首页 文章

我试图让一个敌人向我的玩家移动,但我得到一个属性错误

提问于
浏览
0

这是我遇到问题的代码的相关部分 . 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

2 回答

  • 1

    Error in your code

    • 您将类播放器的x和y变量声明为私有实例变量,而在敌人类中,您将这些x和y值作为全局变量进行访问 .

    So the work around the problem is.

    您可以将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
    
  • 0

    根据提供的代码,看起来您正在将类与该类的对象(实例)混合在一起 .

    player 这是一个类,您可以在其中创建对象 . player 类本身没有class attributes(即,该类的所有成员共享的变量);它只有实例属性(对于类的各个实例唯一的变量) . 因此,预期的用途是您创建一个或多个实例(可能是程序的全局实例)并对其进行操作 .

    因此,我认为你需要的是三重:

    • 要像这样创建一个 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 对象 .

    (对于它的 Value ,许多人坚持一种使类名大写,并且实例小写的约定 . 这有助于使它在阅读代码时显而易见 - 你得到像 my_player = Player( . . . ) 这样的东西,如果你写过 Player.foo ,它有助于调用你所说的是一个类属性,而不是一个成员变量 . )

相关问题