首页 > 解决方案 > Python 新手:Pygame TypeError: update() 接受 1 个位置参数,但给出了 2 个

问题描述

我运行游戏,它运行得很好,但是当第一个玩家射击第二个玩家时,它使游戏崩溃并出现此错误:

pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html
EPIC HIT! Player 2 HIT
Traceback (most recent call last):
  File "C:\Users\rmatt\OneDrive\Hackathon Projects\ShootMeme\_Main.py", line 125, in <module>
    player2.update(gameWindow)
TypeError: update() takes 1 positional argument but 2 were given
[Finished in 6.435s]

当玩家 2 射击玩家 1 时,子弹从玩家 1 上经过,这完全没有我想要的问题。

我一直在试图弄清楚为什么它一直标记这个。任何帮助将不胜感激!下面是相关代码:

import pygame, utils, random
from GenericPlayer import PlayerActive
from GenericPlayer2 import PlayerActive2
#from BasicEnemy import Enemy
pygame.init()

gameWindow = pygame.display.set_mode((1000, 600))
pygame.display.set_caption("ShootMeme")
clock = pygame.time.Clock()

def closeGame():
    pygame.quit()
    quit()

whois = random.randint(0, 1)

whois = 0
if whois == 0:
    player = PlayerActive()
    player2 = PlayerActive2()
else:
    player = PlayerActive2()
    player2 = PlayerActive()

#enemy1 = Enemy()
#enemy2 = Enemy()
#enemy2.speed = 1


pygame.init()

pygame.mixer.init()
pygame.mixer.music.load("C:/Users/rmatt/OneDrive/Hackathon Projects/ShootMeme/Sounds/ShootMeme0.mp3")
pygame.mixer.music.set_volume(.15)
pygame.mixer.music.play(-1)


FPS = 30
gameActive = True
while gameActive:

    for event in pygame.event.get():
        #print (event)
        if event.type == pygame.QUIT:

            gameActive = False

    activeKey = pygame.key.get_pressed()

    if activeKey[pygame.K_d]:
        #player.move(1, 0)
        player.move(5)
    if activeKey[pygame.K_a]:
        #player.move(-1, 0)
        player.move(-5)
    if activeKey[pygame.K_w]:
        #player.move(0, -1)
        player.move(0)
    #if activeKey[pygame.K_s]:
        #continue
        #player.move(0, 1)



    if activeKey[pygame.K_SPACE]:
        player.shoot()

        #pygame.mixer.Channel(1).queue()
        #pygame.mixer.music.load("C:/Users/rmatt/OneDrive/Hackathon Projects/ShootMeme/Sounds/ShootMeme0.mp3")
        #pygame.mixer.music.play(-1)


    if activeKey[pygame.K_RIGHT]:
            #player.move(1, 0)
            player2.move(5)
    if activeKey[pygame.K_LEFT]:
            #player.move(-1, 0)
            player2.move(-5)
    if activeKey[pygame.K_UP]:
            #player.move(0, -1)
            player2.move(0)
        #if activeKey[pygame.K_s]:
            #continue
            #player.move(0, 1)

    if activeKey[pygame.K_KP_ENTER]:
            player2.shoot()

    mouse = pygame.mouse.get_pressed()

    if activeKey[pygame.K_ESCAPE]:
        closeGame()

    gameWindow.fill(utils.white)

    #Do math stuff
    #if mouse[0]:
    #    player.shoot()

    #Draw stuff here

    p1Bullets = pygame.sprite.Group()
    p1Bullets.add(player.bullets)
    p2Bullets = pygame.sprite.Group()
    p2Bullets.add(player2.bullets)

    p1 = pygame.sprite.Group()
    p1.add(player)
    p2 = pygame.sprite.Group()
    p2.add(player2)

    p1bulletCollision = pygame.sprite.groupcollide(p2Bullets, p1, False, False)
    for player1 in p1bulletCollision:
        print("EPIC HIT! Player 2 HIT")
        continue

    p2bulletCollision = pygame.sprite.groupcollide(p1Bullets, p2, False, False)
    for player2 in p2bulletCollision:
        print("EPIC HIT! Player 2 HIT")
        continue

    #Updates

    player.update(gameWindow)
    player2.update(gameWindow)

    #print(str(player.rect.x))


    #enemy1.update(gameWindow, player)
    #enemy2.update(gameWindow, player)


    #End drawing stuff

    pygame.display.update()
    clock.tick(FPS)

closeGame()

和:

import pygame, utils, random, math
pygame.init()

