pygame timer的问题
请问有没有人知道为什么设置了4s的timer,达到某个条件之后出发timer,一直循环。一开始很正常,大概10个之后就突然变快,因为我是用timer来触发刺激呈现的,变快了3个trial之后又恢复正常。然后一直这么循环,正常变快正常变快。设置的clock.tick是60.
有大神知道原因吗? 有可能你设置的不止一个timer他们撞上了?{:10_334:} 我把我另一个注释了也还是这样,您能帮我看看吗?
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()
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() 本帖最后由 小伤口 于 2021-2-23 13:40 编辑
z347289581 发表于 2021-2-23 11:01
我把我另一个注释了也还是这样,您能帮我看看吗?
你试试把add_asteroid函数里的timer删掉把计时的写在外面,或许是函数多次传入了吗?{:10_277:}
我再看看吧{:10_250:}
发消息用回复吧,不然你发消息我其实是收不到的{:10_327:} 本帖最后由 小伤口 于 2021-2-23 14:22 编辑
我以前也遇到过一种类似的,最后我干脆就不用定时器了
直接设置的一个i=0
多少秒自己手工测
当时我设的是i=500时响应函数
不过这是一个笨办法{:10_250:}
如果你实在解决不了,试试这个吧 小伤口 发表于 2021-2-23 13:36
你试试把add_asteroid函数里的timer删掉把计时的写在外面,或许是函数多次传入了吗?
我 ...
谢谢大神!我试过放在外面也是这样。就是我放在# reset的最后后面,但是还是会有这个问题。如果不是统计last_asteroid == 24 那块出错,应该就是timer本身的问题了。主要是我后面还需要到处看到陨石之前一秒飞机的位置数据,所以如果这个时间不精确的话就比较麻烦{:10_243:}
如果按您的思路,你是怎么更新i的呢?{:10_254:} z347289581 发表于 2021-2-23 14:12
谢谢大神!我试过放在外面也是这样。就是我放在# reset的最后后面,但是还是会有这个问题。如果不是统计l ...
每次响应函数之后再写个i=0就行了{:10_264:} 本帖最后由 小伤口 于 2021-2-23 14:31 编辑
z347289581 发表于 2021-2-23 14:12
谢谢大神!我试过放在外面也是这样。就是我放在# reset的最后后面,但是还是会有这个问题。如果不是统计l ...
你可以131行下打印print(‘a’)
确认一下他是不是一直是每10秒响应一次
如果是的话那可能就是没有及时关闭?{:10_243:} 所以会导致那样的问题吧?
俺不是大神也是刚刚学
咱们共同学习{:10_297:}
不能运行也只能瞎猜啦{:10_266:} 小伤口 发表于 2021-2-23 14:18
每次响应函数之后再写个i=0就行了
那就是i += 1 一直更新?
BTW,我好像解决问题了,计时器是不是要和分辨率是倍数关系?比如我的是60,那就要设3秒的或者6秒的timer才会没问题? 小伤口 发表于 2021-2-23 14:25
你可以131行下打印print(‘a’)
确认一下他是不是一直是每10秒响应一次
如果是的话那可能就是没有 ...
好的我试试。
对了你有没有试过刺激在屏幕运动卡帧的情况,而且是随机的,我怀疑是不是也很分辨率有关呢
我能加你好友吗,可以共同学习,主要是我现在等级太低了,加不了你{:10_285:} 小伤口 发表于 2021-2-23 14:25
你可以131行下打印print(‘a’)
确认一下他是不是一直是每10秒响应一次
如果是的话那可能就是没有 ...
好吧我设置成6秒也是会出现突然快几个这样,hai z347289581 发表于 2021-2-23 14:39
好的我试试。
对了你有没有试过刺激在屏幕运动卡帧的情况,而且是随机的,我怀疑是不是也很分辨率有关 ...
刺激?{:10_257:} z347289581 发表于 2021-2-23 14:35
那就是i += 1 一直更新?
BTW,我好像解决问题了,计时器是不是要和分辨率是倍数关系?比如我的是60, ...
i=0
while running:
i+=1
if i==500:
#响应函数
i=0
那定时器是一直响应吗 小伤口 发表于 2021-2-23 14:52
那定时器是一直响应吗
我试了一下,我把pygame.time.set_timer(SHOWT, 0)删掉就正常了,但是这样的话运行了20多次之后就卡了,用print(‘a')就一直出现a,但是陨石就不出现了
我们把呈现的东西叫刺激哈哈哈
我还是加不了你,等级太低了,可惜 小伤口 发表于 2021-2-23 14:52
那定时器是一直响应吗
那你测过i=500大概是多长时间{:10_334:} z347289581 发表于 2021-2-23 15:06
那你测过i=500大概是多长时间
忘了,你可以用手机测,如果大于10你就500以上小于10就500一下{:10_297:} z347289581 发表于 2021-2-23 15:05
我试了一下,我把pygame.time.set_timer(SHOWT, 0)删掉就正常了,但是这样的话运行了20多次之后就卡了, ...
好奇怪啊{:10_250:} 关于屏幕卡顿,之前有过但充会电就好了欸{:10_309:} 小伤口 发表于 2021-2-23 15:09
忘了,你可以用手机测,如果大于10你就500以上小于10就500一下
好的谢谢
那你知道卡帧怎么处理吗?就是我陨石从右往左呈现,经常会出现卡帧的情况 z347289581 发表于 2021-2-23 15:13
好的谢谢
那你知道卡帧怎么处理吗?就是我陨石从右往左呈现,经常会出现卡帧的情况
反正俺是充电{:10_300:}
其余的在网上查也没找到相关信息
60按理说应该够了
游戏写完可以放在论坛让大家玩玩嘞{:10_264:}
页:
[1]
2