重置后世界崩溃

问题描述 投票:3回答:1

我有这个PyBox2D脚本,当汽车撞到建筑物时,我希望所有尸体都被破坏然后重置。碰撞检测效果很好,破坏世界也是如此,当我尝试重置世界时会出现问题。世界要么崩溃,要么汽车无法控制地行驶,或者它根本不行驶。

我为这么长的代码表示歉意,但这是最小的可运行示例。非常感谢您的帮助

import numpy as np
import random
import keyboard
import Box2D
from Box2D.b2 import world, polygonShape, circleShape, edgeShape, staticBody, dynamicBody, kinematicBody, revoluteJoint, wheelJoint, contact
from Box2D import b2Vec2, b2FixtureDef, b2PolygonShape, b2CircleShape, b2Dot, b2EdgeShape, b2Contact, b2ContactFilter, b2Filter, b2ContactListener

import pygame
from pygame import HWSURFACE, DOUBLEBUF, RESIZABLE, VIDEORESIZE
from pygame.locals import (QUIT, KEYDOWN, K_ESCAPE)
pygame.init()


# PyBox2D setup
PPM = 5
SCREEN_WIDTH, SCREEN_HEIGHT = 640, 480
POS_X = SCREEN_WIDTH / PPM / 3
POS_Y = SCREEN_HEIGHT / PPM / 3

CAR_CATEGORY = 0x0002
BUILDING_CATEGORY = 0x0008

CAR_GROUP = 2
BUILDING_GROUP = -8

contact_flag = False
class myContactListener(b2ContactListener):
    def handle_contact(self, contact, began):
        # A contact happened -- see if a wheel hit a
        # ground area
        fixture_a = contact.fixtureA
        fixture_b = contact.fixtureB

        body_a, body_b = fixture_a.body, fixture_b.body
        ud_a, ud_b = body_a.userData, body_b.userData

        car_contact = None
        building_contact = None
        wheel_contact = None

        for ud in (ud_a, ud_b):
            if ud is not None:
                obj = ud['obj']
                if isinstance(obj, Car):
                    car_contact = obj
                elif isinstance(obj, Building):
                    building_contact = obj
                elif isinstance(obj, Wheel):
                    wheel_contact = obj

        if car_contact  is not None and building_contact is not None:
            print("BUMMM")
            _destroy()

    def __init__(self):
        b2ContactListener.__init__(self)

    def BeginContact(self, contact):
        self.handle_contact(contact, True)


    def EndContact(self, contact):
        pass

    def PreSolve(self, contact, oldManifold):
        pass

    def PostSolve(self, contact, impulse):
        pass

def _destroy():
    for building in skyscrapers:
        building.destroy_flag = True

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

    cars[0].destroy_flag = True


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)


class Wheel():
    def __init__(self, box2world, phi, max_lateral_impulse=1, shape=(0.25, 0.75), turn_torque=15000, position=None):

        if position is None:
            position = [POS_X, POS_Y]

        self.destroy_flag = False
        self.position = position
        self.shape = shape
        self.box2world = box2world
        self.phi = phi
        self.max_lateral_impulse = max_lateral_impulse
        self.turn_torque = turn_torque
        self.wheel = self.box2world.CreateDynamicBody(position=(self.position[0], self.position[1]),
                                                      angle=self.phi,
                                                      fixtures=b2FixtureDef(
                                                      shape=b2PolygonShape(box=shape),
                                                      density=650.0,
                                                      friction=10000,
                                                      ))
        self.wheel.userData = {'obj': self}

    # Cancelling lateral velocity

    @property
    def forward_velocity(self):
        current_normal = self.wheel.GetWorldVector((0, 1))
        return current_normal.dot(self.wheel.linearVelocity) * current_normal

    def get_lateral_velocity(self):
        currentRightNormal = self.wheel.GetWorldVector((1, 0))
        return currentRightNormal.dot(self.wheel.linearVelocity) * currentRightNormal

    def apply_impulse(self):
        Impulse = self.wheel.mass * -Wheel.get_lateral_velocity(self)
        self.wheel.ApplyLinearImpulse(Impulse, self.wheel.worldCenter, wake=True)

        if Impulse.length > self.max_lateral_impulse:
            Impulse *= self.max_lateral_impulse / Impulse.length

            self.wheel.ApplyLinearImpulse(Impulse, self.wheel.worldCenter, True)

        # Allowing skidding
        angular_impulse = 0.5 * self.wheel.inertia * -self.wheel.angularVelocity
        self.wheel.ApplyAngularImpulse(angular_impulse, True)

        current_forward_normal = self.forward_velocity
        current_forward_speed = current_forward_normal.Normalize()

        drag_force_magnitude = -2 * current_forward_speed
        self.wheel.ApplyForce(drag_force_magnitude * current_forward_normal, self.wheel.worldCenter, True)


