gpt4 book ai didi

python - 使用 pygame.timer.set_timer() 的 Pygame 闪电动画

转载 作者:行者123 更新时间:2023-12-01 01:47:12 25 4
gpt4 key购买 nike

我目前正在尝试使用 pygame 制作闪电动画。我计划使用 pygame.timer.set_timer() 模块每 3 秒发生一次闪电动画,因为我将发生独立于闪电动画的其他动画。

为了简单起见,我用一个拉长的黄色三角形来象征闪电。一旦超过某个点,我计划让黄色三角形停止,消失 3 秒,然后再次出现。

但是,lightning_event似乎并不是每次在while循环中都会触发,并且没有发生延迟。

我已经使用 pygame.timer.set_timer() 查看了入侵者示例,尽管它不使用 xy 坐标。我尝试调整入侵者代码以使用 xy 坐标,但它也不起作用。

我的另一个问题是,如果同时发生许多事件,使用多线程或多处理是否比使用 pygame.timer.set_timer() 更好?如果是这样,多线程或多处理如何与 pygame 模块一起使用?尤其是因为python的GIL?

这是我的照明动画代码:

import pygame
pygame.init()

BLACK = (0,0,0)
WHITE = (255,255,255)
GREEN = (0,255,0)
RED = (255,0,0)
BLUE = (0,0,255)
YELLOW = (200,240,70)

size = (700,500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Multithreading Project")

done = False

delay1 = 3000
clock = pygame.time.Clock()

def lightning(y_coord,y_coord_incr):
pygame.draw.polygon(screen,YELLOW,[[200,200],[100,y_coord],[300,y_coord]])

lightning_event = pygame.USEREVENT + 1
pygame.time.set_timer(lightning_event, delay1)

while not done:
for event in pygame.event.get():

if event.type == pygame.QUIT:
done = True
elif event.type == lightning_event:
if y_coord > 500:
y_coord = 200
screen.fill(WHITE)
lightning(y_coord,y_coord_incr)
y_coord = y_coord + y_coord_incr
pygame.display.flip()
clock.tick(60)
pygame.quit()

谢谢!

最佳答案

您可以添加一个 bool 变量(我将其称为 lightning_anim_playing)并将其设置为 True 以启动动画。

当动画播放时,增加y_coord并绘制闪电。

一旦 y_coord 大于 500,就启动下一次闪电的计时器 (pygame.time.set_timer(lightning_event, delay1)) 并将 bool 变量设置为 False 停止动画。

当计时器完成后,停止它(pygame.time.set_timer(lightning_event, 0)),重置 y_coord 并再次将 bool 变量设置为 True开始下一个动画。

import pygame


WHITE = (255,255,255)
YELLOW = (200,240,70)

pygame.init()
screen = pygame.display.set_mode((700, 500))
clock = pygame.time.Clock()

delay1 = 3000
lightning_event = pygame.USEREVENT + 1
pygame.time.set_timer(lightning_event, delay1)
y_coord = 200
y_coord_incr = 3
lightning_anim_playing = False

done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
elif event.type == lightning_event:
pygame.time.set_timer(lightning_event, 0) # Stop the timer.
lightning_anim_playing = True # Start the animation.
y_coord = 200 # Reset the y_coord.

if lightning_anim_playing:
# Update the y_coord.
y_coord += y_coord_incr
if y_coord > 500:
# Stop the animation.
lightning_anim_playing = False
# Start the timer for the next lightning.
pygame.time.set_timer(lightning_event, delay1)

screen.fill(WHITE)
# Draw the lightning if the animation is playing.
if lightning_anim_playing:
pygame.draw.polygon(screen,YELLOW,[[200,200],[100,y_coord],[300,y_coord]])

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

pygame.quit()

关于python - 使用 pygame.timer.set_timer() 的 Pygame 闪电动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51162205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com