我正在运行此python代码,并且遇到了accel函数的问题。当按下左右时,旋转方法工作正常,但是当按下向上时没有任何反应。我已经在调试器中逐步执行了代码,并且执行了my_ship.accel行,但它没有进入方法体,它只是继续,就好像那条线不存在一样。 Idk有什么不对请帮忙。此外,my_ship是Ship对象的名称,它在我的代码中被正确定义。
import simplegui
WIDTH = 800
HEIGHT = 600
class ImageInfo:
def __init__(self, center, size, radius = 0, lifespan = None, animated = False):
self.center = center
self.size = size
self.radius = radius
if lifespan:
self.lifespan = lifespan
else:
self.lifespan = float('inf')
self.animated = animated
def get_center(self):
return self.center
def get_size(self):
return self.size
def get_radius(self):
return self.radius
def get_lifespan(self):
return self.lifespan
def get_animated(self):
return self.animated
def change_center(self, new_center):
self.center = new_center
# ship image
ship_info = ImageInfo([45, 45], [90, 90], 35)
ship_image = simplegui.load_image("http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/double_ship.png")
class Ship:
def __init__(self, pos, vel, angle, image, info):
self.pos = [pos[0],pos[1]]
self.vel = [vel[0],vel[1]]
self.thrust = False
self.angle = angle
self.angle_vel = 0
self.image = image
self.image_center = info.get_center()
self.image_size = info.get_size()
self.radius = info.get_radius()
self.info = info
self.accel = 10
self.angle_accel = .1
def draw(self,canvas):
if not self.thrust:
self.info.change_center(ship_center)
canvas.draw_image(self.image, self.image_center, self.image_size, self.pos, self.image_size, self.angle)
else:
self.info.change_center(thrust_ship_center)
canvas.draw_image(self.image, self.image_center, self.image_size, self.pos, self.image_size, self.angle)
def update(self):
self.pos[0] += self.vel[0]
self.pos[1] += self.vel[1]
self.angle += self.angle_vel
def accel(self):
self.thrust = True
self.vel[0] += self.accel
self.vel[1] += self.accel
def rotate(self, direction):
if direction == "left":
self.angle_vel -= self.angle_accel
elif direction == "right":
self.angle_vel += self.angle_accel
else:
print "error"
def keydown_handler(key):
if key == simplegui.KEY_MAP['left']:
my_ship.rotate("left")
elif key == simplegui.KEY_MAP['right']:
my_ship.rotate("right")
elif key == simplegui.KEY_MAP['up']:
my_ship.accel
elif key == simplegui.KEY_MAP['space']:
self.angle_vel += self.angle_accel
def keyup_handler(key):
if key == simplegui.KEY_MAP['left']:
my_ship.rotate("right")
elif key == simplegui.KEY_MAP['right']:
my_ship.rotate("left")
my_ship = Ship([WIDTH / 2, HEIGHT / 2], [0, 0], 1, ship_image, ship_info)
答案 0 :(得分:2)
此:
my_ship.accel
不会调用方法my_ship.accel
,只需2
调用号码2
即可。要在Python中调用某些内容,您需要使用括号。所以:
my_ship.accel()
(如果你想知道为什么Python会这样做,当其他语言,比如Ruby,不要......这就意味着你可以使用方法对象my_ship.accel
作为一个值 - 存储它以便稍后调用,将其传递给map
等。)
但是你还有另外一个问题。
您在accel
个对象上定义方法Ship
。但是,您还在10
个对象上为self.accel
分配了一个整数值Ship
。 “self.accel
无法同时表示两种不同的方法,包括方法和数字。那么,哪一个"赢了"?在这种情况下,self.accel = 10
会在您构建Ship
时发生,稍后会发生,因此它会获胜。
因此,当您撰写my_ship.accel
时,您只需提及数字10
。当您编写my_ship.accel()
时,您正在尝试调用号码10
,就像它是一个函数一样。因此TypeError
。
解决方案是不要为两个不同的东西重复使用相同的名称。通常,在名词之后的动词和属性之后命名函数是避免此问题的好方法 - 尽管您还必须避免使用无偿缩写,否则您可能会缩写acceleration
和accelerate
就像你在这里一样accel
。