因此,我正在用JAVA创建一个等距游戏;简而言之,它有一个由图块组成的地图,当用户在屏幕上拖动鼠标时,地图就会移动。为了给大家一个主意,目前看起来像这样:
在实际的原型版本之前,我构建了一个小的Java应用程序,该应用程序本身没有“ Game Loop”。唯一更新平铺地图位置的事件是鼠标拖动的事件侦听器,并且在移动更新后调用了repaint()方法。它工作正常,我可以选择“图块”并移动地图而不会出现问题。
从那时起,我用游戏状态管理器和真实的游戏循环来重建原型思维,以开发更像真实游戏引擎的东西。游戏循环代码如下所示:
init();
long start;
long elapsed;
long wait;
while(running){
start = System.nanoTime();
update();
draw();
drawToScreen();
elapsed = System.nanoTime() - start;
wait = targetTime - elapsed / 1000000;
if(wait < 0)wait = 5;
try{
Thread.sleep(wait);
} catch(Exception e) {
e.printStackTrace();
}
}
GameStateManager需要使用update()和draw()方法,因此我可以像较早的原型一样绘制地图。当我在屏幕上拖动鼠标以使地图可以移动时,发生了问题。动画变得非常怪异,在某种程度上,我实际上可以看到在所有图块的最终位置之前,图块之间的黑色背景在移动。
起初,我认为问题出在Game Loop线程和主类的事件侦听器之间并发,因为可以在JPanel试图绘制地图时调用mouseDragged事件。然后我在游戏循环代码中对此进行了测试:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
draw();
drawToScreen();
}
});
//draw();
//drawToScreen();
现在,原型可以正常工作了。
因此,我的问题是,这种性能是否很沉重,或者只是Java中的一种不好的做法?另外,我的“并发”假设正确吗?这是我第一次使用Java处理线程,所以我真的不知道我是否以正确的方式处理了这个问题。
obs:这是我制作的整个类,其中包含游戏循环:http : //pastebin.com/RMRHYc5X
obs2:如果有人感兴趣,那么我从事的游戏循环逻辑是基于pj644制作的YouTube Java教程,名为“ Java 2D Game Programming”。
obs3:对不起,如果问题太大,这是我第一次在此网站上发布问题!
Swing并不是真正的写游戏技术,它更新缓慢且在很多方面受到限制。
话虽如此,当您的游戏线程完成工作后,调用yesinvokeLater
或使用aSwingWorker
是更新屏幕的正确方法。
在进一步介绍之前,我确实建议您看一下2d或3d java图形和游戏框架。这样一来,您将可以获得更好的结果,并且在设置游戏循环,更新,管理帧频等方面的许多工作都将为您完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句