原典:
http://compasstech.com.au/TNS_Authoring/Scripting/script_tut7.html
レッスン7.6:「もっとシンプルな方法」
矢印キーやキーボードの一般的な操作子(enterキー、escキー、tabキーなど)で操作するという手段は、自分で作成したドキュメントをハンドヘルド上で問題なく動作させる手段として大変優れています。しかしわたくしにはあまりお勧めできません。というのも、それは確かにシンプルな方法ではありますが、TI-Nspire本来のドキュメントよりもずっと使いやすいLuaスクリプトを記述するのは大変な作業であるからです。
各レッスンで示したサンプルでは、TI-Nspireの変数の値を取り込んで変更して再度元の変数に書き戻すのに矢印キーを使ってはいますが、必ずしもこんなふうにキーボードの操作子を使う必要はありません。それどころか、Luaの外部の変数をまったく使わずにLuaの独自の変数だけを使うほうがずっとシンプルなのです。
レッスン7で述べた3つの画像をすでに作成されていると仮定しましょう。ドキュメントの先頭のところで、sute1、sute2、sute3をそれぞれ定義します。
こうしておけば、スクリプトの残りの部分については以下のようにすることが可能です。
scale、chooseという2つの変数を定義します。最近の私のお気に入りはresize函数です。なぜなら、resize函数は、ページが作成されたときに呼び出されるだけでなく、ハンドヘルド・ビューとコンピューター・ビューとを切り替えたときなど、サイズが変化したときにも呼び出されるからです。
この方法がどれほどシンプルかわかりますか?
ではなぜ、わざわざvar.recallおよびvar.storeを使ってLuaとTI-Nspireとの間で変数をやり取りするのでしょうか?理由の一つは、ハンドヘルドでは大変便利なキーボードなのに、Playerで実行するときにはキーボードが使用できないことにあります。Playerでは、つかんでドラッグすることしかできないのです。キーボードからは何も入力できないのです。
とりあえずTI-Nspireのスライダーと、そのスライダーへのリンク、および追加したキーボード・コマンドはそのままにしておきます。こうしておけば、作成したドキュメントはどこで使用できるようになります。
あとのレッスン(レッスン11~15)では、マウスで操作する方法を学びますので、自分だけの操作子を作成してTI-Nspireのスライダーの代わりに使うことができます。これまでに学んだキーボード操作と組み合わせれば、最適なドキュメントが作成できます。Scripting HQページ(
http://compasstech.com.au/TNS_Authoring/Scripting/index.html
)にアクセスしてください。さまざまなサンプル・ドキュメントが用意してあります。
local screen = platform.window --長ったらしいのでscreenにする
local scale
local choose
function on.resize() --画面のサイズが変わったりしたら
w = screen:width() --画面の幅をwに代入
h = screen:height() --画面の高さをhに代入
scale = 1 -- scaleに1を代入
choose = 1 --chooseに1を代入
end
function on.arrowRight() --右矢印が押されたら
choose = choose + 1 --chooseを1増やす
screen:invalidate() --画面をリフレッシュ
end
function on.arrowLeft() --左矢印が押されたら
choose = choose - 1 --chooseを1減らす
screen:invalidate() --画面をリフレッシュ
end
function on.arrowDown() -下矢印が押されたら
scale = scale - 0.1 --scaleを0.1減らす
screen:invalidate() --画面をリフレッシュ
end
function on.arrowRight() --右矢印が押されたら
scale = scale + 0.1 --scaleを0.1増やす
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 choose == 1 then --chooseが1の場合は
show = sute1 --画像sute1をshowに代入
elseif choose == 2 then --chooseが2の場合は
show = sute2 --画像sute2をshowに代入
else
show = bridge3 --それ以外の場合は画像sute3をshowに代入
end
local imw = show:width() --画像の幅をimwに代入
local imh = show:height() --画像の高さをimhに代入
local im = show:copy(sc * imw, sc * imh) --画像を拡縮してimに代入
local imw = im:width() --拡縮後画像imの幅をimwに代入
local imh = im:height() --拡縮後画像imの高さをimhに代入
gc:drawImage(im, (w - imw)/2, (h - imh)/2) --画面の中央に拡縮後画像imを描画
end