原典:
http://compasstech.com.au/TNS_Authoring/Scripting/script_tut7.html
レッスン7.3「画像をダイナミックにする」
ここまでは順調です。挿入した画像を画面にうまくはめ込む手段として、スケール・ファクターを手作業で調整するという方法ももちろん良いでしょう。しかしもっと良い方法があります。リアルタイムにスケールを変更する方法です。前回のレッスンで学んだように矢印キーを使います。
まずはTI-Nspireドキュメントで使用する変数を作成するのがよいでしょう。私は通常、Geometryウィンドウを挿入してスケールを非表示にします。そのあとでscaleという名前のスライダーを挿入します。スライダーの可変範囲は0~1、ステップ幅は0.1に設定します。スライダーはあとで消去しても構いません。値は矢印キーで操作するからです。しかしそのドキュメントをPlayer(訳註:Playerって何?)で使えるようにしたい場合は、矢印キーは役に立ちませんので、スライダーは残しておきます。
local screen = platform.window --長ったらしいのでscreenにする
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に代入
var.store("scale", sc + 0.1) --scを0.1増分してNspire変数scaleに書き戻す
screen:invalidate() --画面をリフレッシュ
end
function on.arrowDown() --下矢印キーが押されたら
sc = (var.recall("scale") or 0.5) --Nspire変数scaleの値をscに代入
var.store("scale", sc - 0.1) --scを0.1減らしてNspire変数scaleに書き戻す
screen:invalidate() --画面をリフレッシュ
end
上記の函数は、on.paint函数の前に定義することができます。見てわかるように、TI-Nspireのシンボル・テーブルにある変数scaleの値を確認する働きをする函数です(変数scaleが存在しない場合は値0.5に設定されます)。矢印キーを押すたびに値が0.1ずつ増えるか減るかし、新しい値がscaleの値としてTI-Nsipreに書き戻されます。
on.paint函数に加えた唯一の変更点は、scaleの現在の値を取り込んで、その値をLua変数scとして定義するというものです。scの変化するたびに画面をリフレッシュしても(すなわちplatform.invalidateコマンドを実行しても)どうということはありません。
function on.paint(gc)
local w = screen:width()
local h = screen:height()
sc = (var.recall("scale") or 0.5)
imw = sute:width()
imh = sute:height()
im = sute:copy(sc * imw, sc * imh)
imw = im:width()
imh = im:height()
gc:drawImage(im, (w - imw)/2, (h - imh)/2)
end
これで、上下の矢印キーで画像のスケールが制御できるようになりました。
-----------------------------------------------------------------
(訳註)今回の実行例。スライダーの上限、下限をif文で追加設定した。