Перемещение спрайта в 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
параметр.