鱼C论坛

 找回密码
 立即注册
查看: 2691|回复: 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他们撞上了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-23 10:55:36 | 显示全部楼层    本楼为最佳答案   
有可能你设置的不止一个timer他们撞上了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


# initialize 
pygame.init()
transparent = (0, 0, 0, 0)
# pygame.mixer.init() # for music

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

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

pygame.mouse.set_visible(False) 

BLACK = (0,0,0)
GREEN = (0,255,0)
RED = (255,0,0)
WHITE = (255,255,255)
SKY_BLUE = (202,235,216)
GREY = (192,192,192)



def add_asteroid(posy1, group, timer):

        for i in range(24):
                num = choice([1,2,3])
                if num == 1:
                        ast = asteroid.Comet1(bg_size, posy1)
                elif num == 2:
                        ast = asteroid.Comet2(bg_size, posy1)
                elif num == 3:
                        ast = asteroid.Comet3(bg_size, posy1)

                group.add(ast)

                posy1 += 25

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

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



                        







# main module
def main():

        
        


        # 用于延迟
        delay = 100

        running = True

        clock = pygame.time.Clock()

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


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

        # 用于计算trial
        trial = 0
        last_asteroid = 0;

        
        # 用于生成asteroid
        stepy = 10


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

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



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

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


        while running:
                for event in pygame.event.get():
                        if event.type == QUIT:
                                pygame.quit()
                                sys.exit()
                        if event.type == KEYDOWN:
                                if event.key == K_q:
                                        pygame.quit()
                                        sys.exit()

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

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





                                

                fire.update()
                me.update()
                

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






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

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

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

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

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

                        if each.cl:
                                last_asteroid += 1
                                each.cl = False
                                #print(last_asteroid)
                        
                # reset
                if last_asteroid == 24:
                        last_asteroid = 0
                        del all_asteroid 
                        all_asteroid = pygame.sprite.Group()
                        add_asteroid(stepy, all_asteroid, SHOWT)
                        # pygame.time.set_timer(SHOWT, 4 * 1000)
                        





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








if __name__ == '__main__':
        try:
                main()
        except SystemExit:
                pass
        except:
                traceback.print_exc()
                pygame.quit()
                input()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

我再看看吧

发消息用回复吧,不然你发消息我其实是收不到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

不过这是一个笨办法
如果你实在解决不了,试试这个吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我 ...

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

如果按您的思路,你是怎么更新i的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


每次响应函数之后再写个i=0就行了
想知道小甲鱼最近在做啥?请访问 -> 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秒响应一次
如果是的话那可能就是没有及时关闭? 所以会导致那样的问题吧?

俺不是大神也是刚刚学

咱们共同学习

不能运行也只能瞎猜啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

BTW,我好像解决问题了,计时器是不是要和分辨率是倍数关系?比如我的是60,那就要设3秒的或者6秒的timer才会没问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的我试试。

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

我能加你好友吗,可以共同学习,主要是我现在等级太低了,加不了你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好吧我设置成6秒也是会出现突然快几个这样,hai
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

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

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

i=0

while running:
    i+=1
    if i==500:
        #响应函数
        i=0

那定时器是一直响应吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

我还是加不了你,等级太低了,可惜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那你测过i=500大概是多长时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

忘了,你可以用手机测,如果大于10你就500以上小于10就500一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2021-2-23 15:13:22 | 显示全部楼层
关于屏幕卡顿,之前有过但充会电就好了欸
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的谢谢

那你知道卡帧怎么处理吗?就是我陨石从右往左呈现,经常会出现卡帧的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

反正俺是充电
其余的在网上查也没找到相关信息
60按理说应该够了
游戏写完可以放在论坛让大家玩玩嘞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 12:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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