class PlayerActive2(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load('C:/Users/rmatt/OneDrive/Hackathon Projects/ShootMeme/Images/RedShip000.png').convert_alpha()
        self.image = pygame.transform.scale(self.image, (76, 101))

        #self.image.fill(utils.blue)
        self.rect = self.image.get_rect()
        self.image_rotated = self.image

        self.memeMastery = 5

        self.angle = 0
        self.rect.x = 900
        self.rect.y = random.randint(1, 5) * 100
        self.speed = 5

        self.spawnDelay = 0
        self.spawnDelayMax = 15
        self.ammo = pygame.sprite.Group()
        self.bullets = pygame.sprite.Group()

        self.rotation = 0

        self.isAlive = True

        self.cd = 10
        self.cdMax = 10

    def rot_center(emptyVar, image, angle, centerSelf):
        '''rotate an image while keeping its center'''
        rot_image = pygame.transform.rotate(image, angle)
        rot_rect = rot_image.get_rect(center=centerSelf)
        return rot_image

    def is_collided_with(self, sprite):
        return self.rect.colliderect(sprite.rect)

    def move(self, dir):


        #define angle between 0 and 359
        #modulo out 360's either positive or negative to get direction
        #for your angles established now, make the ship move in the x direction equal to -sin(x) and in the y direction equal to -sin(y)
        #your projectiles can also be shot out once you have this angle.


        #if self.angle >= 180:
            #self.angle = -180
        #elif self.angle <= -180:
            #self.angle = 180
        if self.angle >= 360:
            self.angle = 0
        elif self.angle < 0:
            self.angle = 360


        if dir == -5:
            self.angle -= 5
            self.image_rotated = self.rot_center(self.image, self.angle, self.rect.center)

        if dir == 5:
            self.angle += 5
            self.image_rotated = self.rot_center(self.image, self.angle, self.rect.center)

        if dir == 0:
            #print(str(self.angle) + " ROTATION")

            self.rect.x += (math.sin(-self.angle*math.pi/180)*self.speed)
            self.rect.y -= (math.cos(-self.angle*math.pi/180)*self.speed)


        #if dir == 0:
        #    self.speed
        #print(self.rect.x)
        #print(self.rect.y)

        #if dir == 0:
            #self.speed = math.sqrt((math.cos(-self.angle*math.pi/180)*self.speed)**2+(math.sin(-self.angle*math.pi/180)*self.speed)**2)
        #    self.rect.x -= (math.cos(-self.angle*math.pi/180)*self.speed)
        #    self.rect.y += (math.sin(-self.angle*math.pi/180)*self.speed)
        #    return
        #self.angle = (self.angle + dir)%360
        #print (str(self.angle) + " ANGLE")

        #self.image_backup = self.image
        #self.image_rotated = pygame.transform.rotate(self.image, self.angle)
        #self.image = self.image_backup

    def spawnAmmo(self):
        self.ammo.add(Bullet(self.angle,self.rect.x+(self.rect.width/2)+self.rect.width/2*math.cos(self.angle),self.rect.y+(self.rect.height/2)-self.rect.height/2*math.sin(self.angle)))

    def moveAmmo(self):

        for obj in self.ammo:

            if obj.rect.x + obj.rect.width >= self.rect.width:
                obj.xmove *= -1
            elif obj.rect.x <= 0:
                obj.xmove *= -1
            if obj.rect.y + obj.rect.height >= self.rect.height:
                obj.ymove *= -1
            elif obj.rect.y <= 0:
                obj.ymove *=-1

            obj.rect.x += obj.xmove
            obj.rect.y += obj.ymove

    def shoot(self):
        if self.cd <= 0 and self.ammo:
            self.cd = self.cdMax
            bullet = self.ammo.sprites() [0]
            self.ammo.remove(bullet)

            bullet.rect.x = self.rect.x + self.rect.width/2 - bullet.rect.width/2
            bullet.rect.y = self.rect.y + self.rect.height/2 - bullet.rect.height/2

            bullet.getTarg()
            self.bullets.add(bullet)

    def destroy():
        print("HIT! Gen 2")

    def update(self, gw):
        self.cd -= 1
        self.spawnDelay -= 1
        if self.spawnDelay <=0:
            self.spawnAmmo()
            self.spawnDelay = self.spawnDelayMax

        self.moveAmmo()

        #Active in scene
        self.bullets.update()
        self.bullets.draw(gw)

        if self.isAlive:
            gw.blit(self.image_rotated, self.rect)


charList = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z".split()

class Bullet(pygame.sprite.Sprite):
    def __init__(self,angle,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.angle = angle
        self.image = pygame.image.load('C:/Users/rmatt/OneDrive/Hackathon Projects/ShootMeme/Images/RedLaser.png').convert_alpha()
        self.image = pygame.transform.scale(self.image, (11, 11))
        self.rect = self.image.get_rect()

        self.rect.x = x#random.randint(0, 100 - self.rect.width)
        self.rect.y = y#random.randint(0, 100 - self.rect.height)

        self.speed = 20.0

        self.xmove = 0
        self.ymove = 0

        #self.xmove = random.choice([-1, 1])
        #self.ymove = random.choice([-1, 1])

    def rot_center(emptyVar, image, angle, centerSelf):
        '''rotate an image while keeping its center'''
        rot_image = pygame.transform.rotate(image, angle)
        rot_rect = rot_image.get_rect(center=centerSelf)
        return rot_image

    def getTarg(self):

        self.xmove += (math.sin(-self.angle*math.pi/180)*self.speed)
        self.ymove -= (math.cos(-self.angle*math.pi/180)*self.speed)


        #xdiff = cur[0] - self.rect.x - self.rect.width/2
        #ydiff = cur[1] - self.rect.y - self.rect.height/3
        #xdiff = self.rect.x - math.cos(self.angle)*(self.speed)
        #ydiff = self.rect.y - math.sin(self.angle)*(self.speed)

        #magnitude = math.sqrt(float(xdiff ** 2 + ydiff ** 2))
        #numFrames = int(magnitude / self.speed)

        #self.xmove = xdiff/numFrames
        #self.ymove = ydiff/numFrames

        #xtravel = math.cos(self.angle)*self.xmove * numFrames
        #ytravel = math.sin(self.angle)*self.ymove * numFrames

        #self.rect.x += xdiff - xtravel
        #self.rect.y += ydiff - ytravel

    def destroy():
        kill()

    def update(self):
        self.rect.x += self.xmove
        self.rect.y += self.ymove

标签: pythonpygame

解决方案


当您player2执行for player2 in p2bulletCollision:. Python 没有块作用域,因此该定义保留在作用域中。这意味着它player2不再是 PlayerActive 的实例,而是p2bulletCollision列表中的任何内容。

您应该使用不同的名称;实际上,由于您在循环中根本不使用变量,因此请使用以下_字符:

for _ in p2bulletCollision:

推荐阅读