グラデーションスクエア

画像が気にいったのでアンビエント的なものにしてみた。 - 永字八法の続き。

これは背景画像の下にRBGを変化させたレイヤーを重ねてる?

だいたいそんな感じです。より正確に、面白くないように言うと、二つのテクニックを使ってます。
1.通常の画像をマスク画像として、色の白い部分を透過させた影絵を作る。(「lsp 10,":mimage.png;>800,600,#000000",0,0」の部分)
2.1で作った画像の奥に、ファイル無長方形を、定期的に色を変えながら表示する。
これによって、このサンプルの「空の色がじんわり変わる映像」を作っています。(さらに詳しく言うならば、色の変化のさせかたにcosを使用することで、よりじんわり感を以下略)
で、この機能をだいたいLuaに置き換えた物を作りました。
http://www.eiji8pou.pics/download/gradsquare.zip
ついでに、click待ち中にも変化できるように対応しました。

解説

まず、gradsquare.luaを、NL_dofile("gradsquare.lua")で読み込みます。これで、色が変化する長方形が使えるようになります。

square = gradsquare.new(sp, width, height)

これで、色が変化する長方形が一つできました。
引数は、spが使うスプライト番号、width, heightが長方形のサイズです。引数なしだと、それぞれ、100, 640, 480がデフォルトの値として採用されます。800*600で背景に使いたいなら、900, 800, 600くらいがいいんではないでしょうか。
サンプルでは省略していますが、この後さらに三つの正数を指定できます。三つの正数はそれぞれRGBの変化の速さで、数値が大きいほどゆっくりになります。デフォルトでは5, 7, 11が採用されます。
こうやってできたオブジェクトsquareに対し、action()メソッドを実行することで、ちょっとずつ色が変わっていきます。

square:action()

ちなみに引数にtrueを与えると、ついでにNSUpdate()も実行します。普通は必要ないと思います。
さて、NSLuaでは、define節にNSCALL animationを宣言することで、スプライトのセルアニメと同じタイミング(多分)で、Lua側のNSCALL_animation()が呼ばれます(つまり普通なら毎秒何十回も、と言うこと)。
そのNSCALL_animation()内にsquare:action()を記述すると、定期的に短期間に何度も実行されることになります。

function NSCALL_animation()
	square:action() -- 普通はtrueは要らない。
	return true -- ここで自動的にNSUpdate()が呼ばれるので。
end

このようにして、「じんわり変化」が実装されます。

その他

squareオブジェクトは、色々オプションをいじることでさらに細かく操作できます。以下にそのオプションを列挙します。
=で指定した値はデフォルト値です。

square.sp = 100 -- スプライト番号
square.x = 0 -- スプライトのx座標
square.y = 0 -- スプライトのy座標
square.alpha = 255 -- スプライトの不透過度
square.visible = true -- スプライトを表示するかしないか
square.speed = 0.04 -- 全体的な色の変化速度。正の数。0に近いほどゆっくり。

応用

square.visible = false としておいて、その上で定期的にsquare:action()を実行し続けたならば。
そうやって作られた画像をdrawsp系命令で扱うことができる。うまく立ち絵の一部に変形して貼り付けてれば、呪われた貴公子ゲイナーの鎧が表現できるかも。わかりにくい表現だ。

今後の展開

「空の上の方から徐々に色が変わっていくほんまもんのグラデーションやったらかっこええやろなあ」
理論上できますけど、かなりの量のメモリーを食いますね。
右から左、あるいは左から右に色が変化するなら、もっと少ないメモリーで済む……はず。