Коснулся первый объект второго? Как узнать? Python Tkinter
Код сейчас:
from tkinter import *
import time
root=Tk()
canvas=Canvas(root, width=700, height=700)
canvas.pack()
canvas.create_polygon(50, 2, 90, 10, 10, 10,
fill='red',
outline='black')
def movetriangle(event):
if event.keysym=='Up':
canvas.move(1, 0, -3)
elif event.keysym=='Down':
canvas.move(1, 0, 3)
elif event.keysym=='Left':
canvas.move(1, -7, 0)
elif event.keysym=='Right':
canvas.move(1, 7, 0)
canvas.bind_all('<KeyPress-Up>', movetriangle)
canvas.bind_all('<KeyPress-Down>', movetriangle)
canvas.bind_all('<KeyPress-Left>', movetriangle)
canvas.bind_all('<KeyPress-Right>', movetriangle)
root.mainloop()
Сейчас есть только один объект. А если добавить второй. Как узнать коснулся ли первый объект второго? А если второй объект коснулся стены, как это узнать?
Ответы (1 шт):
У Canvas есть метод find_overlapping, который находит все объекты, попадающие в заданный прямоугольник. Мы можем как первое приближение "заменить" первую фигуру на прямоугольник, найти пересекающиеся с этим прямоугольником фигуры - так мы найдем фигуры, которые возможно пересекаются с данной фигурой и отсечем фигуры, которые точно не пересекаются с ней.
В коде будет что-то вроде этого:
poly1 = canvas.create_polygon(50, 2, 90, 10, 10, 10, fill='red', outline='black')
...
# Получаем множество возможно пересекающихся фигур:
overlapping = set(canvas.find_overlapping(*canvas.bbox(poly1)))
# canvas.bbox(poly1) - получить ограничивающий прямоугольник (bounding box) указанной фигуры
# В множество пересекающихся фигур попадает сама исходная фигура, удаляем ее из множества:
overlapping.discard(poly1)
Дальше уже нужно использовать более точные методы - например проверять, есть ли пересекающиеся стороны двух фигур.
Рекомендую почитать книгу "Физика для разработчиков компьютерных игр" (Д.Конгер), конкретно главу про обнаружение столкновений.
По поводу столкновения со стеной - это довольно просто проверяется, просто проверяете, не вышел ли какой-то из углов за границы допустимой области.