Нужна помощь в устранении ошибки атрибута в Pygame (наследование) - PullRequest
0 голосов
/ 20 февраля 2020

При попытке перейти на OOP в моем платформере я столкнулся с этой ошибкой при попытке реализовать наследование в программе.

Traceback (most recent call last):
  File "G:\Coursework assets\Gametest2.py", line 115, in <module>
    bullet.shoot()
  File "G:\Coursework assets\Gametest2.py", line 88, in shoot
    if self.left:
AttributeError: 'projectile' object has no attribute 'left'

Вот родительский класс для игрока, который является главным персонажем пользователь контролирует

class player:
    def __init__(self, playerposX,characterPosX,y):
        self.playerposX = playerposX
        self.y = y
        self.width = 88
        self.height = 135
        self.standing = True
        self.left = False
        self.right = True
        self.vel = 15
        self.jumping = False
        self.jumpCount = 10
        self.attacking = False
        self.characterPosX = characterPosX


    def move(self):
        self.k = pygame.key.get_pressed()
        if self.k[pygame.K_LEFT] and self.playerposX > 0 - 45:
            self.left = True
            self.right = False
            self.playerposX -= self.vel
            self.standing = False
        elif self.k[pygame.K_RIGHT] and self.playerposX < 1500 - 90:
            self.right = True
            self.left = False
            self.standing = False
            self.playerposX += self.vel
        else:
            self.standing = True




    def jump(self):
        if not (self.jumping):  # checks if user's jumping intiating jump
            if self.k[pygame.K_SPACE]:
                self.jumping = True
        else:
            if self.jumpCount >= -10:
                neg = 1
                if self.jumpCount < 0:
                    neg = -1
                self.y -= (self.jumpCount ** 2) * 0.5 * neg
                self.jumpCount -= 1
            else:
                self.jumping = False
                self.jumpCount = 10

    def draw(self):
        wLeft = pygame.image.load('runningleft.png')
        wRight = pygame.image.load('running.png')
        char = [pygame.image.load('idleright.png'), pygame.image.load('idleleft.png')]
        attack = [pygame.image.load('attackleft.png'), pygame.image.load('attackright.png')]
        if not (self.standing):
            if self.left:
                win.blit(wLeft, (self.playerposX, self.y))
            elif self.right:
                win.blit(wRight, (self.playerposX, self.y))
        else:
            if self.right:
                win.blit(char[0], (self.playerposX, self.y))
            if self.left:
                win.blit(char[1], (self.playerposX, self.y))
        if self.attacking == True:
            if self.left:
                win.blit(attack[0], (self.playerposX, self.y))
            if self.right:
                win.blit(attack[1], (self.playerposX, self.y))

Вот дочерний класс, в котором, похоже, возникает ошибка

class projectile(player):
    def __init__(self,bulletx, bullety):
        self.bulletx = bulletx
        self.bullety = bullety
        self.facing = 1
        self.shooting = False
    def shoot(self):
        self.vel = 30 * self.facing
        if self.left:
            self.facing = -1
        else:
            self.facing = 1
        self.bulletx += self.vel
        if self < 0 or bullet.x > 500:
            self.shooting = True
    def draw(self):
     if self.shooting == True:
         win.blit(thunderball,(self.bulletx,self.bullety))

Я не уверен, как исправить это, поэтому я прихожу сюда, чтобы получить совет о том, как решить это

1 Ответ

0 голосов
/ 22 февраля 2020

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

class projectile(player):
    def __init__(self,bulletx, bullety):
        super().__init__(bulletx, bullety)
        self.bulletx = bulletx
        self.bullety = bullety
        self.facing = 1
        self.shooting = False

Я собираюсь догадаться, что вы запутались в том, как работает наследование. Я предлагаю вам взглянуть на другие идеи OOP и учиться на них. Как указывалось ранее, не имеет смысла, что Projectile является подклассом Player, вместо этого вы можете сказать, что и Player, и Projectile являются подклассами GameObject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...