java - 制作 pacman 时遇到问题?

标签 java methods collision-detection pacman

编辑:完全忘了提及我正在用 Java 编写代码

我真的很难制作某种检测系统或某种方法来让我的吃 bean Sprite /角色在游戏中顺利通过我的棋盘。我没有把板做成图像。

我首先尝试了颜色检测,效果最好,但一点也不流畅,而且非常不稳定。

然后我尝试手动输入不允许输入的位置坐标。这也不是很好。

我现在正在尝试让程序使用颜色检测并检查一个单独的看不见的板,看看我是否还在路上。这是迄今为止失败最多的。看起来这将是最聪明的,但边角太小了,很难通过调整图像来修复。

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

最佳答案

存储“老派”游戏板的典型方法是使用charint multidimensional array .使用Matt's excellent little graphic你可以看到棋盘上有 21 x 21 个方 block :

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 消耗点时,将新值存储到板中的位置以指示点已被消耗但它仍然是路径方 block 。 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 意味着右下角的方 block 永远不能用于通路 墙 - - 多一点努力可以解决这个问题,但它并不那么漂亮。)

我不记得有足够多的 Java 可以在 Java 中完成这项工作——但我相信如果这看起来足够吸引人,你一定能想出一些办法。

关于java - 制作 pacman 时遇到问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8117564/

相关文章:

java - 如何在 Java 中扫描文件夹?

java - 使用接口(interface)的抽象类或公共(public)方法

Python timedelta 收到意外结果

java - 不同角色速度的 Pacman 碰撞检测?

java - libGdx:Intersector.intersectLines(似乎)返回错误结果?

Java长计算不卡住GUI(在单线程中)

java - 从 C 调用 Linux 命令没有通过 java 提供任何输出

java - "but the compiler doesn' t 知道这个 "- what' 的意义吗?

Eclipse 自动创建新函数/方法

java - 使用 Java、Slick2D 和平铺 map 编辑器进行碰撞检测