2016-08-06 33 views
0

Ich bin neu in Slick2D und ich versuche Bewegungen mit meinem Charakter. Ich kann dafür sorgen, dass es sich reibungslos bewegt, während ich die Bewegungstaste halte, aber ich möchte auch, dass der Charakter seine Bewegung beendet, so dass er genau auf dem nächsten Plättchen stoppt (ich habe eine einfache Karte mit Kacheln 32x32). Und das ist ein Problem für mich, denn es bewegt sich zu den nächsten Kacheln, aber es teleportiert sich dorthin - die Bewegung ist augenblicklich und ich möchte, dass mein Charakter einfach mit seiner Bewegung mit der gleichen Geschwindigkeit weitermacht.Wie wird der Charakter nach dem Loslassen der Taste in Slick2D weiter bewegt?

Ich habe versucht, zum Beispiel so etwas wie dies in meiner update() Methode:

else if (input.isKeyPressed(Input.KEY_D)) 
    { 
     characterAnimation = characterAnimationRight; 
     characterAnimation.update(delta); 
     xCoord = (int) xCoord; 
     while (xCoord%32 != 0) 
     { 
      xCoord += 1; 
      characterAnimation.update(delta); 
      if (xCoord > Window.WIDTH - 32) 
      { 
       xCoord = Window.WIDTH - 32; 
      } 

     } 
    } 

aber ich kann es nicht funktioniert.

Antwort

0

Die Lösung ist nicht xCoord in while() in der update() Methode zu berechnen. Der Grund dafür ist, dass es im Einzellauf der Methode update() berechnet wird und danach die Methode render() aufgerufen wird, um das Zeichen zu rendern. Das bedeutet, dass der Charakter danach while() gerendert wird und teleportiert wird.

Hier ist meine Lösung:

@Override 
public void update(GameContainer gc, StateBasedGame s, int delta) 
     throws SlickException { 

    // ....... 

    if (moving) 
    { 
     if (movingDirection == DIR_RIGHT) 
     { 
      if (xCoord >= targetCoord) 
      { 
       xCoord = targetCoord; 
       moving = false; 
      } 
      else 
      { 
       xCoord += delta * 0.1f; 
       characterAnimation.update(delta); 
       if (xCoord > Window.WIDTH - 32) 
       { 
        xCoord = Window.WIDTH - 32; 
       } 
      } 
     } 
     else if (movingDirection == DIR_LEFT) 
     { 
      if (xCoord <= targetCoord) 
      { 
       xCoord = targetCoord; 
       moving = false; 
      } 
      else 
      { 
       xCoord -= delta * 0.1f; 
       characterAnimation.update(delta); 
       if (xCoord < 0) 
       { 
        xCoord = 0; 
       } 
      } 
     } 
     else if (movingDirection == DIR_UP) 
     { 
      if (yCoord <= targetCoord) 
      { 
       yCoord = targetCoord; 
       moving = false; 
      } 
      else 
      { 
       yCoord -= delta * 0.1f; 
       characterAnimation.update(delta); 
       if (yCoord < 0) 
       { 
        yCoord = 0; 
       } 
      } 
     } 
     else if (movingDirection == DIR_DOWN) 
     { 
      if (yCoord >= targetCoord) 
      { 
       yCoord = targetCoord; 
       moving = false; 
      } 
      else 
      { 
       yCoord += delta * 0.1f; 
       characterAnimation.update(delta); 
       if (yCoord > Window.WIDTH - 32) 
       { 
        yCoord = Window.WIDTH - 32; 
       } 
      } 
     } 
    } 
} 

Variable moving gesetzt ist wahr, nachdem die Bewegung Taste drücken. Nun wird nach jedem Aufruf von render() der Charakter ein wenig in die update() verschoben und an dieser neuen Position gerendert, bis er genau auf der Kachel liegt.

0

Warum versuchen Sie nicht, eine "xSpeed" und "ySpeed" zu haben, und setzen Sie diese Werte nach wo die 'characterAnimation' eingestellt ist und ob Sie auf einer exakten Kachel sind oder nicht?

Etwas wie:

else if (input.isKeyPressed(Input.KEY_D)) { 
    characterAnimation = characterAnimationRight; 
} 

// ... 

if (characterAnimation == characterAnimationRight){ 
    xSpeed = 1; 
} 
else if (characterAnimation == characterAnimationLeft){ 
    xSpeed = -1; 
} 
xCoord += xSpeed; 
characterAnimation.update(delta); 
if(xCoord % 32 == 0) { 
    xSpeed = 0; 
} 
// ... 

Ich weiß nicht wirklich, wie Sie Ihren Code (oder slick2d) arbeitet, so nahm ich an der xCoord Wert auf magische Weise berücksichtigt wird, wenn characterAnimation.update(delta) genannt wird. Ansonsten tue alles, was du brauchst, um die Position deines Charakters gemäß xCoord zu aktualisieren.