2015-12-04 3 views
0
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 и ниже, но я использовал < = и> =, поэтому это не должно относиться ко всем цифрам выше 0 и ниже 500? Почему он не перемещается в другие места?

+1

У вас есть правильная идея, и ваш код работает правильно. Просто подумайте о направлении мяча, что бы вы ожидали, что это произойдет, когда он ударит в угол ?. Теперь попробуйте изменить область с квадрата 500x500, на прямоугольник размером 400x500 и посмотреть, что произойдет. Надеюсь, это ставит вас в правильном направлении. –

+0

Это определенно помогло, спасибо. – Astrosphere

ответ

-1

Это просто отскакивает назад и вперед от (0,0) и (500.500)

Это нормально, при столкновении под углом стены (например, (0,0) и (500500)) , он отскакивает два раза, что приводит к изменению направления (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 случайных значений.

Редактировать: Выполнение кода и установка шара в положение, не находящееся в диагонали, заставляют его работать, как ожидалось.

+0

Изменение скорости_x и speed_y на случайные значения сработало, спасибо! – Astrosphere

0

Если вы начинаете с (0,0) и двигаетесь вверх и вправо с постоянной скоростью, то вы достигнете (500, 500), где мяч попадет в верхний правый угол экрана. В этот момент и скорость х и скорость у изменится на отрицательный из-за:

if coords[2] >= 500: 
     speed_x = -5 
    if coords[3] >= 500: 
     speed_y = -5 

Это означает, что мяч будет двигаться влево и вниз. Таким образом, проблема заключается в том, что вы попадаете в верхний правый угол точно, одновременно изменяя горизонтальную и вертикальную скорость.

Если вы начинаете в другом положении (скажем (0, 50)), то вы попадете в точку (450, 500), после чего скорость x будет изменена на обратную, а скорость y будет продолжать положительны. Это, надеюсь, исправить! Альтернативно, измените размер холста на то, что не является квадратным.

+0

Работает сейчас, спасибо! – Astrosphere

Смежные вопросы