Renderer now removes wall padding

This commit is contained in:
Robert Müller 2022-12-15 17:17:30 +01:00
parent 4f3924d3ab
commit bdbd1c4e25
2 changed files with 31 additions and 14 deletions

View File

@ -150,9 +150,9 @@ class BaseFactory(gym.Env):
# Objects # Objects
self._entities = Entities() self._entities = Entities()
# Level # Level
level_array = h.one_hot_level(self._parsed_level) level_array = h.one_hot_level(self._parsed_level)
level_array = np.pad(level_array, self.obs_prop.pomdp_r, 'constant', constant_values=1) self._level_init_shape = level_array.shape
level_array = np.pad(level_array, self.obs_prop.pomdp_r, 'constant', constant_values=c.OCCUPIED_CELL)
self._level_shape = level_array.shape self._level_shape = level_array.shape
self._obs_shape = self._level_shape if not self.obs_prop.pomdp_r else (self.pomdp_diameter, ) * 2 self._obs_shape = self._level_shape if not self.obs_prop.pomdp_r else (self.pomdp_diameter, ) * 2

View File

@ -20,21 +20,33 @@ class RenderEntity(NamedTuple):
aux: Any = None aux: Any = None
class RenderNames:
AGENT: str = 'agent'
BLANK: str = 'blank'
DOOR: str = 'door'
OPACITY: str = 'opacity'
SCALE: str = 'scale'
rn = RenderNames
class Renderer: class Renderer:
BG_COLOR = (178, 190, 195) # (99, 110, 114) BG_COLOR = (178, 190, 195) # (99, 110, 114)
WHITE = (223, 230, 233) # (200, 200, 200) WHITE = (223, 230, 233) # (200, 200, 200)
AGENT_VIEW_COLOR = (9, 132, 227) AGENT_VIEW_COLOR = (9, 132, 227)
ASSETS = Path(__file__).parent.parent / 'assets' ASSETS = Path(__file__).parent.parent / 'assets'
def __init__(self, grid_w=16, grid_h=16, cell_size=40, fps=7, grid_lines=True, view_radius=2): def __init__(self, lvl_shape=(16, 16),
self.grid_h = grid_h lvl_padded_shape=None,
self.grid_w = grid_w cell_size=40, fps=7,
grid_lines=True, view_radius=2):
self.grid_h, self.grid_w = lvl_shape
self.lvl_padded_shape = lvl_padded_shape if lvl_padded_shape is not None else lvl_shape
self.cell_size = cell_size self.cell_size = cell_size
self.fps = fps self.fps = fps
self.grid_lines = grid_lines self.grid_lines = grid_lines
self.view_radius = view_radius self.view_radius = view_radius
pygame.init() pygame.init()
self.screen_size = (grid_w*cell_size, grid_h*cell_size) self.screen_size = (self.grid_w*cell_size, self.grid_h*cell_size)
self.screen = pygame.display.set_mode(self.screen_size) self.screen = pygame.display.set_mode(self.screen_size)
self.clock = pygame.time.Clock() self.clock = pygame.time.Clock()
assets = list(self.ASSETS.rglob('*.png')) assets = list(self.ASSETS.rglob('*.png'))
@ -43,7 +55,7 @@ class Renderer:
now = time.time() now = time.time()
self.font = pygame.font.Font(None, 20) self.font = pygame.font.Font(None, 20)
self.font.set_bold(1) self.font.set_bold(True)
print('Loading System font with pygame.font.Font took', time.time() - now) print('Loading System font with pygame.font.Font took', time.time() - now)
def fill_bg(self): def fill_bg(self):
@ -56,11 +68,16 @@ class Renderer:
pygame.draw.rect(self.screen, Renderer.WHITE, rect, 1) pygame.draw.rect(self.screen, Renderer.WHITE, rect, 1)
def blit_params(self, entity): def blit_params(self, entity):
offset_r, offset_c = (self.lvl_padded_shape[0] - self.grid_h) // 2, \
(self.lvl_padded_shape[1] - self.grid_w) // 2
r, c = entity.pos r, c = entity.pos
r, c = r - offset_r, c-offset_c
img = self.assets[entity.name.lower()] img = self.assets[entity.name.lower()]
if entity.value_operation == 'opacity': if entity.value_operation == rn.OPACITY:
img.set_alpha(255*entity.value) img.set_alpha(255*entity.value)
elif entity.value_operation == 'scale': elif entity.value_operation == rn.SCALE:
re = img.get_rect() re = img.get_rect()
img = pygame.transform.smoothscale( img = pygame.transform.smoothscale(
img, (int(entity.value*re.width), int(entity.value*re.height)) img, (int(entity.value*re.width), int(entity.value*re.height))
@ -99,19 +116,19 @@ class Renderer:
sys.exit() sys.exit()
self.fill_bg() self.fill_bg()
blits = deque() blits = deque()
for entity in [x for x in entities if 'door' in x.name]: for entity in [x for x in entities if rn.DOOR in x.name]:
bp = self.blit_params(entity) bp = self.blit_params(entity)
blits.append(bp) blits.append(bp)
for entity in [x for x in entities if 'door' not in x.name]: for entity in [x for x in entities if rn.DOOR not in x.name]:
bp = self.blit_params(entity) bp = self.blit_params(entity)
blits.append(bp) blits.append(bp)
if entity.name.lower() == 'agent': if entity.name.lower() == rn.AGENT:
if self.view_radius > 0: if self.view_radius > 0:
vis_rects = self.visibility_rects(bp, entity.aux) vis_rects = self.visibility_rects(bp, entity.aux)
blits.extendleft(vis_rects) blits.extendleft(vis_rects)
if entity.state != 'blank': if entity.state != rn.BLANK:
agent_state_blits = self.blit_params( agent_state_blits = self.blit_params(
RenderEntity(entity.state, (entity.pos[0] + 0.12, entity.pos[1]), 0.48, 'scale') RenderEntity(entity.state, (entity.pos[0] + 0.12, entity.pos[1]), 0.48, rn.SCALE)
) )
textsurface = self.font.render(str(entity.id), False, (0, 0, 0)) textsurface = self.font.render(str(entity.id), False, (0, 0, 0))
text_blit = dict(source=textsurface, dest=(bp['dest'].center[0]-.07*self.cell_size, text_blit = dict(source=textsurface, dest=(bp['dest'].center[0]-.07*self.cell_size,