Вопрос

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

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

Pacman maze

Не давая мне прямого/полного решения этой проблемы, может ли кто-нибудь подсказать мне, как это можно построить?Я говорю только о границах и трубах («Т») здесь, через которые нельзя пройти и их приходится обходить.Ещё не те точки, которые ест пакман.

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

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

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

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

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

Спасибо

Это было полезно?

Решение

Я бы не делал этого таким образом.

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

Например, пользователь нажимает левую клавишу.Сначала вы определяете, что pacman находится на элементе 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

И так далее.Однако вы можете выбрать более гибкую структуру данных, чем просто символы, поскольку некоторые области должны содержать множество различной информации.IE, хотя зона появления призраков пуста, pacman туда не допущен.Движение призраков и Пакмана отличается для боковых побегов, точка появления конфет — это пустое место, но если вы хотите сохранить гибкость, вам нужно указать, где она находится, на каждой карте.

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

Другие советы

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

альтернативный текст http://www.freeimagehosting.net/uploads/66e4131f59.jpg

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top