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