我的java游戏有问题。我是初学者,但我必须把它写成一个学校项目 游戏被称为“生日蛋糕”,蛋糕上有7个蜡烛,其中一个正在显示为30秒,在这段时间你必须点击它才能得到点,如果你在这段时间没有点击它下一支蜡烛将显示。 10个蜡烛显示时游戏结束 我做了循环,我试图让它工作太久,以至于我因挫折感而死亡 我的for循环工作,但它是如此之快,我使用Thread.sleep(1000),我尝试了很多解决方案,它看起来不错。但是,当我开始游戏时,没有任何事情发生,几秒钟后,所有7支蜡烛显示并迅速消失。我想我做错了什么,但我不知道是什么。
if(Dane.start){
int liczbaLosowa = 0;
for(int i=0; i<10 ;i++){
liczbaLosowa = (int)(Math.random()*7);
this.wspX= wspX_p[liczbaLosowa];
this.wspY= wspY_p[liczbaLosowa];
g2d.drawImage(plomienImg, wspX, wspY,null);
Toolkit.getDefaultToolkit().sync();
try {
Thread.sleep(1000);
} catch (Exception ex) { }
//repaint();
}
Dane.start=false;
}
答案 0 :(得分:5)
此循环位于JPanel paintComponent ...
中
从不,
的从不,强>
在Thread.sleep(...)
内召唤paintComponent
。请理解,此方法在很大程度上决定了程序的感知响应能力,任何减慢程序速度或冻结它的程序都会严重降低和冻结GUI。实际上你永远不应该在大多数Swing程序的代码中调用Thread.sleep(所有这些都在Swing事件线程上运行),但是在paintComponent中这样做是更糟糕的罪。解决方案是使用Swing Timer,并在Timer的ActionListener的actionPerformed代码中定期重复调用您想要被调用的代码。在此方法中,更改类中字段所持有的值,例如wspX和wspY,调用repaint()
,然后使用paintComponent中的那些字段来确定在哪里绘制的内容。
答案 1 :(得分:0)
Thread.sleep()是一个糟糕的调用,可能导致很多问题。我被告知永远不要使用它。相反,我会告诉你我做游戏循环的方式。它可能不是完美的游戏循环,但它很好。
我建议实现runnable并将循环放在run方法中。
public void run(){
init(); //initialisation of images, sound..etc. will be executed once only
int fps = 60 //number of update per second.
double tickPerSecond = 1000000000/fps;
double delta = 0;
long now;
long lastTime = System.nanoTime();
while(running){
now = System.nanoTime();
delta += (now - lastTime)/tickPerSecond;
lastTime = now;
if(delta >= 1){
tick();
render();
delta--;
}
}
}
private void init(){
//initialisation image, sound, loading world, generate maps....etc
}
private void tick(){
//tick player, world, entities..etc
}
private void render(){
//render graphics.
}
也不要忘记为线程创建启动和停止方法。你可以将fps改为你想要的数字,不需要高于60。