我正在建立一个pacman游戏。基本上,我想要一个由块/瓦片组成的窗口的地图表示。然后当pacman角色/幽灵移动时,我会改变它们在地图上的位置来表示屏幕上的内容,并将其用于碰撞检测等。

如何构建此地图,尤其是因为屏幕由x,y坐标组成,所以如何在瓷砖/地图上正确表示它们?

有帮助吗?

解决方案

我知道开始考虑对象和接口是很诱人的,但你想过一个二维数组,每个元素代表40个像素或什么?我不记得pacman在碰撞时的像素精确度,更多的是每件作品移动方向的问题。

其他提示

一般来说,你有一个抽象的表示,不会引用像素(例如,也许吃豆人的迷宫只是w单位宽),然后你有一个线性变换(你知道,y = mx + b )将抽象表示带到实际像素。

为了使其具体化,假设您希望抽象表示为100个单位宽,并且您希望将其渲染为400像素。然后转换只是scrn_x = 4 * x。

如果不自己写这篇文章,很难想出来,但是。

首先,您需要创建实现ICollidable的实体定义。实体将包括鬼,pacman,点和通电。 地图中的每个元素将包含具有某种“位置”的所有当前实体的列表以及其他信息。增加精度的价值。 ICollidable接口不仅包括用于确定哪些实体彼此冲突的逻辑(例如,鬼魂不与点碰撞),而是确定它们是否处于相互碰撞的位置。 IE如果pacman从右边进入一个空间而幽灵从左边离开那个空间则没有碰撞。它还有助于确定pacman何时吃了一个点,这样图形上看起来是正确的。 IE如果你在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边(上,下,左,右)的像素坐标并检查碰撞。例如,如果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