Member 14756060 Ответов: 1

Отсутствует 1 требуется позиционный аргумент, с которым Pygame на Python 1.9.6 3.8.1


Привет,
I recently started following more or less a pygame tutorial series (https://www.youtube.com/playlist?list=PLzMcBGfZo4-lp3jAExUCewBfMx3UZFkh5) where, on the projectile episode (5th), I'm currently stuck because my projectile.draw(screen) doesn't work (TypeError: draw() missing 1 required positional argument: 'screen') like my player ones above who are similar and work and I don't know why. If I give a variable argument before screen (which is pygame.display.set_mode) it says the name isn't defined (even for self) and it works with a random integer for exemple but then I get another error inside the draw function where AttributeError: 'int' object has no attribute 'fbcount' but I already said self.fbcount = 0. I'm kinda new to python and I'm probably not understanding the basics of classes and OOP so I come here to get some help and maybe some advices on how to improve the code :x

import pygame
from pygame.locals import *
pygame.init()
running = pygame.display.get_active()

#Screen settings
screen = pygame.display.set_mode((859, 561))
scene = pygame.image.load("background.jpg").convert()
scenewidth = screen.get_width()

#skins
r_stand = pygame.image.load("rstand.png")
l_stand = pygame.transform.flip(r_stand, True, False)
r_walk = [pygame.image.load("rwalk1.png"), pygame.image.load("rwalk2.png"), pygame.image.load("rwalk3.png"), pygame.image.load("rwalk4.png"), pygame.image.load("rwalk5.png"), pygame.image.load("rwalk6.png")]
l_walk = [pygame.image.load("lwalk1.png"), pygame.image.load("lwalk2.png"), pygame.image.load("lwalk3.png"), pygame.image.load("lwalk4.png"), pygame.image.load("lwalk5.png"), pygame.image.load("lwalk6.png")]
r_jump = [pygame.image.load("rjump1.png"), pygame.image.load("rjump2.png"), pygame.image.load("rjump3.png")]
l_jump = [pygame.image.load("ljump1.png"), pygame.image.load("ljump2.png"), pygame.image.load("ljump3.png")]
r_crouch = [pygame.image.load("rcrouch1.png"), pygame.image.load("rcrouch2.png"), pygame.image.load("rcrouch3.png")]
l_crouch = [pygame.image.load("lcrouch1.png"), pygame.image.load("lcrouch2.png"), pygame.image.load("lcrouch3.png")]
r_fireball = [pygame.image.load("rfireball1.jpg"), pygame.image.load("rfireball2.jpg"), pygame.image.load("rfireball3.jpg"), pygame.image.load("rfireball4.jpg"), pygame.image.load("rfireball5.jpg"), pygame.image.load("rfireball6.jpg"), pygame.image.load("rfireball7.jpg"), pygame.image.load("rfireball8.jpg"), pygame.image.load("rfireball9.jpg"), pygame.image.load("rfireball10.jpg")]
l_fireball = [pygame.image.load("lfireball1.jpg"), pygame.image.load("lfireball2.jpg"), pygame.image.load("lfireball3.jpg"), pygame.image.load("lfireball4.jpg"), pygame.image.load("lfireball5.jpg"), pygame.image.load("lfireball6.jpg"), pygame.image.load("lfireball7.jpg"), pygame.image.load("lfireball8.jpg"), pygame.image.load("lfireball9.jpg"), pygame.image.load("lfireball10.jpg")]

class player1():
    def __init__(self):
        self.x = 79
        self.y = 432
        self.speed = 0.1
        self.width = 15
        self.right = False
        self.left = False
        self.jumping = False
        self.jumpvar = 100
        self.jumpcount = 0
        self.walking = False
        self.walkCount = 0
        self.crouching = False
        self.crouchcount = 0
        self.hitbox = (self.x, self.y, 16, 45)
        self.fbcount = 0

    def draw(self, screen):
        if self.walking == False and self.jumping == False and self.crouchcount == 0:
            if self.left == False:
                screen.blit(r_stand, (self.x, self.y))
            if self.left == True:
                screen.blit(l_stand, (self.x, self.y))
            self.hitbox = (self.x, self.y, 16, 45)
            self.height = 45

#WALKING ANIMATION

        if self.walking == True and self.jumping == False and self.crouchcount == 0:
            if self.right == True:
                screen.blit(r_walk[self.walkCount//300], (self.x, self.y))
            if self.left == True:
                screen.blit(l_walk[self.walkCount//300], (self.x, self.y))
            self.walkCount += 1
            if self.walkCount >= 1800:
                self.walkCount = 0
            self.walking = False
            self.hitbox = (self.x, self.y, 16, 45)
            self.height = 45

#JUMPING ANIMATION

        if self.jumping == True:
            if self.left == False:
                screen.blit(r_jump[self.jumpcount//534], (self.x, self.y))
            if self.left == True:
                screen.blit(l_jump[self.jumpcount//534], (self.x, self.y))
            self.jumpcount += 1
            if self.jumpcount >= 1602:
                self.jumpcount = 0
            self.hitbox = (self.x, self.y, 16, 45)
            self.height = 45

#CROUCHING ANIMATION

        if self.jumping == False and self.crouchcount != 0:
            if self.left == False:
                screen.blit(r_crouch[self.crouchcount//100], (self.x, self.y + (self.crouchcount//100 * 7)))
            if self.left == True:
                screen.blit(l_crouch[self.crouchcount//100], (self.x, self.y + (self.crouchcount//100 * 7)))
            self.hitbox = (self.x, self.y + 13, 19, 33)
            self.height = 33
        if self.crouchcount < 299 and self.crouching == True and self.jumping == False:
                self.crouchcount += 1
        if self.crouchcount > 0 and self.crouching == False and self.jumping == False:
                self.crouchcount -= 1
        pygame.draw.rect(screen, (255,0,0), self.hitbox, 2)

class player2(player1):
    def __init__(self):
        super().__init__()
        self.x = 780

class projectile():
    def __init__(self, x, y, facing):
        self.x = x
        self.y = y
        self.facing = facing
        self.fbcount = 0

    def draw(self, screen):
        if player1.left == False or player2.left == False:
            screen.blit(r_fireball[self.fbcount//100], (self.x, self.y))
        if player1.left == True or player2.left == True:
            screen.blit(l_fireball[self.fbcount//100], (self.x, self.y))
        self.fbcount += 1

def UpdateScreen():
    screen.blit(scene, (0,0))
    player1.draw(screen)
    player2.draw(screen)
    for fireball in fireballs:
        projectile.draw(screen)
    pygame.display.flip()

#MAIN LOOP

player1 = player1()
player2 = player2()
fireballs = []
while running == True:

#SETUP QUIT

    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    keys = pygame.key.get_pressed()

#SETUP FIREBALLS

    for fireball in fireballs:
        if fireball.x < scenewidth and fireball.x > 0:
            fireball.x += fireball.facing
        else:
            fireballs.remove(fireball)

#LEFT PLAYER 1

    if keys[pygame.K_LEFT] and player1.x > player1.speed:
            player1.walking = True
            player1.left = True
            player1.right = False
            player1.x -= player1.speed

#LEFT PLAYER 2

    if keys[pygame.K_a] and player2.x > player2.speed:
            player2.walking = True
            player2.left = True
            player2.right = False
            player2.x -= player2.speed

#RIGHT PLAYER 1

    if keys[pygame.K_RIGHT] and player1.x < scenewidth - player1.width - player1.speed:
            player1.walking = True
            player1.right = True
            player1.left = False
            player1.x += player1.speed

#LEFT PLAYER 2

    if keys[pygame.K_d] and player2.x < scenewidth - player2.width - player2.speed:
            player2.walking = True
            player2.right = True
            player2.left = False
            player2.x += player2.speed

#JUMP PLAYER 1
    if not(player1.jumping):
        if keys[pygame.K_UP]:
            player1.jumping = True
            player1.jumpcount = 0
    else:
        if player1.jumpvar >= -100:
            neg = 1
            if player1.jumpvar < 0:
                neg =- 1
            player1.y -= ((player1.jumpvar/100) ** 2) * 0.3 * neg
            player1.jumpvar -= 0.125
        else:
            player1.jumping = False
            player1.jumpvar = 100

#JUMP PLAYER 2

    if not(player2.jumping):
        if keys[pygame.K_w]:
            player2.jumping = True
            player2.jumpcount = 0
    else:
        if player2.jumpvar >= -100:
            neg = 1
            if player2.jumpvar < 0:
                neg =- 1
            player2.y -= ((player2.jumpvar/100) ** 2) * 0.3 * neg
            player2.jumpvar -= 0.125
        else:
            player2.jumping = False
            player2.jumpvar = 100

#CROUCH PLAYER 1

    if keys[pygame.K_DOWN] and player1.walking == False:
        player1.crouching = True
    else:
        player1.crouching = False

#CROUCH PLAYER 2

    if keys[pygame.K_s] and player2.walking == False:
        player2.crouching = True
    else:
        player2.crouching = False

#FIREBALL PLAYER 1

    if keys[pygame.K_KP1]:
        if player1.left:
            facing = -1
        else:
            facing = 1
        if len(fireballs) < 5:
            fireballs.append(projectile(player1.x + player1.width//2, player1.y + player1.height//2, facing))

    UpdateScreen()


Что я уже пробовал:

-положить снаряд.рисовать(8, экраном), например, больше ошибок нет об этом, но потом ошибка о экране.копированием(r_fireball[собственной личности.fbcount//100], (самовыдвижение.х, собственной личности.г)), где AttributeError: 'инт' объект не имеет атрибут 'fbcount'

1 Ответов

Рейтинг:
0

Richard MacCutchan

for fireball in fireballs:
    projectile.draw(screen)

Ваш призыв к снаряду выше-это к объекту, который не существует. Насколько я вижу, огненные шары-это массив объектов-снарядов, поэтому правильный вызов будет:
for fireball in fireballs:
    fireball.draw(screen)