原典:http://compasstech.com.au/TNS_Authoring/Scripting/script_tut11.html
レッスン11.3「クラス:initとは?」
まず、空のクラスSquareを定義することから始めます。
次いでクラスの初期化が必要です。このクラスに付与するさまざまなプロパティーは、この段階で定義します。今回定義するクラスSquareは、位置(xy座標)、寸法(幅、高さ)、色に関するプロパティーのほか、選択されているかされていないかに関するプロパティーを持ちます(これについてはすぐに明らかになります)。
マウスでクラスSquareの位置を操作する場合は、いつSquareの内側をクリックしたのかを知る必要があります。これについては、函数containsで定義します。函数containsは、座標(x, y)を引数として取り込んで、その座標がSquareの境界内にあるかどうかに応じてブール値(trueまたはfalse)を返す働きをします。
最終的にはSquareを画面に表示する必要があります。
普通の方法の場合はグラフィックス・コンテキスト・コマンド(gc)が必要です。まずはオブジェクトの色を定義しますが、今回は面白い方法を使います。スクリプトの先頭のところで、以下のように色をテーブルとして定義します。
Color = { --Colorテーブルを作成する
red = {0xFF, 0x00, 0x00}, --キーをredとする
green = {0x00, 0xFF, 0x00}, --キーをgreenとする
}
Squareの色はinit函数の中ですでに指定されていますので、unpack函数はただ、テーブルColorから緑色のRGB定義を取り出すだけです(詳しい説明:unpack函数は、テーブルを引数として取り込んで、そのテーブルの各要素を複数の戻り値として返す働きをします。gc:setColorRGBは、赤、緑、青の3つのパラメーターが必要です。しかしColor.greenは値の数が1つであるのに対し、テーブルは3つの要素で構成されています。unpackは、テーブルの各要素をsetColorRGBに必要な3つのパラメーターに変える働きをします)。
正方形については普通の方法で描きますが、各定義に使われているself参照に注目してください。self参照を使うと、クラス・オブジェクトは容易に効率よくクラス・オブジェクト自体のプロパティーを参照することができます。
最後に、正方形が選択されたときにその正方形の周囲に黒い境界線を描くルーチンを記述します。すてきですね。
さて、定義したこのSquareはどんなふうに表示されるでしょうか?
まず、いくつかのパラメーターと一緒に実際に函数Squareを呼び出す必要があります。initルーチンにxy座標、幅、高さが必要であることは忘れないでください(正方形の場合は高さと幅とが同じですが、両方とも必要です)。
あと残っている作業は、on.paint(gc)函数を使って、今回のクラスに定義したペイント・ルーチンを呼び出すことです。これで正方形が表示されます。現時点では、ただ正方形が表示されるだけです。何かを動かしたりする命令はまだスクリプト化していないからです。
正方形を動かしたりする処理は次回学びます。
Square = class() --Squareクラスを作成
function Square:init(x, y, width, height) --初期化。(中心座標x, 中心座標y, 幅, 高さ)。
self.x = x
self.y = y
self.width = width or 20
self.height = height or 20
self.color = Color.green
self.selected = false --未選択状態に初期化
end
function Square:contains(x, y) --現時点では未使用
local sw = self.width
local sh = self.height
return x >= self.x - sw/2 and x <= self.x + sw/2 and
y >= self.y - sh/2 and y <= self.y + sh/2 --xy座標(Squareの中心座標)がSquareの内側にあればtrueを返す
end
function Square:paint(gc) --Squareクラスの描画函数
gc:setColorRGB(unpack(self.color)) --self.colorを取り込む
gc:fillRect(self.x - self.width / 2, self.y - self.height / 2, self.width, self.height) --四角形を描画(self.x、self.yは中心座標)
if self.selected then --選択された場合は黒枠を描画。現時点では未使用
gc:setPen("medium","smooth")
gc:setColorRGB(0, 0, 0)
gc:drawRect(self.x - self.width / 2, self.y - self.height / 2, self.width, self.height) --self.x、self.yは中心座標
end
end
Sq = Square(80, 80, 40, 40) --(中心座標x, 中心座標y, 幅, 高さ)
function on.paint(gc)
Sq:paint(gc)
end
---------------------------------------------------------
(訳註)今回の実行例