Improves headers text-management
Manages 3 text-zones: - Title (top left) - Status (bottom left) - Items list (top right) DONE draws items counter and message
This commit is contained in:
parent
4333c3dd86
commit
536e3fd0d4
|
@ -51,7 +51,7 @@ guard without all the objects, he dies (according to the evolution theory).
|
||||||
3. Recovering objects
|
3. Recovering objects
|
||||||
* [x] Add object management
|
* [x] Add object management
|
||||||
* [x] The way he pick them up
|
* [x] The way he pick them up
|
||||||
* [ ] Add a counter that will list them.
|
* [x] Add a counter that will list them.
|
||||||
4. Win!
|
4. Win!
|
||||||
* [x] _McGyver_ has picked up all the objects and asleep the guard
|
* [x] _McGyver_ has picked up all the objects and asleep the guard
|
||||||
|
|
||||||
|
|
40
conf.py
40
conf.py
|
@ -5,6 +5,8 @@ Licence: `GNU GPL v3` GNU GPL v3: http://www.gnu.org/licenses/
|
||||||
|
|
||||||
This file is part of [_ocp3_ project](https://github.com/freezed/ocp3)
|
This file is part of [_ocp3_ project](https://github.com/freezed/ocp3)
|
||||||
"""
|
"""
|
||||||
|
import pygame
|
||||||
|
import math
|
||||||
|
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
ELEMENT_LIST = [
|
ELEMENT_LIST = [
|
||||||
|
@ -30,6 +32,7 @@ MOVE_STATUS_MSG = {
|
||||||
|
|
||||||
CELL_SIZE_PX = 30 # Size of the tiles, in pixels
|
CELL_SIZE_PX = 30 # Size of the tiles, in pixels
|
||||||
MAZE_SIZE_TIL = 15 # Size of a map, in tiles
|
MAZE_SIZE_TIL = 15 # Size of a map, in tiles
|
||||||
|
FONT_SIZE = math.floor(0.9 * CELL_SIZE_PX)
|
||||||
BLACK = (0, 0, 0)
|
BLACK = (0, 0, 0)
|
||||||
BLUE = (0, 0, 128)
|
BLUE = (0, 0, 128)
|
||||||
GREEN = (0, 255, 0)
|
GREEN = (0, 255, 0)
|
||||||
|
@ -38,13 +41,23 @@ WHITE = (255, 255, 255)
|
||||||
# Messages
|
# Messages
|
||||||
CAPTION = "OCP3, a pygame maze"
|
CAPTION = "OCP3, a pygame maze"
|
||||||
ERR_MAP = "ERR_MAP: «{}»"
|
ERR_MAP = "ERR_MAP: «{}»"
|
||||||
MSG_START_GAME = "Welcome in OCP3.\nUse arrow keys to play, any other key to quit."
|
HEADER_MESSAGES = {
|
||||||
|
'title': "Welcome in OCP3.",
|
||||||
|
'status': "Use arrow keys to play, any other key to quit.",
|
||||||
|
'items': "Items: {}/{}",
|
||||||
|
}
|
||||||
|
|
||||||
# Files
|
# Files
|
||||||
BACKGROUND_IMG = 'img/zebra-800.png'
|
BACKGROUND_IMG = 'img/zebra-800.png'
|
||||||
MAP_FILE = '01.map'
|
MAP_FILE = '01.map'
|
||||||
UNKNOWN_TILE = 'img/unknown-30.png'
|
UNKNOWN_TILE = 'img/unknown-30.png'
|
||||||
|
|
||||||
|
# Constant calculation
|
||||||
|
HEADER_HEIGHT = (2 * CELL_SIZE_PX)
|
||||||
|
WINDOW_SIZE_PX_W = CELL_SIZE_PX * MAZE_SIZE_TIL
|
||||||
|
WINDOW_SIZE_PX_H = WINDOW_SIZE_PX_W + HEADER_HEIGHT
|
||||||
|
WIN_DIM = (WINDOW_SIZE_PX_W, WINDOW_SIZE_PX_H)
|
||||||
|
|
||||||
|
|
||||||
# FUNCTIONS
|
# FUNCTIONS
|
||||||
|
|
||||||
|
@ -72,7 +85,6 @@ def elmt_val(kval, ksel, vsel, nline=False):
|
||||||
|
|
||||||
def maze_draw(WINDOW, map_string):
|
def maze_draw(WINDOW, map_string):
|
||||||
""" Take a map string and generate a graphic maze """
|
""" Take a map string and generate a graphic maze """
|
||||||
import pygame
|
|
||||||
back_tiles = []
|
back_tiles = []
|
||||||
for cell, element in enumerate(map_string):
|
for cell, element in enumerate(map_string):
|
||||||
img = elmt_val('tile', 'symbol', element, 0)
|
img = elmt_val('tile', 'symbol', element, 0)
|
||||||
|
@ -83,8 +95,30 @@ def maze_draw(WINDOW, map_string):
|
||||||
back_tiles.append(pygame.image.load(img).convert_alpha())
|
back_tiles.append(pygame.image.load(img).convert_alpha())
|
||||||
|
|
||||||
x = (cell % MAZE_SIZE_TIL) * CELL_SIZE_PX
|
x = (cell % MAZE_SIZE_TIL) * CELL_SIZE_PX
|
||||||
y = (cell // MAZE_SIZE_TIL) * CELL_SIZE_PX + (2 * CELL_SIZE_PX)
|
y = (cell // MAZE_SIZE_TIL) * CELL_SIZE_PX + HEADER_HEIGHT
|
||||||
WINDOW.blit(back_tiles[cell], (x, y))
|
WINDOW.blit(back_tiles[cell], (x, y))
|
||||||
|
|
||||||
# Refresh
|
# Refresh
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|
||||||
|
|
||||||
|
def set_header(WINDOW, messages):
|
||||||
|
"""
|
||||||
|
Set the header message on the window
|
||||||
|
|
||||||
|
:param obj WINDOWS: display object
|
||||||
|
:param list/str messages: list of messages per place
|
||||||
|
"""
|
||||||
|
pygame.draw.rect(WINDOW, BLACK, (0, 0, WINDOW_SIZE_PX_W, HEADER_HEIGHT))
|
||||||
|
|
||||||
|
FONT = pygame.font.Font(None, FONT_SIZE)
|
||||||
|
|
||||||
|
h_title = FONT.render(str(messages['title']), True, BLUE, WHITE)
|
||||||
|
h_status = FONT.render(str(messages['status']), True, WHITE, BLACK)
|
||||||
|
h_items = FONT.render(str(messages['items']), True, GREEN, BLACK)
|
||||||
|
|
||||||
|
h_items_pos = h_items.get_rect(topright=(WINDOW_SIZE_PX_W, 0))
|
||||||
|
|
||||||
|
WINDOW.blit(h_title, (0, 0))
|
||||||
|
WINDOW.blit(h_status, (0, CELL_SIZE_PX))
|
||||||
|
WINDOW.blit(h_items, h_items_pos)
|
||||||
|
|
24
main.py
24
main.py
|
@ -11,43 +11,30 @@ See [README](https://github.com/freezed/ocp3/blob/master/README.md) for
|
||||||
details
|
details
|
||||||
"""
|
"""
|
||||||
import pygame
|
import pygame
|
||||||
import math
|
|
||||||
from pygame.locals import (
|
from pygame.locals import (
|
||||||
K_UP, K_DOWN, K_RIGHT, K_LEFT, KEYDOWN, QUIT, RESIZABLE
|
K_UP, K_DOWN, K_RIGHT, K_LEFT, KEYDOWN, QUIT, RESIZABLE
|
||||||
)
|
)
|
||||||
from map import Map
|
from map import Map
|
||||||
from conf import BACKGROUND_IMG, BLACK, BLUE, CAPTION, CELL_SIZE_PX, elmt_val, GREEN, MAP_FILE, maze_draw, MAZE_SIZE_TIL, WHITE
|
from conf import BACKGROUND_IMG, CAPTION, MAP_FILE, HEADER_HEIGHT, maze_draw, set_header, WIN_DIM
|
||||||
|
|
||||||
# Constant calculation
|
# Constant calculation
|
||||||
GAME_KEYS = [K_UP, K_DOWN, K_RIGHT, K_LEFT]
|
GAME_KEYS = [K_UP, K_DOWN, K_RIGHT, K_LEFT]
|
||||||
WINDOW_SIZE_PX_H = CELL_SIZE_PX * MAZE_SIZE_TIL
|
|
||||||
WINDOW_SIZE_PX_V = WINDOW_SIZE_PX_H + (2 * CELL_SIZE_PX)
|
|
||||||
WIN_DIM = (WINDOW_SIZE_PX_H, WINDOW_SIZE_PX_V)
|
|
||||||
FONT_SIZE = math.floor(0.9 * CELL_SIZE_PX)
|
|
||||||
|
|
||||||
pygame.init()
|
pygame.init()
|
||||||
WINDOW = pygame.display.set_mode(WIN_DIM, RESIZABLE)
|
WINDOW = pygame.display.set_mode(WIN_DIM, RESIZABLE)
|
||||||
pygame.display.set_caption(CAPTION)
|
pygame.display.set_caption(CAPTION)
|
||||||
WINDOW.blit(pygame.image.load(BACKGROUND_IMG).convert(), (0, (2 * CELL_SIZE_PX)))
|
WINDOW.blit(pygame.image.load(BACKGROUND_IMG).convert(), (0, HEADER_HEIGHT))
|
||||||
|
|
||||||
# Loading map
|
# Loading map
|
||||||
MAP_GAME = Map(MAP_FILE)
|
MAP_GAME = Map(MAP_FILE)
|
||||||
|
|
||||||
# Header messaging
|
# Header messaging
|
||||||
h_msg = MAP_GAME.status_message.splitlines()
|
set_header(WINDOW, MAP_GAME.status_message)
|
||||||
FONT = pygame.font.Font(None, FONT_SIZE)
|
|
||||||
h1_txt = FONT.render(h_msg[0], True, WHITE, BLACK)
|
|
||||||
h2_txt = FONT.render(h_msg[1], True, WHITE, BLACK)
|
|
||||||
WINDOW.blit(h1_txt, (0, 0))
|
|
||||||
WINDOW.blit(h2_txt, (0, CELL_SIZE_PX))
|
|
||||||
|
|
||||||
# Draw maze
|
# Draw maze
|
||||||
maze_draw(WINDOW, MAP_GAME.map_print().replace('\n', ''))
|
maze_draw(WINDOW, MAP_GAME.map_print().replace('\n', ''))
|
||||||
|
|
||||||
# system('clear')
|
pygame.time.Clock().tick(25)
|
||||||
print(MAP_GAME.status_message)
|
|
||||||
# MAP_GAME.map_print()
|
|
||||||
|
|
||||||
# Game loop
|
# Game loop
|
||||||
while MAP_GAME.status:
|
while MAP_GAME.status:
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
|
@ -61,7 +48,6 @@ while MAP_GAME.status:
|
||||||
else:
|
else:
|
||||||
MAP_GAME.status = False
|
MAP_GAME.status = False
|
||||||
|
|
||||||
print("status_message:{}".format(MAP_GAME.status_message))
|
set_header(WINDOW, MAP_GAME.status_message)
|
||||||
|
|
||||||
# Draw maze
|
# Draw maze
|
||||||
maze_draw(WINDOW, MAP_GAME.map_print().replace('\n', ''))
|
maze_draw(WINDOW, MAP_GAME.map_print().replace('\n', ''))
|
||||||
|
|
27
map.py
27
map.py
|
@ -8,7 +8,7 @@ This file is part of [_ocp3_ project](https://github.com/freezed/ocp3)
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
from pygame.locals import K_UP, K_DOWN, K_RIGHT, K_LEFT
|
from pygame.locals import K_UP, K_DOWN, K_RIGHT, K_LEFT
|
||||||
from conf import elmt_val, ERR_MAP, MOVE_STATUS_MSG, MSG_START_GAME, MAZE_SIZE_TIL
|
from conf import elmt_val, ERR_MAP, MOVE_STATUS_MSG, HEADER_MESSAGES, MAZE_SIZE_TIL
|
||||||
|
|
||||||
|
|
||||||
class Map:
|
class Map:
|
||||||
|
@ -67,17 +67,22 @@ class Map:
|
||||||
self.place_element(symbol_to_place, pos=position)
|
self.place_element(symbol_to_place, pos=position)
|
||||||
|
|
||||||
self.status = True
|
self.status = True
|
||||||
self.status_message = MSG_START_GAME
|
|
||||||
self.collected_items = []
|
self.collected_items = []
|
||||||
|
self.collected_items_num = 0
|
||||||
|
self.MAX_ITEMS = sum(1 for _ in elmt_val('name', 'collect', True))
|
||||||
|
self.status_message = {}
|
||||||
|
self.status_message['title'] = HEADER_MESSAGES['title']
|
||||||
|
self.status_message['status'] = HEADER_MESSAGES['status']
|
||||||
|
self.status_message['items'] = HEADER_MESSAGES['items'].format(self.collected_items_num, self.MAX_ITEMS)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.status = False
|
self.status = False
|
||||||
self.status_message = ERR_MAP.format("maplines: " + str(len(map_in_a_list)))
|
print(ERR_MAP.format("maplines: " + str(len(map_in_a_list))))
|
||||||
|
|
||||||
# Erreur de chargement du fichier
|
# Erreur de chargement du fichier
|
||||||
else:
|
else:
|
||||||
self.status = False
|
self.status = False
|
||||||
self.status_message = ERR_MAP.format(':'.join(["mapfile", map_file]))
|
print(ERR_MAP.format(':'.join(["mapfile", map_file])))
|
||||||
|
|
||||||
def map_print(self):
|
def map_print(self):
|
||||||
""" Affiche la carte avec la position de jeu courante """
|
""" Affiche la carte avec la position de jeu courante """
|
||||||
|
@ -118,26 +123,28 @@ class Map:
|
||||||
|
|
||||||
if next_char == elmt_val('symbol', 'name', 'void', 0):
|
if next_char == elmt_val('symbol', 'name', 'void', 0):
|
||||||
self._player_position = next_position
|
self._player_position = next_position
|
||||||
self.status_message = MOVE_STATUS_MSG['ok']
|
self.status_message['status'] = MOVE_STATUS_MSG['ok']
|
||||||
|
|
||||||
elif next_char in elmt_val('symbol', 'collect', True):
|
elif next_char in elmt_val('symbol', 'collect', True):
|
||||||
self._player_position = next_position
|
self._player_position = next_position
|
||||||
self.status_message = MOVE_STATUS_MSG['collect'].format(elmt_val('name', 'symbol', next_char, 0))
|
|
||||||
self._element_under_player = elmt_val('symbol', 'name', 'void', 0)
|
self._element_under_player = elmt_val('symbol', 'name', 'void', 0)
|
||||||
self.collected_items.append(elmt_val('name', 'symbol', next_char, 0))
|
self.collected_items.append(elmt_val('name', 'symbol', next_char, 0))
|
||||||
|
self.collected_items_num += 1
|
||||||
|
self.status_message['status'] = MOVE_STATUS_MSG['collect'].format(elmt_val('name', 'symbol', next_char, 0))
|
||||||
|
self.status_message['items'] = HEADER_MESSAGES['items'].format(self.collected_items_num, self.MAX_ITEMS)
|
||||||
|
|
||||||
elif next_char == elmt_val('symbol', 'name', 'exit', 0):
|
elif next_char == elmt_val('symbol', 'name', 'exit', 0):
|
||||||
self.status = False
|
self.status = False
|
||||||
if sorted(self.collected_items) == sorted(elmt_val('name', 'collect', True)):
|
if sorted(self.collected_items) == sorted(elmt_val('name', 'collect', True)):
|
||||||
self.status_message = MOVE_STATUS_MSG['winner']
|
self.status_message['status'] = MOVE_STATUS_MSG['winner']
|
||||||
else:
|
else:
|
||||||
missed_item_flist = ', '.join((item for item in elmt_val('name', 'collect', True) if item not in self.collected_items))
|
missed_item_flist = ', '.join((item for item in elmt_val('name', 'collect', True) if item not in self.collected_items))
|
||||||
self.status_message = MOVE_STATUS_MSG['looser'].format(missed_item_flist)
|
self.status_message['status'] = MOVE_STATUS_MSG['looser'].format(missed_item_flist)
|
||||||
|
|
||||||
else: # wall, door or nline
|
else: # wall, door or nline
|
||||||
self.status_message = MOVE_STATUS_MSG['wall']
|
self.status_message['status'] = MOVE_STATUS_MSG['wall']
|
||||||
else:
|
else:
|
||||||
self.status_message = MOVE_STATUS_MSG['wall']
|
self.status_message['status'] = MOVE_STATUS_MSG['wall']
|
||||||
|
|
||||||
# place le plyr sur sa nouvelle position
|
# place le plyr sur sa nouvelle position
|
||||||
self.place_element(elmt_val('symbol', 'name', 'player', 0))
|
self.place_element(elmt_val('symbol', 'name', 'player', 0))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user