我正在使用Java Swing开发一款射击类型的视频游戏,我正在使用Java Swing Timer来控制所有的屏幕更新。主屏幕使用BorderLayout,我在BorderLayout中包含的Panel上执行我的图形,并使用AWT Graphics调用来绘制。
现在随着我的游戏进展,我想加快我的屏幕对象(船只)的移动,但我仍然希望它们能够顺利地穿过屏幕。我想我可以通过将Java Swing Timer的超时值降低到5ms左右来完成任务。但是,我注意到当我将它设置为小于15毫秒的任何东西时,似乎没有太大区别。一旦超过该阈值,性能几乎没有明显差异。 - 为什么? -
另一个选择是增加每艘船每次更新移动的像素数,但超过3或4像素的东西,事情开始看起来有些跳跃。
有什么想法吗?并且真的想要将游戏保留在Swing中,在这一点上更倾向于不移植到第三方库。
感谢。
答案 0 :(得分:1)
很可能,这不是软件问题,也不是软件可修复的问题。您的屏幕可能每秒仅刷新约60次,这意味着帧每秒仅绘制60次,或者每隔(大约)16毫秒绘制一次。由于这是一个硬件障碍,因此无法通过软件更快地进行更新。你可以指望你的用户只有60Hz的显示器,所以更值得研究其他解决方案。
浮现在脑海中的一个解决方案是增加运动模糊,使它看起来像船只在它们真的没有时移动得更快。它会让你在看起来有点跳跃之前“跳”更远的距离,因为模糊会让人觉得它的速度非常快,而不是跳过屏幕。不幸的是,我看到做动作模糊的唯一事情是第三方库,尽管你可能有更好的运气谷歌搜索。
答案 1 :(得分:-1)
我建议您更换用于JavaFX的Swing引擎(至少),这是一种性能更好的技术,可以使用更多工具。如今的Swing被认为是一种死技术,以及之前的AWT。学习和启动JavaFX的好地方就是这个:
http://docs.oracle.com/javase/8/javase-clienttechnologies.htm
开发游戏的理想选择是使用为其准备的库,例如libGDX:
http://libgdx.badlogicgames.com/
但如果你想在Swing中创造一个游戏,我该判断谁?有时看到旧东西很好。我自己仍然喜欢Swing,甚至比其他东西都过时了。
我认为你可能正在实施一个错误的游戏循环。 Swing Timer似乎不是更新游戏逻辑的好方法。即使在不同的计算机之间设置不同,通常也很实用且易于实现游戏环以正常工作,尤其是对于角色的正确移动。
你知道,游戏循环是游戏的核心,需要直接实施,否则游戏开发错误,并有几个限制。通常,在游戏循环中我们必须考虑所需的FPS。在游戏更新中,我们必须花费上次更新和当前更新之间经过的时间,即许多开发人员所谓的增量。你会在互联网上找到很多关于它的资料,我建议:
http://dewitters.koonsolo.com/gameloop.html
http://www.java-gaming.org/index.php?topic=21919.0
https://www.youtube.com/watch?v=9dzhgsVaiSo
过去的链接会对您有所帮助,但如果您想了解更多信息,我建议您查看一下这本书:
http://www.brackeen.com/javagamebook/
即使是旧的材料(如Swing),你会发现如何使用键盘和鼠标输入系统实现良好游戏循环的细节,声音,使用最佳性能摇摆必须提供,以及其他酷的东西。还有一件事......为了给你一个关于角色运动的更好结果,我建议你使用位置变量(X和Y)和十进制类型,如float或double。
我希望你能做你想做的事。祝你好运!