http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2019-4-15 11:11:00
博文:python之pygame模块(三)

 

继续整理,小结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()

 

 

 

mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.