布尔值未按预期更改

时间:2017-03-21 13:14:36

标签: java if-statement boolean

答案 - 比赛条件

所以这就是我制造的游戏类产生的障碍,每当障碍物离开屏幕时它就会消除障碍并增加分数。这样可以正常工作,但布尔值(plusScore)在预期时不会变为true。

public void update() {
            //
            if(obstacles.get(obstacles.size() - 1).getRectangle().top >= Constants.SCREEN_HEIGHT) {
                int xStart = (int)(Math.random()*(Constants.SCREEN_WIDTH - playerGap));
                obstacles.add(0, new Obstacle(obstacleHeight, color, xStart, obstacles.get(0).getRectangle().top - obstacleHeight - obstacleGap, playerGap));
                obstacles.remove(obstacles.size() - 1);
                score += 10;
                plusScore = true; //Problem here
                tempTime = (int)System.currentTimeMillis();
            }
            if (tempTime + 5 <= System.currentTimeMillis()) {
                plusScore = false; //Unsure if working as relying on above
            }
        }

这(下面)是我要求布尔的地方,我包括方法的第一部分,因为我不确定是否可能存在冲突。

public void draw(Canvas canvas) {
   for(Obstacle ob : obstacles)
       ob.draw(canvas);
   Paint paint = new Paint();
   paint.setTextSize(100);
   paint.setColor(Color.BLACK);
   canvas.drawText(" " + score, 50, 50 + paint.descent() - paint.ascent(), paint);

   if(plusScore) { //This is what the Boolean should effect
       Paint paint2 = new Paint();
       paint2.setTextSize(100);
       paint2.setColor(Color.GREEN);
       drawPlusScore(canvas, paint2, "+10!");
   }
}

[只是为了澄清当没有if语句时draw方法正常工作。] 如果问题很明显,我道歉,我第一次关注教程并决定为自己尝试一些事情。

2 个答案:

答案 0 :(得分:1)

我看到两种可能性:

  1. 您的系统速度足够慢,在if方法的第一个update()中设置该布尔值后,您立即进入第二个if并将变量设置为false(我发现这很不可能,但如果您在某种模拟器中运行可能会?)。可能值得进行一些记录以确认绘图发生在您将此变量的设置设置为true和false之间。

  2. plusScore方法中的update()变量与plusScore方法中的draw()变量不同。这两种方法都属于同一类吗?我可以说你的plusScore变量是你的代码片段中的一个字段,但是如果这两个代码片段不在同一个类中,那么你正在处理两个完全独立的变量。

答案 1 :(得分:1)

每次调用plusScore时,update都会设置为false。试试这个:

public class CheckTime {
     public static void main(String []args){
        int tempTime = (int) System.currentTimeMillis();
        long longTime = System.currentTimeMillis();
        System.out.println("As long: " + longTime);
        System.out.println("As int: " + tempTime);
        System.out.println("Check: " + (tempTime + 5 < longTime));
     }
}

输出结果为:

As long: 1490102795366
As int: -250856346
Check: true 

这意味着:因为您将当前时间从long转换为int,所以会出现溢出。这就是为什么你update中的最后一个if语句永远都是真的。

您应该尽量避免比较两种不同的类型,例如intlong(除非您确定它是相同的,但您应该能够使用相同的类型)。将tempTime更改为长,删除演员,它将起作用。

另一个提示:plusScoretempTime + 5 <= System.currentTimeMillis()在此示例中具有相同的语义。因此,您可以摆脱plusScore并使用updatedraw的if语句来获得相同的行为。