Мир рушится после перезагрузки - PullRequest
3 голосов
/ 19 февраля 2020

У меня есть эта функция PyBox2D, и я хочу, чтобы все тела разрушались, а затем сбрасывались, когда Автомобиль врезался в здание. Обнаружение столкновений работает хорошо, так же как и разрушение мира, возникает проблема, когда я пытаюсь сбросить мир. Мир либо сотрясет sh, либо машина будет бесконтрольно двигаться, либо вообще не будет двигаться.

def _reset():
    if len(box2world.bodies) == 0:
        for building in skyscrapers:
            building.destroy_flag = False


        for wheel in cars[0].tires:
            wheel.destroy_flag = False

        cars[0].destroy_flag = False

        create_buildings()      
        create_car()
        cars[0].control()

box2world = world(contactListener=myContactListener(), gravity=(0.0, 0.0), doSleep=True)

1 Ответ

0 голосов
/ 24 февраля 2020

Похоже, единственными автомобилями, которые вы контролируете, являются автомобили [0], первая машина в списке. когда вы вбиваете sh в здание и _step (), вы устанавливаете для destroy_flag для cars [0] значение True, которое затем уничтожает их, а затем в _reset вы возвращаете значение false. Также, когда вы создаете машину, вы добавляете машины. Вам нужно сбросить автомобили до пустого списка: вы также не обновляете положение автомобиля [0] при создании нового автомобиля, только новый автомобиль в списке. Наряду с тем, что список небоскребов не очищается, небоскребы по-прежнему находятся в том же месте, а также автомобиль [0] в том же месте. Это вызывает вечный сценарий уничтожения / сброса, который, в свою очередь, бесконечно создает машины и небоскребы, а затем заставляет его взламывать ваш мир.

def _reset():
    if len(box2world.bodies) == 0:
        for building in skyscrapers:
            building.destroy_flag = False


        for wheel in cars[0].tires:
            wheel.destroy_flag = False

        cars[0].destroy_flag = False

        skyscrapers=[]
        cars = []
        #or you could keep your old car and just increase the index
        # to do this, instead of calling car[0], your may want to call car[carnum]
        #before creating your first car you could set the carnum to 0
        #just before creating the new car during reset you would do carnum += 1
        #another way would be instead of appending your car to a list you could do cars=[Car()]

        create_buildings()
        create_car()
        cars[0].control()
...