Я пытаюсь заставить врага двинуться к моему игроку, но получаю ошибку атрибута - PullRequest
0 голосов
/ 09 декабря 2018

Это соответствующая часть кода, с которой у меня возникают проблемы.Player.x и player.y получают ошибки «AttributeError: тип объекта« player »не имеет атрибута« x »» в консоли отладки.У меня есть отдельный класс под названием «player», и я хочу получить координаты 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 ]

0 голосов
/ 09 декабря 2018

Ошибка в вашем коде

  • Вы объявляете переменные x и y класса player как частные переменные экземпляра, тогда как в классе врага вы получаете доступ к этим 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

или передать экземпляр игрока методу 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
0 голосов
/ 09 декабря 2018

Исходя из предоставленного кода, похоже, что вы смешиваете класс с объектом (экземпляр) этого класса.

playerВот класс, из которого вы могли бы создавать объекты.Сам класс player не имеет атрибутов класса (т. Е. Переменных, общих для всех членов класса);он имеет только атрибуты instance (переменные, уникальные для отдельных экземпляров класса).Таким образом, ожидаемое использование заключается в том, что вы создаете один или несколько экземпляров (возможно, глобальных для вашей программы) и работаете с ними.

Таким образом, я думаю, что вам нужно в три раза:

  1. Длясоздайте объект player следующим образом: the_player = player(starting_x, starting_y, multiplier, starting_fps)
  2. Добавьте параметр для этого player в инициализатор вашего enemy, например:

    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, это поможет вспомнить, что вы говорите об атрибуте class , а не о членской переменной.)

...