読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

コルーチンは素敵

PSPLuaが使えるので早速コルーチンです。最初コルーチン使うとエミュが落ちるのでなんでだ〜と試験期間中にも関わらずさけんでいたのですが、すぐに原因が判明しました。luaL_openlibsの呼び忘れでした。夜風に当たると色々ひらめくものです。
以下コルーチンを試してみたのです。

th06_psp_application::th06_psp_application() : lua_(lua_open()) {
  luaL_openlibs();
  // Luaから使うC++関数を登録
  luaL_dofile(lua_.get(), "test.lua");
  lua_getglobal(lua_.get(), "init");
  lua_pcall(lua_.get(), 0, 0, 0);
}
// メインループから毎回呼ばれる
void th06_psp_application::update() {
  lua_getglobal(lua_.get(), "update");
  lua_pcall(lua_.get(), 0, 0, 0);
}
-- draw_box(x, y, width, height, rgb, alpha, angle) C++側で用意

function init()
  co = coroutine.create(fade_in)
end

function fade_in()
  local i = 0
  local alpha = 0xFF
  while i < 32 do
    draw_box(0, 0, 480, 272, 0x000000, alpha, 0)
    coroutine.yield()
    i = i + 1
    alpha = alpha - 0xFF / 32
  end
  while true do
    draw_box(0, 0, 480, 272, 0x000000, 0x00, 0)
    coroutine.yield()
  end
end

function update()
  coroutine.resume(co)
end

Luaシンタックスハイライト効くんですね。感動です。
で、普通ならグローバルな状態変数を使って分岐するコードを書かなければならないところ、ストレートな実行順に書くことが出来ます。この書き方が見やすいかどうかは人それぞれだと思いますが、状態変数がローカルに置けるコルーチンはそれだけでも優秀な気がします。因みにdraw_boxでRGB値とアルファ値で引数を分けているのはPSP浮動小数演算が普通のPCで言うところのfloat相当の精度しかないので32bit整数値をまともに扱えないからです。