在pygame中每x(毫秒)做一些事情 [英] Do something every x (milli)seconds in pygame

查看:406
本文介绍了在pygame中每x(毫秒)做一些事情的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在学习Python和Pygame,我做的第一件事就是一个简单的Snake游戏。我试图让蛇每0.25秒移动一次。下面是我的循环代码的一部分:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