グラデーションスクエア
画像が気にいったのでアンビエント的なものにしてみた。 - 永字八法の続き。
これは背景画像の下に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系命令で扱うことができる。うまく立ち絵の一部に変形して貼り付けてれば、呪われた貴公子ゲイナーの鎧が表現できるかも。わかりにくい表現だ。