2013-11-20 2 views
0

Я программирую 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, но не может.

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

+0

Почему бы не сделать, чтобы ваш размер вашего размера увеличился до вашего общего размера? Это также кратно двум, например, скорости использования 2, 4 и 8 (возможно, 16?). –

+0

@ElliottFrisch Спасибо за ответ, к сожалению, это не сработает, так как скорость будет безумно быстрой. Я мог бы замедлить цикл игры, но тогда это будет слишком прерывистым. –

+0

Тогда вам придется масштабировать его.Помните 'distance = rate * time', вы, кажется, знаете, какое« время »вы ​​хотите. Кажется, вы знаете «расстояние». Очевидно, из этого следует поток «rate». –

ответ

1

звучит как у вас есть ...

Почему бы не дать свой "Pac-Man" Sprite вектор скорости? Вектор будет описывать не только скорость, с которой «pac-man» путешествует, но и в каком направлении, что означает, что вы можете видеть впереди.

«pac-man» должен рассчитывать и в конечном итоге принимать решение, основанное на следующем разговоре ... «эй, двигаясь с такой скоростью и в этом направлении ... в течение многих секунд я собираюсь ударить по стене , когда это произойдет? ». Секунды даже не должны быть секундами ... они могут быть «квадратами».

Вам понадобится функция, которая принимает начальный вектор движения (направление и скорость), который возвращает координату точки X, Y, где «pac-man» должен остановиться, где он не может идти дальше и должен изменить направление (центр плитки, примыкающей к стене). Каждый раз, когда «pac-man» меняет направление, снова запустите этот расчет ... вам не нужно проверять, является ли следующий квадрат допустимым. Если его направление не изменилось, и его скорость постоянна ... вам нужно только вычислить один раз и позволить системе координат сделать все остальное.

При таком подходе размер квадрата и скорость не имеют значения ... до тех пор, пока «pac-man» не ударит или в пределах его следующего движения не достигнет точки остановки, продолжайте движение вдоль вектора.

+0

Большое спасибо. Поскольку вы, вероятно, могли бы рассказать о моем вопросе, я был расстроен, так как чувствовал, что я просто на грани решения. Я, наконец, понял это, и у меня действительно интересная демонстрация для моей презентации класса завтра. –

+0

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

Смежные вопросы