【问题标题】:Increasing Fluidity 2D game Java增加流动性 2D 游戏 Java
【发布时间】:2016-05-23 14:13:26
【问题描述】:

我正在尝试用 java 编写一个 2D 乒乓球游戏。我遇到的问题是关于流动性。我使用图像(与大多数 2D 游戏一样)作为背景、桨和球。使用 Actionlistener 创建了游戏,并将它与一个计时器附加到游戏中。现在我只是在游戏循环中有这个代码用于碰撞。

@Override
public void actionPerformed(ActionEvent e) {

    if (ball.y <= 0 || ball.y + ball.height + 35 > HEIGHT) { // Horizontal
                                                                // Walls
                                                                // collision
        ballspeedY = -ballspeedY;
    }
    if (ball.x <= 0 || ball.x + ball.width + 5 >= WIDTH) { // Vertical Walls
                                                            // collision
        ballspeedX = -ballspeedX;
    }

    ball.y += ballspeedY;
    ball.x += ballspeedX;

    renderer.repaint();
}

还有这个绘图代码

public void repaint(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;

    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

    g2d.drawImage(backgroundImage, 0, 0, WIDTH, HEIGHT, null);
    g2d.drawImage(ball.image, ball.x, ball.y, ball.width, ball.height, null);
    g2d.drawImage(paddle.image, paddle.x, paddle.y, paddle.width, paddle.height, null);
}

问题是,当我增加球的速度时,它开始移动不顺畅。我做了一项研究并试图取消绘制背景图像。球开始移动得更顺畅了。我感到困惑的是,如果我有移动的背景或 100 个球或其他东西怎么办。我做错了什么,请有人告诉我应该使用哪种方式在屏幕上顺利移动这些对象。使用大得多的图像或背景甚至 3D 游戏的游戏移动得如此流畅,但我的简单乒乓游戏却没有。我做错了什么?

已解决:问题出在这一行: g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

这条线破坏了动画的流畅性。当我删除它时,一切都运行得非常快和流畅

【问题讨论】:

  • 当您说小球移动不顺畅时,它是在闪烁,还是似乎从一个位置跳到另一个位置而不是连续滑动?
  • 不闪烁,就像你说的第二个参数。从一个位置跳到下一个位置,而不是顺利滑动

标签: java graphics


【解决方案1】:

我无法完全回答您的问题,因为这实际上是一个复杂的主题。有多个不同的方面可以讨论,但每个方面本身就是研究材料。我将尝试涵盖基本思想:

多线程

首先,您的代码可能是按顺序执行的。每次actionPerformed 运行时,最后都会调用redraw。现在,基本上这将定义您的“帧率”。所以你的actionPerformed 越耗时(更复杂的代码),你的帧率就会越低。

为了解决这个问题,它自己的一个线程可以负责绘制游戏的实际状态。

球速与帧率无关

我不确定如何阅读您的代码。但据我所知,你的球速是一个整数。考虑到我上面写的东西。因此,在您当前的实现中,球速实际上定义了球每帧移动的距离。这是一个问题,因为这意味着游戏运行得更快/更慢取决于actionPerformed 的复杂性。即使我读错了你的代码,这也是需要考虑的事情。

解决它的一种方法是像上面提到的那样使用多个线程将计算和绘图分开。但是您可能还应该看看frame independent physics

100个球问题

如果您要在 actionPerformed 方法中计算所有 x 球的位置,则 x 越大,您的帧速率就会越慢。这又是由于上述原因。但我想在某一时刻你必须做进一步的优化,否则你的重新计算过程跟不上。虽然这个数字应该很高 - 但这是我缺乏经验的地方。

Graphics2D 不是 OpenGL

我不太熟悉 Java Graphics2D 的工作原理,但我对 OpenGL 有基本的了解。对于真正的游戏,OpenGL 几乎是必须的。甚至网络游戏也开始使用 WebGL(类似功能的浏览器支持界面)。这是您实际使用显卡的地方。尤其是 3D 游戏,但即使是简单的 2D 游戏,它的性能也确实是最好的。顺便说一句,智能手机游戏也是如此。

在这里是不可能的,所以我就让它保持原样。如果您对这些东西感兴趣,则需要更深入地学习它们。我想您的下一步是使用与帧率无关的计算。我不确定多线程的东西,因为它通常伴随着一堆困难......

【讨论】:

  • 首先,感谢您的指导。我真的在你的解释中得到了一些观点。并研究了一些关于 OpenGL 的信息。现在我即将决定切换到该库。因为我基本上了解了如何编写简单的游戏。我最后想问的是,有没有关于这个库的适当教程(尤其是视频)?我的意思是,例如,作为初学者,您是如何学习 OpenGL 的?
  • @TolgaŞen 老实说,我有机会在我的计算机科学研究中学习它。我想如果你想用 openGL 创建一个简单的 java 游戏,请尝试使用 JOGL (jogamp.org/jogl/www)。这是我首先使用的库。但我只想说,OpenGL 真的很复杂。所以也许你从你的 java Graphics2D 方法开始会更好。抱歉没有教程,也许你可以在 JOGL 页面上找到。
猜你喜欢
  • 2018-01-07
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多