python - 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
解决方案
当您player2
执行for player2 in p2bulletCollision:
. Python 没有块作用域,因此该定义保留在作用域中。这意味着它player2
不再是 PlayerActive 的实例,而是p2bulletCollision
列表中的任何内容。
您应该使用不同的名称;实际上,由于您在循环中根本不使用变量,因此请使用以下_
字符:
for _ in p2bulletCollision:
推荐阅读
- javascript - Swiper:如何删除每个视差过渡之间的空白
- azure-devops - Azure DevOps 管道:在 ReferencePaths 参数中具有多个目录的 msbuild
- jwt - 使用为其他服务返回的 JWT 时,Cloud Run 服务请求总是失败并返回 401。相同的请求适用于为最终用户返回的 JWT
- php - php artisan db:seed ErrorException 未定义变量 $factory
- python - 断言错误:401!= 200
- ruby-on-rails - 如何使用rails Nokogiri gem获取2个div之间的所有html数据
- java - Spring Repository 忽略嵌套实体字段的大小写
- exception - 在本地服务器上找不到驱动程序
- php - 如何从控制器执行 Laravel 黄昏命令
- python - 创建新帐户时未对 Django 密码进行哈希处理