2017-05-15 6 views
-2

私は小惑星に取り組んでいますが、ランダムに動く小惑星の機能は実行されません。ここではコード -オブジェクトを渡しません

class Player(): 
    def __init__(self, canvas): 
     self.shape = canvas.create_rectangle(910, 540, 960, 590, outline = "blue", fill= "white") 
     self.pos = canvas.coords(self.shape) 
     self.xspeed = 0 
     self.yspeed = 0 

    def move(self, canvas): 
     canvas.move(self.shape, self.xspeed, self.yspeed) 
     self.pos = canvas.coords(self.shape) 


class Asteroid(): 
    def __init__(self, canvas): 
     self.One = canvas.create_oval(0,0, 50, 50, fill="grey") 
     self.speedx = (10) 
     self.speedy = (10) 

    def move(self, canvas): 
     while True: 
      self.canvas.move(self.One, self.speedx, self.speedy) 
      self.canvas.after(20) 
      self.canvas.update() 


def game(): 
    #create window and canvas 
    parent = Tk() 
    canvas = Canvas(parent, width = 1920, height = 1080, 
    background="black") 
    parent.title("Asteroids") 
    canvas.pack() 

    #create player 
    player = Player(canvas) 
    enemyOne = Asteroid(canvas) 
    enemyOne.move(canvas) 

であると私はエラーがだから、オブジェクトのキャンバスが小惑星に渡され、DEF移動されていない

AttributeError: 'Asteroid' object has no attribute 'canvas' 

をmessage-得ます。渡すキャンバスが過去に働いたことを示すために、class Playerを参照に含めました。ありがとう。

+3

属性ではありませんが、**が渡されています。それを '__init__'(' self.canvas = canvas')の属性として割り当てることができます。それを 'move'に渡す必要はありません。あるいは、それを属性にしたくない場合は、明示的にそれを渡し、 'self 'を介して*アクセスしません。しかし、現在のミックスとマッチは意味をなさない。 – jonrsharpe

答えて

1

Asteriod()へのコンストラクタコールでは、パラメータとしてcanvasが渡されます。しかし、コンストラクタは、他の言葉で何も割り当て

self.canvas = canvas 

しかしself.canvasが存在しなければならないことを意味self.canvas.move()を呼び出すmove()方法がありません、canvasという属性を作成しません。それはないので、あなたはメッセージ'Asteroid' object has no attribute 'canvas'を得る理由です。

関連する問題