鱼C论坛

 找回密码
 立即注册
查看: 3325|回复: 27

[已解决]pygame timer的问题

[复制链接]
发表于 2021-2-23 10:45:05 | 显示全部楼层 |阅读模式

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

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

x
请问有没有人知道为什么设置了4s的timer,达到某个条件之后出发timer,一直循环。一开始很正常,大概10个之后就突然变快,因为我是用timer来触发刺激呈现的,变快了3个trial之后又恢复正常。然后一直这么循环,正常变快正常变快。
设置的clock.tick是60.
有大神知道原因吗?
最佳答案
2021-2-23 10:55:36
有可能你设置的不止一个timer他们撞上了?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-23 10:55:36 | 显示全部楼层    本楼为最佳答案   
有可能你设置的不止一个timer他们撞上了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 11:01:34 | 显示全部楼层
我把我另一个注释了也还是这样,您能帮我看看吗?
  1. import pygame, sys, traceback
  2. from pygame.locals import *
  3. from random import *
  4. import plane
  5. import time
  6. import asteroid


  7. # initialize
  8. pygame.init()
  9. transparent = (0, 0, 0, 0)
  10. # pygame.mixer.init() # for music

  11. bg_size = width, height = 800, 600
  12. #screen  = pygame.display.set_mode(bg_size,FULLSCREEN|DOUBLEBUF|HWSURFACE)
  13. screen  = pygame.display.set_mode(bg_size)
  14. pygame.display.set_caption("Firebase")

  15. background = pygame.image.load("assets/space2.png").convert() # alpha = 0

  16. pygame.mouse.set_visible(False)

  17. BLACK = (0,0,0)
  18. GREEN = (0,255,0)
  19. RED = (255,0,0)
  20. WHITE = (255,255,255)
  21. SKY_BLUE = (202,235,216)
  22. GREY = (192,192,192)



  23. def add_asteroid(posy1, group, timer):

  24.         for i in range(24):
  25.                 num = choice([1,2,3])
  26.                 if num == 1:
  27.                         ast = asteroid.Comet1(bg_size, posy1)
  28.                 elif num == 2:
  29.                         ast = asteroid.Comet2(bg_size, posy1)
  30.                 elif num == 3:
  31.                         ast = asteroid.Comet3(bg_size, posy1)

  32.                 group.add(ast)

  33.                 posy1 += 25

  34.         pygame.time.set_timer(timer, 4 * 1000)

  35. # def reset(group):
  36. #         random.shuffle(group)



  37.                        







  38. # main module
  39. def main():

  40.        
  41.        


  42.         # 用于延迟
  43.         delay = 100

  44.         running = True

  45.         clock = pygame.time.Clock()

  46.         # 用于得分计时
  47.         addscore = True
  48.         ADDS = USEREVENT
  49.         pygame.time.set_timer(ADDS, 1 * 80)
  50.         #pygame.time.set_timer(ADDS, 0)


  51.         # 用于陨石计时
  52.         SHOWT = USEREVENT + 1
  53.         # pygame.time.set_timer(SHOWT, 4 * 1000)

  54.         # 用于计算trial
  55.         trial = 0
  56.         last_asteroid = 0;

  57.        
  58.         # 用于生成asteroid
  59.         stepy = 10


  60.         # 生成飞机
  61.         fire = plane.Fire(bg_size)
  62.         me = plane.MyPlane(bg_size)

  63.         # 生成陨石
  64.         all_asteroid = pygame.sprite.Group()
  65.         add_asteroid(stepy, all_asteroid, SHOWT)



  66.         # 统计得分
  67.         score = 0
  68.         adds = 2
  69.         score_font1 = pygame.font.SysFont('arvo', 21)
  70.         score_font2 = pygame.font.SysFont('arial', 18)

  71.         # 生成shield
  72.         shield = 1
  73.         shield_font = pygame.font.SysFont('arvo', 25)


  74.         while running:
  75.                 for event in pygame.event.get():
  76.                         if event.type == QUIT:
  77.                                 pygame.quit()
  78.                                 sys.exit()
  79.                         if event.type == KEYDOWN:
  80.                                 if event.key == K_q:
  81.                                         pygame.quit()
  82.                                         sys.exit()

  83.                         elif event.type == ADDS:
  84.                                 if addscore:
  85.                                         score += 10

  86.                         elif event.type == SHOWT:
  87.                                 for each in all_asteroid:
  88.                                         each.active = True
  89.                                 pygame.time.set_timer(SHOWT, 0)
  90.                                





  91.                                

  92.                 fire.update()
  93.                 me.update()
  94.                

  95.                 screen.blit(background, (0,0))






  96.                 # 绘制火焰
  97.                 if fire.active:
  98.                         screen.blit(fire.image2, fire.rect2)

  99.                 # 绘制飞机
  100.                 if me.active:
  101.                         screen.blit(me.image1, me.rect)

  102.                 # 绘制得分       
  103.                 score_text1 = score_font1.render("Score:", True, WHITE)#拒绝锯齿
  104.                 score_text2 = score_font2.render("%s" % str(score), True, WHITE)#拒绝锯齿
  105.                 screen.blit(score_text1, (25,100))
  106.                 screen.blit(score_text2, (25,120))

  107.                 # 绘制shield
  108.                 shield_text = shield_font.render("Shields:", True, WHITE)#拒绝锯齿
  109.                 shield1 = pygame.draw.line(screen, GREY, (25,70), (150,70), 18 )
  110.                 shield2 = pygame.draw.line(screen, SKY_BLUE, (25,70), (150,70), 18 )
  111.                 screen.blit(shield_text, (25,40))

  112.                 # 绘制asteroid
  113.                 for each in all_asteroid:
  114.                         if each.active:
  115.                                 each.move()
  116.                                 screen.blit(each.image, each.rect)

  117.                         if each.cl:
  118.                                 last_asteroid += 1
  119.                                 each.cl = False
  120.                                 #print(last_asteroid)
  121.                        
  122.                 # reset
  123.                 if last_asteroid == 24:
  124.                         last_asteroid = 0
  125.                         del all_asteroid
  126.                         all_asteroid = pygame.sprite.Group()
  127.                         add_asteroid(stepy, all_asteroid, SHOWT)
  128.                         # pygame.time.set_timer(SHOWT, 4 * 1000)
  129.                        





  130.                 clock.tick(60)
  131.                 pygame.display.flip()








  132. if __name__ == '__main__':
  133.         try:
  134.                 main()
  135.         except SystemExit:
  136.                 pass
  137.         except:
  138.                 traceback.print_exc()
  139.                 pygame.quit()
  140.                 input()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 13:36:22 | 显示全部楼层
