1

在我的游戏中,我使用了一个名为的布尔变量

onScreen

并且每次游戏开始时都设置为 true。我还有一个叫做 int 的变量

onScreenTime

游戏开始时设置为180。这些用于在一定时间内在屏幕上描绘文本“为 Wave X 做准备”。由于 onScreenTime 为 180,而 fps 为 60,因此文本仅显示 2 秒。2 秒后,onScreen 设置为 false,游戏继续。编码:

if (onScreen){
        g.setFont(new Font("Geneva", Font.BOLD, 50));
        g.setColor(Color.BLACK);
        g.drawString("Prepare for wave: " + currentLevel,400,500);
}

仅当 onScreen = true 时才在屏幕上绘制文本。以下代码在 update() 方法中,并操作了到目前为止提到的两个变量:

onScreenTime--;
    if (onScreenTime == 0){
        onScreen = false;
}

基本上,每次调用 update()(每秒 60 次)时,onScreenTime 都会减少 1,如果它等于 0,则 onScreen = false。然后在同一个 update() 方法中,我有两个 if 语句应该是不言自明的:

if (score > 500){
        currentLevel = 2;
        onScreen = true;
        onScreenTime = 180;
}
if (score > 1000){
        currentLevel = 3;
        onScreen = true;
        onScreenTime = 180;
}

最后,在同一个 update() 方法中,我有

if (currentLevel == 1 && onScreen == false){
        wave(2,enemyP,100);
}
if (currentLevel == 2 && onScreen == false){
        wave(3,enemyP1,90);
}
if (currentLevel == 3 && onScreen == false){
        wave(3,enemyP2,80);
}

currentLevel 决定敌人,他们绘制的图像,一次在屏幕上绘制多少,以及它们产生的频率。wave() 是一种为每个级别创建波浪的方法。它表示为:

public void wave(int amount, Image i, int seconds){
    for (int x = amount; x > 0; x--){
        if (frameCount % seconds == 0){
            Random r = new Random();
            int randX = r.nextInt(width - 20)+10;
            army.add(new EnemyShip(randX,(int)(Math.random()*100)-300,enemyH,enemyW,i,10));
        }
    }
}

i 是图像,enemyH 和enemyW = 30,10 是生命。这将在以后更改。我的问题是,一旦出现“准备波:2”文本,它就不会消失。第一个“准备波:1”可以正常工作并消失,但第二个不会,因此不会产生任何敌人。

编辑:正如评论中指出的那样,我写了 2 秒,应该是 3 秒。编辑:我将以前的方法更改为:

if (onScreenTime <= 0){
        onScreen = false;
        onScreenTime = 180;
}

并将以前的方法更改为:

if (score == 500){
        currentLevel = 2;
        onScreen = true;
        onScreenTime = 180;
}
if (score == 1000){
        currentLevel = 3;
        onScreen = true;
        onScreenTime = 180;
}

每击中一次,分数就会上升 20 分。我认为问题在于我将其设置为 if(score > 500) 而不是 == 500。

4

2 回答 2

0

这部分不应该:

onScreenTime--;
if (onScreenTime == 0){
    onScreen = false;
}

同时重置 onScreenTime:

onScreenTime--;
if (onScreenTime <= 0){
    onScreen = false;
    onScreenTime = 180;
}
于 2014-09-08T23:40:46.957 回答
0

尝试改变

onScreenTime--;
if (onScreenTime == 0){
    onScreen = false;
}

onScreenTime--;
if (onScreenTime <= 0){
    onScreen = false;
    onScreenTime = 180;
}

竞争条件可能导致 onScreenTime 低于零,从而导致难以跟踪的问题。

将 onScreenTime 重置回 180 将(很可能)使您当前的问题消失。

顺便提一句:

由于 onScreenTime 为 180,而 fps 为 60,因此文本仅显示 2 秒。

我希望它是 3 秒:180/60=?

于 2014-09-08T23:43:17.757 回答