4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rust + Entity Component System で仕様変更に強いゲーム設計 その4ー3〜 アニメーションを動かす

Last updated at Posted at 2020-02-03

目次

その1 〜 序文
その2 〜 キャラの移動
その3−1 〜 コンポーネントの設計
その3−2 〜 システムの設計
その3−3 〜 メイン部分
その4−1 〜 剣を表示
その4−2 〜 アニメーションコンポーネント
【イマココ】その4-3 〜 アニメーションを動かす
その5-1~ あたり判定
その5-2~ やられアニメーション
その6 〜 これまでの振り返り

アニメーションを動かそう

前回は、アニメーションを動かす仕組みを実装しましたので、今回はアニメーションを実際に動かしたいと思います。

実は当初、アニメーションを動かすための、ステートマシンを導入しようとして、実際に実装までやったのですが、今の段階でステートマシンを導入しても、後でいろんな要件が出てきたときに、単純な状態遷移だけでは管理しきれなくなりそうだな、と思ってやめました。

こちらが、そのステートマシンを導入した状態のソースです。
興味のある方は、見てみてください。
最新コミットでは、ステートマシンの仕組みは削除されています。

ということで今回は単純に

  • スペースキーが押されたら、攻撃アニメーション
  • 攻撃アニメーションが終わったら、待機アニメーション再生(ループ)

だけを実装します。

Animatorを更新するシステムの実装を、下記の様に書き換えます。
(前回まででは、単に update() を呼ぶだけでした)

impl SystemProcess for System<CContainer<CharacterAnimator>, CContainer<Input>>
{
    fn process(animators: &mut Self::Update, inputs: &Self::Refer) {
        animators.iter_mut().zip_entity(inputs).for_each(|(a, i)| {
            if let Some(id) = a.playing_id() {
                if id == CharacterAnimID::Attack && a.is_end() {
                    a.play(CharacterAnimID::Wait);
                }
            }
            if i.attack {
                a.play(CharacterAnimID::Attack);
            }
            a.update()
        });
    }
}

inputの状態を見て、attack (スペースキー)だったら、攻撃アニメを再生、攻撃アニメが終了していたら、待機アニメを再生、としています。

これで、なんか戦えそうな感じになりました。

次は、攻撃の当たり判定を実装してみようと思います。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?