本帖最后由 小伤口 于 2021-2-23 13:40 编辑
z347289581 发表于 2021-2-23 11:01
我把我另一个注释了也还是这样,您能帮我看看吗?


你试试把add_asteroid函数里的timer删掉把计时的写在外面,或许是函数多次传入了吗?

我再看看吧

发消息用回复吧,不然你发消息我其实是收不到的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 13:46:41 | 显示全部楼层
本帖最后由 小伤口 于 2021-2-23 14:22 编辑

我以前也遇到过一种类似的,最后我干脆就不用定时器了
直接设置的一个i=0
多少秒自己手工测
当时我设的是i=500时响应函数

不过这是一个笨办法
如果你实在解决不了,试试这个吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 14:12:45 | 显示全部楼层
小伤口 发表于 2021-2-23 13:36
你试试把add_asteroid函数里的timer删掉把计时的写在外面,或许是函数多次传入了吗?

我 ...

谢谢大神!我试过放在外面也是这样。就是我放在# reset的最后后面,但是还是会有这个问题。如果不是统计last_asteroid == 24 那块出错,应该就是timer本身的问题了。主要是我后面还需要到处看到陨石之前一秒飞机的位置数据,所以如果这个时间不精确的话就比较麻烦

如果按您的思路,你是怎么更新i的呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 14:18:48 | 显示全部楼层
z347289581 发表于 2021-2-23 14:12
谢谢大神!我试过放在外面也是这样。就是我放在# reset的最后后面,但是还是会有这个问题。如果不是统计l ...


