Luaレッスン13「上級篇:クラスとキーボード・コントロールと」和訳

原典:http://compasstech.com.au/TNS_Authoring/Scripting/script_tut13.html

レッスン13「上級篇:クラスとキーボード・コントロールと」

レッスン12では、クラスを定義することにより、マウスで画面オブジェクトを操作するような処理が驚くほど簡単になることを学びました。しかしクラスの可能性はこんなものではありません。クラスを使えば、おおよそ何でも簡単になります。クラス・オブジェクトは、画面上での自身の位置を知っているので(そればかりか、他のオブジェクトの位置についても知っています)、さまざまな制御方式を設定するのが実に簡単になります。

 今回のレッスンでは、Squareをいろいろ動かす手段として矢印キーなどのキーボード・コントロールを追加する方法を学びます。まずは準備作業からです。

 これまでドキュメントを作成したときには、函数グローバル変数(Color、W、H、Sqなど)などをたくさん定義しました。 

一般に、必要に応じてそうしたグローバル変数を呼び出せるようにしておかなければならない場合は、この方法を採るべきです。こうした方法の場合は、何らかの時点(on.createなど)で呼び出さなければならない函数の中にグローバル変数を記述しておくという方法を採るのが普通です。この函数は必ず最初に呼び出されます(それで問題ありません)。ハンドヘルドを使うだけならそれで十分です。

 しかしコンピューター上でも機能するようにしたい場合は、ページのサイズが変化することも考慮しなければなりません。ページのサイズが変化した場合は、platform.window:widthおよびplatform.window:heightの両方の両値を計算し直す必要があります。これらの値がページ作成時にしか定義されない場合は、効果的ではありません。 

もっと良い方法はon.resizeを使う方法です。これは、ページが最初に作成されたときに呼び出されます。さらに、いつページのサイズが変化しようと再度呼び出されます。完璧です。 

さて、ここからが今回のレッスンです。

 示したコードをよく見てください(訳註:サンプル・ファイルどおりなので示さない)。どのような働きをするコードがわかりますか? 

 ちょっと前までならちんぷんかんぷんだったかもしれませんが、このコードを解読できる人もいるでしょう。

 ずっと以前のレッスン6で使い方を学んだ矢印コントロールと唯一違う点は、TrackedObject変数を使用していることです。しかし、このTrackedObject変数が、現在選択されているモノ(今回はSquare)を参照するための手段でしかないことがわかってしまえば、上下左右の矢印キーの働きは自ずと予想がつくでしょう。

 各条件について二重チェックしたくなるかもしれませんが、それでは画面がスムーズに表示されません。もちろん、各函数の最初の条件(TrackedObjectに何か入っているかどうかについての判定条件)についても同様です。

 このことは、これまで避けていた非常に重要な問題を引き起こします。下のコマンド・ラインを前回のレッスンのスクリプトにコピー・アンド・ペーストしてください。キーボード・コマンドがマウス・コントロールに追加されます。これでどうなるでしょうか?  

まだ何も起こりません。その理由は、キーボードを使用していることにあります。オブジェクトを選択する手段をまだ設けていないのです。マウス・コントロールの場合はクリックするだけ済みます。

 解決手段としてTABキーを使いましょう。これは、複数のオブジェクトの中からどれか選ぶときの方法ですね。tabキーを押すたびにオブジェクトから次のオブジェクトへとフォーカスが移動します。そのための方法はすぐにわかります。まずtabKeyアクションをどう定義しているのかをよく調べてみてください。

 

function on.tabKey() --tabキーが押されたら
     if TrackedObject ~= nil then --TrackedObjectに何か入っていた場合は
          TrackedObject.selected = false --そのselectedプロパティーをfalseにする
     end
     TrackedObject = Sq --TrackedObjectにSqを代入
     Sq.selected = true --そのselectedプロパティーをtrueにする
     screen:invalidate()
end

 

つかんだオブジェクトをリリースするには(TrackedObjectを空にするには)どうすればよいでしょうか? 

 これは簡単ですが重要です。選択されていたオブジェクトは、escキーの押されたときにリリースされます。escキーを押すと、TrackedObjectが再度nilの状態に戻ります。

 (訳註)スクリプトはサンプル・ファイルのままなので省略。

 

今回のチュートリアルは本当にゆっくりと進めています。一度にひとつのことしか説明していません。遅すぎるかもしれませんが、慎重すぎるのは悪いことではありません。理解度に応じてどんどん進めてくださって構いません。

チュートリアルを終えたら、必ず自らそのスクリプトを試してみてください。示したスクリプトを元に、自分ならではの発想でいろいろ変えてみてください。たとえば、同じようなスクリプトを使って、グラフィック・オブジェクトの代わりに画像を動かしてみるのもよいでしょう。チュートリアル6、7で学んだ画像定義コマンドを使うだけでできてしまいます。

次のレッスンでは、これまでに覚えたことを複数のオブジェクトに適用する方法を学びます。

---------------------------------------------------------------

(訳註)今回の実行例。サンプル・ファイルのままである。lesson12と同じようにマウスで動かせるほか、tabキーで選択したあとは矢印キーでも動かせるようになっている。座標は、オブジェクトの中心座標。

f:id:ti-nspire:20141031121629g:plain