Как обнаружить столкновение между выбранным объектом и другими объектами в списке? - PullRequest
0 голосов
/ 21 января 2020

Как я могу определить, есть ли столкновение между автомобилем и другими элементами в трафике c (traffico)?

  • Car.posAtt - это фактическое положение автомобиля на карте.
  • Car.visione - это Rect перед автомобилем, чтобы создать расстояние между собой.
  • Car.ingombro является Rect изображения.

Очевидно, что когда car.visione обнаруживает столкновение с одним из других car.ingombro s, оно собирается остановиться.

for car in traffico:
    if countTrafficLight == 1:
        if car.quadPart == 2:
            if car.posAtt[1] < 430 or car.posAtt[1] > 435:                   
                car.Move()
                pygame.draw.rect(schermoGioco, BLUE, car.visione)
                if car.posAtt == CoordToTurn(car.quadPart, car.quadArr):
                    car.Turn()
        elif car.quadPart == 3:
            if car.posAtt[0] > 570 or car.posAtt[0] < 565:
                car.Move()
                pygame.draw.rect(schermoGioco, BLUE, car.visione)
                if car.posAtt == CoordToTurn(car.quadPart, car.quadArr):
                    car.Turn()
        elif car.quadPart == 4:
            if car.posAtt[1] < 210 or car.posAtt[1] > 220:

                car.Move()
                pygame.draw.rect(schermoGioco, BLUE, car.visione)
                if car.posAtt == CoordToTurn(car.quadPart, car.quadArr):
                    car.Turn()
        elif car.quadPart == 1:
            car.Move()
            pygame.draw.rect(schermoGioco, BLUE, car.visione)
            if car.posAtt == CoordToTurn(car.quadPart, car.quadArr):
                    car.Turn()

1 Ответ

2 голосов
/ 21 января 2020

Лучший способ реализовать это - преобразовать car в объект PyGame Sprite. Это позволило бы коду использовать SpriteGroup и мощные groupcollide функции.

Вместо этого должна быть возможность просто l oop через N x N раз, проверяя каждую машину на соответствие другие. Я не уверен из вашего вопроса, что именно представляет собой ingombro прямоугольник, но ниже кода предполагается, что это граничный прямоугольник вокруг самого автомобиля.

def carCollidesWith( test_car, traffic ):
    """Returns the car-in-traffic that test_car collies with, or None"""
    result = None   
    for car in traffic:
        if ( car is not test_car ):  # don't collide with yourself
            if ( test_car.ingombro.colliderect( car.ingombro ) ):
                result = car
                break

    return result

Однако есть много других способов сделать это более эффективно. Взгляните на библиотеку pygame Rect, библиотеку , документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...