Почему param moveY не отображается? Метод обновления Pygame

#python #pygame

#python #pygame

Вопрос:

Я пытаюсь поиграть с pygame, и я могу нарисовать изображение в виде спрайта на экране. Я пытаюсь переместить спрайт с помощью WASD, изменив переменные x и y.

Когда я запускаю программу, спрайт рисуется, но не перемещается, когда я нажимаю правильные клавиши.

РЕДАКТИРОВАТЬ: я добавил метод обновления, и параметр moveY говорит, что его там нет, хотя это явно так, почему это так?

Вот код:

 import pygame
pygame.init()

screen = pygame.display.set_mode((750, 750))

BLACK = (0, 0, 0)
WHITE = (255,255,255)
RED = (255,0,0)

class Sprite(pygame.sprite.Sprite):
    def __init__(self, pos):
        super(Sprite, self).__init__()
        self.image = demon
        self.pos = [x,y]
        self.rect = self.image.get_rect(center = pos)
    def update(self, moveX, moveY):
        pygame.sprite.Sprite.update(self)
        moveXY = [moveX,moveY]
        
        Sprite.pos[x]  = moveXY[moveX]
        Sprite.pos[y]  = moveXY[moveY] 
        
        

        
        
all_sprites_list = pygame.sprite.Group()

demon = pygame.image.load("C:/programming/doomman/cacodemon.png").convert_alpha()

x = 300
y = 300

my_sprite = Sprite((x, y))
all_sprites_list.add(my_sprite)
clock = pygame.time.Clock()
pygame.display.set_caption("Demon Dance")
carryOn = True
        
while carryOn == True:
    keys = pygame.key.get_pressed()
    
    for event in pygame.event.get():
            if event.type==pygame.QUIT:
                carryOn=False
            elif event.type == pygame.KEYDOWN:
                if keys[pygame.K_w]:
                    Sprite.update(0, 50)
                if keys[pygame.K_s]:
                    Sprite.update(0, -50)
                if keys[pygame.K_d]:
                    Sprite.update(50, 0)
                if keys[pygame.K_a]:
                    Sprite.update(-50, 0)
                    
    
    
    pygame.display.flip()
    clock.tick(60)
    all_sprites_list.draw(screen)
 

Комментарии:

1. Я не знаком с pygame API, но целые числа в Python передаются по значению (вроде), что означает, что здесь: my_sprite = Sprite((x, y)) x и y копируются в функцию. Это означает, что при изменении значения x или y оно не отражается в my_sprite . Существует ли метод для непосредственного изменения объекта sprite?

2. Похоже, вы можете определить update метод для спрайта. Я бы рекомендовал изучить это и изменить ваши координаты x и y, вызвав указанный метод: pygame.org/docs/ref/sprite.html#pygame.sprite . Спрайт

3. Я добавил метод обновления, все еще не работает, обновит вопрос

Ответ №1:

Смотрите pygame.sprite.Group.draw :

Преобразует содержащиеся в нем спрайты в аргумент Surface. При этом используется Sprite.image атрибут для исходной поверхности и Sprite.rect для позиции.

Поэтому вам необходимо обновить rect атрибут после изменения position ( pos ) спрайта:

 class Sprite(pygame.sprite.Sprite):
    def __init__(self, pos):
        super(Sprite, self).__init__()
        self.image = demon
        self.pos = [pos[0], pos[1]]
        self.rect = self.image.get_rect(center = pos)
    
    def update(self, moveX, moveY):
        Sprite.pos[x]  = moveX
        Sprite.pos[y]  = moveY 
        self.rect = self.image.get_rect(center = pos)
 

На самом деле вам вообще не нужен pos атрибут. Вы можете переместить спрайт, изменив позицию, сохраненную в rect :

 class Sprite(pygame.sprite.Sprite):
    def __init__(self, pos):
        super(Sprite, self).__init__()
        self.image = demon
        self.rect = self.image.get_rect(center = pos)
    
    def update(self, moveX, moveY):
        self.rect.x  = moveX
        self.rect.y  = moveY
 

Дополнительно update есть метод экземпляра. Вам нужно вызвать его с объектом, а не с классом:

 if keys[pygame.K_w]:
    my_sprite.update(0, 50)
if keys[pygame.K_s]:
    my_sprite.update(0, -50)
if keys[pygame.K_d]:
    my_sprite.update(50, 0)
if keys[pygame.K_a]:
    my_sprite.update(-50, 0)
 

Комментарии:

1. Как я получаю ошибку типа: в update() отсутствует 1 требуемый позиционный аргумент: ‘moveY’

2. @TheBearSlicer Спасибо. Пожалуйста.