原典:
http://compasstech.com.au/TNS_Authoring/Scripting/script_tut7.html
レッスン7.4「画像をリアルタイムに入れ換える」
ここでは、定義しておいた複数の画像を左右の矢印キーで切り替える方法を紹介します。(中略)追加画像をsute2、sute3として定義します。
Geometryウィンドウにスライダーを挿入します。名前はchooseとし、可変範囲は1~3とします。
スケールを変えたときと同じように、左右の矢印キーで変数chooseの値を増減し、その値をLuaスクリプト側でchとして参照します。
paint函数内でchooseの現在の値を呼び出し、if..then..elseif..endループで画像を定義します。
これで、左右の矢印キーで画像が切り替えられるようになったはずです。
おめでとうございます! これで、Luaで画像をディジタイズする方法(訳註:現行バージョンではディジタイズは不要)、定義する方法、挿入する方法、スケールを設定する方法、操作する方法はすべて学びました。今シリーズの最後のいくつかのレッスンでは、Luaを使って独自のグラフィックを作成する方法を採り上げます。
--------------------------------------
(訳註)今回作ったスクリプト。原文と少し変えた。
local screen = platform.window --長ったらしいのでscreenにする
local sute1 = image.new(_R.IMG.sute1)
local sute2 = image.new(_R.IMG.sute2)
local sute3 = image.new(_R.IMG.sute3)
function on.construction() --0.2秒ごとに画面をリフレッシュ
timer.start(1/5)
end
function on.timer()
screen:invalidate()
end
function on.arrowUp() --上矢印キーが押されたら
sc = (var.recall("scale") or 0.5) --Nspire変数scaleの値をscに代入
if sc >= 1 then
sc = 1
else
var.store("scale", sc + 0.1) --scを0.1増分してNspire変数scaleに書き戻す
end
screen:invalidate() --画面をリフレッシュ
end
function on.arrowDown() --下矢印キーが押されたら
sc = (var.recall("scale") or 0.5) --Nspire変数scaleの値をscに代入
if sc <= 0.1 then --0以下になると画像が消えて復帰しなくなるため0.1未満にならないようにする
sc = 0.1
else
var.store("scale", sc - 0.1) --scを0.1減らしてNspire変数scaleに書き戻す
end
screen:invalidate() --画面をリフレッシュ
end
function on.arrowLeft() --左矢印キーが押されたら
ch = (var.recall("choose") or 1) --Nspire変数chooseの値をchに代入
if ch <= 1 then --chの下限を1とする
ch = 1
else
var.store("choose", ch - 1) --chを1減らしてNspire変数chooseに書き戻す
end
screen:invalidate() --画面をリフレッシュ
end
function on.arrowRight() --右矢印キーが押されたら
ch = (var.recall("choose") or 1) --Nspire変数chooseの値をchに代入
if ch >= 3 then --chの上限を3とする
ch = 3
else
var.store("choose", ch + 1) --scを1増やしてNspire変数chooseに書き戻す
end
screen:invalidate() --画面をリフレッシュ
end
function on.paint(gc)
local w = screen:width() --画面の幅をwに代入
local h = screen:height() --画面の高さをhに代入
sc = (var.recall("scale") or 0.5) --スライダーscaleの値をscに代入
ch = (var.recall("choose") or 1) --スライダーchooseの値をchに代入
if ch == 1 then -- chが1の場合は
show = sute1 --画像sute1をshowに代入
elseif ch == 2 then --chが2の場合は
show = sute2 --画像sute2をshowに代入
else
show = sute3 --いずれでもない場合は画像sute3をshowに代入
end
local imw = show:width() --画像showの幅をimwに代入
local imh = show:height() --画像showの高さをimwに代入
local im = show:copy(sc * imw, sc * imh) --画像showのスケールを変更してimに代入
local imw = im:width() --スケール変更後の画像imの幅をimwに代入
local imh = im:height() --スケール変更後の画像imの高さをimhに代入
gc:drawImage(im, (w - imw)/2, (h - imh)/2) --スケール変更後の画像imを画面中央に描画
end
----------------------------------------------------------------------
(訳註)今回の実行例。