Перемещение спрайта в PyGame

В настоящее время я работаю над школьным проектом, но я застрял, пытаясь заставить мой спрайт двигаться. Мое сообщение об ошибке говорит, что мне не хватает 1 обязательного позиционного аргумента: 'self' в Mario.handle_keys().

Вот мой основной код:

import pygame
import sys
from pygame.locals import*
from Mario import Mario
from Ladder import Ladder

pygame.init()
b = Mario([0, 800])
c = Ladder([600, 800])
game_over = False
dispwidth = 600
dispheight = 800
cellsize = 10
white = (255, 255, 255)
black = (0, 0, 0)
bg = white


def main():
    FPS = 30
    while not game_over:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        Mario.handle_keys()

        Mario.draw(screen)
        screen.fill(bg)
        screen.blit(b.image, b.rect)
        screen.blit(c.image, c.rect)
        pygame.display.update()
        fpstime.tick(FPS)

while True:
    global fpstime
    global screen

    fpstime = pygame.time.Clock()
    screen = pygame.display.set_mode((dispwidth, dispheight))
    pygame.display.set_caption('Donkey Kong')
    main()

И мой спрайт:

import pygame
from pygame.locals import*


class Mario(pygame.sprite.Sprite):
    image = None

    def __init__(self, location):
        pygame.sprite.Sprite.__init__(self)

        if Mario.image is None:

            Mario.image = pygame.image.load('mario3.png')
        self.image = Mario.image

        self.rect = self.image.get_rect()
        self.rect.bottomleft = location

        self.x = 0
        self.y = 0

    def handle_keys(self):

        keys_pressed = pygame.key.get_pressed()

        if keys_pressed[K_LEFT]:
            self.x -= 5

        if keys_pressed[K_RIGHT]:
            self.y += 5

    def draw(self, surface):

        surface.blit(self.image, (self.x, self.y))

Заранее спасибо.

Я ценю любые советы!

1 ответ

Решение

Mario это класс. Метод handle_keys(self) является методом экземпляра - это означает, что он может быть вызван только против Mario пример. (Можно иметь classmethod, но это не то, что вы хотите здесь, так как вам нужно изменить self.)

На вершине вы сделали b = Mario([0, 800]) - Я бы изменил b в mario везде и c в ladder,

 mario = Mario([0, 800])

Тогда вместо Mario.handle_keys() вы бы использовали mario.handle_keys(),

Больше фона:

Когда вы звоните mario.handle_keys() то, что на самом деле происходит под ним, более или менее handle_keys(mario), Предмет mario в конечном итоге является аргументом self, Так как вы пытаетесь позвонить handle_keys на уроке Mario вместо этого Python жалуется, что ничего не передается handle_keys для self параметр.

Больше в сорняки:

Если вы определите метод класса, вы сделаете это так:

class Foo():
    @classmethod
    def my_class_method(cls):
        ...

Вы бы назвали это Foo.my_class_method(), который бы прошел Foo в my_class_method как cls параметр.

Другие вопросы по тегам