Python 物体碰撞?

Python 物体碰撞?,python,tkinter,tk,Python,Tkinter,Tk,所以我做了一个“游戏”,有两个球,一个是绿色的球,一个是红色的球,你可以移动红色的球,但是当它与绿色的球碰撞时,我希望它通过在控制台中打印来显示一条成功消息!这是我的密码 __author__ = 'Zac' from Tkinter import * from random import randint class Application: def circle(self, r, x, y): return (x-r, y-r, x+r, y+r) def s

所以我做了一个“游戏”,有两个球,一个是绿色的球,一个是红色的球,你可以移动红色的球,但是当它与绿色的球碰撞时,我希望它通过在控制台中打印来显示一条成功消息!这是我的密码

__author__ = 'Zac'
from Tkinter import *
from random import randint
class Application:
    def circle(self, r, x, y):
        return (x-r, y-r, x+r, y+r)

    def square(self, s, x, y):
        return (x, y, s, s)

    def __init__(self, canvas, r, x, y, **kwargs):
        self.canvas = canvas
        self.r = r
        self.x = x
        self.y = y
        self.ball = canvas.create_oval(self.circle(r, x, y), **kwargs)


root = Tk()
canvas = Canvas(root, width = 1000, height = 1000)
canvas.pack()

ball1 = Application(canvas, 20, 50, 50, fill='red')
ball2 = Application(canvas, 30, 200, 250, fill='green')

def forward(event):
    canvas.delete(ball1.ball)
    ball1.y -= 5
    ball1.ball = canvas.create_oval(ball1.circle(ball1.r, ball1.x, ball1.y), fill='red')

def backward(event):
    canvas.delete(ball1.ball)
    ball1.y += 5
    ball1.ball = canvas.create_oval(ball1.circle(ball1.r, ball1.x, ball1.y), fill='red')

def left(event):
    canvas.delete(ball1.ball)
    ball1.x -= 5
    ball1.ball = canvas.create_oval(ball1.circle(ball1.r, ball1.x, ball1.y), fill='red')

def right(event):
    canvas.delete(ball1.ball)
    ball1.x += 5
    ball1.ball = canvas.create_oval(ball1.circle(ball1.r, ball1.x, ball1.y), fill='red')

root.bind('<w>', forward)
root.bind('<s>', backward)
root.bind('<a>', left)
root.bind('<d>', right)
root.mainloop()
\uuuuu作者\uuuuu='Zac'
从Tkinter进口*
从随机导入randint
班级申请:
def循环(自身、r、x、y):
返回(x-r、y-r、x+r、y+r)
def方形(自身、s、x、y):
返回(x、y、s、s)
定义初始值(自我、画布、r、x、y、**kwargs):
self.canvas=画布
self.r=r
self.x=x
self.y=y
self.ball=canvas.create_椭圆(self.circle(r,x,y),**kwargs)
root=Tk()
画布=画布(根,宽度=1000,高度=1000)
canvas.pack()
ball1=应用程序(画布,20,50,50,填充='red')
ball2=应用程序(画布,30,200,250,填充为绿色)
def转发(事件):
canvas.delete(ball1.ball)
ball1.y-=5
ball1.ball=canvas.create_oval(ball1.circle(ball1.r,ball1.x,ball1.y),fill='red')
def向后(事件):
canvas.delete(ball1.ball)
ball1.y+=5
ball1.ball=canvas.create_oval(ball1.circle(ball1.r,ball1.x,ball1.y),fill='red')
def left(事件):
canvas.delete(ball1.ball)
ball1.x-=5
ball1.ball=canvas.create_oval(ball1.circle(ball1.r,ball1.x,ball1.y),fill='red')
def权限(事件):
canvas.delete(ball1.ball)
ball1.x+=5
ball1.ball=canvas.create_oval(ball1.circle(ball1.r,ball1.x,ball1.y),fill='red')
root.bind(“”,向前)
root.bind(“”,向后)
root.bind(“”,左)
root.bind(“”,右)
root.mainloop()

好的,我就是这么做的

我添加了这个函数

def collide():
    x_diff = abs(ball1.x - ball2.x)
    y_diff = abs(ball1.y - ball2.y)

    if x_diff <= 49:
        if y_diff <= 49:
            print "COLLIDED"
def collide():
x_diff=abs(ball1.x-ball2.x)
y_diff=abs(ball1.y-ball2.y)

如果x_diff,你需要写一个函数来检查物体是否足够近,可以触摸,然后在每次移动结束时调用该函数。为此,你需要创建一个假想的直角三角形,斜边是球中心之间的距离。然后,您可以获得球的x坐标之间的x边=差,y边的x边=差,并使用标准直角三角形公式a2+b2=c**2计算中心之间的距离。如果它小于半径之和,则存在碰撞。@CurlyJoe你能举个例子吗?因为我发现这很难理解:p向前、向后、向左和向右的函数都应该在类中,所以每个球都有自己的一组运动函数。然后,您可以将其他关键点绑定到第二个球,或者添加一个附加事件,将绑定从一个球更改为下一个球。x_diff=abs(ball2.x-ball1.x)。y也一样。网站更改了上面的公式,但它是a^2+b^2=c^2