这是我遇到问题的代码的相关部分。在调试控制台中,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
答案 0 :(得分:1)
根据提供的代码,您似乎正在将类与该类的对象(实例)混合在一起。
player
这是一个类,您可以可以创建对象。 player
类本身没有class attributes(即该类的 all 成员共享的变量);它仅具有 instance 属性(该变量对于该类的各个实例是唯一的)。因此,预期的用途是创建一个或多个实例(可能是程序的全局实例)并对其进行操作。
因此,我认为您需要三个方面:
player
对象:the_player = player(starting_x, starting_y, multiplier, starting_fps)
为此player
的参数添加到enemy
的初始化程序中,如下所示:
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
,它有助于说明您所谈论的是 class 属性,而不是成员变量。)
答案 1 :(得分:0)
您的代码错误
所以解决此问题的方法是。
您可以将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
或将播放器实例传递给内的方法moveTowardsPlayer() 如果您不想保留玩家的x和y变量,请选择敌方职业 类)作为全局/类变量。代码如下。
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