gpt4 book ai didi

java - Java 中的 Pacman 问题

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:11 24 4
gpt4 key购买 nike

为了我的大学作业,我必须制作一个可联网的 pacman 版本。我想我最好通过首先制作 pacman 的本地副本来解决这个问题,然后扩展此功能以进行网络播放。

我不得不说,我对 Java GUI 开发和在 Java 中使用此类功能还比较陌生。

我已经开始关注上面关于 java 游戏开发和吃 bean 游戏示例的链接。

我决定将迷宫表示为一个 int 数组,其中不同的值表示不同的事物。然而,当主游戏循环中的 paint 方法运行时,我将使用此方法重新绘制整个迷宫。

    for (int i : theGame.getMaze())
{
if (i == 4)
{
g.setColor(mazeWallColour);
g.fillRect(curX, curY, cellSize, cellSize);
curX += 25;
}
else
{
curX += cellSize;
}

index++;


// Move to new row
if (index == 25)
{
index = 0;
curX = 10;
curY += cellSize;
}
}

然而,这为我提供了不到 1fps 的帧率。尽管我注意到上面链接的示例在每次调用 paint 方法时都使用了类似的重绘方式,而且我相信这是在不可见的图像上进行的(有点像双缓冲 [我像第一个链接一样使用了 BufferStrategy解释]) 重绘迷宫的更好方法是什么?

任何与此有关的指示/建议都会很有用。

感谢您的宝贵时间。

http://pastebin.com/m25052d5a - 用于主要游戏类。

编辑:在尝试查看哪些代码执行时间如此之长后,我刚刚注意到发生了一些非常奇怪的事情。

在我添加的 paintClear(Graphics g) 方法中

ocean = sprites.getSprite("oceano.gif");
g.setPaint(new TexturePaint(ocean, new Rectangle(0,t,ocean.getWidth(),ocean.getHeight())));
g.fillRect(10, 10,getWidth() - 20,getHeight() - 110);

这让整个事情顺利进行 - 但是当我删除这些线时,整个事情变慢了?这是什么原因造成的?

Updated code

最佳答案

首先,我建议您使用命名常量而不是在代码中使用随机魔数(Magic Number),并考虑为您的单元格类型使用枚举。虽然它不会使您的代码运行得更快,但它肯定会使其更易于理解。此外,“i”通常用作计数器,而不是返回值。您可能应该将其称为 cellType 或类似名称。我还建议您为舞台 map 使用二维数组,因为它使许多事情在逻辑上和概念上都变得更容易。

也就是说,这里有一些尝试:

setColor() 拉出循环并执行一次。编译器可能能够进行循环不变提升,从而为您完成此操作(并且可能会这样做),但从概念上讲,您应该无论如何都应该这样做,因为看起来您希望所有的墙都是一种颜色。

尝试调用 drawRect() 而不是 fillRect() 并查看绘制速度是否更快。我认为不会,但值得一试,即使它看起来更丑。同样,您可以尝试创建一个 Image 然后绘制它。这样做的好处是可以很容易地告诉您的 Graphics 对象对您的图像进行变换。此外,请考虑完全消除它并确保它对性能造成重大影响。

此外,通常您不需要为它的 Graphics 对象请求父级并直接在其上实现绘画。相反,您应该覆盖它的 paintComponent() 方法并只使用提供给您的 Graphics(可能像您一样调用辅助方法)。 Swing 组件默认是双缓冲的,所以你不需要自己实现;只需让 Swing 对象完成它的工作,让您知道何时绘画。

此外,您最终会重新绘制整个屏幕,这有点矫枉过正。如果调用 repaint(Rectangle),Swing 可以选择仅重绘板中明确标记为脏的部分。当你更新你的一个 Sprite 时,只在 Sprite 的旧位置和新位置的区域调用 repaint(r) 。当你完成一个关卡并需要一个新的棋盘时,你可以调用 repaint()(不带参数)来重新绘制整个 map 。

你还应该看看 Sun's tutorial获得一些提高 Swing 效率的技巧。

关于java - Java 中的 Pacman 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/445070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com