グラデーションスクエア2の続き。

グラデーションスクエア2 - 永字八法の続き。
http://www.eiji8pou.net/download/gradsquare2_20090929.zip
NScripterの側から、ある程度の操作ができるようにしてみました。

導入

まず、「gradsquare2.lua」が必須です。これを、「system.lua」の中から呼びだす必要があります。以下、system.luaに記述すべき内容。

--system.lua

math.randomseed(os.time())

NL_dofile("gradsquare2.lua")

NSExec('luasub animestart')
function NSCOM_animestart()
	NSLuaAnimationMode(true)
end

NSExec('luasub animestop')
function NSCOM_animestop()
	NSLuaAnimationMode(false)
end

NSExec('luasub animeinterval')
function NSCOM_animeinterval()
	NSLuaAnimationInterval(NSPopInt())
end

NSExec('luacall animation')
function NSCALL_animation()
	gradsquare2.all_action()
	return true
end

「gradsquare2.lua」を同じフォルダに置きます。

このsystem.luaの使い方

animestart ; アニメーションをスタートします。
animestop ; アニメーションをストップさせます。ただし、表示されているものをどうこうはしません。明示的に消す必要があります。
animeinterval 25 ; アニメーションの間隔を決めます。引数の数値と同じミリ秒間隔で一コマずつ動かしていきます。

ちなみに25ミリ秒は、秒間40コマ。40フレームと呼んでもいいでしょう。あんまり細かくしすぎても処理が重くなります。
今回のサンプルのような処理ならば、40ミリ秒(秒間25フレーム)や60ミリ秒(秒間約16フレーム)でもいいかも知れません。これぐらいでも、アニメと同じ程度の処理速度になります。

NScripter側の処理

; gradsquare (スプライト番号),(幅),(高さ),(赤要素の変化係数),(青要素の変化係数),(緑要素の変化係数)
gradsquare 100,400,300,3,5,7 ; こんな感じで。
; 第一引数で指定したスプライト番号をグラデーションアニメする四角にします。
; 第二、第三引数で大きさを指定できます。
; 第四引数以降は、変化係数です。大きくすればするほど、変化速度が遅くなります。

; gradamsp (スプライト番号),(新しいx座標),(新しいy座標),(新しいアルファ値)
gradamsp 100,400,0
; amspのグラデーション版です。通常のamspでもエラーは出ませんが、有効ではありません。
; gradsquareで使っていないスプライト番号を指定すると、エラーになります。
; 第四引数は省略できます。

; gradvsp (スプライト番号),(表示するなら1, 表示しないなら0)
gradvsp 100,0
; vspのグラデーション版です。通常のvspでもエラーは出ませんが、有効ではありません。
; gradsquareで使っていないスプライト番号を指定すると、エラーになります。

; gradcsp (スプライト番号)
gradcsp 100
; cspのグラデーション版です。通常のcspでもエラーは出ませんが、有効ではありません。
; gradsquareで使っていないスプライト番号を指定すると、エラーになります。
; -1指定は有効です。ただし、gradsquareで宣言したものだけです。

アニメーションをやめる方法は、gradcsp、gradvsp、animestopなどを使い分けてください。

細かい注意点

塗りつぶし長方形のシステムを使っているので、その制限を受けます。
たとえば、指定した幅が、(この場合)32の倍数になっていないときは、余りの部分が真っ黒になります。
幅が640、320、800の時はこれは問題になりませんが、400の時には、右側に16ドットの黒い帯が発生してしまいます。
また、gradsquareはセーブされません。gradsquareをしている最中にセーブし、再びロードした際には、gradsquareの設定はなくなっています。
loadgosubを使って、再現するようにしてください。animestart()を忘れずに。

思いついた小技

複数のgradsquareを作り、それぞれを半透明にして重ね合わせます。(いずれも色の変化度合はずらしておきます)そうすると、波打つようなグラデーションが観察できます。

既知のバグ

長時間グラデーションさせていると、数値がオーバーフローを起こす可能性があります。
多分、9日以上でエラー出すんじゃないかなあ。そこまでやるとは思わないけど。