Как представить окно 400x400 как карту в Java-игре?

StackOverflow https://stackoverflow.com/questions/622517

  •  05-07-2019
  •  | 
  •  

Вопрос

Я создаю игру для Пакмана.По сути, я хочу иметь представление карты этого окна, состоящее из блоков/плиток.Затем по мере движения персонажа/призрака pacman я бы изменил их положение на карте, чтобы представить то, что на экране, и использовал бы это для обнаружения столкновений и т. д.

Как мне построить эту карту, тем более, что экран состоит из координат x,y, и как мне правильно представить их в тайлах/на этой карте?

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

Решение

Я знаю, что заманчиво начать думать об объектах и ​​интерфейсах, но задумывались ли вы о двумерном массиве, в котором каждый элемент представляет 40 пикселей или что-то в этом роде?Я не помню, чтобы pacman был точен до пикселя, когда дело дошло до столкновения, скорее вопрос в направлении, в котором двигалась каждая часть.

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

Как правило, у вас есть абстрактное представление, которое не ссылается на пиксели как таковые (например, возможно, лабиринт Pac-Man просто имеет ширину w единиц), а затем у вас есть линейное преобразование (вы знаете, y = mx + b ) переносить абстрактное представление в фактические пиксели.

Чтобы сделать это конкретным, предположим, что вы хотите, чтобы ваше абстрактное представление было шириной 100 единиц, и вы хотите, чтобы оно отображалось как 400 пикселей. Тогда преобразование просто scrn_x = 4 * x.

Трудно придумать это, не написав это самому, но.

Сначала вам нужно будет создать определения сущностей, реализующие ICollidable.Сущности будут включать призраков, Пакмана, точки и бонусы.Каждый элемент на карте будет содержать, наряду с другой информацией, список всех присутствующих объектов со своего рода значением «позиции» для дополнительной точности.Интерфейс ICollidable будет включать не только логику для определения того, какие объекты сталкиваются друг с другом (например, призраки не сталкиваются с точками), но и для определения того, могут ли они столкнуться друг с другом.То есть, если pacman входит в пространство справа, а призрак покидает это пространство слева, столкновения не происходит.Это также поможет определить, когда именно pacman съел точку, чтобы графически она выглядела правильно.Т.е. если вы уничтожите точку прямо в тот момент, когда Пакман войдет в пространство, она исчезнет еще до того, как он коснется ее графически.

Ваши спрайты, такие как pacman и призрак, представлены позициями (x, y). Чтобы определить, сталкиваются ли они друг с другом, используйте этот псевдокод:

sprites = [ ... list of sprites ... ]
for i1=0 to len(sprites):
    sprite1 = sprites[i1]
    for i2 = i1+1 to len(sprites):
        sprite2 = sprites[i2]
        if (sprite1.x-sprite2.x)^2+(sprite1.y-sprite2.y)^2 < radius_of_sprites^2:
            collide(sprite1, sprite2)

Обратите внимание, что это вообще не касается карты. Мы можем проверить наличие столкновений между пакманом и картой отдельно. Ключевой трюк заключается в том, что вы делите координаты пикселей каждой из сторон Пакмана (сверху, снизу, слева, справа) и проверяете наличие столкновений. Например, если pacman идет направо, нам нужно проверить правый край для столкновения:

pacman_tile_x = (pacman.x+tilesize/2)/tilesize    # added tilesize/2 to check the middle of pacman
pacman_tile_y = pacman.y/tilesize + 1   # +1 because right edge is 1 tile to the right of the sprite's coordinate
if tile[pacman_tile_x][pacman_tile_y].is_a_wall:
    ... wall collide code ...

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

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