前回は時間待ちしてる間にイベント処理まで止まるのが問題だよ、という指摘で終わりました。
PyGameの場合この部分はニュービーキラーな部分らしく。具体的に良い解決方法が提示されてるわけでもありません。
問題を整理してみましょう。
時間待ちは必要な処理。
困るのは待ってる時間の間イベント処理が行われない事にある。
ということは、待ってるときにイベント処理をすればいい。となりますね。
パッと思いつくのはスレッドですが、イベント処理を別スレッドで動かすとイベントを拾えないという問題があるようですので、泥臭くいきましょう。
コードはこのようになりました。
import pygame, time from pygame.locals import * #--------------------------------------------- # function start #--------------------------------------------- def polling( value ): global _running st = time.time() _procWait = True while(_procWait): for event in pygame.event.get(): if event.type == pygame.QUIT: _running = False if time.time() - st > value: _procWait = False def blink( value ): global screen, img1, img2 screen.fill( (50,50,50) ) if( value == 1 ): screen.blit(img1,(144,83)) else: screen.blit(img2,(144,83)) pygame.display.update() #--------------------------------------------- # function end #--------------------------------------------- _running = True _size = ( 320,200 ) _mode = pygame.HWSURFACE | pygame.DOUBLEBUF pygame.init() screen = pygame.display.set_mode(_size,_mode) pygame.display.set_caption("hello pygame") img1 = pygame.image.load("./bluedot.png").convert_alpha() img2 = pygame.image.load("./glaydot.png").convert_alpha() while(_running): blink(1) polling(0.2) blink(0) polling(0.2) pygame.quit()
pollingEventという名前だったイベント処理用のファンクションに、時間中ずっとイベント監視だけを行うループを入れて、
名前に違和感があるのでpollingと名前をかえました。
メインループではwaitの代わりにこのpollingを使います。
こうすることによって、待ち時間中はイベントが発生しない、などということはなくなってとりあえず一件落着。
polling(0.2)の 0.2は0.2秒だと思います。多分(ぇ
一応表示させたりしてみていたんですが、多分それくらい((((