如何使对象在画布中相互反弹

2024-10-03 11:22:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着让我的程序中的球互相弹跳,但没有成功,大多数时候只是出了问题。 以下是我的main的源代码:

from tkinter import *
from Ball import *
import time
HEIGHT = 500
WIDTH = 500
window = Tk()


canvas = Canvas(window,height=HEIGHT,width = WIDTH)
canvas.pack()
basket_ball = Ball(canvas,0,0,100,1,1,"orange")
soccer_ball = Ball(canvas,399,399,499,1,1,"black")

while True:
    basket_ball_coords = canvas.coords(basket_ball.image)
    soccer_ball_coords = canvas.coords(soccer_ball.image)
    basket_ball.move()
    soccer_ball.move()
    print (basket_ball_coords)
    print (soccer_ball_coords)
    if basket_ball_coords[2] == soccer_ball_coords[0] and ((soccer_ball_coords[3] - basket_ball_coords[3])<= 100 and (soccer_ball_coords[3] - basket_ball_coords[3])> -101):
        basket_ball.xVelo = -basket_ball.xVelo
        soccer_ball.xVelo = -soccer_ball.xVelo
    if basket_ball_coords[3] == soccer_ball_coords[1] and ((soccer_ball_coords[2]- basket_ball_coords[2]<=100)and (soccer_ball_coords[2] - basket_ball_coords[2])> -101):
        basket_ball.yVelo = -basket_ball.yVelo
        soccer_ball.yVelo = -soccer_ball.yVelo
    if basket_ball_coords[0] == soccer_ball_coords[2] and ((soccer_ball_coords[3] - basket_ball_coords[3]) <= 100 and (soccer_ball_coords[3] - basket_ball_coords[3]) > -101):
        basket_ball.xVelo = -basket_ball.xVelo
        soccer_ball.xVelo = -soccer_ball.xVelo
    if basket_ball_coords[1] == soccer_ball_coords[3] and ((soccer_ball_coords[2]- basket_ball_coords[2]<=100)and (soccer_ball_coords[2] - basket_ball_coords[2])> -101):
        basket_ball.yVelo = -basket_ball.yVelo
        soccer_ball.yVelo = -soccer_ball.yVelo
    window.update()
    time.sleep(0.01)


window.mainloop()

这是我用来创建Ball对象的Ball类

class Ball:
    def __init__ (self,canvas,x,y,diameter,xVelo,yVelo,color):
        self.canvas = canvas
        self.image = canvas.create_oval(x,y,diameter,diameter,fill=color)
        self.xVelo = xVelo
        self.yVelo = yVelo
    def move(self):
        coordinates = self.canvas.coords(self.image)
        if (coordinates[2] >= self.canvas.winfo_width() or coordinates[0] < 0):
            self.xVelo = -self.xVelo
        if (coordinates[3] >= self.canvas.winfo_height() or coordinates[1] < 0):
            self.yVelo = -self.yVelo
        self.canvas.move(self.image,self.xVelo,self.yVelo)

Tags: andimageselfmoveifcoordswindowcanvas
1条回答
网友
1楼 · 发布于 2024-10-03 11:22:17

如果球中心之间的距离小于其半径之和,则球会“反弹”

毕达哥拉斯定理说,距离是x和y三角洲平方和的平方根

假设:

  • 通过的x和y为左上角(?)
  • 自半径=直径/2
  • 自中心x=x+自半径
  • 自中心y=y+自半径

加入班级舞会:

def intersects_ball(self, other):
    xdelta = self.center_x - other.center_x
    ydelta = self.center_y - other.center_y
    distance = math.sqrt(xdelta*xdelta + ydelta*ydelta)
    return distance < (self.radius + other.radius)

编辑以添加:

球碰撞时会发生什么情况取决于每个球的位置 速度矢量和质量,大概还有碰撞的偏移角

以下是两个在线示例,其源代码有效:

相关问题 更多 >