Pygame中Enemy类draw方法调用报错:缺少Win参数求助
Pygame Enemy.draw() 参数错误排查与解决
错误原因分析
你的代码存在两个关键问题:
1. 实例方法调用方式错误
你在主循环中直接通过Enemy.draw(Win)调用类的方法,但draw是实例方法,它的第一个参数默认是实例本身(self)。当你用类直接调用时,Python会把传入的Win当作self,此时方法还需要第二个参数Win,自然会报缺少参数的错误。
同时你创建的Enemy(0, 0)实例没有被保存,相当于每帧创建一个临时敌人就丢弃了,根本没用到它。
2. draw方法的语法错误
draw方法里的Win.blit( enemy_img ( self.x , self.y ) )是错误的:enemy_img是你加载并缩放好的Surface对象,不是函数,不能加括号调用。blit的正确语法是Win.blit(表面对象, (x, y))。
修复步骤
步骤1:修正实例调用方式
在主循环中,先把Enemy实例保存到变量,再用实例调用draw方法:
# 替换主循环里的这两行 # Enemy( 0 , 0 ) # Enemy.draw( Win ) enemy = Enemy(0, 0) enemy.draw(Win)
步骤2:修复draw方法的语法错误
修改Enemy类的draw方法:
def draw(self, Win): # 去掉enemy_img后面的括号,把位置作为第二个参数传给blit Win.blit(enemy_img, (self.x, self.y))
进阶优化:保留多个敌人(可选)
如果你想生成多个敌人并持续存在,建议用列表存储敌人实例,每帧遍历更新:
# 在主循环外初始化敌人列表 enemies = [] # 主循环内 # 可以控制生成逻辑,比如每隔几帧生成一个敌人 enemies.append(Enemy(0, 0)) # 遍历所有敌人,执行移动和绘制 for enemy in enemies: enemy.move() enemy.draw(Win)
修复后的完整Enemy类与主循环关键代码
# Enemy Class class Enemy: def __init__(self, x, y): self.x = x self.y = y def move(self): fpx = self.x - PlayerPos[0] fpy = self.y - PlayerPos[1] fpxx = fpx * (-1) fpyy = fpy * (-1) fp = [fpx, fpy] if fp[0] > PlayerPos[0] and fpxx < 0: fp[0] = fp[0] * (-1) if fp[0] > 10 or fp[0] < -10 : self.x = self.x + (fp[0]) ^0 * enemy_speed if fp[1] > PlayerPos[1] and fpyy < 0: fp[1] = fp[1] * (-1) if fp[1] > 10 or fp[1] < -10 : self.y = self.y + (fp[1]) ^0 * enemy_speed def draw(self, Win): Win.blit(enemy_img, (self.x, self.y)) ##### main loop ##### Running = True # 初始化敌人列表 enemies = [] while Running: Win.fill((39, 188, 39)) # ... 其他事件处理、玩家移动代码保持不变 ... player() # 添加敌人并更新 enemies.append(Enemy(0, 0)) for enemy in enemies: enemy.move() enemy.draw(Win) pygame.display.update() clock.tick(60)
内容的提问来源于stack exchange,提问作者Harsshavardhan Kannan
相关产品推荐
相关产品推荐