class Car():

    def __init__(self, box2world, position=None):

        if position is None:
            position = [POS_X + 10, POS_Y + 5]

        self.destroy_flag = False
        self.position = position
        self.ticking = 0
        self.box2world = box2world
        self.body = self.box2world.CreateDynamicBody(position=self.position,
                                                     angle=0.0)
        self.body_Fixtures = self.body.CreatePolygonFixture(shape=b2PolygonShape(box=(2.189 / 2, 4.897 / 2)),
                                                            density=2810,
                                                            friction=0,
                                                            filter=b2Filter(
                                                                categoryBits=CAR_CATEGORY,
                                                                maskBits=BUILDING_CATEGORY,
                                                                groupIndex=CAR_GROUP))
        self.tires = []
        self.suspensions = []
        self.on_the_beginning = False
        self.body.userData = {'obj': self}

        # Connecting bodywork with wheels

        for i in range(4):
            if i == 1 or i == 2:  # Moving wheels a bit away from the chassis
                X_SHIFT = 0.45
            else:
                X_SHIFT = -0.45

            # Creating Wheels
            self.tires.append(Wheel(box2world=box2world, phi=0, position=(self.position[0] + X_SHIFT, self.position[1])))

            if i in range(2):
                # Rear wheels do not move so they can be welded to chassis
                self.suspensions.append(box2world.CreateWeldJoint(bodyA=self.body,
                                                                  bodyB=self.tires[i].wheel,
                                                                  localAnchorA=(self.body_Fixtures.shape.vertices[i][0] + X_SHIFT, self.body_Fixtures.shape.vertices[i][1] + 0.5),
                                                                  localAnchorB=(0, 0),
                                                                  ))
            else:
                # Front wheels are revolute joints
                self.suspensions.append(box2world.CreateRevoluteJoint(bodyA=self.tires[i].wheel,
                                                                      bodyB=self.body,
                                                                      localAnchorA=(0, 0),
                                                                      localAnchorB=(self.body_Fixtures.shape.vertices[i][0] + X_SHIFT, self.body_Fixtures.shape.vertices[i][1] - 0.5),
                                                                      enableMotor=True,
                                                                      maxMotorTorque=100000,
                                                                      enableLimit=True,
                                                                      lowerAngle=0,
                                                                      upperAngle=0,
                                                                      motorSpeed=0
                                                                      ))

    def control(self):  # This makes control independent from visualisation
        # Front left suspension: index 2
        # Front right suspension: index 3

        # Alternative steering (Con: Physical perversion, Pro: It works...)
        if keyboard.is_pressed("a"):
            self.suspensions[2].lowerLimit -= np.deg2rad(2)
            self.suspensions[2].upperLimit -= np.deg2rad(2)
            self.suspensions[3].lowerLimit -= np.deg2rad(2)
            self.suspensions[3].upperLimit -= np.deg2rad(2)

            if self.suspensions[2].lowerLimit <= -np.pi / 4:

                self.suspensions[2].upperLimit = -np.pi / 4
                self.suspensions[2].lowerLimit = -np.pi / 4
                self.suspensions[3].upperLimit = -np.pi / 4
                self.suspensions[3].lowerLimit = -np.pi / 4

        if keyboard.is_pressed("d"):
            self.suspensions[2].upperLimit += np.deg2rad(2)
            self.suspensions[2].lowerLimit += np.deg2rad(2)
            self.suspensions[3].upperLimit += np.deg2rad(2)
            self.suspensions[3].lowerLimit += np.deg2rad(2)

            if self.suspensions[2].upperLimit >= np.pi / 4:
                self.suspensions[2].lowerLimit = np.pi / 4
                self.suspensions[2].upperLimit = np.pi / 4
                self.suspensions[3].lowerLimit = np.pi / 4
                self.suspensions[3].upperLimit = np.pi / 4
            else:
                self.ticking = -1

        FORWARD_IMPULSE = 1000
        if keyboard.is_pressed("w"):
            self.tires[2].wheel.ApplyLinearImpulse(b2Vec2(self.tires[2].wheel.GetWorldVector((0, FORWARD_IMPULSE))), self.tires[2].wheel.position, True)
            self.tires[3].wheel.ApplyLinearImpulse(b2Vec2(self.tires[3].wheel.GetWorldVector((0, FORWARD_IMPULSE))), self.tires[3].wheel.position, True)

        if keyboard.is_pressed("s"):

            self.tires[2].wheel.ApplyLinearImpulse(b2Vec2(self.tires[2].wheel.GetWorldVector((0, -FORWARD_IMPULSE))), self.tires[2].wheel.position, True)
            self.tires[3].wheel.ApplyLinearImpulse(b2Vec2(self.tires[3].wheel.GetWorldVector((0, -FORWARD_IMPULSE))), self.tires[3].wheel.position, True)

        for wheels in self.tires:
            if wheels == 0 or wheels == 1:
                pass
            else:
                Wheel.apply_impulse(wheels)

