鳥小屋.txt

主に自作ゲームをつくったりしているよ。制作に関することやそうじゃないことのごった煮ブログ

メインループなう

はてなダイアリーのテーマを変更してみました。前のはデフォで用意されてたやつをそのまま使っていたら、一部ブラウザですごいことになってるのに気付いて突貫工事したものだったので、ちゃんとしたやつに変更しました。ただ、はてなダイアリーのテーマの仕様がまだよくわかってないので一部変なところがあるかもです。
それでは本題。一応、前回のメインループの話の続き。

いろいろ考えたんですが結局Lua側にメインループを置くことにしました。おかげさまでリロード時の処理とかちょっと面倒になったんですが、まぁ誤差(?)の範囲ということにしておきます。

-- メインループ
function sysMain()
    while #g_scene > 0 do
        g_scene[#g_scene]:update();	   -- シーン更新
        local ret = System:update();   -- 画面描画
        if ret ~= 0 then               -- システムによる強制中断
            return ret;
        end
    end
    return 0;
end

g_sceneはLuaのテーブルをスタックっぽく使って、シーンクラスのオブジェクトを放り込んでいます。もともとあるシーンを維持したまま他のシーンを呼び出せるようにしたかった*1のでスタックみたいな感じにしてます。シーンが1つも無くなったらループ終了でおしまい。
System:update()はC++側の処理を呼び出しています。画面描画とか1/60秒待つ処理とかはその中に全部入れてあります。System:update()の戻り値は通常時は0で、閉じるボタンとかAlt+F4でゲームが終了されたりすると0以外の数値が返ってきます。リロード処理とかもこの辺りで。

メインループはこんな感じで収まったんですが、今はリロード処理をどうしようと悩み中。特にコルーチンはリロードしたらまずいよなぁ……コルーチンはリロードしない版とコルーチンも初期化しちゃう版の2種類のリロードを用意しておこうかな。

*1:マップ移動シーン中に戦闘シーンを呼び出して戦闘終わったら戻ってくる……みたいなのが簡単に書けると信じて!