Java meets Python - 第6回 配列と別れる50の方法(3) ライフゲーム
よろずプログラマーのためのPython導入ガイド (8)
イベント処理
何かと厄介なイベント処理ですが、うまく付き合えば強力な味方となります。
class LifeGamePanel(JPanel):
def this_mouseClicked(self, e):
life = self.detectLife(e)
print ">>>", life
life.reverse();
self.repaint();
メソッドthis_mouseClickedは、マウスでクリックした生命体を描画します。detectLifeを利用してイベントが発生した生命体lifeを特定し、隣接する生命体の数によってその表示を変化(反転)させます。反転reverseしたときには、repaintを利用してパネルを再描画します。
class LifeGamePanel(JPanel):
def paintComponent(self, g):
self.decideEdge();
self.paintItems(g)
def decideEdge(self):
Life.Edge = min(self.width, self.height) / self.dim
def paintItems(self, g):
for e in self.items:
e.paint(g)
repaintを呼び出すと、Swingのフレームワークに準拠してpaintComponentが呼び出されます。そのため、任意のコンポーネントを再描画したいときには、このメソッドを再定義しておきます。実際の処理はpaintItemsに委ね、パネルに配置したすべての生命体を再描画paintします。
メソッドdecideEdgeは、ウィンドウの大きさが変化したときに、再描画する生命体の大きさを決定します。ただし、属性値Life.Edgeを直接アクセスしているので、後の仕様変更でこれが問題となる可能性を否定できません。この問題を回避する方法は、後の連載で紹介します。
class LifeGamePanel(JPanel):
def detect(self, x, y):
obj = self.nullObject()
for e in self.items:
if e.detect(x, y): obj = e; break
return obj
def nullObject(self):
return Null
class Life(Shape):
def detect(self, x, y):
return (self.x, self.y) == (x, y)
メソッドdetectは、指定した座標x/yを持つ生命体を特定します。ただし、実際の処理は、各Lifeインスタンスeに委ね、その条件を満たす生命体objをリターン値とします。クラスLifeでは、指定した座標x/yと比較して、自分selfがその条件を満たすかどうかを判定した結果をリターン値とします。
この記事は参考になりましたか?
- よろずプログラマーのためのPython導入ガイド連載記事一覧
-
- Java meets Python - 第7回 ハリウッドの原則
- Java meets Python - 第6回 配列と別れる50の方法(3) ライフゲーム
- Java meets Python - 第5回 二分木と辞書
- この記事の著者
-
小泉ひよ子とタマゴ倶楽部(コイズミヒヨコトタマゴクラブ)
http://tamago-club.cocolog-nifty.com/「楽しくなければ仕事じゃない」が私たちのモットー。99%の苦悩の連続も、1%の成功に報われます。だからこそ、この仕事が楽しくて仕方がないのです。楽をするための努力なら惜しみません。何もせず楽をしているのと、努力をしたから楽ができるのと...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
伊藤うさぎ(イトウ ウサギ)
ペンネームの「由来は」と言うと。苗字の方は、セミナー研修で同じチームになった、3人の合体ユニット名 [I:石塚, T:田川, O:尾沢] から来ています。名前の方は、同じ干支(卯:1987 年生)に因んだものです。既に2人は卒業して、残る1人がその名跡を継承しています。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
