ゲームを作る際に一定間隔で何かが動く等の割り込み処理が必要になる場面は多々あります。

例:テトリスの様な落ちもの系の落下物、移動速度が決まったキャラを動かす際のスピード調整等々

 

そこでtimeモジュールを使用して、ある処理を前回の処理から一定時間経過後再度呼び出すサンプルを作りました。

 

画面

 

起動すると周期時間毎にカウントが増えていきます。

マウスの左クリックで周期増加(カウント減速)、右クリックで周期減少(カウント加速)します。

周期の範囲は0.1秒~2秒です。

ソースはGoogleドキュメントにも載せてあります。

timeモジュールを使用した一定周期の割り込み処理ソース

 

-ソース------------------------------------------------------

#T104time.py 時間割り込み処理

import pyxel as px

import time as tm

 

class App():

    def __init__(self):

        px.init(90,20,title="時間割り込み",display_scale=5)

        self.t0=tm.time()       #基準時間取得

        self.cnt=0              #割り込み回数カウンタ

        self.dist=5             #割り込み周期(秒*10)

        #※周期の時間が10倍なのは小数計算バグ回避のため

 

        px.run(self.update,self.draw)

 

    def cntup(self):    #カウンタ更新処理

        self.cnt+=1     #カウンタ更新

 

    def update(self):

        t1=tm.time()                    #現時間取得

        if t1-self.t0>=self.dist/10:    #割り込み周期以上の場合

            self.cntup()                #カウンタ更新処理

            self.t0=tm.time()           #基準時間更新

 

        #周期操作

        if px.btnp(px.MOUSE_BUTTON_LEFT):  

            if self.dist<20:

                self.dist+=1        #周期減速

        if px.btnp(px.MOUSE_BUTTON_RIGHT):

            if self.dist>1:

                self.dist-=1        #周期加速

 

    def draw(self):

        px.cls(0)

 

        px.text(2,1,"mouse L->+0.1:R->-0.1",1)  #操作説明

        px.text(2,7,str(self.cnt),1)            #カウンタ表示

        px.text(2,14,f"{self.dist/10:.3g}",1)   #周期表示

 

App()

-------------------------------------------------------

ソース内で周期を10倍で扱っているのは、小数で加算・減算を繰り返すと途中で「1.799999…」の様な誤差が出る場合があるので、整数で計算して変数に保存し、使用時のみ小数に変換しています。

 

内容は、

1.基準時間を保存

2.現時間を取得し、基準時間+周期以上の場合は割り込み処理を呼び出して基準時間を更新

3.2を繰り返す

 

一定周期で処理を呼び出すゲーム基本的に永久ループだと思うので、この組み方が簡潔でいいと思います。

 

以上です。