继续整理,小结pygame的时钟和定时器的用法。
时钟:pygame可以创建时钟对象clock=pygame.time.Clock(),时钟对象的tick(time)方法可以用来控制循环发生的速度,如将clock.tick(60),放while True:下面,可以控制没秒60次循环。
定时器:在js中有setTimeout(fn,time)和setInterval(fn,time),也有相关的关闭方法;pygame的定时器用pygame.time.set_timer(eventid,time),第一个参数eventid,可以定义全局常量,赋值pygame的USEREVENT常量,常量返回一个整数,如果有第二个事件,可以赋值USEREVENT+1,以此类推,pygame.time.set_timer(eventid,time)语句需要写在初始化方法中,time用毫秒,表示每隔多长时间,这个用户事件发生一次!,然后在程序的循环中进行事件监听,用for event in pygame.event.get()遍历事件,如果监听有事件发生,则进行相应的操作,用if event.type == eventid进行判断。
本例飞机游戏,有两个地方用了定时器,一个是每隔一秒的创建敌机事件,pygame.time.set_timer(CREATE_ENEMY_EVENT,1000),一个是每隔0.5秒的英雄开火事件,pygme.time.set_timer(HERO_FIRE_EVENT,500),定时器放在游戏主文件PlaneGame类的初始化方法中,两个eventid在全局中定义,一个USEREVENT一个+1,然后在PlaneGame类的stargame方法中循环调用事件监听,监听用一个私有方法__event_handler,除了监听这两个事件,还要监听键盘事件以控制英雄飞机的左右移动。
在startgame方法中,无限循环while True:先后调用事件监听、碰撞检测、更新绘制和最后的pygame.display.update(),每秒循环的次数用clock.tick()控制。每次循环,事件监听私有方法中,监听用户是否点击关闭按钮(执行退出);监听1秒发生一次的CREATE_ENEMY_EVENT(敌机创建,名称任意取)(发生时,调用Enemy类创建敌机,并加入敌机精灵组,用add方法);监听每半秒发生的HERO_FIRE_EVENT事件,调用hero.fire()方法,开火射击;还有监听键盘按键,这个没有用event.type判断,主要是用这种方法键盘按下后不能连续发射。
困惑:js的定时器可以在函数和对象中使用,使用简单,每隔多长时间,调用一次函数,即可!而pygame的定时器需要一个eventid(赋值USEREVENT),需要在初始化设置定时器pygame.time.set_timer(eventid,time),然后还需要在循环中调用事件监听。让人困惑的是无法用函数使用定时器,难道一定要使用类,使用类的初始化中设置定时器,在类的方法中遍历事件,对事件进行判断,然后执行相应的代码?经过简单的测试没有成功!!还有一点,定时器在哪些python模块中有,是否不同模块,用法不一样?
下面的代码测试无效,困惑! import pygame
clock = pygame.time.Clock() A_EVENT = pygame.USEREVENT pygame.time.set_timer(A_EVENT,1000)
def fn(): while True: clock.tick(60) for event in pygame.event.get(): if event.type == A_EVENT: print("hello")
fn()
|