8

所以我正在用 Java 构建 pacman 游戏来自学游戏编程。

我有基本的游戏窗口,里面有 pacman sprite 和 ghost sprites,pacman 用箭头键移动,不会超出窗口的墙壁等。现在我正在尝试构建迷宫,就像在这个图片:

吃豆人迷宫

如果没有给我直接/完整的解决方案,有人可以指导我如何构建它吗?我在这里只谈论边界和管道('T' 标记),你不能通过它们,你必须四处走动。不是吃豆人吃的那些点。

以下是我的问题:

1)创建这个迷宫最有效的算法/方法是什么?每次调用paint()方法时都必须绘制它,还是有办法只在游戏开始时绘制它而不再绘制?

2)这将如何实际绘制到屏幕上?我假设fillRect()将被使用?

3) 任何有关碰撞检测的提示(因此 pacman/ghosts 无法穿过墙壁)都会有所帮助。

4)关于如何计算管道之间的空白空间以便在它们之间填充点的任何提示也将非常有帮助。

谢谢

4

3 回答 3

10

我不会那样做的。

我会绘制图形地图,然后创建一个代表地图的 2D 数据数组。数据地图将负责确定碰撞、吃点、糖果在哪里以及鬼魂在哪里。处理完所有内容的所有逻辑后,只需使用 2D 数组在图形地图上以正确的像素坐标显示所有内容。

例如,用户正在按下左键。首先,您确定 pacman 位于元素 3、3。元素 3、2 包含表示墙壁的信息,因此您可以执行代码以使他忽略该命令。

编辑:

每个元素将代表一个点可能在哪里。例如:

不,看着板我会说阵列看起来像这样。

d,d,d,d,d,d,d,d,d,d,d,d,w,w,d,d,d,d,d,d,d,d,d,d,d,d
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d
p,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,p    
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d    
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d

等等。但是,您可能希望选择一个比字符更灵活的数据结构,因为某些区域需要包含一堆不同的信息。IE 即使幽灵生成区域是空白的,pacman 也不允许在那里。侧逃生的鬼魂和吃豆人的移动是不同的,糖果重生点是一个空白点,但如果你想保持灵活,你需要在每张地图的基础上指出它的位置。

您需要记住的另一件事是 pacman 和幽灵通常位于点之间,因此包含代表它们在 1,2 和 1,3 之间占用的空间百分比的信息对于碰撞检测和确定很重要当您想从板上移除点、通电和糖果时。

于 2009-03-07T21:02:23.360 回答
2
  1. 您可以将地图绘制成 BufferedImage,然后在每个paint() 上绘制它。通过这种方式,您将获得相当合理的性能。

  2. 如果您对实心墙感到满意,您可以使用 fillRect 绘制每个方形墙块。如果您希望获得与图片相同的外观,您需要弄清楚如何以正确的方式绘制线条并使用弧线作为角落。

  3. Pacman 游戏地图由方格组成,Pacman 和幽灵总是以动画的方式从一个方格移动到相邻的方格(即你按右,吃豆人向右移动一个方格)。这意味着碰撞检测很容易:只是不允许移动到非空方格。

  4. 我不明白你想在这里问什么。

于 2009-03-07T21:02:39.413 回答
2

1)只是为了给我关于重绘的建议。如果您发现重绘整个图像很慢,您可以做的事情是仅确定屏幕上已更改的元素并重绘这些元素。一种方法如下: 确定已移动的精灵。确定(近似)围绕这些精灵的矩形。仅重绘这些矩形。这样你只刷新屏幕的一部分而不是整个屏幕。与重绘整个屏幕相比,这应该会提高性能。

对于您提出的其他问题,其他答案是合理的。

于 2009-03-07T21:18:24.617 回答