Персонаж на экране не двигается (pygame)

По какой-то причине клавиши со стрелками не перемещают спрайт "guy.png". У кого-нибудь есть объяснение, почему? Да, спрайт отображается на экране, и да, guy.png находится в той же папке, что и проект.

код:

import pygame, sys
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((500, 500), 0, 32)
guy_sprite = pygame.image.load("guy.png")
wall_sprite = pygame.image.load("wall.png")

class guy_class(pygame.sprite.Sprite):
    def __init__(self, surface):
        self.surface = surface
        self.x = 250
        self.y = 250
        self.vx = 0
        self.vy = 0
        self.sprite = guy_sprite

    def event(self, event):
        if event.type == pygame.K_UP:
            self.vy = -1
        elif event.type == pygame.K_DOWN:
            self.vy = 1
        elif event.type == pygame.K_LEFT:
            self.vx = -1
        elif event.type == pygame.K_RIGHT:
            self.vx = 1

    def move(self):
        self.x += self.vx
        self.y += self.vy

    def draw(self, surface):
        surface.blit(self.sprite, (int(self.x), int(self.y)))

    def position(self):
        return self.x, self.y

class wall_class(pygame.sprite.Sprite):
    def __init__(self, surface):
        self.x = 100
        self.y = 250
        self.vx = 0
        self.vy = 0
        self.sprite = wall_sprite

    def draw(self, surface):
        surface.blit(self.sprite, (self.x, self.y))

def end_game():
    pygame.quit()
    sys.exit()

clock = pygame.time.Clock()
guy = guy_class(screen)
wall = wall_class(screen)

while True:
    screen.fill((0, 0, 0))
    guy.move()
    guy.draw(screen)

    for event in pygame.event.get():
        if event.type == QUIT:
            end_game()
        elif event.type == pygame.KEYDOWN:
            guy.event(event)

    clock.tick(100)
    pygame.display.update()


person undo_all    schedule 21.04.2013    source источник


Ответы (1)


Причина, по которой ваш спрайт не движется, заключается в том, что вы проверяете тип вместо ключа в своей функции события парня.

Поэтому измените его на это:

def event(self, event):
    if event.key == pygame.K_UP:
        self.vy = -1
    elif event.key == pygame.K_DOWN:
        self.vy = 1
    elif event.key == pygame.K_LEFT:
        self.vx = -1
    elif event.key == pygame.K_RIGHT:
        self.vx = 1

вы также должны проверить событие KEY_UP, поэтому ваш спрайт остановится, когда вы отпустите клавишу.

person Bartlomiej Lewandowski    schedule 21.04.2013