python - 我试图让敌人向我的玩家移动,但出现属性错误
问题描述
这是我遇到问题的代码的相关部分。player.x 和 player.y 在调试控制台中出现“AttributeError: type object 'player' has no attribute '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
类本身没有类属性(即类的所有成员共享的变量);它只有实例属性(类的各个实例独有的变量)。因此,预期用途是您创建一个或多个实例(可能对您的程序来说是全局的)并对其进行操作。
因此,我认为你需要的是三个方面:
- 像这样创建一个
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
,它有助于指出您说的是类属性,而不是成员变量。)
推荐阅读
- r - 无法在 ubuntu 外访问 Rshiny 应用程序的 http://localhost:3838/Rshiny/
- swift - 无法在 Bundle 项目中的 NSWindowController 中动态更改实例化视图,但能够在 Cocoa 应用程序中
- php - 如何搜索多维关联数组php
- javascript - 如何将 forEach 循环中的字符串合并到数组中
- javascript - 将故事书添加到 vue.js webpack 项目解析失败:意外令牌 (1:0)
I have a problem when starting storybook after adding it to a new vuejs project.
Apparently when including a .vue file it is not interpreted correctly ...
Here are all th
- django - 仅返回 Django REST Framework 中的最后一个对象
- c++ - MSVC编译器生成mov ecx,看起来没用的ecx
- docker - 无法在 docker 中推送图像
- python - 我如何找到这个数学问题的解决方案?
- c++ - 多个 std::map.insert() 使用相同的 std::pair 引用,但使用新值会导致不正确的映射值。为什么以及如何解决?