gpt4 book ai didi

Java Applet,游戏循环第一次运行良好,然后重置时,更新速度减半

转载 作者:行者123 更新时间:2023-12-01 15:12:41 26 4
gpt4 key购买 nike

所以对于我正在创建的游戏,我意识到我的 gameLoop 出了问题,因为我第一次玩游戏时它运行得很好,但第二次或之后的任何事情,它的速度减慢了大约一半。即使我最小化游戏(因为这会停止 gameLoop,然后再次启动它会重新启动),这里是 gameLoop 代码:

public void gameLoop(){

new Thread(){
public void run() {
while(gameRunning){
try {
Thread.sleep(1000/60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (tutorial){
updateBullet();
updatePlayer();
repaint();
} else {
updateEnemies();
updateBullet();
createEnemies();
updateParticles();
updatePlayer();
repaint();
}

}
repaint();
}
}.start();
}

我第一次在 init() 中启动它,只需使用

gameLoop();

然后我还有:

public void stop(){
bg.stop();
gameRunning = false;
}
public void start(){
bg.start();
gameRunning = true;
gameLoop();

}

最后,playerUpdate 也会停止循环(玩家内部的线程是为了允许一些效果在玩家死亡后完成):

 public void updatePlayer(){
if (player.isMovingLeft){
player.x-=3;
}
if (player.isMovingRight){
player.x+=3;
}
for (int j=0; j < enemies.size(); j++){
if (player.isAlive){
if (enemies.get(j).x+19 > player.x && enemies.get(j).x < player.x+40 && enemies.get(j).y > player.y && enemies.get(j).y < player.y+40) {
enemies.remove(j);
j--;
explode.setFramePosition(0);
explode.start();
for (int k = 0; k <21; k++){
addParticle(player.x+20,player.y+20,2);
}
new Thread(){
public void run() {
try {
Thread.sleep(2000);
gameRunning = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();

player.isAlive = false;
break;

}
}
}
}

然后在 keyPressed 事件中重新启动:

if (!gameRunning){
if (arg0.getKeyCode() == KeyEvent.VK_ENTER){
enemies.clear();
bullets.clear();
particles.clear();
score = 0;
player.x = 200;
player.isMovingLeft = false;
player.isMovingRight = false;
player.isAlive = (true);

gameRunning = true;
gameLoop();
}
}

那么为什么每当循环停止并再次启动时,它都会以一半的速度运行?谢谢!

最佳答案

看起来您正在为每个游戏循环启动一个新线程;这意味着每次游戏循环运行时,都会有另一个线程供 Java VM 处理。这是极其低效的,因为最终您将运行 1000 个线程,从而导致巨大的延迟。有什么方法可以重写代码而不需要线程吗?

另外,这是做什么的?

                try {
Thread.sleep(1000/60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

为什么你会选择 1000/60? A:为什么不直接用16呢? B:看来你的意思是别的,但不确定是什么

另外,您在 start()stop() 方法中引用的 bg 变量是什么?

关于Java Applet,游戏循环第一次运行良好,然后重置时,更新速度减半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com