重置后世界崩溃

The world crashes after reset

我有这个 PyBox2D 函数,我希望所有物体在汽车撞到建筑物时销毁然后重置。 碰撞检测效果很好,世界的破坏也很好,当我尝试重置世界时出现问题。 世界要么崩溃,要么汽车不受控制地移动,要么根本不动。

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)

您控制的汽车似乎只有列表中的第一辆汽车[0]。 当您撞到建筑物和 _step() 时,您将 cars[0] 的 destroy_flag 设置为 True,然后销毁它们,然后在 _reset 中将其设置回 false。 此外,当您创建汽车时,您将附加到汽车上。您需要将 cars 重置为空列表:您在创建新车时也没有更新 car[0] 的位置,只有列表中的新车。除了不清空摩天大楼列表外,在同一位置还有摩天大楼,在同一位置还有汽车[0]。 这导致了一个永久的 destroy/_reset 场景,它反过来无限地创造汽车和摩天大楼,然后导致它崩溃你的世界。

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()