RPGマップ風
nslua実験中:RPG風マップ移動処理(09/09/07)
最小限の実装で、うまく作ってあるなあ。
スクリプトとしても、面白い実装がいくつかあって参考になる。
特に、map.lua
function hoge() -- 長いスクリプト end hoge() -- hogeを実行。 hoge = nil -- 実行した後は証拠隠滅
なんだこれ(笑) まあ、一度しか実行しない関数は、実行後定義を削除して少しでもメモリーを浮かそうってことなんだろうけど。
本体の解読
luagameと言う命令は、いわゆるドラクエ風の動きを実装した命令で、これを実行すると一定の条件を満たさない限り、ずっとドラクエ風になる。
終了条件は、NSCOM_luagameの中盤の
if (map[mx+1][my+1]==2) then NSDCopyToBg() return end
の部分。
マップ単位での現在位置(mx, my)が、2番(階段)だった場合、ドラクエ風移動画面を終了するようになっている。
戻ってくると、
階段を踏みました。\
と表示、改ページ待ちして、すぐにluagameに戻るようになっている。
意図の考察
本来、luagameは情報を返す機構をつけるべきで、それによって、NScripter側でどんなイベントが発生したかを判断、分岐・ループさせるのが想定した使い方だろう。
このサンプルスクリプトの場合は、発生するイベントが「階段を踏んだ」以外にないので、判断や分岐は必要ない。
実際に使うには、「階段を踏んだ」だけでは足りず、当然「どの階段を踏んだか」も返さなければならない。そうでないと、マップのつながりを定義できないからだ。
他にも「階段を踏んだ」以外にワンダリング・モンスターとか、トラップとか、店とか街とかの条件を設定できなければならない。
ぶっちゃけ、一度移動するごとに「なにを踏んだか」の情報を返してもいいと思うんだがな。
その辺の実装は個人の趣味かなー。
いや、そこじゃないだろ。
新命令がたくさんだ。
NSDclear()で、なんか新しく作ったレイヤーの初期化。
NSDBlt()で、この新しいレイヤーに、指定したスプライトの一部分をコピーして貼り付ける。
NSDsp()で、この新しいレイヤーに、指定したスプライトをコピーして貼り付ける。
NSDPresent()で、この新しいレイヤーを実際の画面に反映させる。
NSDCopyToBg()で、現在の画面を背景画像にする。(その後なら、テキストウィンドウも表示できる)
って、この「新しいレイヤー」って、drawレイヤーとは別物なのか?
応用
- シューティングの背景とかに使えそう。
- 頑張れば敵味方の表示もできそうだなあ。
dllフォルダ
dllはdllフォルダに入れておけば自動的に読み込んでくれますってのは、昔っからこんな仕様だったっけ?