from Tkinter import *
window = Tk()
canvas = Canvas(window, width=500, height=500, background="green")
canvas.pack()
speed_x = 5
speed_y = 5
ball = canvas.create_oval(0,0,32,32,fill="blue")
while True:
canvas.move(ball, speed_x, speed_y)
canvas.after(30)
canvas.update()
coords = canvas.coords(ball)
if coords[2] >= 500:
speed_x = -5
if coords[0] <= 0:
speed_x = 5
if coords[3] >= 500:
speed_y = -5
if coords[1] <= 0:
speed_y = 5
我的目标是让球永远在屏幕上反弹。我让它从墙上反弹,但只是从一个角落到另一个角落。它只是从(0,0)和(500,500)来回反弹。 我不知道我哪里出错了。如何让它在随机方向上反弹?我尝试改变起点,但没有做任何事情。
我以为我在18行及以下的版本中犯了一个错误,但我使用了&lt; =和&gt; =所以不应该适用于0以上且500以下的所有数字?为什么不移动到其他地方?
答案 0 :(得分:0)
如果你从(0,0)开始并以恒定速度向上和向右移动,那么你将达到(500,500),其中球将击中屏幕的右上角。此时,由于以下原因,x速度和y速度都将变为负值
if coords[2] >= 500:
speed_x = -5
if coords[3] >= 500:
speed_y = -5
这意味着球会左右移动。所以问题是你准确地击中右上角,同时反转水平和垂直速度。
如果你从不同的位置开始(比如说(0,50)),那么你将达到点(450,500),此时x速度将反转,y速度将继续为正。这应该有希望解决它!或者,将画布的大小更改为不是正方形。
答案 1 :(得分:-1)
它只是从(0,0)和(500,500)来回反弹
这是正常的,当遇到墙角(如(0,0)和(500,500))时,它反弹两次,导致方向反转(180°)而不是90°反弹。
将球设置到另一个初始位置:
from Tkinter import *
window = Tk()
canvas = Canvas(window, width=500, height=500, background="green")
canvas.pack()
speed_x = 5
speed_y = 5
ball = canvas.create_oval(0,0,32,32,fill="blue")
canvas.move(ball, 100, 0) # move ball away from diagonal.
while True:
canvas.move(ball, speed_x, speed_y)
canvas.after(30)
canvas.update()
coords = canvas.coords(ball)
if coords[2] >= 500:
speed_x = -5
if coords[0] <= 0:
speed_x = 5
if coords[3] >= 500:
speed_y = -5
if coords[1] <= 0:
speed_y = 5
如何让它在随机方向上反弹?
遇到墙壁时,请将speed_x
和speed_y
设置为随机值。
编辑:运行代码并将球设置到不在对角线上的位置使其按预期工作。