前提・実現したいこと
勉強のためpythonとtkinterでブロック崩しゲームを作成しています。
参考にしたサイト
上記リンクを参考にしながら、ひとまず枠の中でボールが跳ね返り続けるコードを書いてみましたが、
不明点があるので教えてください。
【疑問】
下記コードの場合、ボールが壁(ウィンドウの枠)にぶつかった判定の時、ボールの半分が壁に沈み込む(見えなくなる)ような描写になるはずですが、
そうなっていません。(ボールの端が壁にぶつかったときに跳ね返っているように見える)
これはどうしてでしょうか?
python
1 2import tkinter as tk 3ball = {"dirx": 15, 4 "diry": -15, 5 "x": 350, 6 "y": 300, 7 "w": 10} 8 9win = tk.Tk() 10buff = tk.StringVar() 11buff.set("") 12label = tk.Label(win, textvariable = buff) 13label.pack() 14 15cv = tk.Canvas(win, width = 600, height = 400) 16cv.pack() 17 18def draw_ball(): 19 cv.delete("all") 20 cv.create_oval(ball["x"] - ball["w"], ball["y"] + ball["w"], ball["x"] + ball["w"], ball["y"] - ball["w"], fill = "red") 21 22def move_ball(): 23 bx = ball["x"] + ball["dirx"] 24 by = ball["y"] + ball["diry"] 25 26 buff.set("posi x = " + str(bx) + " posi y = " + str(by)) 27 28 if bx <= 0 or bx >= 600: 29 ball["dirx"] *= -1 30 31 if by <= 0 or by >= 400: 32 ball["diry"] *= -1 33 34 if 0 < bx < 600: 35 ball["x"] = bx 36 37 if 0 < by < 400: 38 ball["y"] = by 39 40def gameloop(): 41 draw_ball() 42 move_ball() 43 44 win.after(50, gameloop) 45 46gameloop() 47win.mainloop() 48
【疑問に思った理由】
ボールの描画は、Canvasのcreate_oval()で行っています。create_oval(円の左端, 円の上端, 円の右端, 円の下端)で描画されます。
今回のコードでは、create_ovalにボールの中心位置座標からの相対距離を入力しています。
ボールの中心位置座標を(x,y) , ボールの幅 = 10 として、
create_oval( x-10, y+10, x+10, y-10)で、ボールの中心をx,yとした直径20の円が描画されます。
ボールの移動・跳ね返りは、ボールの中心位置座標(x,y)の値を変更し、(x,y) が ウィンドウの端(0,0) (600,400)の位置に来た時に反射させています。
ということは、ボールの中心がウィンドウの端に来た時、ボールの半径10の部分はウィンドウの外に消えるような描写となっているべきです。
しかし、ボールの端がウィンドウの端とぶつかって反射しているように見えます。
(本当はボールの端がウィンドウの端とぶつかるように見えたほうがリアルで喜ばしいのですが、このコードでそうなるべきではないと考えています)
教えていただけるとうれしいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/15 14:48