【问题标题】:Tkinter object collision?Tkinter 对象碰撞?
【发布时间】:2015-10-18 15:56:01
【问题描述】:

所以我制作了一个“游戏”,它有 2 个球,一个绿球和一个红球,您可以移动红球,但是当它与绿球碰撞时,我希望它通过在安慰!这是我的代码。

__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()

【问题讨论】:

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

标签: python tkinter tk


【解决方案1】:

好的,这就是我的做法!

我添加了这个功能

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"

并且每次你运行该函数来移动碰撞函数时都会调用,如果有触摸它就会打印“碰撞”

感谢@CurlyJoe 提供用于检查它们之间距离的代码!

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多