Обнаружение столкновений Python с координатами x и y для границы - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю над игрой с черепахой-питоном, в которой черепаха может двигаться с помощью команд, но она должна уметь обнаруживать столкновения с прямоугольниками и кругами на экране, а также с границей.Понятия не имею, как это сделать, может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Проверка столкновения с окружностью тривиальна - используйте метод distance(), который измеряет расстояние от центра курсора до положения или центра другой черепахи.Учитывая положение круга center и его radius:

def circle_collision(the_turtle, center, radius):
    return the_turtle.distance(center) <= radius

Если вам нужно знать, касался ли нос черепахи круг, вы можете добавить половину размера черепахи к radius, для(возможно измененный размер) курсор, который был бы очень приблизительно:

def circle_collision(the_turtle, center, radius):
    dx, dy, border = the_turtle.shapesize()

    return the_turtle.distance(center) <= radius + 5 * (dx + dy) + border

Т.е. половина размера по умолчанию черепахи в 20 пикселей, умноженная на среднее значение dx и dy плюс ширина границы вокруг черепахи,Или какое-то такое приближение.

Обнаружить столкновение прямоугольника также достаточно просто:

def rectangle_collision(the_turtle, x, y, width, height):
    tx, ty = the_turtle.position()

    return x <= tx <= x + width and y <= ty <= y + height

Отрегулируйте на любую меру прямоугольника, которую вы используете:

def rectangle_collision(the_turtle, llx, lly, urx, ury):
    x, y = the_turtle.position()

    return llx <= x <= urx and lly <= y <= ury

a laаргументы координат для setworldcoordinates().

0 голосов
/ 28 ноября 2018

Столкновение легко!Прежде чем приступить к мелочам, нужно понять, как получить расстояние между двумя точками.Если вы не сделали этого раньше, это всего лишь пифаг!
Diagram

Если вы изобразите две точки на плоскости (красные точки на рисунке),Наименьшее расстояние, которое нужно пройти между ними, находится непосредственно от одной точки к другой, без необходимости совершать какие-либо повороты, это расстояние между точками.На рисунке выше пусть y будет вертикальной осью, а x - горизонтальной осью.Горизонтальное расстояние между точками d и e представлено значением b.Вертикальное расстояние между точками d и e представлено значением a.Таким образом, ...

a = dy - ey
b = dx - ex

Хотя a и be могут быть отрицательными, это не имеет значения, потому что мы выстраиваем их вследующий шаг.

Чтобы получить значение c, мы должны получить квадратный корень из суммы квадратов a и b.Звучит сложно на первый взгляд, но очень просто!
Distance between two points

Код Python Сделать это в Python просто.

c = ((a**2)+(b**2))**0.5
# a**2 is a squared
# anything to the power of 0.5 is square rooted, test it in console
# 25**0.5 = 5.0
# 5**2 = 25

Теперь у нас есть расстояние между двумя точками d и e.Допустим, d и e имеют радиус rd и re.Затем мы можем проверить, сталкивается ли окружность d с окружностью e, вычитая каждый радиус из расстояния между центром окружностей.Таким образом, c становится ...

c -= rd - re

Если c меньше или равно нулю, тогда у вас есть столкновение между кругами!

def collision(d, e, rd, re):
    a = d.y-e.y
    b = d.x-e.x
    c = ((a**2)+(b**2))**0.5
    if c > 0:
        # no collision
        return False
    return True

Прямоугольники Прямоугольникинемного проще, чтобы проверить, находится ли точка внутри прямоугольника, все, что вам нужно, это некоторые операторы if.Пусть эти переменные представляют прямоугольник x = x location, y = y location, w = width, h = height.Предположим, вы хотите проверить, сталкивается ли точка p с прямоугольником.

def check_rect_collision(p, x, y, w, h): 
    if p.x >= x and p.x <= x+w and p.y >= y and p.y <= y+h:
        # collision between p and rectangle
        return True
    return False
...