Java中的"Pacman迷宫"

8

我正在用Java构建pacman游戏,以此学习游戏编程。

我已经有了基本的游戏窗口和pacman精灵以及ghost精灵的绘制,pacman通过箭头键移动,在窗口墙壁之外不会移动等等。现在我正在尝试构建迷宫,就像这张图片中所示:

Pacman迷宫

不要直接给我完整的解决方案,请问有人能指导一下我如何构建吗?我只谈论边界和管道(“T”标记),你不能穿过管道,必须绕过它们。不是pacman吃掉的点。

以下是我的问题:

1)创建此迷宫的最有效算法/方法是什么?是否每次调用paint()方法时都必须绘制它,还是有一种方法仅在游戏开始时绘制它并永远不再绘制?

2)这将如何绘制到屏幕上?我认为将使用 fillRect()

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

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

谢谢

3个回答

10

我不会那么做。

我会先绘制图形地图,然后创建一个表示地图的二维数据数组。数据地图将负责确定碰撞、吃点、糖果和幽灵的位置。一旦处理了所有东西的逻辑,只需使用2D数组将它们以正确的像素坐标显示在图形地图上。

例如,用户按下左键。首先确定 Pacman 在元素 3,3 处。元素 3,2 包含了表示墙壁的信息,因此你可以实现代码使 Pacman 忽略该命令。

编辑:

每个元素将代表一个点的位置。例如:

不,看着这张地图,我的意思是数组可能看起来像这样。

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

等等。您可能希望选择比仅字符更灵活的数据结构,因为某些区域需要包含许多不同的信息。即使鬼​​生成区域为空,也不允许Pacman进入该区域。 鬼和Pacman的移动对于侧面逃生是不同的,糖果生成点是一个空白点,但如果您想保持灵活性,则需要在每个地图上表示其位置。

另一件要记住的事情是,Pacman和鬼通常在两个点之间,因此包含代表它们所占用空间的1,2和1,3之间的百分比信息对于碰撞检测以及确定何时从游戏板中删除点,能量增强剂和糖果非常重要。


这个数组如何表示地图?就像一个像素到像素的表示吗? - Ali
谢谢。如果我想将吃豆人移动到100 x,50 y位置,我该如何在地图上设置以显示该位置已被占用?有任何代码可以实现吗? - Ali
将数据结构更改为类似于map[100,50].OccupiedBy = Characters.PacMan的形式。Characters可以是一个枚举类型,包括Characters.Ghost1、Characters.Ghost2等。 - Spencer Ruport
你会选择哪种数据结构来实现,哈希表还是链表?我不知道你可以像 100、50 这样拥有一个索引,我以为它必须是 100/50 或者像字符串 "100,50"。 - Ali
抱歉,我有 VB 编程习惯。如果您愿意,可以创建一个链表或哈希映射,但由于映射不会增长,我建议使用二维数组。我的意思是要放 Map[100][50]。 - Spencer Ruport
迷宫和角色位置的表示应该是相关但不同的。迷宫具有粗粒度的结构,不需要像素级表示。角色位置需要它(或者至少比迷宫更细),所以会涉及到比例转换。 - user41871

2
  1. 你可以将地图绘制到BufferedImage中,然后在每个paint()方法中仅绘制该图像。这样可以获得相当合理的性能。

  2. 如果你希望墙壁是实心的,可以使用fillRect绘制每个正方形墙块。如果你希望获得与图片中相同的外观,则需要找出正确绘制线条的方法,并在角落处使用弧线。

  3. Pacman游戏地图由正方形组成,Pacman和幽灵总是在动画步骤中从一个正方形移动到相邻的正方形(即按右键,Pacman向右移动一个正方形)。这意味着碰撞检测很容易:只需不允许移动到非空正方形。

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


你所说的正方形是指一个像素/ x,y坐标还是一个由10个像素组成的正方形块? - Ali
我的意思是一块像素。Spencer Ruport 也在谈论同样的事情。 - TrayMan

2

1) 我对重绘图片的建议是,如果整个图片的重绘速度较慢,您可以确定只有屏幕上发生变化的元素,并重新绘制它们。实现这一方法的步骤如下:确定已移动的精灵,大致确定包围这些精灵的矩形区域,仅重新绘制这些矩形区域。这样就可以只刷新屏幕的部分而非整个屏幕,从而提高性能。

其他答案对您提出的其他问题已经很合理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接