「Wキー」と「Shiftキー」が同時に押されたとき、ドワーフを走らせます。

○「走る」状態のアニメーションと走る速度を示す変数が必要です。走る速度は走るアニメーションが再生されているとき、ドワーフの足が滑っているように見えないようにします。.5f が十分に適切な値であることが分かりました。
  1. // Add this as a member variable
  2. const float RUN_SPEED = .5f;
  3.  
○歩いているとき、「Wキー」と「Shiftキー」が同時に押下された場合、「走る」状態に移行し始めます。これらのアニメーションの間で正しく動作させるため、手動で時間を動くアニメーションで設定する必要があります。次のソースコードを「歩く」状態に追加して下さい。
  1. // Add this to the "else if (state == "walk")" block in UpdateState
  2. if (keyState.IsKeyDown(Keys.LeftShift) && keyState.IsKeyDown(Keys.W))
  3. {
  4. blendFactor = 0;
  5. state = "walkToRun";
  6. run.SpeedFactor = 0;
  7. }
  8.  
○この部分は慎重を要します。幸運にも「歩く」状態と「走る」状態の両方のアニメーションには、開始と終了のフレームに互換性があります。両方の開始フレームはドワーフの足の位置が似ています。しかし再生期間は異なります。この問題を「走る」状態のアニメーションの経過時間をスケーリングし、「歩く」状態のアニメーションの経過時間と同期を取ることで解決します。これは公式で行えます。「走る」状態のアニメーション時間 = (「歩く」状態のアニメーション時間) / (「歩く」状態のアニメーション再生期間) * (「走る」状態のアニメーション再生期間)。速度も同じようにスケーリングされます。「歩く」状態から「走る」状態に移行する完全なソースコードは次のようになります。
  1. // Add this to the UpdateState method
  2. else if (state == "walkToRun")
  3. {
  4. blendFactor += .05f;
  5. if (blendFactor >= 1)
  6. {
  7. blendFactor = 1;
  8. run.SpeedFactor = 1;
  9. state = "run";
  10. }
  11. double factor = (double)walk.ElapsedTime / walk.AnimationSource.Duration;
  12. run.ElapsedTime = (long)(factor * run.AnimationSource.Duration);
  13. currentSpeed = WALK_SPEED+ blendFactor * (RUN_SPEED-WALK_SPEED);
  14. foreach (BonePose p in poses)
  15. {
  16. p.CurrentController = walk;
  17. p.CurrentBlendController = run;
  18. p.BlendFactor = blendFactor;
  19. }
  20. }
  21.  
○このパターンはほとんどの「走る」状態から「歩く」状態への直接移行に使用されます。新しい「走る」状態を作成して下さい。
  1. else if (state == "run")
  2. {
  3. currentSpeed = RUN_SPEED;
  4. if (keyState.IsKeyUp(Keys.LeftShift))
  5. {
  6. blendFactor = 0;
  7. state = "runToWalk";
  8. walk.SpeedFactor = 0;
  9. }
  10. foreach (BonePose p in poses)
  11. {
  12. p.CurrentController = run;
  13. p.CurrentBlendController = null;
  14. }
  15. }
  16.  
○blendFactor が増加するとドワーフが減速することを覚えていなければならないこと以外は、「走る」状態から「歩く」状態への移行は、「歩く」状態から「走る」状態への移行のパターンと同じです。
  1. else if (state == "runToWalk")
  2. {
  3. blendFactor += .05f;
  4. if (blendFactor >= 1)
  5. {
  6. blendFactor = 1;
  7. walk.SpeedFactor = 1;
  8. state = "walk";
  9. }
  10. double factor = (double)run.ElapsedTime / run.AnimationSource.Duration;
  11. walk.ElapsedTime = (long)(factor * walk.AnimationSource.Duration);
  12. currentSpeed = WALK_SPEED + (1f - blendFactor) * (RUN_SPEED - WALK_SPEED);
  13. foreach (BonePose p in poses)
  14. {
  15. p.CurrentController = run;
  16. p.CurrentBlendController= walk;
  17. p.BlendFactor = blendFactor;
  18. }
  19. }
  20.  
チュートリアルはこれで終わりです!

最終更新:2009年06月21日 12:50