制作pacman有些问题?

时间:2011-11-14 05:07:42

标签: java methods collision-detection pacman

编辑:完全忘了提到我用Java编码

我真的很难制作某种检测系统或某种方式让我的pacman精灵/角色在游戏中顺利通过我的棋盘。我没有让这块板成为一张图片。

我首先尝试过颜色检测,但效果最好,但根本不光滑,非常不稳定。

然后我尝试手动输入不允许输入的位置坐标。这也没有那么好用。

我现在正在尝试让程序使用颜色检测并检查一个单独看不见的板,看看我是否还在路上。到目前为止,这已经失败了。它看起来似乎是最聪明的,但角落只是通过调整图像而难以修复。

我想知道你们会为这样的任务建议什么方法。

1 个答案:

答案 0 :(得分:5)

存储“旧学校”游戏板的典型方法是使用charint multidimensional array。使用Matt's excellent little graphic你可以看到董事会中有21个21个方格:

int board[21][21] = {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
                     {1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
                     {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1},
                     /* ... and so on, for all 21 lines .. */                      }};

选择墙壁和路径的数字并不重要。 “路径”位置最初包含“包含点”的代码。当paccy消耗这些点时,将新值存储到该位置的板上以指示该点已被消耗但它仍然是通道方块。对于墙壁,Matt建议-1,对于点没有0,对于点来说1 - 这是一个非常好的计划,因为它让你的“墙碰撞”例程只是寻找

if (board[pac.x][pac.y] > 0) {
    /* still in bounds */
} else {
    /* collided against a wall */
}

缺点是-1在数组初始值设定项中看起来更尴尬。

如果这是在C中完成的,那么使用char board[21][21]代替int board[21][21]来“改善”这一点很容易,并将游戏板存储为C字符串:

char board[21][21] = " XXXXXXXXXXXXXXXXXXX "
                     " X        X        X "
                     " X XX XXX X XXX XX X "
                     " X                 X "
                     " X XX X XXXXX X XX X "
                     " X    X   X   X    X "
                     " XXXX XXX X XXX XXXX "
                     "    X X       X X    "
                     "XXXXX X XXXXX X XXXXX"
                     "        X   X        "
                     "XXXXX X XXXXX X XXXXX"
                     "    X X       X X    "
                     " XXXX X XXXXX X XXXX "
                     " X        X        X "
                     " X XX XXX X XXX XX X "
                     " X  X           X  X "
                     " XX X X XXXXX X X XX "
                     " X    X   X   X    X "
                     " X XXXXXX X XXXXXX X "
                     " X                 X "
                     " XXXXXXXXXXXXXXXXXXX";

这在源代码中更易于阅读,占用的内存更少,而且墙碰撞例程看起来像这样:

if (board[pac.x][pac.y] == 'X') {
    /* collided with a wall */
} else {
    /* still in bounds */
}

(虽然编译器将在字符串末尾插入的尾随NUL意味着右下方不能用于路径墙 - 一点点更多的努力可以解决这个问题,但它并不那么美好。)

我不记得有足够的Java用Java来完成这项工作 - 但我相信如果这看起来足够引人注目,你可以弄明白。