2018年12月19日水曜日

WxPythonのテトリスのコード**№3.5 タイマーによる描画更新の雛形コード




ブロックを表示して、それを落下させていきます。
落下の速度はタイマーによって管理されています。

再描画を受ける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 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts