2016-11-25 8 views
0

Ich arbeite an einem Spiel, das Sprites im zweidimensionalen Raum nutzt, und ich versuche, einen besseren Weg zu finden, an einem bestimmten Punkt anzuhalten.Bessere Möglichkeit, an einem bestimmten Punkt anzuhalten?

Ich habe die folgende bekommen zu arbeiten:

public void target(boolean hasTargetIn, Point target) { 

    if (hasTarget) { 
     deltaX = target.getX() - this.mPos.getX(); 
     deltaY = target.getY() - this.mPos.getY(); 
     mDirection = Math.atan2(deltaY,deltaX); 

     mVelocityX = Math.cos(mDirection) * mSpeed; 
     mVelocityY = Math.sin(mDirection) * mSpeed; 
    } 
    hasTarget = hasTargetIn; 

} 

public void move(Point target) { 

    if (mPos.getX() != target.getX() + 3 && mPos.getY() != target.getY() + 3) { 

     this.mPos.x += mVelocityX; 
     this.mPos.y += mVelocityY; 
    } 
} 

Hier sind die Argumente, die ich auf das Verfahren gebe:

sprite.target(true, new Point(700,305)); 
sprite.move(new Point(700,305)); 

Aber dies erfordert mich den target.getX zum Ausgleich () um 3 in der move() -Methode, da die X-Werte zwischen 703 und 697 schwanken, wenn das Sprite die Position erreicht (also bleibt es einfach dort jitterlos ohne die Logik, die ich in der move() -Methode eingeschlossen habe). Gibt es einen besseren Weg, um sich an einem bestimmten Punkt zu bewegen und anzuhalten?

Antwort

1

Verwenden Sie einfach den Abstand zum Ziel. Wenn die Entfernung größer als die Geschwindigkeit ist, bewegen Sie sich wie normal, wenn die Entfernung kleiner ist als die Geschwindigkeit, dann verschieben Sie einfach die Distanz.

Sie müssen atan2, sin und cos nicht verwenden, um das normalisierte DeltaX zu erhalten, Y können Sie einfach die Deltas durch die Entfernung teilen. Tut dasselbe wie richt und benutze sin und cos.

deltaX = target.getX() - this.mPos.getX(); 
    deltaY = target.getY() - this.mPos.getY(); 
    // get the distance 
    mDist = Math.sqrt(deltaX * deltaX + deltaY * deltaY); 
    if(mDist > 0){ 
     if(mDist < mSpeed){ 
      mVelocityX = deltaX; 
      mVelocityY = deltaY; 
     }else{ 
      mVelocityX = (deltaX/mDist) * mSpeed; 
      mVelocityY = (deltaY/mDist) * mSpeed; 
     } 
    }else{ 
     mVelocityX = 0; 
     mVelocityY = 0; 
    } 
0

Sie speichern die Richtung. Könntest du nicht einfach aufhören, dich zu bewegen, nachdem sich die Richtung um etwa (!) 180 Grad verschoben hat?

Auf der anderen Seite könnte es passieren, dass Ihre Geschwindigkeit zu schnell sein könnte (in anderen Fällen), also würden Sie nicht über 3 aber vielleicht 300 Pixel gehen, also wenn Sie (mit der Richtung) erkannt haben, dass Sie vorbeigelaufen sind Das Ziel, du drehst mit kleinerer Geschwindigkeit zurück und hörst (wie ich vorher bemerkt habe) auf, als du das Ziel mit niedriger Geschwindigkeit wieder passierst.

Verwandte Themen