Luaレッスン14「上級篇:複数のクラスをキーボードで制御する」和訳

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

 レッスン14「上級篇:複数のクラスをキーボードで制御する」

 クラスを定義する方法、およびそうしたオブジェクトをキーボード、マウスの両方で動かす方法については、レッスン13までに学びました。クラスがたった1つだけではそれほど面白くありません。そこで今度は、複数のクラス・オブジェクトを操作してみましょう。

 まず、操作するクラスがもう1つ必要となります。この作業は、これまでに学んだ内容の復習、改良にはもってこいです。

 下に示したコード(訳註:原典参照)では、先に作成したSquareクラスに加えて、Circleクラスを作成しています。レッスン11を学んだ皆さんなら、コードの内容はよくわかるはずです。

 コードを確認してみましょう。contains函数がどのように定義されているのかを見てください。Squareクラスの場合とはまったく違いますが、正方形ではなく円ですから当然と言えば当然です。しかし、Squareの場合よりもずっとシンプルに出来ています。

 Squareのときと同じように、汎用性のあるCircleを定義しました。つまり、必要に応じてSquareクラスを長方形にすることができるのと同じよう、Circleも楕円に変更できるということです。こうしておけば、最初のシンプルな計画を変更しなければならなくなった場合でも、あとあと融通が利くわけです。これは、プログラミングだけでなく、ドキュメント作成の場合にも当てはまる経験則です。ようするに、ちょっとした手間を掛けるだけで汎用性の高いプログラミングが出来るのであれば、あまり的を絞り込んだプログラムは作成しないようにするということです。たとえばクイズ・ドキュメントの場合は、ランダム函数を少し使うだけで複数のクイズが出せるのであれば、具体的なクイズを入力することは避けてください。そのほうが、学習ツールとしてはずっと強力で便利です。

 drawArcコマンドおよびfillArcコマンドの構文を確認してください。これは、“サークル・クリエーター”よりも遙かに汎用性の高いコマンドです。円というのは要するに、円弧の角度の範囲を0~360度にした図のことです(-180~180度でも同じことです。よく考えてみてください)。

 ようやく今回のレッスンの核心にたどり着きました。複数のオブジェクトを操作するためのシンプルな方法の1つは、そうした複数のオブジェクトを格納しておくテーブルを作成することです。オブジェクトを切り替えるのは、テーブル内の要素を切り替えるだけで済みます。この方法を気に入ってくれるとうれしいのですが。

 今回は、今のところSquareとCircleとから成るObjectsというテーブルを作成します。ここまでくれば、変数TrackedObjectの重要性がわかったのじゃありませんか。Objectsテーブルに含まれているどのメンバーが現在選択されていようとも、そのとき選択されているオブジェクトがTrackedObjectとなるわけです。テーブル内の要素を切り替えるメカニズムが必要なわけですが、それには、キーボードの場合はtabKeyを使い、マウス・コントロールの場合はmouseDownを使います。

 Objectsテーブルは、on.resize函数の中で定義したほうがよいでしょう。以前使用した中間変数Sqは今回は使用せずに、on.resize函数を使ってSquareおよびCircleを定義します。前回のコードを少し書き換える必要がありますが、それだけの価値はあります。

 今回のコードの仕組みを確認する一番良い方法は、tabKey函数の定義を変更してみることです。新しいコードは太字で表示してあります(訳註:太字は原文のみ)。残りのコードは、TrackedObjectを使用していますが、問題ありません。

 構文が少し奇妙に見えるかもしれませんが、Objectsテーブル内のオブジェクトを切り替えるシンプルなforループになっているだけです。

 ループの最初の行では何が行われているのでしょうか? ループ・カウントは、1からObjectsテーブル内のオブジェクト数(#Objects)まで順に増えていきます。

 TABキーを押すと、テーブル内でのフォーカスの位置が1つ隣のオブジェクトへ移動します。breakは、無限ループを中断する働きをしています。もう一度tabKeyが押されるまでループを中断するわけです。

 そのあとで、on.paint函数を書き換えれば、以前使用したグローバル変数SqではなくObjectsテーブルが使用できます。今回のforループにはダミー変数"_"を使用しています。その目的は、ipairs函数内のObjectsテーブル内の各要素を巡回してゆくためです。つまり、obj[1], obj[2], ... のように、各オブジェクトだけでなくインデックスも巡回するわけです。最後に、表示される座標位置がTrackedObjectの座標位置になるように、末尾のdrawStringコマンド内でSq参照を置き換えます。座標の数字はオブジェクトと同じ色で表示されます。実にクールです。

 以上の変更によって、キーボード・コントロールでオブジェクトを切り替えること、および選択したオブジェクトを動かすことが可能となりました。残りの作業は、マウス・コントロールでも複数のクラスが操作できるよう、tabKeyと同じようにmouseDown函数を書き換えることです。

 今シリーズの最後のレッスンでは、これまでに学んだ内容を振り返り、クラス入門篇の仕上げをします。

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

(訳註)今回の実行例。スクリプトはサンプル・ファイルのままであるが、特にon.tabKey函数のところで何をしているのかよくわからない(訳註:のちによくわかった)。

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