2013-07-25 7 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; 

     } 

는 u는이 코드 :

+0

덕분에 speed.y 대신 speed.x를 사용 shuld 생각하지 말아! 그것은 효과가있었습니다. 이제는 왼쪽과 오른쪽으로 움직일 수 있지만 내 문제는 이제 애니메이션입니다. 그것은 내 업데이트 방법이나 무승부 방법으로 무엇을해야합니까? 내 애니메이션에서 원했던 것은 내 다운 키를 길게 누를 때마다 내 애니메이션이 워킹 다운이 될 것이고 키를 놓으면 애니메이션이 stndbydown이됩니다. –

+0

그래서 어디 stucking입니까 ?? 버튼을 누르면 아래로 애니메이션 실행하지만 버튼을 석방에 standbydown 오지 않을거야 ?? 또는 다른 것? wot는 지금까지 시도했다 ???? – Pranav008

+0

speed.x를 speed.x로 변경해 보았습니다. 내 선수가 왼쪽과 오른쪽으로 이미 이동했습니다. 내 애니메이션이 내 키에 응답하지 않습니다. 키를 누를 때마다 애니메이션이 걷는 것이고 키를 놓으면 애니메이션이 stndbyup이됩니다. 음, 내가 묻기 전에 시도한 것은 업데이트 방법을 개선하는 것이지만 여전히 좋은 결과는 얻지 못했습니다. 나는 틀린 것을 발견하는 것처럼 보일 수 없다. –

관련 문제