Python список не возвращает правильное значение сложного объекта - PullRequest
2 голосов
/ 14 марта 2020

Я пишу платформер, используя python 3.6.9 и библиотеку pygame. Я пытаюсь создать все игровые объекты, а затем поместить их все в список, чтобы перетащить их все на экран в виде for x in gameObjectList l oop.

Каждый из игровых объектов в Вопрос имеет атрибут img, который я присваиваю pygame.image.load("slime-character.gif"). Это сохраняет изображение как объект pygame.Surface. Окно (экран) имеет функцию blit, которая принимает объект Surface (который является изображением) и либо пару координат x и y, либо pygame.Rect, из которого она берет x и y.

Мой код:

for x in gameObjects:
        screen.blit(x.img, x.rect)

, но выдает ошибку, говоря, что x.img является целым числом. Печатая это, кажется, 200. Печать без итератора print(gameObjects[0].img) дает мне то же самое.

НО, если я печатаю само значение объекта print(object1.img), я получаю объект pygame.Surface, это то, что мне нужно, чтобы моргать.

Для меня нецелесообразно жестко кодировать каждый возможный объект, чтобы появиться, поэтому мне нужно ссылаться на их изображения из списка объектов. Но когда я это сделаю, это даст мне неправильный тип данных. Кто-нибудь знает, почему это происходит / обходной путь, чтобы я мог получить доступ к нужным мне данным?

Заранее спасибо. Ссылка на полный код (89i sh строк) на Google Диске.

РЕДАКТИРОВАТЬ: решено благодаря комментарию Криса Дойла: я забыл поставить экран в качестве параметра для movableOb js. Я оставляю этот вопрос, однако, на тот случай, если кто-нибудь сможет объяснить поведение программы (работает без списка, но не работает, когда на него ссылаются из списка).

1 Ответ

1 голос
/ 15 марта 2020

Прежде всего имена классов должны обычно использовать соглашение CapWords. См. Руководство по стилю для Python Код - Имена классов .
Используйте переименование gameObjectRef на GameObjectRef, gameObj на GameObj и movableObj на MovableObj.


Проблема object2 соответственно класса movableObj. Класс movableObj является производным от класса gameObj. Первым аргументом для конструктора gameObj является экран. Вы должны передать screen конструктору gameObj в супер вызове конструктора fht:

Do

gameObj.__init__(self, img, xpos, ypos, w, h, visible, active)

gameObj.__init__(self, screen, img, xpos, ypos, w, h, visible, active)

in

class movableObj(gameObj):
    def __init__(self, screen, img, xpos, ypos, w, h, gravity=1, xvel=0, yvel=0,
                 visible=False, leaveScreen=False, active=True):
        gameObj.__init__(self, screen, img, xpos, ypos, w, h, visible, active)
        self.gravity = gravity
        self.xvel = xvel
        self.yvel = yvel
        self.leaveScreen = leaveScreen

Более того, вы должны передать конструктору screen при создании экземпляра movableObj:

object2 = movableObj(imgslime, 600, 200, 20, 20, 0, 2, 0)

object2 = movableObj(screen, imgslime, 600, 200, 20, 20, 0, 2, 0)
...