我试图用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);
这条线破坏了动画的流动性。当我删除它时,everthing运行非常快速和流畅
答案 0 :(得分:2)
我无法完全回答你的问题,因为这实际上是一个复杂的主题。谈论有多个不同的方面,但每个方面本身都在研究材料。我将尝试涵盖基本想法:
<强>多线程强>
首先,您的代码可能全部按顺序执行。每次actionPerformed
运行时,它都会在结束时调用redraw
。现在,基本上这将定义你的帧率#39;因此,actionPerformed
越耗时(代码越复杂),帧速率就越低。
为了解决这个问题,它上面的一个帖子可以注意画出游戏的实际状态。
球速与帧速率无关
我不确定如何阅读您的代码。但从我看到的情况来看,你的空速是一个整数。考虑一下我上面写的东西。因此,在您当前的实现中,ballpeed实际上定义了球每帧移动的距离。这是一个问题,因为它意味着游戏运行得更快/更慢,具体取决于actionPerformed
的复杂性。即使我读错你的代码,这也是需要考虑的事情。
解决这个问题的一种方法是将计算和绘图与上面提到的多个线程分开。但你应该看看frame independent physics。
100球问题
如果你要计算actionPerformed
方法中所有x球的位置,那么你的帧速率越大,x越大。这也是因为上述事情。但我想有一点你必须做进一步的优化,否则你的重新计算过程就无法跟上。虽然这个数字应该很高 - 但这是我缺乏经验的地方。
Graphics2D不是OpenGL
我不太熟悉Java Graphics2D的工作原理,但我对OpenGL有基本的了解。对于真正的游戏,OpenGL几乎是必须的。甚至webgames也开始使用WebGL(浏览器支持的界面用于类似的功能)。这是您实际使用图形卡的功能。特别是对于3D游戏,但即使对于简单的2D游戏,它也是性能最佳的。顺便说一句,智能手机游戏也是如此。
覆盖那里是不可能的,所以我只是保持原样。如果您对这些事情感兴趣,您需要更深入地学习它们。我想你的下一步是使用帧率独立计算。我不确定多线程的东西,因为它通常伴随着一堆困难......