Как представить окно 400x400 как карту в игре Java? - PullRequest
1 голос
/ 08 марта 2009

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

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

Ответы [ 4 ]

3 голосов
/ 08 марта 2009

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

1 голос
/ 08 марта 2009

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

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

0 голосов
/ 08 марта 2009

Ваши спрайты, такие как 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 это, вероятно, не обязательная оптимизация.

0 голосов
/ 08 марта 2009

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

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

...