Skip to content
第33回 見た目とアニメーションの接続

1 / 1 見た目と行動の接続 ​

このステップの目的

行動状態から表示コマを選び、戦闘の数値と見た目を独立させます。

第33回の到達版では、移動時に姿を切り替え、攻撃時に前へ少し動いて見せます。被弾時は色が短時間変わります。素材は最初から使っており、この回では表示の切り替えを仕上げます。

見た目の設定 ​

Visuals.csvは画像、コマの寸法と列数、待機・移動・攻撃の開始コマと枚数、毎秒のコマ数、足元の基準位置、倍率を持ちます。コマ番号は0から始まり、左から右、上から下へ数えます。1枚絵は各状態を同じ1コマに設定できます。

BattleView.cppの無名名前空間にあるFrameを実装します。Motion::Idle、Move、Attackで開始コマと枚数を選び、秒数 × 毎秒のコマ数の整数部分を枚数で割った余りから表示コマを求めます。

Draw内のbounceの計算を、移動中はstd::sin(unit.animationSec * 16) * 2、それ以外は0に変更します。これは描画位置の上下動で、戦場の中心X座標は変更しません。攻撃時の前進表示、左右反転、被弾時の色変更は提供済みです。

戦闘への影響を調べる ​

Visuals.csvの青い兵のfpsを6から12へ変えて起動し直します。姿の切り替えは速くなりますが、攻撃間隔0.5秒とダメージ8は変わらないことを観察してください。BattleView::Drawがconst Battle&を受け取り、戦闘状態を書き換えないことを確かめます。

表示が忙しすぎる場合は、性能の攻撃間隔とは別に表示速度を調整します。確認後はfpsを6へ戻します。軽装兵と攻撃兵の同じ画像は、候補の名前と戦場の種類名で判別できます。密集した同種の個体は先頭に名前と体数をまとめて表示します。

実装後に比較する参考コード
Source/TowerDefense/BattleView.cppcpp
int Frame(const VisualDefinition& visual, Motion motion, double seconds)
{
    int first = visual.idleFirst;
    int count = visual.idleCount;
    if (motion == Motion::Move) { first = visual.moveFirst; count = visual.moveCount; }
    if (motion == Motion::Attack) { first = visual.attackFirst; count = visual.attackCount; }
    return first + static_cast<int>(seconds * visual.framesPerSec) % count;
}
チェックリスト

今回の変更箇所を指し示し、観察した結果とその理由を説明できますか。実験後の値とファイルを確認して次へ進みます。

ゲームプログラミング実践