我有这个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>
似乎您控制的唯一汽车是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()