2013-07-25 56 views
0

美好的一天親愛的先生們。我遇到了我角色的動畫和控制問題。我的問題是每當我嘗試按左右箭頭鍵時,我的播放器上下移動而不是左右移動。我確實試圖調試我的代碼,但我仍然無法找出哪部分代碼是錯誤的。這就是爲什麼我要求你們查看我的代碼,並可能知道哪部分代碼是錯誤的或者需要改進。Libgdx:人物運動與動畫

這是我爲我的球員代碼:

public class DugmanPlayer { 
    public enum state 
    { 
     standby, 
     walking, 
     digging, 
     dying 
    } 

    public enum dir 
    { 
     left, 
     right, 
     up, 
     down 
    } 

    public static float WIDTH; 
    public static float HEIGHT; 
    static float speedmax = 30f; 
    static float damping = 0.9f; 
    dir d = dir.up; 

    public Vector2 position = new Vector2(); 
    public Vector2 speed = new Vector2(); 
    state st = state.walking; 

    public float statetime = 0; 

    public void UpdatePlayer(float deltatime) 
    { 
     if(deltatime==0)return; 
     statetime += deltatime; 
     //rightwalking 
     if(Math.abs(speed.x) > speedmax) { 
      speed.x = Math.signum(speed.x) * speedmax; 
      if(d != dir.left)d = dir.right; 
      st = state.walking; 
     } 

     if(Math.abs(speed.x) < 1) { 
      speed.x = 0; 
      if(st!=state.walking)st = state.standby; 
      d=dir.right; 
     } 
     //upwalking 
     if(Math.abs(speed.y) > speedmax) { 
      speed.y = Math.signum(speed.y) * speedmax; 
      if(d != dir.down)d = dir.up; 
      st = state.walking; 
     } 

     if(Math.abs(speed.y) < 1) { 
      speed.y = 0; 
      if(st != state.walking)st = state.standby; 
      d=dir.up; 
     } 

     if(Math.abs(-speed.x)>speedmax) 
     { 
      speed.x = Math.signum(-speed.x) * speedmax; 
      if(d != dir.right)d = dir.left; 
      st = state.walking; 
     } 
     if(Math.abs(-speed.x)<1) 
     { 
      speed.x = 0; 
      if(st!=state.walking)st = state.standby; 
      d=dir.up; 
     } 

     if(Math.abs(-speed.y)>speedmax){ 
      speed.y = Math.signum(-speed.y) * speedmax; 
      if(d != dir.up)d = dir.down; 
      st = state.walking; 
     } 
     if(Math.abs(-speed.y)<1) 
     { 
      speed.y = 0; 
      if(st!=state.walking)st = state.standby; 
      d=dir.down; 
     } 

     speed.scl(deltatime); 

     position.add(speed); 
     speed.scl(1/deltatime); 

     // Apply damping to the velocity on the x-axis so we don't 
     // walk infinitely once a key was pressed 
     speed.x *= damping; 
     speed.y *= damping; 

     InputProcess(); 
    } 

    TextureRegion left; 
    TextureRegion right; 
    TextureRegion up; 
    TextureRegion down; 
    TextureRegion standby; 
    Animation Walkingleft; 
    Animation WalkingRight; 
    Animation WalkingUp; 
    Animation WalkingDown; 
    Animation stndbyleft,stndbyright,stndbyup,stndbydown; 

    public void LoadPlayerTexture() 
    { 
     TextureAtlas dug = new TextureAtlas(Gdx.files.internal("character/walking.pack")); 
     left = dug.findRegion("faceleft"); 
     right = dug.findRegion("faceright"); 
     up = dug.findRegion("faceup"); 
     down = dug.findRegion("facedown"); 

     TextureRegion[] leftwalk = left.split(left.getRegionWidth()/3, left.getRegionHeight()/1)[0]; 
     TextureRegion[] rightwalk = right.split(right.getRegionWidth()/3, right.getRegionHeight()/1)[0]; 
     TextureRegion[] upwalk = up.split(up.getRegionWidth()/3, up.getRegionHeight()/1)[0]; 
     TextureRegion[] downwalk = down.split(down.getRegionWidth()/3, down.getRegionHeight()/1)[0]; 

     Walkingleft = new Animation(0.5f, leftwalk[0],leftwalk[1],leftwalk[2]); 
     WalkingRight = new Animation(0.5f, rightwalk[0],rightwalk[1],rightwalk[2]); 
     WalkingUp = new Animation(0.5f, upwalk[0],upwalk[1],upwalk[2]); 
     WalkingDown = new Animation(0.5f, downwalk[0],downwalk[1],downwalk[2]); 

     stndbyleft = new Animation(0, leftwalk[1]); 
     stndbyright = new Animation(0, rightwalk[1]); 
     stndbyup = new Animation(0, upwalk[1]); 
     stndbydown = new Animation(0, downwalk[1]); 

     DugmanPlayer.WIDTH = 1/16f * leftwalk[0].getRegionWidth(); 
     DugmanPlayer.HEIGHT = 1/16f * leftwalk[0].getRegionHeight(); 
    } 

