ゲームに学ぶフレームワーク #3.4: Rectangle を利用する

前の記事記事一覧次の記事

ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》
Rectangle を利用する

《著》森こねこ+小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

■ 概要

アプリケーションを作成する過程を通して、Jython/Swing によるフレームワークを習得します。

典型的なオセロゲームから始めて、蜂の巣(6角形)状の盤面を作り、3人で対戦できるゲームへと進化させます。

《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。

事例:モジュールを起動する

モジュールを起動すると、次のようなウィンドウが現れます。

$ 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

》作業中です《

Last updated♪09/06/30