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