/ / Виявлення зіткнень Pacman з різними швидкостями характеру? - java, виявлення зіткнень, ігровий движок, зіткнення

Pacman виявлення зіткнень з різною швидкістю персонажів? - java, виявлення зіткнень, ігровий движок, зіткнення

Я запрограмую 2D, гру на основі сітки Pacman. Всі плитки мають розмір 8x8. У грі плитки карти розглядаються як 16x16, а символи (Pacman і привиди) розглядаються як 32x32. Насправді, всі вони витягнуті з розпису 8x8 плиток. Я зберігаю позиції як центральну точку кожного символу. Оскільки плитки символів більші, ніж мозаїчні карти, карта будується таким чином, щоб символи мали можливість "перекриватися" на заблокованих плитках.

Щоб вирішити цю проблему, я створив невидимий Прямокутник і прикріпив його до позиції персонажа. (x,y) точка, прямокутник є вікно, що оточує цю точку. Цей прямокутник є по суті 16х16 в грі, і знаходиться в центрі символу, що дозволяє для перекриття необхідного.

Це відмінно працює, якщо ви працюєте з 8px якГлобальна швидкість руху, але я хотів би розглядати 8px як "100% швидкість" і мати повний контроль над швидкістю символів з подвійним, що знаходиться в діапазоні [0,1). Я читаю позиції назад як цілі числа, хоча, оскільки я працюю з пікселями.

Тому питання, яке я задаю, є по суті "якщо це"переміщує X кількість пікселів у напрямку Y тепер, чи буде моя коробка зіткнення торкатися блокованої плитки? Але якщо ви "рухаєтеся 5px за один раз, це в кінцевому підсумку викликає дуже очевидну проблему. Скажіть, ви" x = 0, рухаючись вправо. Плитки 16x16 в грі, як сказано раніше, і у вас є два з них відкриті перед третім, який заблокований. Таким чином, ви рухаєтеся, x = 5, x = 10, x = 15, x = 20, ми просто дісталися до 2-ї плитки, x = 25, x = 30, x = 35, тепер ми знаходимося в 3-й плитці ... але чекати, ми не можемо туди, бо X = 35 стикається. І, на жаль, нам треба було повернути і почати рухатися вниз, але ми можемо "т", тому що тепер наша вісь Y не правильно зв'язана з сіткою. Наша позиція X повинна бути 32, але не може.

Моє питання для кожного тут, які мої варіанти? Які у вас ідеї чи ідеї? У мене є відчуття, що я роблю його більш складним, ніж мені потрібно.

Відповіді:

1 для відповіді № 1

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

Чому б не дати своєму "pac-man" спрайт вектора швидкості? Вектор описує не тільки швидкість, з якою "pac-man" подорожує, але в якому напрямку, тобто ви можете бачити вперед.

"pac-man" повинен розраховувати і в кінцевому рахункуприймаючи рішення, засноване на наступній розмові ... "ей, рухаючись з такою швидкістю і в цьому напрямку ... у стільки секунд, я" буду вдаритися по стіні, коли це станеться? ". повинні бути секунди ... вони можуть бути "квадратами".

Вам знадобиться функція, яка приймаєпочатковий вектор руху (напрямок і швидкість), який повертає координату точки X, Y, де "pac-man" повинен зупинитися, де він не може йти далі і повинен змінити напрямок (центр плитки, що прилягає до стіни). Кожен раз, коли "pac-man" змінює напрямок, знову запускайте цей розрахунок ... Вам не потрібно продовжувати перевірку, якщо наступний квадрат є прохідним. Якщо його напрямок не змінилося, а його швидкість постійно. Вам потрібно лише розрахувати один раз і дозволити системі координат зробити все інше.

При такому підході квадратний розмір і швидкість не має значення ... доки хіт "pac-man" або в межах наступного руху не перевищує точку зупинки, продовжувати рухатися по вектору.