2017-09-23 25 views
0

私は画面の上端と下端にボールをバウンスさせる次のコードを持っています。クラスとtkinterを使ったボールの移動

上に跳ねるためのコードを作業すると下

from tkinter import * 
import random 
import time 

class Ball: 
    def __init__(self,canvas,color): 
     self.canvas=canvas 
     self.id=canvas.create_oval(30,30,50,50,fill=color) 
     self.canvas.move(self.id,100,200) 

     #ADD THESE LINES TO OUR __INIT__ METHOD 
     self.x=0 
     self.y=-1 
     self.canvas_height=self.canvas.winfo_height() 

    def draw(self): 
     self.canvas.move(self.id,self.x,self.y) 
     pos=self.canvas.coords(self.id) 

     if pos[1] <=0: 
      self.y=1 
     if pos[3] >=self.canvas_height: 
      self.y=-1 


def main(): 
    tk=Tk() 
    tk.title("My 21st Century Pong Game") 
    tk.resizable(0,0) 
    tk.wm_attributes("-topmost",1) 
    canvas=Canvas(tk,bg="white",width=500,height=400,bd=0,highlightthickness=0) 
    canvas.pack() 
    tk.update() 

    ball1=Ball(canvas,'green') 
    while 1: 
     tk.update() 
     ball1.draw() #call the ball draw method here 
     time.sleep(0.01) 
main() 

それは左から右へ(左と右の壁にバウンス)のために実現するためにしようと、私はかなりのロジックを把握や解決できません私のエラーは以下の通りです。

私は答えについて

self.x=1 #set the object variable x to 0 (don't move the ball horizontally) 
     self.y=-0 #set the object variable y to -1 (this means keep moving the ball UP on initilisation) 
     self.canvas_height=self.canvas.winfo_height() #set the canvas height by calling the canvas function winfo_height (it gives us the current canvas height) 

    def draw(self): 
     self.canvas.move(self.id,self.x,self.y) 
     pos=self.canvas.coords(self.id) 

     if pos[2] <=0: #if you hit the top of the screen then stop subtracting 1 as defined in the __init__ method and therefore stop moving up -reverse directions 
      self.x=-1 
     if pos[3] >=self.canvas_height: #if the bottom coordinates are greater or equal to canvas height, then reverse again, and set y back to -1 (go up) 
      self.x=1 

左右にバウンスのために試してみた、

誰かがに必要とされるロジックへと簡単に説明を提供することができ座標がどこから来ているのか、pos [0]、pos [1]などが何を参照しているのかという問題を解決してください。私はアイデアを持っていますが、それは明確ではなく、ある程度の明確さから利益を得るでしょう。

私は、問題を解決するために+私の元のコードを使用して説明+コード化された解決策の後です。

答えて

0

コードはほぼ正しいです。実際には、ちょっとしたことが、おそらくあなたに答えを与えたと思います。あなたの 'move x'コードは 'move y'コードからコピー貼り付けられましたが、十分に変更されていません。これをやってください。

「what do pos [0] etc mean」との回答で、Get coords of an oval in Tkinterとお伝えします。 通常、矩形の座標は(左、上、右、下)として与えられます。

あなたは、私はあなたのエラーを修正する以外に、下記のいくつかのことを変更したことがわかります:

  1. 私はvxvyx & y変数を変更しました。値はボールの速度であり、位置ではありません。
  2. 関数名が移動して描画されないため、drawではなく、moveになりました。
  3. tk.protocol行の変数aliveは、ユーザーがウィンドウを閉じた後にプログラムをきちんと整理する方法を提供します。

from tkinter import * 
import random 
import time 

class Ball: 
    def __init__(self,canvas,color): 
     self.alive = True 
     self.canvas = canvas 
     self.id = canvas.create_oval(30, 30, 50, 50, fill=color) 
     self.canvas.move(self.id, 100, 200) 

     #ADD THESE LINES TO OUR __INIT__ METHOD 
     self.vx = 1 
     self.vy = -1 
     self.canvas_width = self.canvas.winfo_width() 
     self.canvas_height = self.canvas.winfo_height() 

    def move(self): 
     self.canvas.move(self.id, self.vx, self.vy) 
     pos = self.canvas.coords(self.id) 
     if pos[0] <= 0: 
      self.vx = 1 
     if pos[2] >= self.canvas_width: 
      self.vx = -1 
     if pos[1] <= 0: 
      self.vy = 1 
     if pos[3] >= self.canvas_height: 
      self.vy = -1 

    def kill(self): 
     self.alive = False 

def main(): 
    tk = Tk() 
    tk.title("My 21st Century Pong Game") 
    tk.resizable(0, 0) 
    tk.wm_attributes("-topmost", 1) 
    canvas = Canvas(tk, bg="white", width=500, height=400, bd=0, highlightthickness=0) 
    canvas.pack() 
    tk.update() 

    tk.protocol("WM_DELETE_WINDOW", lambda: ball1.kill()) 

    ball1 = Ball(canvas, 'green') 
    while ball1.alive: 
     tk.update() 
     ball1.move() #call the ball move method here 
     time.sleep(0.01) 
    tk.destroy() 

if __name__ == "__main__": 
    main() 
関連する問題