Python не входит в l oop в пигме - PullRequest
2 голосов
/ 23 апреля 2020

Я делаю игру в Pygame, и я действительно не понимаю, почему код не работает для l oop. Он определенно попадает в метод events (), но он просто не запускает for l oop внутри. Кто-нибудь знает почему?

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

1 Ответ

2 голосов
/ 23 апреля 2020

Если строка

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

не выполняется, это означает, что pygame.event.get() не вернул событие.

Распространенной ошибкой новичка является многократный вызов pygame.event.get() за кадр, поэтому убедитесь, что в вашей игре только один вызов pygame.event.get().

pygame.event.get() очистит очередь событий после вызова, поэтому, если вы не обработаете все возвращенные события, вы пропустите они и другой вызов не вернут их снова.

Если вам нужно прослушивать события в других местах, кроме вашего основного l oop, просто сохраните события в переменной. Вот пример, который я написал для другого ответа:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...