class Building():

    BUILDING_FILTER = b2Filter(categoryBits=BUILDING_CATEGORY,
                               maskBits=CAR_CATEGORY,
                               groupIndex=BUILDING_GROUP,
                               )

    def __init__(self, box2world, shape, position, sensor=None):
        self.box2world = box2world
        self.destroy_flag = False
        self.shape = shape
        self.position = position

        if sensor is None:
            sensor = False

        self.sensor = sensor
        self.footprint = self.box2world.CreateStaticBody(position=position,
                                                         angle=0.0,
                                                         fixtures=b2FixtureDef(
                                                             shape=b2PolygonShape(box=(self.shape)),
                                                             density=1000,
                                                             friction=1000,
                                                             filter=Building.BUILDING_FILTER))
        self.footprint.userData = {'obj': self}


############################################################## Setting up car and buildings

def create_buildings():
    BUILDINGS_POSITIONS = [(POS_X - 25, POS_Y), (POS_X + 40, POS_Y), (POS_X - 25, POS_Y + 40), (POS_X + 40, POS_Y + 40),
                       (POS_X - 25, POS_Y - 40), (POS_X + 40, POS_Y - 40), (POS_X - 25, POS_Y - 80), (POS_X + 40, POS_Y + -80),
                       (POS_X + 165, POS_Y), (POS_X + 105, POS_Y), (POS_X + 165, POS_Y + 40), (POS_X + 105, POS_Y + 40),
                       (POS_X + 165, POS_Y - 40), (POS_X + 105, POS_Y - 40), (POS_X + 165, POS_Y - 80), (POS_X + 105, POS_Y + -80),
                       (POS_X + 230, POS_Y + 40), (POS_X + 230, POS_Y), (POS_X + 230, POS_Y - 40), (POS_X + 230, POS_Y + - 80)]

    # Generate buildings of different shape (the number of buildings is partly determined by an element of coincidence)
    RANDOM_MODULO = random.randint(3,7)
    for i in range(len(BUILDINGS_POSITIONS)):
        if i % RANDOM_MODULO == 0:
            skyscrapers.append(Building(box2world, shape=(8, 12), position=(BUILDINGS_POSITIONS[i][0] + 15.5, BUILDINGS_POSITIONS[i][1])))
            skyscrapers.append(Building(box2world, shape=(10, 12), position=(BUILDINGS_POSITIONS[i][0] - 15.5, BUILDINGS_POSITIONS[i][1])))

        else:
            skyscrapers.append(Building(box2world, shape=(23, 12), position=(BUILDINGS_POSITIONS[i])))
skyscrapers = []
create_buildings()


# Randomly choose a skyscraper, next to which a car will be generated
# (first four skyscraper are visible when the PyGame window is launched)
cars_random_skyscraper = random.choice(skyscrapers[0:3])
def create_car():
    cars.append(Car(box2world, position=(cars_random_skyscraper.position[0] + 1.55 * cars_random_skyscraper.shape[0], cars_random_skyscraper.position[1])))

cars = []
create_car()

############################################################## Pygame visualisation
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), HWSURFACE | DOUBLEBUF | RESIZABLE)
pygame.display.set_caption('Top Down Car Using OOP')
colors = {dynamicBody: (133, 187, 101, 0), staticBody: (15, 0, 89, 0)}
running = True
FPS = 24
TIME_STEP = 1.0 / FPS
############################### Drawing functions

SCREEN_OFFSETX, SCREEN_OFFSETY = SCREEN_WIDTH / 16, SCREEN_HEIGHT
def fix_vertices(vertices):
    return [(int(SCREEN_OFFSETX + v[0]), int(SCREEN_OFFSETY - v[1])) for v in vertices]


