鱼C论坛

 找回密码
 立即注册
查看: 4568|回复: 47

有哪些好办法来计算游戏的时间?

[复制链接]
发表于 2017-7-19 16:53:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想用pygame做一个音乐游戏,就是当音乐到特定的点会出现不同的敌人,而且这些点很密集,随时在变化。
请问用哪种方法会更高效一些?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-19 18:15:55 | 显示全部楼层
本帖最后由 MSK 于 2017-7-19 18:19 编辑

你可以配合pygame.time下的Clock类使用:

clock = pygame.time.Clock()
#主程序代码
clock.tick(30)

这样程序每秒刷新30次pygame画面,
你可以设置一个delay变量,delay=0,每次刷新delay+=1
这样当delay=6时就过了0.2秒,delay=30时就过了一秒,在循环内放一些判断语句,这样每次循环都可以进行判断,当clock.tick(30)时,每三十分之一秒就可以判断一次,这样符合你的标准~

clock = pygame.time.Clock()
delay = 0
while True:
    delay += 1
    #代码
    #代码

   if delay == 15:
          代码
   clock.tick(30)

我以前就这么做的
或者你可以用pygame的计数器,pygame.time.Timer()它的计时单位是一千份之一秒~足够了

效率嘛,两种方法每次循环都会进行判断,相差不大
     
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-19 18:36:49 | 显示全部楼层
  1. import datetime
  2. flag = True
  3.     if flag:

  4.          start_time = datetime.datetime.now()
  5.          flag = False
  6. end_time = datetime.datetime.now()
  7. run_time = (end_time - start_time)
复制代码

缩进恐怕有点问题,,自己看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 14:50:20 From FishC Mobile | 显示全部楼层
MSK 发表于 2017-7-19 18:15
你可以配合pygame.time下的Clock类使用:

clock = pygame.time.Clock()

非常感谢,回去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 14:51:49 From FishC Mobile | 显示全部楼层
新手·ing 发表于 2017-7-19 18:36
缩进恐怕有点问题,,自己看

非常感谢,回去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 17:10:07 | 显示全部楼层
本帖最后由 星空下的舞者 于 2017-7-20 17:11 编辑
MSK 发表于 2017-7-19 18:15
你可以配合pygame.time下的Clock类使用:

clock = pygame.time.Clock()


我刚玩python不久,所以很多基础东西都不清楚。
这里是修改打飞机的游戏,我试了第一种方法,结果游戏直接卡死进不去,Process finished with exit code -805306369 (0xCFFFFFFF)

代码我是直接照搬过去的, 捕获.PNG ,进入游戏后可以听到bullet2_sound确实响了一次,但是游戏会卡死。
这是哪里的问题呢?

那就比方说我想在游戏开始后第二秒出现一个声音,第6秒再出现下一个声音,如此往下写,正确的代码应该是什么样的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 17:14:07 | 显示全部楼层
新手·ing 发表于 2017-7-19 18:36
缩进恐怕有点问题,,自己看

如楼上所说,如果用datetime这个方法,比方说我想在游戏开始后第二秒出现一个声音,第6秒再出现下一个声音,如此往下写,代码应该是什么样的呢?因为我去搜了下datetime也没大看明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 17:20:18 | 显示全部楼层
本帖最后由 星空下的舞者 于 2017-7-20 17:36 编辑

因为是跟着音乐走,这里最后采纳的方法将作为核心大量使用,贯穿全游戏
所以选择起来很慎重
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 17:36:19 | 显示全部楼层
额额,你clock.tick(60)每秒刷新60次,但是每刷新30次播放一次音乐,也就是每半秒播放一次,还没播放完又播放一次,不卡死才怪

如果照你的设为clock.tick(60):
你可以这么写:
  1. if not (delay % 120):#2秒
  2.         #音乐
  3.         pass
  4. if not (delay % 360):#6秒
  5.         #音乐
  6.         pass
复制代码


不过建议对delay进行处理,到达某个数值时自动归零,否则,程序的计算量将越来越大~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 17:42:10 | 显示全部楼层
本帖最后由 星空下的舞者 于 2017-7-20 17:47 编辑
MSK 发表于 2017-7-20 17:36
额额,你clock.tick(60)每秒刷新60次,但是每刷新30次播放一次音乐,也就是每半秒播放一次,还没播放完又播 ...


谢谢,是把截图里红圈的代码全部替换成这个吗,但这里变成了每隔xx秒出现一次呢?我是希望只出现在第2和第6秒,一次性的,不再循环

——————
if (delay == 120)
好像这样就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 17:47:45 | 显示全部楼层
把红圈圈里的if语句换掉就行,
因为每秒刷新60次,每刷新一次delay+1,所以当not (delay % 120)的值为True时就果了2秒
%是取余数,当delay=120(两秒)时delay % 120 == 0,not (delay % 120)的值就为True
就做到了每隔两秒播放音乐~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 17:57:48 | 显示全部楼层
MSK 发表于 2017-7-20 17:47
把红圈圈里的if语句换掉就行,
因为每秒刷新60次,每刷新一次delay+1,所以当not (delay % 120)的值为True ...

救命啊亲为毛我换成循环就不管用了呢

if not (delay % 120):  # 2秒
    for each in small_planets1:
        if each.active:
            each.move()
            screen.blit(each.image, each.rect)
    pass
没有效果诶,这个循环单独可以用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 18:01:23 | 显示全部楼层
星空下的舞者 发表于 2017-7-20 17:57
救命啊亲为毛我换成循环就不管用了呢

if not (delay % 120):  # 2秒

你的代码是small_planets1里的东西每两秒移动一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 18:08:46 | 显示全部楼层
本帖最后由 星空下的舞者 于 2017-7-20 18:09 编辑
MSK 发表于 2017-7-20 18:01
你的代码是small_planets1里的东西每两秒移动一次

small_planets1是个会移动的小星球图片,我是希望它出现跟上面那个声音一样的效果,每两秒出现一次,跟声音一样,但用了循环就无效了呢。
相关代码还有两块:
def add_small_planets1(group3, group4, num):
    for i in range(num):
        e4 = bg_planet.SmallPlanet1(bg_size)
        group3.add(e4)
        group4.add(e4)
以及

small_planets1 = pygame.sprite.Group()   # 小型背景星球组
add_small_planets1(small_planets1, planets, 1)  # 生成若干小型背景星球



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 18:16:19 | 显示全部楼层
是不是忘了加pygame.display.flip()  ???


                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 18:35:06 From FishC Mobile | 显示全部楼层
MSK 发表于 2017-7-20 18:16
是不是忘了加pygame.display.flip()  ???


这个是干嘛的?这个星球单独运行是没问题的,但是这样就不出现了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 18:38:22 | 显示全部楼层
星空下的舞者 发表于 2017-7-20 18:35
这个是干嘛的?这个星球单独运行是没问题的,但是这样就不出现了

这个是刷新屏幕的语句,pygame是双缓冲的,如果没有,你的图像只会永远停留在内存中而不会出现在屏幕上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 19:28:57 | 显示全部楼层
MSK 发表于 2017-7-20 18:38
这个是刷新屏幕的语句,pygame是双缓冲的,如果没有,你的图像只会永远停留在内存中而不会出现在屏幕上


还需要再加在另外的地方吗,结尾是有的
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 19:31:29 | 显示全部楼层
星空下的舞者 发表于 2017-7-20 19:28
还需要再加在另外的地方吗,结尾是有的

就是在结尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-20 19:32:21 | 显示全部楼层

我这是改的别人的,程序正常运行是没问题的,该有的都有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 08:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表