新たなパネル:イベントハンドラー

(ゲーム用に開発した)既存のフレームワーク GameBoardPanel をもとに、イベントハンドラーを拡張します。

# --------------------------------------------------- after -----
def this_mouseClicked(self, e):
stone = self.detectStone(e)
print ">>> this_mouseClicked: %s"%stone
if stone: return

if stone is nullStone:
print "::: click again ..."
return

self.reversed = False
self.reverse(stone)
if not self.reversed: return

self.place(HexStone(stone.x, stone.y, self.mode))
self.mode = not self.mode
self.repaint()

〈改訂〉盤面をクリックしたときのイベントに応答します。現状のままでも、実用上は問題ありません。しかし、コマを配置する位置を正確に検出できないと、エラーメッセージが表示されます。そこで、利用者に「盤面を正確にクリックする」ことを促すメッセージを出力するように、コードを改訂します。

# --------------------------------------------------- after -----
def detectStone(self, e):
return self.detectPoint(e.x, e.y)

〈改訂〉イベントが発生したコマを検出します。コマの座標で検出 detect する代わりに、スクリーン座標で検出 detectPoint します。

# --------------------------------------------------- after -----
def detectPoint(self, x, y):
obj = self.nullObject()
for e in self.items:
if e.isExistPoint(x, y): obj = e; break
return obj

〈新規〉スクリーン座標 x,y 使って、そこにコマが存在するかどうか isExistPoint を判定します。

# --------------------------------------------------- after -----
def reverse(self, stone):
for x, y in self._bounds:
e = self.detect(stone.x+x, stone.y+y)
if e.state == (not self.mode):
self.reverseStones(e, x, y)

〈改訂〉イベントが発生したコマ stone と隣接するコマを反転します。クラス属性 _bounds が保持するオフセット座標を使って、6つの方向で境界を接するコマに対して、反転できるかどうかを判定します。

# --------------------------------------------------- after -----
def place(self, stone):
px, py = stone._points()
null = self.detectPoint(px, py)
self.items.remove(null)
self.items.append(stone)
print "place: %s"%stone, "%s,%s"%(px, py)

〈改訂〉指定された石 stone を盤面に配置します。


Previous|4/5|Next