    public void DrawPlayer(float deltatime, OrthogonalTiledMapRenderer r) 
    { 
     Animation fm = null; 
     boolean loop = true; 

     switch (st) { 
     case standby: if(speed.y == 0){ 
     fm = stndbyup; 
     } 
     else if(-speed.y == 0){ 
     fm = stndbydown; 
     }else if (speed.x == 0) { 
     fm = stndbyright; 
     }else if (-speed.x == 0) { 
     fm = stndbyleft; 
     } 
      break; 
     case walking: if(speed.y>speedmax){ 
     fm = WalkingUp; 
     }else if(-speed.y>speedmax){ 
     fm = WalkingDown; 
     }else if (speed.x>speedmax) { 
     fm = WalkingRight; 
     }else if (-speed.x>speedmax) { 
     fm = Walkingleft; 
     } 
     break; 
     case digging: 
      break; 
     case dying: 
      break; 
     default: 
      break; 
     } 


     SpriteBatch batch = r.getSpriteBatch(); 

     batch.begin(); 
     batch.draw(fm.getKeyFrame(statetime, loop), position.x, position.y, WIDTH, HEIGHT); 
     batch.end(); 
    } 

    public void InputProcess() 
    { 
     if(Gdx.input.isKeyPressed(Keys.UP) || Gdx.input.isKeyPressed(Keys.W)) { 
      if(st != state.standby)st = state.walking; 
      speed.y += speedmax; 
      d = dir.up; 
     } 
     else if(Gdx.input.isKeyPressed(Keys.DOWN) || Gdx.input.isKeyPressed(Keys.S)) { 
      if(st!=state.standby)st = state.walking; 
      speed.y = -speedmax; 
      d = dir.down; 
     } 
     else if(Gdx.input.isKeyPressed(Keys.LEFT) || Gdx.input.isKeyPressed(Keys.A)) { 
      if(st!=state.standby)st = state.walking; 
      speed.y = -speedmax; 
      d = dir.left; 
     } 
     else if(Gdx.input.isKeyPressed(Keys.RIGHT) || Gdx.input.isKeyPressed(Keys.D)) { 
      if(st!=state.standby)st = state.walking; 
      speed.y += speedmax; 
      d = dir.right; 
     } 
     else 
     { 
      st = state.standby; 
      speed.x = 0; 
      speed.y = 0; 
     } 
    } 
} 

我做了與我的性格類是它將包含所有的輸入,我的性格,渲染動畫到特定的狀態和方向。

回答

1
else if(Gdx.input.isKeyPressed(Keys.LEFT) || Gdx.input.isKeyPressed(Keys.A)) { 

      if(st!=state.standby)st = state.walking; 
      speed.y = -speedmax; 
      d = dir.left; 

     } 


     else if(Gdx.input.isKeyPressed(Keys.RIGHT) || Gdx.input.isKeyPressed(Keys.D)) { 

      if(st!=state.standby)st = state.walking; 
      speed.y += speedmax; 
      d = dir.right; 

     } 

你不覺得,美shuld在此代碼:)

+0

由於使用speed.x代替speed.y的!它確實有效。我現在可以左右移動,但現在我的問題是動畫。它是否必須對我的更新方法或繪圖方法做任何事情?我的動畫所需要的是,只要按住我的向下鍵,我的動畫就會步行,當我釋放鍵時,動畫就會變成stndbydown。 –

+0

那你在哪裏?按下按鈕是下來動畫運行,但在釋放按鈕它不來standbydown?還是別的?你有沒有試過,直到現在? – Pranav008

+0

我試着將speed.y改成speed.x,這讓我的玩家已經左右移動了。我的動畫沒有用我的鍵響應,它應該做的是每當我按住它時,動畫就會向上走,一旦釋放我的向上鍵,動畫就會變爲stndbyup。那麼,我之前嘗試的是改進我的更新方法,但它仍然沒有任何好處。我似乎無法找到什麼是錯的。 –