踏みつけ その3

ぺしゃんこの図

潰れるアニメーションも追加しました。
差分
実装としては、

  1. 踏まれたらスプライトを潰れたものに変更
  2. 移動用コルーチンを5フレーム後に消滅するものに変更

となっています。
なお、移動ルーチン側からキャラクタを消滅させるため、スプライトの番号=-1を消滅指示用に割り当てました。


「5フレーム後に消滅」のために次の関数オブジェクトを作成しました。

class vanish_routine
{
public:
    // 引数は消滅までのフレーム数
    explicit vanish_routine(std::size_t frames) : frames_(frames)
    {
    }

    routine_result vanish_routine::operator()(
        routine_type::self& self,
        move_info mv, std::size_t form, input_command cmd) const
    {
        acceleration a;
        a.ax = 0.0f;
        a.ay = 0.0f;

        // ウェイト
        for (std::size_t i = 0; i < frames_; ++i)
            boost::tie(mv,form,cmd) = self.yield(std::make_pair(a, form));

        // 消滅
        return std::make_pair(a, sprite_info_list::nform);
    }

private:
    std::size_t frames_;
};

この関数オブジェクトはキャラクタに依存しないので、コルーチンをこれに差し替えるだけで任意のキャラクタを消すことができます。