テトリスのソースを読む(その3)

wx.Timerの働きが不明だったので、wxPythonのデモコードの中にそれを使ったものがあるのではと探したところ、Timerというのを見つけた。それを読んで(実行や変数をいじってみて)、おおよそ働きを理解できたと思う。
テトリスのコードに戻ると、wxTimer関連の処理は次の順番で行っている。

class Board(wx.Panel):
    Speed = 300
    ID_TIMER = 1
...
def_init__(self, parent):
...
    self.timer = wx.Timer(self, Board.ID_TIMER)    # ここで呼び出し
...
    self.Bind(wx.EVT_TIMER, self.OnTimer, id=Board.ID_TIMER)

最後のself.Bind(wx.EVT_TIMER...)はタイマーが動き出したときのイベントをself.OnTimerで指定している。

  • wxTimerをスタートする
class Board(wx.Panel):
...
    def start(self):
...
        self.timer.Start(Board.Speed)

ここでBoard.Speed(今の場合は300という数値が入っている)の単位はmsecのようだ。つまり、self.timer.Start(Board.Speed)によって、Board.Speed [msec]ごとにself.OnTimerが実行される。

  • 実行される具体的なイベントOnTimer
class Board(wx.Panel):
...
    def OnTimer(self, event):
        if event.GetId() == Board.ID_TIMER:  # この条件がよくわからん...
            if self.isWaitingAfterLine:
                self.isWaitingAfterLine = False
                self.newPiece()
            else:
                self.oneLineDown()
        else:
            event.Skip()

やっていることはなんとなく想像がつくのだが...。