gpt4 book ai didi

Python没有在pygame中进入for循环

转载 作者:行者123 更新时间:2023-12-04 10:09:50 25 4
gpt4 key购买 nike

我正在用 pygame 制作游戏,我真的不明白为什么代码没有运行这个 for 循环。它肯定会到达 events() 方法,但它只是没有在里面运行 for 循环。有谁知道为什么?

def events(self):
print('events') # This prints out
for event in pygame.event.get():
print('for loop') # This doesn't print out
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_change = -10
y_change = 0
if event.key == pygame.K_RIGHT:
x_change = 10
y_change = 0
if event.key == pygame.K_UP:
y_change = -10
x_change = 0
if event.key == pygame.K_DOWN:
y_change = 10
x_change = 0
self.x += x_change
self.y += y_change

最佳答案

如果线

print('for loop') # This doesn't print out

没有被执行,这意味着 pygame.event.get()没有返回事件。

一个常见的初学者错误是调用 pygame.event.get()每帧多次,因此请确保您只有一个 pygame.event.get()调用你的游戏。
pygame.event.get()一旦调用将清除事件队列,因此如果您不处理返回的所有事件,您将错过它们并且另一个调用将不会再次返回它们。

如果您需要在除主循环之外的其他地方监听事件,只需将事件存储在变量中即可。这是我为另一个答案写的一个例子:
import pygame

class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((32, 32))
self.image.fill((0, 0, 0))
self.image.set_colorkey((0, 0, 0))
pygame.draw.polygon(self.image, pygame.Color('dodgerblue'), ((0, 0), (32, 16), (0, 32)))
self.org_image = self.image.copy()
self.angle = 0
self.direction = pygame.Vector2(1, 0)
self.rect = self.image.get_rect(center=(200, 200))
self.pos = pygame.Vector2(self.rect.center)

def update(self, events, dt):
for e in events:
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_SPACE:
self.groups()[0].add(Projectile(self.rect.center, self.direction.normalize()))
pressed = pygame.key.get_pressed()
if pressed[pygame.K_a]:
self.angle += 3
if pressed[pygame.K_d]:
self.angle -= 3

self.direction = pygame.Vector2(1, 0).rotate(-self.angle)
self.image = pygame.transform.rotate(self.org_image, self.angle)
self.rect = self.image.get_rect(center=self.rect.center)

class Projectile(pygame.sprite.Sprite):
def __init__(self, pos, direction):
super().__init__()
self.image = pygame.Surface((8, 8))
self.image.fill((0, 0, 0))
self.image.set_colorkey((0, 0, 0))
pygame.draw.circle(self.image, pygame.Color('orange'), (4, 4), 4)
self.rect = self.image.get_rect(center=pos)
self.direction = direction
self.pos = pygame.Vector2(self.rect.center)

def update(self, events, dt):
self.pos += self.direction * dt
self.rect.center = self.pos
if not pygame.display.get_surface().get_rect().contains(self.rect):
self.kill()

def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))
sprites = pygame.sprite.Group(Player())
clock = pygame.time.Clock()
dt = 0

while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
sprites.update(events, dt)
screen.fill((30, 30, 30))
sprites.draw(screen)
pygame.display.update()
dt = clock.tick(60)

if __name__ == '__main__':
main()

如您所见, pygame.event.get()只调用一次。结果存储在变量 events 中然后通过 update 传递给所有 Sprite 方法。

关于Python没有在pygame中进入for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61383881/

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