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

我有基本的游戏窗口,其中包含pacman sprite和鬼精灵,pacman用箭头键移动,不会移动到窗口的墙壁之外等等。现在我正在尝试构建迷宫,如图所示:

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

以下是我的问题:

1)创建这个迷宫最有效的算法/方法是什么?是否必须在每次调用paint()方法时绘制它,或者只有在游戏开始时才能绘制它并且永远不会再次绘制它?

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

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

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

由于

有帮助吗?

解决方案

我不这样做。

我绘制图形地图,然后创建一个代表地图的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

等等。您可能希望选择比字符更灵活的数据结构,但是因为某些区域需要包含一堆不同的信息。即使鬼魂产卵区空白,也不允许pacman在那里。鬼魂和pacman的移动对于侧面逃脱是不同的,糖果产生点是一个空白点但是如果你想保持灵活性,你将想要表示每个地图的位置。

你要记住的另一件事是,pacman和鬼魂通常在点之间,因此包含表示在1,2和1,3之间占据的空间百分比的信息对于碰撞检测非常重要。以及确定何时想要从电路板上移除点,通电和糖果。

其他提示

这是给你的提示:

alt text http://www.freeimagehosting.net/uploads/66e4131f59.jpg

这个正确使用的提示将允许您处理渲染和碰撞检测,并且还允许您以紧凑的方式表示迷宫。

  1. 您可以将地图绘制成BufferedImage,并在每个paint()上绘制一个drawImage。你会以这种方式获得相当合理的表现。

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

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

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

1)只是提出重绘的建议。如果您发现重绘整个图像的速度很慢,则只能确定屏幕上已更改的元素并重新绘制这些元素。对此的方法如下:确定已移动的精灵。确定(近似)这些精灵周围的矩形。仅重绘那些矩形。这样您只是刷新屏幕的一部分而不是整个屏幕。与重绘整个屏幕相比,这会导致性能提升。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top