Лабиринт Пакмана на Java

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

У меня есть основное окно игры со спрайтом pacman и нарисованными призраками, pacman перемещается с помощью клавиш со стрелками,не выходит за пределы стен окна и т. д. Сейчас я пытаюсь построить лабиринт, как на этой картинке:

Pacman maze

не давая мне прямого / полного решения этого, может ли кто-нибудь помочь мне в том, как это можно построить? Я говорю только о границы и трубы (метки "T") здесь, через которые вы не можете пройти, и вам нужно обойти. Не те точки, которые ест Пакман.

вот мои вопросы:

1) каков наиболее эффективный алгоритм/метод создания этого лабиринта? Будет ли он должен быть нарисован каждый раз, когда вызывается метод paint() или есть способ нарисовать его только в начале игры и никогда больше?

2) Как это будет фактически нарисовано на экране? Я предполагаю fillRect() будет использоваться?

3) любые намеки на обнаружение столкновений (поэтому pacman/ghosts не могут пройти через стены) были бы полезны.

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

спасибо

4 ответов


Я бы так не поступил.

Я бы нарисовал графическую карту, а затем создал 2D-массив данных, который представляет карту. Карта данных будет отвечать за определение столкновений, поедание точек, где конфеты и где призраки. Как только вся логика для всего обрабатывается, просто используйте 2D-массив, чтобы отобразить все в соответствующих пиксельных координатах на графической карте.

например пользователь нажимает левую клавишу. Сначала вы определяете, что Пакман в элементе 3, 3. Элемент 3, 2 содержит информацию, обозначающую стену, поэтому вы можете реализовать код, чтобы заставить его игнорировать команду.

изменить:

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

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

d,d,d,d,d,d,d,d,d,d,d,d,w,w,d,d,d,d,d,d,d,d,d,d,d,d
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d
p,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,p    
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d    
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d

и так далее. Возможно, вы захотите выбрать более гибкую структуру данных, чем просто символы, поскольку некоторые области должны содержать куча разной информации. Т. е. даже если призрачная область нереста пуста, pacman не допускается там. Движение призраков и pacman отличается для боковых побегов, точка Candy spawn-пустое место, но если вы хотите оставаться гибким, вы захотите указать, где это находится на основе карты.

еще одна вещь, которую вы захотите запомнить, это то, что pacman и призраки часто находятся между точками, поэтому содержат информацию, которая представляет собой процент пространства они занимают от 1,2 до 1,3 важно для обнаружения столкновений, а также определения, когда вы хотите, чтобы удалить точки, бонусы и конфеты с доски.


вот подсказка для вас:

alt текст http://www.freeimagehosting.net/uploads/66e4131f59.jpg

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


  1. вы можете нарисовать карту в BufferedImage и просто нарисовать ее на каждой paint(). Таким образом, вы получите вполне разумную производительность.

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

  3. карта игры Pacman состоит из квадратов и Пакман и призраки всегда перемещаются с одного квадрата на соседний в анимированном шаге (т. е. вы нажимаете вправо, Пакман перемещает один квадрат вправо). Это означает, что обнаружение столкновений легко: просто не допускайте перемещения в квадраты, которые не пусты.

  4. Я не понимаю, что вы пытаетесь задать здесь.


1) просто дать мой совет на перерисовку. Что-то, что вы можете сделать, если найдете перерисовку всего изображения медленно, это определить только элементы, которые изменились на экране, и перерисовать их. Подход для этого будет следующим: определите спрайты, которые переместились. Определите (приблизительный) прямоугольник вокруг этих спрайтов. Перерисуйте только эти прямоугольники. Таким образом, вы только освежаете части экрана, а не весь экран. Это должно привести к увеличению производительность по перерисовке всего экрана.

другие ответы были приемлемы для других вопросов, которые вы задали.