Python Turtle как создать столкновение - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь создать понг, используя Turtle, однако у меня проблема с системой столкновений.Для этого я использую основную пифагорейскую функцию, однако, когда мяч попадает в лесоруб, он застревает в бампере и начинает дрожать.Я не уверен, как решить эту проблему.Вот код столкновения и бампера.

turtle.register_shape('bar.gif')

lbump = turtle.Turtle()
lbump.color('white')
lbump.shape('bar.gif')
lbump.penup()
lbump.speed(0)
lbump.setposition(-285,0)

rbump = turtle.Turtle()
rbump.color('white')
rbump.shape('bar.gif')
rbump.penup()
rbump.speed(0)
rbump.setposition(285,0)

ball = turtle.Turtle()
ball.color('white')
ball.shape('circle')
ball.penup()
ball.speed(0)
ball.setposition(0,0)
ballspeedx = -5
ballspeedy = 0 #To test collison#

def isCollision(t1, t2):
    distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2))
    if distance < 30:
        return True
    else:
        return False

def ball_move():
    while True:
        global ballspeedy
        global ballspeedx
        x = ball.xcor() + ballspeedx
        y = ball.ycor() + ballspeedy
        if y > 285 or y < -285:
            ballspeedy *= -1

        if x < -295 or x > 295:
            x = 0
            y = 0

        if isCollision(lbump, ball):
            ballspeedx *= -1

        if isCollision(rbump, ball):
            ballspeedx *= -1
        ball.setposition(x,y)

1 Ответ

0 голосов
/ 28 февраля 2019

Причина, скорее всего, в следующем: когда обнаруживается столкновение (isCollision возвращает True) и знак скорости x переключается, шар не успевает пройти достаточное расстояние от бампера до следующегоитерация цикла.Следовательно, следующая итерация isCollision все еще обнаруживает столкновение и снова меняет знак скорости.
В результате знак скорости x переключается на каждой итерации с положительного на отрицательный и наоборот, и вы видите эффект сотрясения.

Если я прав, это редактирование - самый простой способ решить эту проблему:

if isCollision(lbump, ball):
    ballspeedx = abs(ballspeedx)

if isCollision(rbump, ball):
    ballspeedx = -1 * abs(ballspeedx)

Конечно, могут быть реализованы более сложные решения.

...