Updates only changed tiles
Before this, after each move, the whole maze was redrawed to update display. Now it draws only the changed tiles (current/old player position). Changed tiles are stocked in a list, for future needs, others changed tiles can be add here. TODO keep maze.string updated
This commit is contained in:
parent
69be4c1753
commit
eb68f7c04d
29
gui.py
29
gui.py
|
@ -76,3 +76,32 @@ class GraphUI:
|
||||||
self.SURFACE.blit(h_title, (0, 0))
|
self.SURFACE.blit(h_title, (0, 0))
|
||||||
self.SURFACE.blit(h_status, (0, CELL_SIZE))
|
self.SURFACE.blit(h_status, (0, CELL_SIZE))
|
||||||
self.SURFACE.blit(h_items, h_items_pos)
|
self.SURFACE.blit(h_items, h_items_pos)
|
||||||
|
|
||||||
|
def update(self, player):
|
||||||
|
"""
|
||||||
|
Updates GUI after a move
|
||||||
|
|
||||||
|
:param obj player: a Player object
|
||||||
|
"""
|
||||||
|
changed_tiles = [
|
||||||
|
(elmt_val('tile', 'symbol', player.ground, 0), player.old_position),
|
||||||
|
(elmt_val('tile', 'name', 'player', 0), player.current_position),
|
||||||
|
]
|
||||||
|
|
||||||
|
# [print('tile[0]:{} tile[1]:{}'.format(tile[0], tile[1])) for num, tile in enumerate(changed_tiles) if tile[0] is not False]
|
||||||
|
[self.blit(tile[0], self.coord_from_index(tile[1])) for num, tile in enumerate(changed_tiles) if False not in tile]
|
||||||
|
|
||||||
|
# Refresh
|
||||||
|
pygame.display.flip()
|
||||||
|
|
||||||
|
def coord_from_index(self, idx):
|
||||||
|
"""
|
||||||
|
Gets 2 dimensions coordinates
|
||||||
|
|
||||||
|
Converts a string index (the position in the maze.string: beware of EOL) to 2 dimensions coordinates (necessary for positionning objects in pygame)
|
||||||
|
:param int index: string index
|
||||||
|
"""
|
||||||
|
|
||||||
|
x = (idx % (MAZE_SIZE + 1)) * CELL_SIZE
|
||||||
|
y = (idx // (MAZE_SIZE + 1)) * CELL_SIZE + HEAD_SIZE_H
|
||||||
|
return (x, y)
|
||||||
|
|
8
main.py
8
main.py
|
@ -29,11 +29,12 @@ game_maze = Maze(MAZE_FILE)
|
||||||
if game_maze.status:
|
if game_maze.status:
|
||||||
macgyver = Player(game_maze)
|
macgyver = Player(game_maze)
|
||||||
gui = GraphUI()
|
gui = GraphUI()
|
||||||
|
# TODO include set_header() in draw()
|
||||||
|
gui.set_header(macgyver.status_message)
|
||||||
|
gui.draw(game_maze)
|
||||||
|
|
||||||
# game loop
|
# game loop
|
||||||
while game_maze.status:
|
while game_maze.status:
|
||||||
gui.set_header(macgyver.status_message)
|
|
||||||
gui.draw(game_maze)
|
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
if event.type == QUIT:
|
if event.type == QUIT:
|
||||||
game_maze.status = False
|
game_maze.status = False
|
||||||
|
@ -43,11 +44,14 @@ while game_maze.status:
|
||||||
last_message = True # executes last_message loop
|
last_message = True # executes last_message loop
|
||||||
if event.key in GAME_KEYS:
|
if event.key in GAME_KEYS:
|
||||||
macgyver.key_event(event.key)
|
macgyver.key_event(event.key)
|
||||||
|
gui.set_header(macgyver.status_message)
|
||||||
|
gui.update(macgyver)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
macgyver.status_message['status'] = MSG_QUIT
|
macgyver.status_message['status'] = MSG_QUIT
|
||||||
game_maze.status = False
|
game_maze.status = False
|
||||||
|
|
||||||
|
|
||||||
# displays the last_message (won, lost or quit)
|
# displays the last_message (won, lost or quit)
|
||||||
while last_message:
|
while last_message:
|
||||||
macgyver.status_message['title'] = MSG_END
|
macgyver.status_message['title'] = MSG_END
|
||||||
|
|
31
player.py
31
player.py
|
@ -24,9 +24,11 @@ class Player:
|
||||||
:param obj maze: Maze object
|
:param obj maze: Maze object
|
||||||
"""
|
"""
|
||||||
self.maze = maze
|
self.maze = maze
|
||||||
self.position = maze.string.find(
|
self.current_position = maze.string.find(
|
||||||
elmt_val('symbol', 'name', 'player', 0)
|
elmt_val('symbol', 'name', 'player', 0)
|
||||||
)
|
)
|
||||||
|
self.old_position = 0
|
||||||
|
|
||||||
# Element under player, default 'floor'
|
# Element under player, default 'floor'
|
||||||
self.ground = elmt_val('symbol', 'name', 'floor', 0)
|
self.ground = elmt_val('symbol', 'name', 'floor', 0)
|
||||||
|
|
||||||
|
@ -49,16 +51,16 @@ class Player:
|
||||||
:param int pressed_key: direction (pygame const)
|
:param int pressed_key: direction (pygame const)
|
||||||
"""
|
"""
|
||||||
if pressed_key == K_UP:
|
if pressed_key == K_UP:
|
||||||
self.move_to(self.position - self.maze.COL_NB)
|
self.move_to(self.current_position - self.maze.COL_NB)
|
||||||
|
|
||||||
elif pressed_key == K_DOWN:
|
elif pressed_key == K_DOWN:
|
||||||
self.move_to(self.position + self.maze.COL_NB)
|
self.move_to(self.current_position + self.maze.COL_NB)
|
||||||
|
|
||||||
elif pressed_key == K_RIGHT:
|
elif pressed_key == K_RIGHT:
|
||||||
self.move_to(self.position + 1)
|
self.move_to(self.current_position + 1)
|
||||||
|
|
||||||
elif pressed_key == K_LEFT:
|
elif pressed_key == K_LEFT:
|
||||||
self.move_to(self.position - 1)
|
self.move_to(self.current_position - 1)
|
||||||
|
|
||||||
# ++Add other treatment for key events here (help, menu, etc.)++
|
# ++Add other treatment for key events here (help, menu, etc.)++
|
||||||
|
|
||||||
|
@ -80,14 +82,16 @@ class Player:
|
||||||
if next_position in self.maze.RANGE:
|
if next_position in self.maze.RANGE:
|
||||||
next_symbol = self.maze.string[next_position]
|
next_symbol = self.maze.string[next_position]
|
||||||
|
|
||||||
|
self.old_position = self.current_position
|
||||||
|
|
||||||
# 'floor' element
|
# 'floor' element
|
||||||
if next_symbol == elmt_val('symbol', 'name', 'floor', 0):
|
if next_symbol == elmt_val('symbol', 'name', 'floor', 0):
|
||||||
self.position = next_position
|
self.current_position = next_position
|
||||||
self.status_message['status'] = MSG_OK
|
self.status_message['status'] = MSG_OK
|
||||||
|
|
||||||
# 'item' element
|
# 'item' element
|
||||||
elif next_symbol in elmt_val('symbol', 'item', True):
|
elif next_symbol in elmt_val('symbol', 'item', True):
|
||||||
self.position = next_position
|
self.current_position = next_position
|
||||||
self.stock.append(
|
self.stock.append(
|
||||||
elmt_val('name', 'symbol', next_symbol, 0)
|
elmt_val('name', 'symbol', next_symbol, 0)
|
||||||
)
|
)
|
||||||
|
@ -121,17 +125,10 @@ class Player:
|
||||||
# for all other element (wall or nline)
|
# for all other element (wall or nline)
|
||||||
else:
|
else:
|
||||||
self.status_message['status'] = MSG_WALL
|
self.status_message['status'] = MSG_WALL
|
||||||
|
self.old_position = False
|
||||||
|
|
||||||
|
|
||||||
# out the string range
|
# out the string range
|
||||||
else:
|
else:
|
||||||
self.status_message['status'] = MSG_WALL
|
self.status_message['status'] = MSG_WALL
|
||||||
|
self.old_position = False
|
||||||
# Replaces player symbol on the maze by 'ground' value
|
|
||||||
self.maze.string = self.maze.string.replace(
|
|
||||||
elmt_val('symbol', 'name', 'player', 0), self.ground
|
|
||||||
)
|
|
||||||
|
|
||||||
# Sets the player's new position
|
|
||||||
self.maze.set_symbol(
|
|
||||||
elmt_val('symbol', 'name', 'player', 0), self.position
|
|
||||||
)
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user