问题描述
我正在使用 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.
推荐答案
您可以使用 Event
和 pygame.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 中每隔几秒移动一个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!