繁体   English   中英

我试图使敌人向我的玩家移动,但出现属性错误

[英]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类本身没有类属性 (即,类中所有成员共享的变量); 它仅具有实例属性(该类的各个实例唯一的变量)。 因此,预期的用途是创建一个或多个实例(可能是程序的全局实例)并对其进行操作。

因此,我认为您需要三个方面:

  1. 要创建一个player对象,如下所示: the_player = player(starting_x, starting_y, multiplier, starting_fps)
  2. 向您的enemy的初始值设定项添加该player的参数,如下所示:

     class enemy(object): def __init__(self, player_to_track, fps, difficulty): self.player_to_track = player_to_track 
  3. the_player传递给您创建的enemy对象。

(就其价值而言,许多人都遵循使类名大写且实例小写的约定。这有助于在阅读代码时使区分变得明显—您会得到诸如my_player = Player( . . . ) ,如果编写Player.foo ,它有助于指出您是在谈论属性,而不是成员变量。)

代码错误

  • 您将类播放器的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM