2016-08-01 2 views
0

나는 새가 화면을 만졌을 때만 날개를 펄럭 이는 flappy bird 같은 게임을 만들고 있지만 화면을 터치하면 애니메이션을 활성화하는 데 문제가 있습니다. 화면이 터치 그런Libgdx에서 Flappy Bird와 비슷한 애니메이션을 만드는 방법은 무엇입니까?

batch.draw(animation.getKeyFrame(myTimeState, false), x, y); //the myTimeState is 0 to render the 1st frame only. 

나는이 작업을 수행 :

//myTimeStep is just basically a controllable timeState for the animation only 

    if(Gdx.input.justTouched){ 
     myTimeState = timeState; 
    }else if(Gdx.input.justTouched == false && animation.isAnimationFinished(timeState)){ 
     myTimeState = 0; 
    } 

나는 myTimeStep 즉시 화면을 터치 마친 후 0이되기 때문에 애니메이션이 모든 프레임을 재생 할 수 있다고 생각하지 않습니다. 또한 나는 이것이 올바른 방식이라고 생각하지 않습니다. 만약 당신이 더 나은 아이디어 나 해결책을 가지고 있다면 도움을주십시오. 미리 감사드립니다.

+0

나는 잘 모르겠다. 화면을 터치 한 경우에만 애니메이션을 재생하고 터치 업하는 순간에 애니메이션을 정지 시키시겠습니까? –

+0

아니지만 그게 내 코드에서 일어나는 일이야. 나는 화면이 터치 될 때 새가 날개를 펄럭이고 애니메이션이 단순한 스프라이트가 된 후에 플 래피 새 같은 것을 원한다. –

답변

2

여기에는 여러 가지 방법이 있습니다. 물론 timeState를 증가시켜야하며, 또한 애니메이션의 길이와 반복 할 시간에 따라 다릅니다.

애니메이션을 한 번만 재생하도록 만든 다음 화면을 다시 터치 할 때까지 중지하면 화면을 터치 할 때 myTimeState를 0으로 설정 한 다음 매 프레임마다 증가시킬 수 있습니다. 애니메이션은 끝까지 도달하면 자체적으로 실행되고 "정지"됩니다 (루프가 없다고 말함). 다음에 누군가가 화면을 터치하면 myTimeState가 다시 0으로 설정되고 애니메이션이 다시 시작됩니다.

+0

고마워, 나는 처음에는 그것을 얻지 못했다. 그래서 화면을 만졌을 때 나는 timeState를 0으로 설정했습니다. –

+0

또 다른 질문으로 timeState를 0으로 설정하면 애니메이션이 아직 재생되지 않았다고 생각합니까? 애니메이션이 다시 재생되는 이유는 무엇입니까? –

+0

시간 상태를 증가시키는 것을 잊지 마십시오. 그것은 바로 열쇠입니다. timestate 0에 애니메이션의 첫 번째 이미지가 표시됩니다. 게임에서, 당신은 Gdx.graphics.getDeltaTime()처럼 델타 시간만큼 시간 상태를 증가시킵니다. 렌더링 할 때, 애니메이션 클래스는 누적 된 시간을 기반으로 표시 할 이미지를 결정합니다. anim.을 반복하지 않으면 timestate가 image * timePerFrame (애니메이션 생성자)을 전달하면 렌더링에 애니메이션의 마지막 이미지가 지속적으로 표시됩니다 (비공 비행 img 일 수 있음). timestate를 다시 0으로 설정하고 애니메이션을 다시 시작합니다 (시간이 증가하는 경우) –

0

먼저 애니메이션의 playmode가 Animation.PlayMode.NORMAL로 설정되어 있는지 확인해야합니다. 기본 설정이지만 LOOPED 어딘가에 설정하면 아무 것도 예상대로 작동하지 않습니다.

둘째,이 경우에는 Input.justTouched()를 사용하지 않습니다. 대신 입력 프로세서의 리스너가 가장 적합 할 것입니다. 다음은 Stage의 예입니다. 어떤 입력 프로세서가 뭔지 모르시는 분은 event handlingclass documentation에 대한 자습서를 참조하십시오.

stage.addListener(new ClickListener() { 
     @Override 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
      if(button == Input.Buttons.LEFT) { 
       timeState = 0; 
      } 
      return super.touchDown(event, x, y, pointer, button); 
     } 
    }); 

당신은 내가 그것을 확인하지 않은하지만 가능성이 있음, 거기

if(animation.isAnimationFinished(timeState)) { 
     //draw some sprite 
    } else { 
     //draw animation keyframe 
    } 

animation.isAnimationFinished의 결과()을 기반으로 (애니메이션의 키 프레임 또는 스프라이트) 표시 할 무슨 일이 일어나고 있는지 선택할 수 있습니다 마지막 프레임이 잘라내 지도록 유도 할 수 있습니다. 왜냐하면 animation.isAnimationFinished()가 true를 반환 할 것이므로 표시되는 즉시. 나는 틀릴 수도있어, 당신은 그것을 확인해야 할 것입니다. 문제가되면 스프라이트를 애니메이션의 마지막 프레임으로 추가 할 수 있습니다. 애니메이션이 끝나면 마지막 프레임에서 frezzes가되며 정적 스프라이트가됩니다. 큰에

  1. 설정 시간 단계 : 당신이 당신의 애니메이션 나는이 개 솔루션을 참조 0 동일한 타임 스텝 때문에 게임의 시작 부분에서 연주거야 두 경우 모두

    , 나는 두 번째를 취할 조언 숫자는 애니메이션의 지속 시간보다 큽니다. 그런 다음 Animation.isAnimationFinished()가 true를 반환합니다.
  2. 각라고 isAnimationFinished(), 중 false로 설정됩니다,
  3. 이 당신의 클릭 리스너에 true로 설정됩니다,

    • 이 false로 초기화됩니다 :

    • 부울 변수가 있음을 isAnimationPlayed 소개 frame isAnimationPlayed가 true 인 경우에만 표시 할 내용을 결정하기 위해 draw() 메서드에서

    • 이 사용됩니다.
0

당신은 당신의 timeState 애니메이션의 지속 시간을 설정할 수 있습니다.

+0

무엇을 의미합니까? 예를 들어 각 프레임은 0.33으로 렌더링되므로 timeState = 0.33을 수행해야합니까? 시간 상태는 timeState + = deltaTime이어야합니다. –

관련 문제