在pygame中每x(毫秒)做一些事情 [英] Do something every x (milli)seconds in pygame
问题描述
true:
check_for_quit()
clear_screen()
draw_snake()
draw_food()
check_for_direction_change()
move_snake()#我该怎么做它使循环以正常速度运行,但move_snake()每0.25秒执行一次?
pygame.display.update()
我想要所有其他函数正常运行,但move_snake()仅在每0.25秒发生一次。我查了一下,发现了一些答案,但对于那些创造他们第一个Python脚本的人来说,这些答案似乎都太复杂了。
是否有可能实际获得我的代码应该是什么样子的例子,而不是告诉我需要使用哪个函数?感谢!
有几种方法,例如跟踪系统时间或使用 Clock
和计数滴答。
但最简单的方法是使用事件队列和每x毫秒创建一个事件,使用 pygame.time.set_timer()
:
pygame.time.set_timer()
$
$ b
set_timer(eventid,milliseconds) - >&b $ b
反复在事件队列中创建事件 ; None
设置一个事件类型,使其每隔给定的毫秒数出现在事件队列中。第一个事件将不会出现,直到时间已过。
每个事件类型都可以有一个单独的计时器连接到它。最好使用pygame.USEREVENT和pygame.NUMEVENTS之间的值。
要禁用事件的计时器,请将毫秒参数设置为0。
以下是一个小例子,其中蛇每250毫秒移动一次:
import pygame
pygame.init()
screen = pygame.display.set_mode((300,300))
player,dir,size = pygame.Rect( 100,00,20,20,20),(0,0),20
MOVEEVENT,t,trail = pygame.USEREVENT + 1,250,[]
pygame.time.set_timer(MOVEEVENT,t)
而真:
keys = pygame.key.get_pressed()
如果键[pygame.K_w]:dir = 0,-1
如果键[pygame.K_a]:dir = -1,0
if [pygame.K_s]:dir = 0,1
if key [pygame.K_d]:dir = 1,0
if pygame.event .get(pygame.QUIT):在pygame.event.get()中为e打破
:
如果e.type == MOVEEVENT:#每't'毫秒被调用
trail。 append(player.inflate(( - 10,-10)))
trail = trail [-5:]
player.move_ip(* [v * v中dir的大小])
screen.fill((0,120,0))
for t在轨迹中:
pygame.draw.rect(screen,(255,0,0),t)
pygame.draw.rect(screen,(255,0,0),player)
pygame.display.flip()
I'm learing Python and Pygame, and my first thing I'm making is a simple Snake game. I'm trying to make it so that the snake moves once every 0.25 seconds. Here is the part of my code that loops:
while True:
check_for_quit()
clear_screen()
draw_snake()
draw_food()
check_for_direction_change()
move_snake() #How do I make it so that this loop runs at normal speed, but move_snake() only executes once every 0.25 seconds?
pygame.display.update()
I want all of the other function to run normally, but move_snake() to only occur once every 0.25 seconds. I've looked it up and found a few answers but they all seem too complicated for someone who's making their first ever Python script.
Would it be possible to actually get an example of what my code should look like rather than just telling me which function I need to use? Thanks!
There are several approaches, like keeping track of the system time or using a Clock
and counting ticks.
But the simplest way is to use the event queue and creating an event every x ms, using pygame.time.set_timer()
:
pygame.time.set_timer()
repeatedly create an event on the event queue
set_timer(eventid, milliseconds) -> None
Set an event type to appear on the event queue every given number of milliseconds. The first event will not appear until the amount of time has passed.
Every event type can have a separate timer attached to it. It is best to use the value between pygame.USEREVENT and pygame.NUMEVENTS.
To disable the timer for an event, set the milliseconds argument to 0.
Here's a small, running example where the snake moves every 250 ms:
import pygame
pygame.init()
screen = pygame.display.set_mode((300, 300))
player, dir, size = pygame.Rect(100,100,20,20), (0, 0), 20
MOVEEVENT, t, trail = pygame.USEREVENT+1, 250, []
pygame.time.set_timer(MOVEEVENT, t)
while True:
keys = pygame.key.get_pressed()
if keys[pygame.K_w]: dir = 0, -1
if keys[pygame.K_a]: dir = -1, 0
if keys[pygame.K_s]: dir = 0, 1
if keys[pygame.K_d]: dir = 1, 0
if pygame.event.get(pygame.QUIT): break
for e in pygame.event.get():
if e.type == MOVEEVENT: # is called every 't' milliseconds
trail.append(player.inflate((-10, -10)))
trail = trail[-5:]
player.move_ip(*[v*size for v in dir])
screen.fill((0,120,0))
for t in trail:
pygame.draw.rect(screen, (255,0,0), t)
pygame.draw.rect(screen, (255,0,0), player)
pygame.display.flip()
这篇关于在pygame中每x(毫秒)做一些事情的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!