def _draw_polygon(polygon, screen, body, fixture):
    transform = body.transform
    vertices = fix_vertices([transform * v * PPM for v in polygon.vertices])
    pygame.draw.polygon(
        screen, [c / 2.0 for c in colors[body.type]], vertices, 0)
    pygame.draw.polygon(screen, colors[body.type], vertices, 1)
polygonShape.draw = _draw_polygon


def step():
    if (cars[0].destroy_flag == False):
        TIME_STEP = 1.0 / FPS
        box2world.Step(TIME_STEP, 10, 10)
    else:
        for body in box2world.bodies:
            box2world.DestroyBody(body)

############################### Main game loop
while running:
    # Control your car
    cars[0].control()
    # Check the event queue
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
            # The user closed the window or pressed escape
            running = False

    # Draw the world
    screen.fill((255, 255, 255, 255))
    for body in box2world.bodies:
        for fixture in body.fixtures:
            fixture.shape.draw(screen, body, fixture)

    # Simulate dynamic equation in each step
    step()
    _reset()

    # Flip the screen and try to keep at the target FPS
    pygame.display.flip()  # Update the full display Surface to the screen
    pygame.time.Clock().tick(FPS)

pygame.quit()
print('Done!')

EDIT这是我收到的完整错误消息,当世界崩溃时,希望对您有帮助

Fatal Python error: (pygame parachute) Segmentation Fault

Thread 0x00001e80 (most recent call first):
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 296 in wait
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\queue.py", line 170 in get
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\site-packages\keyboard\_generic.py", line 57 in process
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865 in run
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917 in _bootstrap_inner
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 885 in _bootstrap
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydev_bundle\pydev_monkey.py", line 667 in __call__

Thread 0x000023ec (most recent call first):
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\site-packages\keyboard\_winkeyboard.py", line 563 in listen
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\site-packages\keyboard\__init__.py", line 294 in listen
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865 in run
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917 in _bootstrap_inner
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 885 in _bootstrap
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydev_bundle\pydev_monkey.py", line 667 in __call__

Thread 0x000033cc (most recent call first):
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 199 in _on_run
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 149 in run
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917 in _bootstrap_inner
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 885 in _bootstrap

Thread 0x00003758 (most recent call first):
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 300 in wait
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 552 in wait
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 171 in _on_run
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 149 in run
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917 in _bootstrap_inner
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 885 in _bootstrap

Thread 0x00003958 (most recent call first):
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\wrapper.py", line 168 in recv
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 248 in _read_line
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 262 in _on_run
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 149 in run
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917 in _bootstrap_inner
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 885 in _bootstrap

Thread 0x00002e6c (most recent call first):
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 300 in wait
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\queue.py", line 179 in get
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 362 in _on_run
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py", line 149 in run
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917 in _bootstrap_inner
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 885 in _bootstrap

Thread 0x00001dd8 (most recent call first):
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\ipcjson.py", line 113 in _buffered_read_line_as_ascii
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\ipcjson.py", line 154 in _wait_for_message
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\ipcjson.py", line 272 in process_one_message
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\ipcjson.py", line 258 in process_messages
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\wrapper.py", line 521 in process_messages
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865 in run
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917 in _bootstrap_inner
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 885 in _bootstrap

Thread 0x000036d8 (most recent call first):
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 300 in wait
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 552 in wait
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\futures.py", line 122 in run_forever
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865 in run
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917 in _bootstrap_inner
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\threading.py", line 885 in _bootstrap

Current thread 0x00003694 (most recent call first):
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\site-packages\Box2D\Box2D.py", line 8320 in <lambda>
  File "c:\Users\Mechatrnk\OneDrive\V\u0160\DP - Design of Autonomous Vehicle Simulator\Programming\CarModel.py", line 152 in control
  File "c:\Users\Mechatrnk\OneDrive\V\u0160\DP - Design of Autonomous Vehicle Simulator\Programming\Final_OOP_TopDown_Car_19_2_Model_auta_v_novem_skriptu.py", line 320 in <module>
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 85 in _run_code
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 96 in _run_module_code
  File "C:\Users\Mechatrnk\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 263 in run_path
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 316 in run_file
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 432 in main
  File "c:\Users\Mechatrnk\.vscode\extensions\ms-python.python-2020.2.63072\pythonFiles\ptvsd_launcher.py", line 48 in <module>
python pygame box2d collision reset
1个回答
0
投票

似乎您控制的唯一汽车是cars [0],是列表中的第一辆汽车。当您撞到建筑物并重置时,会将cars [0]的destroy_flag设置为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()
© www.soinside.com 2019 - 2024. All rights reserved.