1

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

我该如何构建这张地图,特别是因为屏幕是由 x,y 坐标组成的,所以我怎样才能在地图上正确地表示它们?

4

4 回答 4

3

我知道开始考虑对象和接口是很有诱惑力的,但是您是否考虑过一个每个元素代表 40 个像素或其他东西的二维数组?我不记得 pacman 在碰撞时是像素精确的,更多的是每个部分移动的方向的问题。

于 2009-03-07T21:42:21.860 回答
1

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

具体来说,假设您希望抽象表示为 100 单位宽,并且您希望将其渲染为 400 像素。那么变换就是scrn_x = 4 * x。

于 2009-03-07T21:42:46.837 回答
0

如果不自己写,很难想出这个但是。

首先,您需要创建实现 ICollidable 的实体定义。实体将包括幽灵、吃豆人、圆点和通电。地图中的每个元素都将包含与其他信息一起的所有当前实体的列表,并带有一种“位置”值以增加精度。ICollidable 接口不仅包括用于确定哪些实体相互碰撞的逻辑(例如,幽灵不与点碰撞),而且还包括确定它们是否处于相互碰撞的位置。IE 如果 pacman 从右侧进入一个空间,而一个幽灵从左侧离开该空间,则不会发生碰撞。它还将帮助确定 pacman 何时准确地吃掉了一个点,以便从图形上看它是正确的。IE 如果你在 pacman 进入空格时破坏了一个点,它'

于 2009-03-07T21:32:38.763 回答
0

您的精灵(如 pacman 和 ghost)由位置 (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 ...

现在,如果屏幕上有大量精灵,您可以通过存储地图中任何特定图块上存在的精灵来优化精灵到精灵的碰撞检测,因此您只需检查相邻图块中的精灵. 但是对于第一次通过和这个吃豆人游戏,它可能不是必要的优化。

于 2009-03-07T21:52:40.137 回答