球只能在对角线上来回反弹?

时间:2015-12-04 08:53:55

标签: python tkinter

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以下的所有数字?为什么不移动到其他地方?

2 个答案:

答案 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_xspeed_y设置为随机值。

编辑:运行代码并将球设置到不在对角线上的位置使其按预期工作。