[英]I am trying to make an enemy move toward my player, but am getting an Attribute Error
这是我遇到问题的代码的相关部分。 在调试控制台中,player.x和player.y出现“ AttributeError:类型对象'player'没有属性'x'”错误。 我有一个单独的类,称为“玩家”,我想获得它在移动时的x和y坐标,以便敌人可以朝它移动。 这是与玩家课程相关的开始部分:
class player(object):
def __init__(self, x, y, sprintMultiplier, fps):
self.x = x
self.y = y
self.vel = 1/fps * 150
class enemy(object):
def __init__(self, fps, difficulty):
pass
def draw(self, window):
self.moveTowardsPlayer()
window.blit(self.downStanding, (self.x, self.y))
def moveTowardsPlayer(self):
dx, dy = self.x - player.x, self.y - player.y
dist = math.hypot(dx, dy)
dx, dy = dx/dist, dy/dist
self.x += dx * self.vel
self.y += dy * self.vel
根据提供的代码,您似乎正在将一个类与该类的对象 (实例)混合在一起。
player
是一个类,您可以在其中创建对象。 player
类本身没有类属性 (即,类中所有成员共享的变量); 它仅具有实例属性(该类的各个实例唯一的变量)。 因此,预期的用途是创建一个或多个实例(可能是程序的全局实例)并对其进行操作。
因此,我认为您需要三个方面:
player
对象,如下所示: the_player = player(starting_x, starting_y, multiplier, starting_fps)
向您的enemy
的初始值设定项添加该player
的参数,如下所示:
class enemy(object): def __init__(self, player_to_track, fps, difficulty): self.player_to_track = player_to_track
the_player
传递给您创建的enemy
对象。 (就其价值而言,许多人都遵循使类名大写且实例小写的约定。这有助于在阅读代码时使区分变得明显—您会得到诸如my_player = Player( . . . )
,如果编写Player.foo
,它有助于指出您是在谈论类属性,而不是成员变量。)
代码错误
因此,解决该问题的方法是。
您可以如下所述将x和y值声明为全局变量,并按如下所示在构造函数中将这些x和y变量访问为全局变量。
class player(object):
x = 0
y = 0
def __init__(self, x, y, sprintMultiplier, fps):
player.x = x
player.y = y
self.vel = 1/fps * 150
或者,如果您不想将(玩家类的)x和y变量保留为全局/类变量,则将玩家实例传递给敌人类中的moveTowardsPlayer()方法。 代码如下。
def moveTowardsPlayer(self, player1):
dx, dy = self.x - player1.x, self.y - player1.y
dist = math.hypot(dx, dy)
dx, dy = dx/dist, dy/dist
self.x += dx * self.vel
self.y += dy * self.vel
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.