2017-03-21 4 views
0

BEANTWORTET - Racing ZustandBoolean nicht wie erwartet ändern

Das ist also die Klasse für das Spiel, das ich mache, dass erzeugt Hindernisse, jedes Mal, wenn ein Hindernis Bildschirm erlischt es das Hindernis entfernt und fügt zu der Partitur. Das funktioniert gut, aber der Boolesche Wert (plusScore) ändert sich nicht in wahr, wenn er erwartet wird.

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 
      } 
     } 

Diese (unten) ist, wo ich für die Boolesche bin Aufruf enthalten ich den ersten Teil des Verfahrens, da ich nicht sicher war, ob es möglich Konflikt sein könnte.

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!"); 
    } 
} 

[Nur das Streck-Verfahren funktioniert gut zu klären, wenn es keine if-Anweisung ist.] Wenn das Problem liegt auf der Hand Ich entschuldige mich, ich bin nach einem Tutorial zum ersten Mal und beschlossen, etwas für mich zu versuchen, .

+0

ist diese Bedingung erfüllt: objections.get (objections.size() - 1) .getRectangle(). Top> = Constants.SCREEN_HEIGHT –

+0

Ja, es funktioniert und erhöht die Punktzahl um 10 jedes Mal, wenn sie vom Bildschirm gehen (I habe im Emulator nachgecheckt) – George

+0

Ich vermute einen Rennzustand.Versuchen Sie, den Boolean in 'draw' nicht in' update' zurückzusetzen -> setzen Sie plusScore = false; 'als erste Anweisung in' if (plusScore) '. Werden 'update' und' draw' auf verschiedenen Threads aufgerufen? Wenn ja, versuchen Sie es flüchtig zu machen. – Fildor

Antwort

1

Ich sehe zwei Möglichkeiten:

  1. Ihr System langsam genug ist, dass unmittelbar danach boolean im ersten if im update() Verfahren einstellen, die Sie in den zweiten if landen und Sie die Variable auf false (Ich finde das ziemlich unwahrscheinlich, aber wenn du vielleicht in einer Art Emulator liegst? Es kann sich lohnen, eine Protokollierung vorzunehmen, um zu bestätigen, dass die Zeichnung zwischen der Einstellung dieser Variablen auf wahr und falsch liegt.

  2. Die plusScore Variable in Ihrer update() Methode ist nicht das gleiche wie die plusScore Variable in Ihrer draw() Methode. Sind beide Methoden in derselben Klasse? Ich kann sagen, dass Ihre plusScore Variable ein Feld aus Ihren Code-Schnipsel ist, aber wenn diese beiden Code-Schnipsel nicht in derselben Klasse sind, haben Sie es mit zwei völlig separaten Variablen zu tun.

1

Ihre plusScore wird auf false gesetzt werden, wird jedes Mal, update genannt. Versuchen Sie folgendes:

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)); 
    } 
} 

Die Ausgabe lautet:

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

Das bedeutet: weil Sie die aktuelle Zeit von long zu int werfen Sie einen Überlauf zu bekommen. Und deshalb wird Ihre letzte if-Anweisung in update immer wahr sein.

sollten Sie versuchen, wie int Vergleich von zwei verschiedenen Arten zu vermeiden und long (außer Ihnen 110% sicher sind, es ist das gleiche, aber dann sollten Sie in der Lage sein, die gleichen Typen zu verwenden). Ändern Sie tempTime zu lang, entfernen Sie die Besetzung und es wird funktionieren.

Ein weiterer Hinweis: plusScore und tempTime + 5 <= System.currentTimeMillis() hat die gleiche Semantik in diesem Beispiel. So können Sie plusScore loswerden und die if-Anweisung von update in draw verwenden, um das gleiche Verhalten zu erhalten.

Verwandte Themen