ブロックを表示して、それを落下させていきます。
落下の速度はタイマーによって管理されています。
再描画を受けるOnPaintの中に描画の関数を書きます。
タイマーを受ける関数のなかに y += 1 などと ブロックの移動のコードを書きます。さらに Refuresh()をいますとそこからOnPaintが呼び出されて、再描画されます。
ただし Refresh(eraseBackground=False) とすると Clear()が必要となります。
(元位置のブロックが消されず、表示されたままになります。)
雛形コード
E:\MyBackups\goolgedrive\myprg_main\python_my_prg\wxpython\dc\anime_box_rakka.py
# coding: UTF-8
# ブロックが落下
import wx
class MyApp(wx.App):
def __init__(self):
#エラーが出たらファイルに書き出す
wx.App.__init__(self, redirect=True, filename="game_tetoris_log.txt")
#wx.App.__init__(self, redirect=True )
class Tetris(wx.Frame):
def __init__(self, parent, id, title):
print "Tetris __init__",
wx.Frame.__init__(self, parent, id, title)
#ステータスバー作成
self.board = Board(self)
self.board.SetFocus()
#初期値設定 タイマースタート
self.board.start()
self.Centre()
self.Show(True)
class Board(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
print "__init__"
#wxウィンドウで背景色を白
self.timer = wx.Timer(self)
self.Bind(wx.EVT_PAINT, self.OnPaint)
#self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_TIMER, self.onTimer, self.timer)
#wx.Timerで一定確率で描写します
#100ミリ秒ごとにタイマーイベントを発生させる
self.y = 0
def start(self):
print "start",
#300ミリ秒ごとにOnTimer()が実行される
self.timer.Start(1000) #***************
"""画面書き換え要求があった時に呼ばれる処理"""
def OnPaint(self, event=None):
print "OnPaint"
#dc = wx.BufferedPaintDC(self, self.buffer)
dc = wx.PaintDC(self)
self.DrawSquare(dc, 100, self.y)
"""ウインドウサイズが変更された時に呼ばれる処理"""
#かなり複雑になるのでこのイベントやめる
def OnSize(self, event=None):
print "OnSize"
pass
#タイマーのタイミングでRefreshして、OnPaintを呼び出して再描画
def onTimer(self,event):
print "onTimer"
self.y += 10
#Refresh_
#以下のように引数を与えた場合は、Clearが必要
#ただのRefreshならClearはいらない
#self.Refresh(eraseBackground=False)
#dc.Clear()
self.Refresh()
def DrawSquare(self, dc, x, y):
print "Draw2"
dc.SetBrush(wx.Brush('#000000'))
dc.DrawRectangle(x, y, 15, 15)
app = MyApp()
Tetris(None, -1, 'tetris.py')
app.MainLoop()
0 件のコメント:
コメントを投稿