所以我在编译时遇到这个错误,我不明白,因为我有两个相同的类,一个工作正常,另一个抛出这个错误。
如果self.currentState2 == 1: NameError:名称'self'未定义
class EnemyShip(pygame.sprite.Sprite):
def __init__(self, (x, y), playerShip):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("enemy.png")
self.image = self.image.convert()
tranColor = self.image.get_at((1, 1))
self.image.set_colorkey(tranColor)
self.rect = self.image.get_rect()
self.enemyX = float(x)
self.enemyY = float(y)
self.ship = playerShip
self.count = 0
self.currentState2 = 0
def update(self):
self.count += 1
x_component = self.ship.rect.centerx-self.enemyX
y_component = self.ship.rect.centery-self.enemyY
distance = math.hypot(x_component, y_component)
if distance < 100:
self.currentState2 = 1
print distance
elif distance > 100:
self.currentState2 = 0
print "test2"
if self.count < 600:
self.caculateNextPosition()
self.rect.center = (self.enemyX, self.enemyY)
elif self.count < 600:
self.caculateNextPositionEvade()
self.rect.center = (self.enemyX, self.enemyY)
else:
self.count = 0
def caculateNextPosition(self):
shipX = self.ship.rect.centerx
shipY = self.ship.rect.centery
if self.currentState2==1:
if self.enemyY < shipY:
self.enemyY += 4
elif self.enemyY > shipY:
self.enemyY -= 4
if self.enemyX < shipX:
self.enemyX += 4
elif self.enemyX > shipX:
self.enemyX -= 4
elif self.currentState2==0:
if self.enemyY < shipY:
self.enemyY += 0
elif self.enemyY > shipY:
self.enemyY -= 0
if self.enemyX < shipX:
self.enemyX += 0
elif self.enemyX > shipX:
self.enemyX -= 0
答案 0 :(得分:2)
方法calculateNextPosition
中的缩进不正确。因此,if语句系列在类的主体(而不是方法)中执行,其中self
未被定义。
答案 1 :(得分:1)
你的缩进是关闭的。 if语句不在您认为的方法之内。
答案 2 :(得分:1)
检查缩进 - 条件与函数定义处于同一级别。换句话说,它不在函数内部,所以技术上是 - 自我没有被定义。
答案 3 :(得分:1)
您可能只有缩进错误。
由于self
被隐式作为实例方法的第一个参数传递,如果你有类似的东西:
class A(object):
def foo(self):
return "foo called"
...然后没关系,因为self
是该方法的局部变量。但是,如果你像这样填写缩进词:
class A(object):
def bar(self):
if self.x == 1:
do_stuff()
if self.x == 2:
do_something_else()
...第二个self.x
会导致错误,因为self
并不代表函数范围之外的任何内容。
答案 4 :(得分:1)
您需要缩进这些行:
if self.currentState2==1:
elif self.currentState2==0:
它们不被视为函数def的一部分,因为它们与函数名称具有相同的缩进。