Мяч прилип к Surface Game Maker

Я новичок в Game Maker, и у меня возникли проблемы с функцией.

Я делаю игру, похожую на понг, и сталкиваюсь с проблемой, когда мяч сталкивается с верхней частью ракетки или нижней частью (меньшие стороны, а не лицом к лицу), мяч и ракетка замерзают.

Единственный код, который у меня есть в случае столкновения мяча с ракеткой, - это изменить горизонтальную скорость.

скорость *= -1;

Я понимаю проблему в том, что, поскольку мяч коснулся вершины, горизонтальное направление меняется на противоположное, но он все еще находится в контакте с поверхностью, поскольку вертикальная скорость не изменилась, поэтому снова меняется и застревает в бесконечном цикле.

Я пробовал много вещей, чтобы обойти это, например, установить сигнал тревоги, чтобы определить, касается ли мяч все еще после одного кадра, и изменить вертикальную скорость (безуспешно).

Я также попытался проверить, совпадает ли y-позиция верхней части мяча с y-позицией нижней части лопасти (и наоборот), и изменить вертикальную скорость, если это так. но опять безуспешно.

я уверен, что оба эти метода работают, если используется правильный код, но я должен просто выполнять его неправильно.

Какой метод я должен использовать, чтобы сделать так, чтобы, если мяч сталкивается с верхней или нижней частью весла, он не застревал, а в идеале просто менял вертикальную скорость вместо горизонтальной скорости?

Я уверен, что у этого есть простое решение, но потому что я новичок, я не могу его решить!

Благодарность!


person Kane B    schedule 09.05.2017    source источник


Ответы (2)


Моим решением было бы изменить случай, когда мяч сталкивается с веслом. Создайте объект, который почти идентичен вашему текущему объекту, а затем удалите событие столкновения, но задайте для события создания движение с обратной скоростью. Мяч будет двигаться в нужном вам направлении, но не застрянет. Затем вы можете проверить, есть ли пустое место, и если есть, заменить объект обратно на исходный шар.

person Helaman Sung    schedule 18.05.2017
comment
Я бы не рекомендовал создавать еще один экземпляр для чего-то такого простого. - person Timtech; 22.06.2017

Во-первых, это хороший вопрос. Я не знаю, как вы проверяете столкновения, но если вы делаете это в пошаговом событии (в отличие от события столкновения или чего-то еще), вы должны иметь возможность проверять горизонтальные и вертикальные столкновения отдельно. Например (заменив obj на имя объекта весла):

if (position_meeting(x-1, y, obj) || position_meeting(x+1, y, obj)) {
    //horizonal collision
}
if (position_meeting(x, y-1, obj) || position_meeting(x, y+1, obj)) {
    //vertical collision
}

Это дает преимущество обнаружения пограничного случая, когда он точно попадает в угол, и в этом случае вы, вероятно, захотите перевернуть обе скорости.

Вы также можете сделать что-то большее, как вы предложили, даже используя событие столкновения, просто проверяя, меньше ли значение x мяча (при условии, что вы центрировали оба спрайта), чем {значение x весла плюс или минус его ширина}, что будет указывают на вертикальное столкновение.

person Timtech    schedule 22.06.2017