Я программирую 2D, основанную на сетке игру Pacman. Все плитки размером 8x8. В игре плитки карт рассматриваются как 16x16, а символы (Pacman и призраки) рассматриваются как 32x32. На самом деле все они вытащили из спрайта 8х8 плиток. Я сохраняю позиции как центральную точку каждого символа. Поскольку плитки персонажей больше, чем плитки карты, карта построена таким образом, что персонажи могут «перекрываться» на заблокированные плитки.Обнаружение столкновения Pacman с переменными скоростями символов?
Чтобы справиться с этим набором проблем, я создал невидимый прямоугольник и привязал его к позиции персонажа. Если позиция является точкой (x,y)
, прямоугольник - это поле, окружающее эту точку. Этот прямоугольник по существу является 16x16 в игре и находится в центре символа, что позволяет наложить перекрытие.
Это прекрасно работает, если вы работаете с 8px в качестве глобальной скорости движения, но я бы хотел обработать 8px как «100% -ную скорость» и иметь полный контроль над скоростью символов с двойным, находящимся в диапазоне [ 0,1). Позиции сохраняются как двойные точки, поэтому на этом уровне это нормально. Я читал позиции назад как целые числа, хотя, поскольку я работаю с пикселями.
Таким образом, вопрос, который я задаю, заключается в том, «если это приведет к перемещению X количества пикселей в направлении Y, будет ли мой столкновение касаться заблокированной плитки? Но если вы перемещаете 5 пикселей за раз, это в конечном итоге вызывает очень очевидная проблема: скажите, что вы находитесь в x = 0, двигаясь вправо. Плитки - 16x16 в игре, как указано выше, и у вас есть два из этих открытых перед третьим, которые заблокированы. Таким образом, вы перемещаетесь, x = 5, x = 10, x = 15, x = 20, мы только добрались до 2-го плитки, x = 25, x = 30, x = 35 теперь мы находимся в 3-м плитке ... но подождите. там, потому что X = 35 сталкивается, и, к сожалению, нам нужно было повернуться и начать движение вниз, но мы не можем, потому что теперь наша ось Y не правильно выровнена с сеткой. Нашей позиции X должно быть 32, но не может.
Мой вопрос для всех здесь есть, какие у меня варианты? Какие у вас идеи или идеи? У меня такое чувство, что я делаю это сложнее, чем мне нужно.
Почему бы не сделать, чтобы ваш размер вашего размера увеличился до вашего общего размера? Это также кратно двум, например, скорости использования 2, 4 и 8 (возможно, 16?). –
@ElliottFrisch Спасибо за ответ, к сожалению, это не сработает, так как скорость будет безумно быстрой. Я мог бы замедлить цикл игры, но тогда это будет слишком прерывистым. –
Тогда вам придется масштабировать его.Помните 'distance = rate * time', вы, кажется, знаете, какое« время »вы хотите. Кажется, вы знаете «расстояние». Очевидно, из этого следует поток «rate». –