每次响应函数之后再写个i=0就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 14:25:04 | 显示全部楼层
本帖最后由 小伤口 于 2021-2-23 14:31 编辑
z347289581 发表于 2021-2-23 14:12
谢谢大神!我试过放在外面也是这样。就是我放在# reset的最后后面,但是还是会有这个问题。如果不是统计l ...


你可以131行下打印print(‘a’)
确认一下他是不是一直是每10秒响应一次
如果是的话那可能就是没有及时关闭? 所以会导致那样的问题吧?

俺不是大神也是刚刚学

咱们共同学习

不能运行也只能瞎猜啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 14:35:10 | 显示全部楼层
小伤口 发表于 2021-2-23 14:18
每次响应函数之后再写个i=0就行了

那就是i += 1 一直更新?

BTW,我好像解决问题了,计时器是不是要和分辨率是倍数关系?比如我的是60,那就要设3秒的或者6秒的timer才会没问题?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 14:39:00 | 显示全部楼层
小伤口 发表于 2021-2-23 14:25
你可以131行下打印print(‘a’)
确认一下他是不是一直是每10秒响应一次
如果是的话那可能就是没有 ...

好的我试试。

对了你有没有试过刺激在屏幕运动卡帧的情况,而且是随机的,我怀疑是不是也很分辨率有关呢

我能加你好友吗,可以共同学习,主要是我现在等级太低了,加不了你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 14:43:44 | 显示全部楼层
小伤口 发表于 2021-2-23 14:25
你可以131行下打印print(‘a’)
确认一下他是不是一直是每10秒响应一次
如果是的话那可能就是没有 ...

好吧我设置成6秒也是会出现突然快几个这样,hai
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 14:50:33 | 显示全部楼层
z347289581 发表于 2021-2-23 14:39
好的我试试。

对了你有没有试过刺激在屏幕运动卡帧的情况,而且是随机的,我怀疑是不是也很分辨率有关 ...

刺激?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 14:52:52 | 显示全部楼层
z347289581 发表于 2021-2-23 14:35
那就是i += 1 一直更新?

BTW,我好像解决问题了,计时器是不是要和分辨率是倍数关系?比如我的是60, ...

  1. i=0

  2. while running:
  3.     i+=1
  4.     if i==500:
  5.         #响应函数
  6.         i=0
复制代码


那定时器是一直响应吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 15:05:30 | 显示全部楼层
小伤口 发表于 2021-2-23 14:52
那定时器是一直响应吗

我试了一下,我把pygame.time.set_timer(SHOWT, 0)删掉就正常了,但是这样的话运行了20多次之后就卡了,用print(‘a')就一直出现a,但是陨石就不出现了

我们把呈现的东西叫刺激哈哈哈

我还是加不了你,等级太低了,可惜
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 15:06:29 | 显示全部楼层
小伤口 发表于 2021-2-23 14:52
那定时器是一直响应吗

那你测过i=500大概是多长时间
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:09:03 | 显示全部楼层
z347289581 发表于 2021-2-23 15:06
那你测过i=500大概是多长时间

忘了,你可以用手机测,如果大于10你就500以上小于10就500一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:11:51 | 显示全部楼层
z347289581 发表于 2021-2-23 15:05
我试了一下,我把pygame.time.set_timer(SHOWT, 0)删掉就正常了,但是这样的话运行了20多次之后就卡了, ...

好奇怪啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:13:22 | 显示全部楼层
关于屏幕卡顿,之前有过但充会电就好了欸
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 15:13:59 | 显示全部楼层
小伤口 发表于 2021-2-23 15:09
忘了,你可以用手机测,如果大于10你就500以上小于10就500一下

好的谢谢

那你知道卡帧怎么处理吗?就是我陨石从右往左呈现,经常会出现卡帧的情况
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:19:34 | 显示全部楼层
z347289581 发表于 2021-2-23 15:13
好的谢谢

那你知道卡帧怎么处理吗?就是我陨石从右往左呈现,经常会出现卡帧的情况

反正俺是充电
其余的在网上查也没找到相关信息
60按理说应该够了
游戏写完可以放在论坛让大家玩玩嘞
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 12:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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