我试图让一个敌人向我的玩家移动,但我得到一个属性错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我试图让一个敌人向我的玩家移动,但我得到一个属性错误相关的知识,希望对你有一定的参考价值。
这是我遇到问题的代码的相关部分。 player.x和player.y在调试控制台中收到“AttributeError:type object'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
答案
代码出错
- 您将类播放器的x和y变量声明为私有实例变量,而在敌人类中,您将这些x和y值作为全局变量进行访问。
所以围绕这个问题的工作是。
您可以将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
另一答案
根据提供的代码,看起来您正在将类与该类的对象(实例)混合在一起。
player
这是一个类,你可以创建对象。 player
类本身没有class attributes(即,所有成员共享的变量);它只有实例属性(类的各个实例唯一的变量)。因此,预期的用途是您创建一个或多个实例(可能是程序的全局实例)并对其进行操作。
因此,我认为你需要的是三重:
- 要像这样创建一个
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
,它有助于调用你所说的是一个类属性,而不是一个成员变量。)
以上是关于我试图让一个敌人向我的玩家移动,但我得到一个属性错误的主要内容,如果未能解决你的问题,请参考以下文章