在 Pygame 中每隔几秒移动一个对象 [英] Move an object every few seconds in Pygame

查看:57
本文介绍了在 Pygame 中每隔几秒移动一个对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 pygame 制作一个街机游戏,并且我试图每隔几秒就让一个精灵改变位置.

I'm making an arcade game using pygame and I'm trying to have a sprite change positions every few seconds.

我尝试使用 time.sleep(1) 并将帧速率更改为 .5 (clock.tick(.5)>).

I've tried using time.sleep(1) and changing the frame rate to .5 (clock.tick(.5)).

两者都只在时间间隔过后才使对象改变位置,但是它们也使精灵以相同的速率跟随我的鼠标更新坐标.

Both worked to make the object change position only after the time interval has passed, however they also make the sprite following my mouse update coordinates at the same rate.

我一直在研究,但似乎无法找到另一种方法来使精灵移动而不使我的程序每次运行时刷新速度变慢或休眠".

I've been researching and can't seem to find another way to make the sprite move without making my program refresh slower or 'sleep' every time it runs.

推荐答案

您可以使用 Eventpygame.time.set_timer():

You can use an Event for this together with pygame.time.set_timer():

pygame.time.set_timer()
在事件队列上重复创建一个事件
set_timer(eventid, 毫秒) ->无

设置一个事件类型以每隔给定的毫秒数出现在事件队列中

Set an event type to appear on the event queue every given number of milliseconds

<小时>

这是一个简单、完整的示例.注意敌人是如何每 1000 毫秒向侧面移动一次,每 3500 毫秒向下移动一次,并且您可以每 450 毫秒射击一次(均使用事件).


Here's a simple, complete example. Note how the enemies move every 1000ms sideways, every 3500ms downwards, and you can shoot every 450ms (all using events).

import pygame

# you'll be able to shoot every 450ms
RELOAD_SPEED = 450

# the foes move every 1000ms sideways and every 3500ms down
MOVE_SIDE = 1000
MOVE_DOWN = 3500

screen = pygame.display.set_mode((300, 200))
clock = pygame.time.Clock()

pygame.display.set_caption("Micro Invader")

# create a bunch of events 
move_side_event = pygame.USEREVENT + 1
move_down_event = pygame.USEREVENT + 2
reloaded_event  = pygame.USEREVENT + 3

move_left, reloaded = True, True

invaders, colors, shots = [], [] ,[]
for x in range(15, 300, 15):
    for y in range(10, 100, 15):
        invaders.append(pygame.Rect(x, y, 7, 7))
        colors.append(((x * 0.7) % 256, (y * 2.4) % 256))

# set timer for the movement events
pygame.time.set_timer(move_side_event, MOVE_SIDE)
pygame.time.set_timer(move_down_event, MOVE_DOWN)

player = pygame.Rect(150, 180, 10, 7)

while True:
    clock.tick(40)
    if pygame.event.get(pygame.QUIT): break
    for e in pygame.event.get():
        if e.type == move_side_event:
            for invader in invaders:
                invader.move_ip((-10 if move_left else 10, 0))
            move_left = not move_left
        elif e.type == move_down_event:
            for invader in invaders:
                invader.move_ip(0, 10)
        elif e.type == reloaded_event:
            # when the reload timer runs out, reset it
            reloaded = True
            pygame.time.set_timer(reloaded_event, 0)

    for shot in shots[:]:
        shot.move_ip((0, -4))
        if not screen.get_rect().contains(shot):
            shots.remove(shot)
        else:
            hit = False
            for invader in invaders[:]:
                if invader.colliderect(shot):
                    hit = True
                    i = invaders.index(invader)
                    del colors[i]
                    del invaders[i]
            if hit:
                shots.remove(shot)

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_LEFT]: player.move_ip((-4, 0))
    if pressed[pygame.K_RIGHT]: player.move_ip((4, 0))

    if pressed[pygame.K_SPACE]: 
        if reloaded:
            shots.append(player.copy())
            reloaded = False
            # when shooting, create a timeout of RELOAD_SPEED
            pygame.time.set_timer(reloaded_event, RELOAD_SPEED)

    player.clamp_ip(screen.get_rect())

    screen.fill((0, 0, 0))

    for invader, (a, b) in zip(invaders, colors): 
        pygame.draw.rect(screen, (150, a, b), invader)

    for shot in shots: 
        pygame.draw.rect(screen, (255, 180, 0), shot)

    pygame.draw.rect(screen, (180, 180, 180), player)    
    pygame.display.flip()

这篇关于在 Pygame 中每隔几秒移动一个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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