目次
その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
(スペースキー)だったら、攻撃アニメを再生、攻撃アニメが終了していたら、待機アニメを再生、としています。
これで、なんか戦えそうな感じになりました。
次は、攻撃の当たり判定を実装してみようと思います。