ゲームに学ぶフレームワーク #3.4: Rectangle を利用する
ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》
Rectangle を利用する
■ 概要
アプリケーションを作成する過程を通して、Jython/Swing によるフレームワークを習得します。
典型的なオセロゲームから始めて、蜂の巣(6角形)状の盤面を作り、3人で対戦できるゲームへと進化させます。
《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。
■ 関連記事
- INDEX〈Python〉
- INDEX〈Swing〉
- Java プログラマーのための Python 導入ガイド
- IronPython で学ぶ WPF プログラミングの世界《IronPython2.6》改訂版
事例:モジュールを起動する
モジュールを起動すると、次のようなウィンドウが現れます。
$ jython2.5.0 -i step03/othelloEx.py
マウスをクリックした位置に、矩形を描きます。別の位置をクリックすると、そこに新たな矩形を描きます(矩形が移動したかのように見えます)。
事例:Java の世界を Jython から観察する
実行中の Java アプリケーションの状態は、Jython の対話モードでも確認できます。
>>> Model(34,22) <<<
マウスでクリックした位置が出力されます。ここで、次のように、
>>> import othelloView
import 文を使って、モジュール othelloView を取り込むと、
>>> othelloView.Xmodel.geom java.awt.Rectangle[x=34,y=22,width=20,height=20]
大域変数 Xmodel を介して、モデル Model を参照できます。すると、モデルに対応する矩形領域の位置 (x,y) や大きさ (width,height) が分かります。これは、標準出力された情報と同じです。さらに、別の位置をクリックすると、
>>> Model(118,22) <<< >>> othelloView.Xmodel.geom java.awt.Rectangle[x=118,y=22,width=20,height=20]
モデルの位置が移動したことを、標準出力と対話モードのどちらでも確認できます。
事例:コードの解説
■ モジュール:othelloModel.py
from java.awt import Color from java.awt import Rectangle class Model(object): _extent = 20 _drawColor = Color.black _fillColor = Color.green def __init__(self, point, *args, **keys): self.geom = Rectangle( point, width = self._extent, height = self._extent, )
クラス Rectangle を利用して、モデルに固有の矩形領域を規定します。
《Note》コンストラクターの実引数:実際には、コンストラクターとして Rectangle(Point,int,int) は規定してありません。Rectangle(Point) や Rectangle(int,int) が規定してあるだけです。Jython では、実引数を解釈して、適切なコンストラクター呼び出しを展開します。
def __repr__(self):
return "%s(%d,%d)"%(self.__class__.__name__,
self.geom.x, self.geom.y)
モデルに固有の文字列表現を規定して、座標 (x,y) を確認します。
def paint(self, g): print self e = self.geom x, y, w, h = e.x, e.y, e.width, e.height g.color = self._fillColor g.fillRect(x, y, w, h) g.color = self._drawColor g.drawRect(x, y, w, h)
■ モジュール:othelloView.py
... from othelloModel import Model
他のモジュール othelloModel で規定されたクラス Model を利用します。
class GameBoard(Canvas): model = None def _mouseClicked(self, e): self.model = Model(e.point) self.repaint() def paint(self, g): if self.model: self.model.paint(g)
Swing で規定されたフレームワークに沿って、メソッド repaint を呼び出すと(必要なら)メソッド paint を起動して、キャンバス内を再描画します。
《Note》ハリウッドの原則:メソッド paint は、他から呼び出されるのを想定しています。ハリウッドの原則に従うなら、フレームワークの意義を理解して、paint を呼び出すコードを記述しないことです。
Tips
》作業中です《