Improved map rendering, world rendering in separate surface and map can be translated

This commit is contained in:
manishthani 2019-01-15 12:23:50 +01:00
parent 7343b7d74e
commit 086d926690
1 changed files with 47 additions and 17 deletions

View File

@ -169,20 +169,23 @@ class ModuleHUD (object):
# ============================================================================== # ==============================================================================
offset = 250 offset_x = 250
offset_y = 250
scale_x = 1
scale_y = 1
class ModuleWorld(object): class ModuleWorld(object):
def __init__(self, name, host, port, timeout): def __init__(self, name, host, port, timeout, surface):
self.name = name self.name = name
self.surface = surface
try: try:
client = carla.Client(host, port) client = carla.Client(host, port)
client.set_timeout(timeout) client.set_timeout(timeout)
self.world = client.get_world() self.world = client.get_world()
weak_self = weakref.ref(self) weak_self = weakref.ref(self)
#self.world.on_tick(lambda timestamp: ModuleWorld.on_world_tick(weak_self, timestamp)) self.world.on_tick(lambda timestamp: ModuleWorld.on_world_tick(weak_self, timestamp))
except Exception as ex: except Exception as ex:
logging.error('Failed connecting to CARLA server') logging.error('Failed connecting to CARLA server')
@ -202,19 +205,17 @@ class ModuleWorld(object):
def render_map(self, display, town_map): def render_map(self, display, town_map):
# Get map waypoints # Get map waypoints
waypoint_list = town_map.get_topology()
radius = 2 radius = 2
width = 1 width = 1
thickness = 1 thickness = 1
waypoint_list = town_map.generate_waypoints(10.0)
point_list = [] point_list = []
for waypoint in waypoint_list:
first_waypoint = int(waypoint[0].transform.location.x +
offset), int(waypoint[0].transform.location.y + offset)
second_waypoint = int(waypoint[1].transform.location.x +
offset), int(waypoint[1].transform.location.y + offset)
point_list = [first_waypoint, second_waypoint] for waypoint in waypoint_list:
pygame.draw.lines(display, (255, 0, 255), False, point_list, 1) point_list.append((int(waypoint.transform.location.x + offset_x),
int(waypoint.transform.location.y + offset_y)))
pygame.draw.lines(self.surface, (255, 0, 255), False, point_list, 1)
def render_actors(self, display, actors, filter, color): def render_actors(self, display, actors, filter, color):
filtered_actors = [actor for actor in actors if filter in actor.type_id] filtered_actors = [actor for actor in actors if filter in actor.type_id]
@ -223,17 +224,18 @@ class ModuleWorld(object):
for actor in filtered_actors: for actor in filtered_actors:
actor_location = actor.get_location() actor_location = actor.get_location()
pygame.draw.circle(display, color, (offset + int(actor_location.x), pygame.draw.circle(self.surface, color, (offset_x + int(actor_location.x),
offset + int(actor_location.y)), radius, width) offset_y + int(actor_location.y)), radius, width)
def render(self, display): def render(self, display):
actors = self.world.get_actors() actors = self.world.get_actors()
town_map = self.world.get_map() town_map = self.world.get_map()
self.surface.fill((0, 0, 0))
self.render_map(display, town_map) self.render_map(display, town_map)
self.render_actors(display, actors, 'vehicle', (255, 0, 0)) self.render_actors(display, actors, 'vehicle', (255, 0, 0))
self.render_actors(display, actors, 'traffic_light', (0, 255, 0)) self.render_actors(display, actors, 'traffic_light', (0, 255, 0))
self.render_actors(display, actors, 'speed_limit', (0, 0, 255)) self.render_actors(display, actors, 'speed_limit', (0, 0, 255))
display.blit(self.surface, (0, 0))
# ============================================================================== # ==============================================================================
# -- Input ----------------------------------------------------------- # -- Input -----------------------------------------------------------
@ -243,9 +245,10 @@ class ModuleWorld(object):
class ModuleInput(object): class ModuleInput(object):
def __init__(self, name): def __init__(self, name):
self.name = name self.name = name
self.mouse_pos = (0, 0)
def render(self, display): def render(self, display):
pass display = pygame.transform.scale(display, (int(1280 * scale_x), int(720 * scale_y)))
def tick(self, clock): def tick(self, clock):
self.parse_input() self.parse_input()
@ -258,15 +261,41 @@ class ModuleInput(object):
# Quick actions # Quick actions
if event.key == K_ESCAPE: if event.key == K_ESCAPE:
exit_game() exit_game()
elif event.type == pygame.MOUSEBUTTONDOWN:
self.mouse_pos = pygame.mouse.get_pos()
if event.button == 4:
# Scale up surface
print ("mouse wheel up")
global scale_x
global scale_y
scale_x += 0.1
scale_y += 0.1
if event.button == 5:
# Scale down surface
global scale_x
global scale_y
scale_x -= 0.1
scale_y -= 0.1
def _parse_keys(self): def _parse_keys(self):
keys = pygame.key.get_pressed() keys = pygame.key.get_pressed()
# if keys[pygame.K_LEFT]: # if keys[pygame.K_LEFT]:
# Do something # Do something
def _parse_mouse(self):
if pygame.mouse.get_pressed()[0]:
x, y = pygame.mouse.get_pos()
global offset_x
global offset_y
offset_x += x - self.mouse_pos[0]
offset_y += y - self.mouse_pos[1]
self.mouse_pos = (x, y)
def parse_input(self): def parse_input(self):
self._parse_events() self._parse_events()
self._parse_keys() self._parse_keys()
self._parse_mouse()
# ============================================================================== # ==============================================================================
# -- Game Loop --------------------------------------------------------------- # -- Game Loop ---------------------------------------------------------------
@ -286,7 +315,8 @@ def game_loop(args):
# Init modules # Init modules
input_module = ModuleInput(MODULE_INPUT) input_module = ModuleInput(MODULE_INPUT)
world_module = ModuleWorld(MODULE_WORLD, args.host, args.port, 2.0) world_module = ModuleWorld(MODULE_WORLD, args.host, args.port, 2.0,
pygame.Surface((args.width, args.height)))
hud_module = ModuleHUD(MODULE_HUD, args.width, args.height) hud_module = ModuleHUD(MODULE_HUD, args.width, args.height)
# Register Modules # Register Modules