Здравствуйте! Проблема такова: мой объект игрока цепляется за углы объектов стен. Так как игра будет в стиле TDS, то это будет очень бесячим моментом. Как можно решить эту проблему?
Об объектах
Маска игрока - Круг Объекты стены используют пункт Solid, когда как объект игрока использует функцию place_free
Код:
Код
var xDir, yDir;
//Sprite Rotation direction = point_direction(x, y, mouse_x, mouse_y); //Mouse position image_angle = direction; //Rotare sprite to mouse
if xDir != 0 and place_free(x + (xDir * player_speed), y) //Check pressed horizontal keys and free space { if xDir > 0 then x += player_speed; //If pressed "D" then move right if xDir < 0 then x -= player_speed; //If pressed "A" then move left xDir = 0; //Reset navigation var }
if yDir != 0 and place_free(x , y + (yDir * player_speed)) //Check pressed vertical keys and free space { if yDir > 0 then y += player_speed; //If pressed "S" then move right if yDir < 0 then y -= player_speed; //If pressed "W" then move left yDir = 0; //Reset navigation var }
UPD: В общем, я решил подзаморочиться и решил, что мне надо сделать "отскок" на 1 px от места столкновения маски со стеной, так как спрайт больше овальный, нежели круглый. Написал такой код на объекте игрока при столкновении со стеной:
Код
while (!place_free(x + 1, y)) {x -= 1} while (!place_free(x - 1, y)) {x += 1} while (!place_free(x, y + 1)) {y -= 1} while (!place_free(x, y - 1)) {y += 1}
И вот надо мной смеется GMS: 1) Если крутится у правой стороны стены, то всё работает как надо - игрок отодвигается от стены при столкновении маски игрока со стеной. 2) Крутится у левой стороны стены НУЖНО медленно, иначе тебя перекидывает по ту сторону стены. 3) Касаться нижней и верхней стороны стены "опасно"! - при малейшем столкновении тебя кидает в левую сторону. Если закомментировать всё, кроме одной строки, то работает только на одной стороне (логично), но и при прикосновении к другим сторонам стены тебя сразу кидает на эту рабочую сторону. Изображение:
Спасите мой мозг, plz!
UPD2: Забыл черкнуть, что маска теперь - овальная. Но я продолжаю "насиловать" GML 1.
Код
while (!place_free(x + 1, y) or !place_free(x - 1, y) or !place_free(x, y + 1) or !place_free(x, y - 1)) { if !place_free(x + 1, y) {x -= 2}; if !place_free(x, y + 1) {y -= 2}; if !place_free(x - 1, y) {x += 2}; if !place_free(x, y - 1) {y += 2}; }
Игра просто при столкновении зависатет наметрво. Убивается только через диспетчер задач. При дебагинге замтеил, что игра не может выйти из моего while 2.
Код
if !place_free(x + 1, y) {x -= 2}; if !place_free(x, y + 1) {y -= 2}; if !place_free(x - 1, y) {x += 2}; if !place_free(x, y - 1) {y += 2};
Вот бы хорошо бы было, если бы GMS2 при наличии столкновения всегда вызывал этот скрипт. Но нет - он вызывает его только один раз и больше не хочет. При медленном столкновении игрок отодвигается. При быстром столкновении "бок" игрока заезжает в стену. А это в свою очередь блокирует код движения выше.
Lev_Nickolaevich, image_angle вращает и маску объекта, в этом и проблема. Объяви переменную "angle" в Create и в Step пропиши "angle = direction". Затем используй её в Draw в качестве аргумента угла поворота одной из расширенных функций рисования спрайта (draw_sprite_ext). Разработчик, композитор и издатель инди-игр в Steam. Редактор карт: BekkerDev Level Editor 4 Страница разработчика в Steam Паблик ВК: BekkerDev Studio
Сообщение отредактировал AlexanderBekker - Вторник, 17 Апреля 2018, 08:22
AlexanderBekker, вот в том-то и проблема, что маска и помогает мне определить, где происходит столкновение (забыл черкнуть, что маска овальная уже, +1 к греху на душу)
Lev_Nickolaevich, игрок застревает из-за маски, потому что её края при повороте вписываются в твёрдые объекты. Поэтому нужно создать отдельную переменную, которая будет отвечать за визуальный поворот спрайта, передав её в функцию draw_sprite_ext вместо стандартной image_angle, которая нигде не должна изменяться. Разработчик, композитор и издатель инди-игр в Steam. Редактор карт: BekkerDev Level Editor 4 Страница разработчика в Steam Паблик ВК: BekkerDev Studio
AlexanderBekker, способ с draw_sprite_ext будет работать при круглой маске. И он работает, я проверил! Но у меня маска овальная. Поэтому получается, что спрайт игрока залезает в стены, что я бы не хотел. Причем у меня получилось сделать так как я хочу, но почему-то работало только с одной стороны (UPD1 /\). Неужели GMS2 просто не проработан в плане кастомных масок? http://vk.com/lev_nickolaevich
while(!place_free(x - 1, y) and place_free(x + 1, y)) x++; while(!place_free(x + 1, y) and place_free(x - 1, y)) x--; while(!place_free(x, y - 1) and place_free(x, y + 1)) y++; while(!place_free(x, y + 1) and place_free(x, y - 1)) y--;
Добавлено (17 Апреля 2018, 18:32) ---------------------------------------------
Используй спрайт с заливкой одного цвета как маску для обьекта, тогда вращение будет засчитыватсья и у маски и у спрайта в одинаковом углу Была такая проблема при отрисовке изометрического столкновения.