Так что в последнее время я играл много pacman в своей камере, и мне интересно, как призраки, кажется, работают независимо друг от друга. Я думал о том, как это было бы запрограммировано.
Одним из вариантов, о котором я подумал, были темы. Все 4 призрака бегут в своих собственных потоках и каким-то образом находят положение Пакмана. Но, кажется, слишком много работать с четырьмя потоками, и синхронизация будет сложной. Кроме того, Google написал pacman в Javascript, который не поддерживает потоки, поэтому это можно сделать без потоков, и должен быть более простой способ.
Моя вторая мысль была обработчиками событий. Я просто связал событие 'directionChanged', которое pacman сработает, с 4 обработчиками событий, по одному для каждого призрака. Каждый призрак затем решает, какой путь выбрать, чтобы добраться до Пакмана. Это, я думаю, более вероятно, что происходит. Но это может замедлиться, если обработчики событий выполняются синхронно, потому что пути должны вычисляться последовательно, а четвертому призраку потребуется время, чтобы изменить направление, и это может создать видимое отставание (вероятно). Кроме того, призраки запускают событие сами, когда попадают в стену, а их обработчики изменяют направление призраков. Но учитывая частоту, с которой pacman меняет направление и четыре призрака отвечают, обработчики событий также кажутся слишком много.
Я говорю, что вышеупомянутые идеи были бы слишком много, потому что помните, что игра была написана 30 лет назад, когда процессор времени и памяти было мало, поэтому я думаю, что должен быть гораздо более простой путь.
Кроме того, кажется, что призраки идут разными путями, даже когда Пакман еще. Все ли призраки используют совершенно разные или оптимизированные по-разному алгоритмы поиска пути?
Меня больше интересует выяснение того, как все призраки, кажется, работают для себя одновременно, чем алгоритмы поиска пути, которые они используют. Мысли?
Вы сильно над этим задумываетесь.
По стандартам видеоигр потоки и обработчики событий ужасно медленные. Многопоточные игровые движки - относительно новое изобретение, буквально спустя десятилетия после того, как был выпущен Pacman. Скудная логика Pacman будет происходить внутри одного довольно жесткого цикла, что-то вроде этого очень упрощенного псевдокода:
while (!pacman_dead) {
foreach ghost {
if (ghost has hit a wall) {
if (pacman to left) turn left
if (pacman to right) turn right
} else {
go straight
if (ghost touched pacman) {
pacman_dead = true
}
}
}
handle_input();
move_pacman();
draw_screen();
}
Это довольно распространенный шаблон в играх, и он дает видимость совпадения. Обычно игра запускается в единственном цикле, который продвигает состояние игры на небольшое расстояние между перерисовками экрана. Вот почему производительность по-прежнему очень важна при разработке игр: ваша игра должна перебирать каждый внутриигровой объект, который должен что-то делать или принимать какое-то решение (противники, управляемые ИИ, движущиеся платформы, простые анимации и т. Д. ) и обновлять свое состояние не менее 30 раз в секунду.
Здесь много полезной информации о том, как работает pacman , включая несколько подробных описаний поведения призраков.
** Обратите внимание, что я нашел эту информацию в Алгоритме поиска пути для Pacman некоторое время назад.
РЕДАКТИРОВАТЬ:
В этом блоге сообщение есть еще больше информации о призраках.
Перед рендерингом каждого кадра я перебирал призраков. Таким образом не будет никаких событий, потоков или проблем с асинхронностью. У каждого призрака, вероятно, есть очень грубая эвристика для подсчета своих ходов и принятия решения (поворот налево или направо, никаких действий, что угодно).
Вот реализация , которую вы могли бы проверить. :)