テトリスのソースを読む(その3)
wx.Timerの働きが不明だったので、wxPythonのデモコードの中にそれを使ったものがあるのではと探したところ、Timerというのを見つけた。それを読んで(実行や変数をいじってみて)、おおよそ働きを理解できたと思う。
テトリスのコードに戻ると、wxTimer関連の処理は次の順番で行っている。
- Boardクラスのインスタンスを作成時に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()
やっていることはなんとなく想像がつくのだが...。