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フォルダに入れておけば自動的に読み込んでくれますってのは、昔っからこんな仕様だったっけ?