2016-08-06 5 views
0

私はSlick2Dの新人です。私は自分のキャラクターとの動きを試しています。移動キーを押しながらスムーズに移動させることができますが、移動を終了して次のタイルで正確に停止するようにしたい(タイル32x32の単純なマップがある)。それは次のタイルに移動するので私にとっては問題ですが、そこにはテレポートがあります。動きは瞬時で、私のキャラクターは同じスピードで動き続けます。Slick2Dでは、キーを離してもキャラクターを動かし続ける方法は?

私は例えば、私のupdate()方法でこのような何か試してみました:

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

     } 
    } 

を、私はそれを動作させるcan't。

答えて

0

update()の方法では、while()xCoordを計算することはできません。その理由は、それがupdate()メソッドの1回の実行で計算され、その後、render()メソッドが呼び出されて文字をレンダリングするためです。つまり、文字はwhile()の後にレンダリングされ、テレポートされます。

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

変数movingを移動キーを押した後にtrueに設定されている:

は、ここに私のソリューションです。今度はrender()の呼び出しのたびに、文字はちょうどupdate()に移動され、正確にタイルに来るまでこの新しい位置にレンダリングされます。

0

"xSpeed"と "ySpeed"を設定し、 'characterAnimation'が設定されている場所と正確なタイルになっているかどうかに応じてこれらの値を設定してみませんか?

何かのように:

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; 
} 
// ... 

私は実際にあなたのコード(またはslick2d)がどのように動作するか分からないので、私はcharacterAnimation.update(delta)が呼び出されたときにxCoord値が魔法のように考慮されていると仮定しました。それ以外の場合は、xCoordに従ってキャラクターの位置を更新する必要があります。

関連する問題