NowLoading

Now loading...のやり方




むずでょ@muzudho1
ローダースレッドを使って画像読込をバックグラウンドで行ってみたぜ☆ ファイル読込が終わるまで フォアグランドでやることがないのでタイトル画面を出してみたのだが、並行処理の無駄遣いもいいところだぜ☆



3つのプログラムが同時に動いています。
1.「シーン」
    AIMSでは、シーンが動いており、毎フレーム行われる処理を書く場所があります。

2.「ファイル読込プログラム用」
    AIMSでは、同時に1つまで、「シーン」とは別に平衡して動くプログラムが書けます。
    ここにファイル読込を書けば、シーンを止めずにファイル読込を行えます。

3.「Now Loading...表示用」








1.解説1

好きな関数を、同時に1つまで、「ローディング・スレッド」(※)にすることができる。

  ※…「Now loading...」画面で、後ろ(バックグラウンド)で動いている関数。


ローディング・スレッドの実行方法は、startLoaderThread( "関数名" ) と書くだけです。



2.注意点

「ローディング・スレッド」は、1回は必ず動かしておいた方がよい。(AIMS1.50の場合)

「startLoaderThread( ) 」を使ってないときに「isLoaderRunning( )」を使うと強制終了するから。(AIMS1.50)
(なんで false を返さずに強制終了するんだ?)



3.解説2

「まだ、ローディング・スレッドが動いていますか」の確認には、
isLoaderRunning( ) 関数を使う。

この関数が true を返すと、Now loading...の最中ということです。
この関数が false を返すと、ローディングは完了した、ということです。

ここで先ほどの注意点でも触れているように、
「ローディング・スレッドはまだ1回も動いていないですよ」というときには 強制終了 した。
早いうちに空っぽの関数を startLoaderThread( ) しておくと、この問題は解消する。






『suica32』での利用例

『suica32』では、game_common.luaに書かれている「initializer」という名前の関数が ローディング・スレッド として利用されている。

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
function logo_OnStart()
    ~中略~
    startLoaderThread("initializer");
    ~中略~
    startThread("logo_Thread");
end
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Now Loading... 用のプログラムと、
Now Loading... が終了するまで待つプログラムの2つが並行して動いています。




initializer関数は次の通り。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-- 各種初期化ルーチンを一斉に呼び出す
function initializer()
    for index,func in pairs(INITIALIZER_LIST) do
        func();
    end
end    
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛



logo_Thread関数は次の通り。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
function logo_Thread()
    ~中略~ ※ここでロゴを表示する処理

   wait(230);
    while isLoaderRunning() do
        wait(1);
    end
    ~中略~
end
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛



~_OnStep関数では次の通り。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
function logo_OnStep()
    if(isLoaderRunning()==false and isAlive(actor_text)) then
        vanish(actor_text);
    end
    if((isLoaderRunning()==false and isJoyPressed(0,BUTTON_TRIG1)==true) or isThreadRunning()==false)then
        changeScene("title");
    end
end
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛



game_common.lua には、

INITIALIZER_LIST = {}

というテーブルがあり、このテーブルには関数が入っている。次の通り。


function bullets_init()
  --中略
end
table.insert( INITIALIZER_LIST, bullets_init );


アクターの書かれた .lua ファイルの ~_init() 関数を追加していっている。





Now loading... 中には、~_init()関数が呼び出されているといえる。
これは AIMSの仕様ではなく、『suica32』の仕様のようだ。


  • 最終更新:2013-10-05 21:26:18

このWIKIを編集するにはパスワード入力が必要です

認証パスワード