routine_state

yield()の引数と戻り値が多く、コルーチン内の処理が分かりづらくなってきたので、引数と戻り値をまとめたroutine_stateを作成し、コードを整理しました。
routine_state.hpp
差分


これで移動アルゴリズムがはっきりするようになりました。
例えばstraight_routineはこうなります。

routine_result straight_routine::operator()(
    routine_type::self& self,
    rect r, velocity v, sprite_form form, input_command cmd) const
{
    // routine_stateを作成
    acceleration a;
    routine_state stat(self,r,v,form,cmd,a);

    while (true)
    {
        // 停止
        stat.stop();
        stat.yield();

        // 前進開始
        stat.accelerate(speed_);
        stat.yield();

        // 何かにぶつかるまで等速で前進
        a.ax = 0.0f;
        while (v.vx != 0.0f)
            stat.yield();

        // Uターン
        stat.turn();
    }

    HAMIGAKI_COROUTINE_UNREACHABLE_RETURN(routine_result())
}


まだプレイヤーキャラクタ用のplayer_routineはごちゃごちゃしたままです。
せっかくコルーチンを使っているのに状態を保存するフラグが散在していて分かりにくいです。
これはもう少し整理しないと駄目ですね。