2016-08-01 6 views
0

私は、画面に触れたときだけ鳥が羽ばたくフラッフィー鳥のようなゲームを作成していますが、画面に触れたときにアニメーションを起動する際に問題があります。画面をタッチした後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をインクリメントする必要があります。また、アニメーションの長さやループしたいかどうかによって異なります。

アニメーションを1回再生するように作成してから停止すると(画面が再びタッチされるまで)、画面に触れたときにmyTimeStateを0に設定し、フレームごとに増やすことができます。ループが終了したときにアニメーションが実行され、ループが終了したときにアニメーションが停止します。次に誰かが画面に触れると、myTimeStateが0に戻され、アニメーションが再び開始されます。

+0

ありがとう、私は最初にそれを取得しませんでした。だから私が画面に触れたとき、私はただtimeStateを0に設定しました。 –

+0

timeStateを0に設定すると、アニメーションがまだ再生されていないとゲームは考えますか?それがアニメーションが何度も繰り返される理由なのでしょうか? –

+0

時間の状態を増やすことを忘れないでください。それが鍵です。タイムスタート0で、アニメーションの最初のイメージが表示されます。あなたのゲームでは、Gdx.graphics.getDeltaTime()のようにいくつかのdeltaTimeだけ時間状態をインクリメントします。レンダリングすると、アニメーションクラスは蓄積したタイムスタンプに基づいてどのイメージを表示するかを決定します。アニメーションをループしないと、timestateがimages * timePerFrame(アニメーションコンストラクタ)を渡すと、アニメーションの最後のイメージが継続的にレンダリングされます(非飛行imgでもかまいません)。 timestateを0に戻し、アニメーションを再開します(タイムスタンプが増えた場合) –

0

まず、アニメーションのプレイモードがAnimation.PlayMode.NORMALに設定されていることを確認する必要があります。これはデフォルトの設定ですが、LOOPEDのどこかに設定すると、期待どおりに動作するものはありません。

第2に、この場合は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); 
     } 
    }); 

あなたは)animation.isAnimationFinished(の結果に基づいて、(アニメーションのキーフレームまたはスプライト)が表示されるように何が起こっているか

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

を選ぶことができ、私はそれをチェックしていませんが、可能性があります、このこと表示されるとすぐにanimation.isAnimationFinished()がtrueを返すため、最後のフレームが切り取られる可能性があります。私は間違っているかもしれないので、あなたはそれをチェックしなければならないでしょう。それが問題になる場合は、スプライトをアニメーションの最後のフレームとして追加できます。アニメーションが終了すると、最後のフレームでフリーズします。これは静的なスプライトになります。タイムステップ0に等しい私は2つのソリューションを参照してくださいので、どちらの場合も、

は、あなたのアニメーションがゲームの最初にプレイしますよ、私は2番目を取ることをアドバイス:

  1. セットのタイムステップ大にアニメーションの長さよりもはるかに大きい数値です。 Animation.isAnimationFinished()はtrueを返します。

  2. はブール変数を導入することをisAnimationPlayed:

    • がfalseで初期化され
    • があなたのクリックリスナーでtrueに設定されます、
    • がそれぞれ呼ばれisAnimationFinished()、中にはfalseに設定されますframe isAnimationPlayedがtrueの場合のみ、
    • がdraw()メソッドで使用され、何を表示するかが決定されます。
0

あなたは自分のtimeStateアニメーションの継続時間を設定することができます。

+0

どういう意味ですか?例えば、各フレームは0.33のためにレンダリングされるので、私はtimeState = 0.33を行うべきですか?時間状態はtimeState + = deltaTimeである必要があります。 –

関連する問題