Pygame colliderect вызывает проблемы с игрой с мячом - PullRequest
0 голосов
/ 10 июля 2019

Я играю в удар. Я сделал стены и шары с классами, и у каждого класса есть прямоугольник, определяющий его положение. Все стены находятся в списке, и я проверяю список, используя colliderect, чтобы увидеть, попадает ли мяч в какую-либо из стен. Если это так, в зависимости от стены (вертикальной или горизонтальной), я меняю направление движения мяча. Проблема в том, что иногда мяч попадает в стену и застревает внутри. Я представляю, что он просто постоянно сталкивается со стеной и постоянно меняет направление, заставляя его просто оставаться на месте.

Я пытался добавить время восстановления, но даже это не всегда работает. Скорость шара не должна быть проблемой, как будто он перемещается на 3 пикселя за кадр, если будет двигаться с той же скоростью на следующем кадре после изменения его направления. Тем не менее, более медленные скорости помогают, но все еще не полностью решают эту проблему. Кроме того, я обнаруживаю столкновения, прежде чем перемещать мяч на каждом кадре.

for wall in walls:
    if wall.type == "hwall":
        if wall.rect.colliderect(ball.rect):
            ball.y_change = -(ball.y_change)
    elif wall.type == "vwall":
        if wall.rect.colliderect(ball.rect):
            ball.x_change = -(ball.x_change)

Вот полный код: https://pastebin.com/85Ge175i

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Перепробовал все предложенные методы, и ни один не помог мне.Отказался от использования функции столкновения Pygame, поскольку она, кажется, не работает для моих конкретных потребностей.Вместо этого я проверил положение мяча со всеми стенами, и руководство столкнулось таким образом.Также при столкновении я немного сдвигаю мяч назад, чтобы он не застрял в стенах.

# Check for collision
for wall in walls:
    if wall.type == "hwall":

        if ball.y_change < 0:
            if wall.rect.top <= ball.rect.top <= wall.rect.bottom and wall.rect.left <= ball.rect.center[0] <= wall.rect.right:
                ball.y_change = -(ball.y_change)
                ball.y += speed_y * 2
        else:
            if wall.rect.top <= ball.rect.bottom <= wall.rect.bottom and wall.rect.left <= ball.rect.center[0] <= wall.rect.right:
                ball.y_change = -(ball.y_change)
                ball.y -= speed_y * 2


    elif wall.type == "vwall":

        if ball.x_change < 0:
            if wall.rect.left <= ball.rect.left <= wall.rect.right and wall.rect.top <= ball.rect.center[1] <= wall.rect.bottom:
                ball.x_change = -(ball.x_change)
                ball.x += speed_x * 2
        else:
            if wall.rect.left <= ball.rect.right <= wall.rect.right and wall.rect.top <= ball.rect.center[1] <= wall.rect.bottom:
                ball.x_change = -(ball.x_change)
                ball.x -= speed_x * 2
0 голосов
/ 10 июля 2019

Быстрое решение может заключаться в проверке не только столкновений, но и положения краев прямоугольников стен и шара.
Код должен быть самоочевидным:

for wall in walls:
    if wall.rect.colliderect(ball.rect):
        if wall.type == "hwall" and wall.rect.bottom < ball.rect.bottom and ball.y_change > 0:
            ball.y_change = -(ball.y_change)
        elif wall.type == "hwall" and wall.rect.top > ball.rect.top and ball.y_change < 0:
            ball.y_change = -(ball.y_change)
        elif wall.type == "vwall" and wall.rect.right < ball.rect.right and ball.x_change > 0:
            ball.x_change = -(ball.x_change)
        elif wall.type == "vwall" and wall.rect.left > ball.rect.left and ball.x_change < 0:
            ball.x_change = -(ball.x_change)

Этокак вы уверены, что как только компонент скорости перевернут, он не перевернется сразу.

...