From 7d97befee4b34f399654b9a9447fbd8ec4857ef6 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 23 Oct 2020 14:53:08 +0200 Subject: [PATCH 1/5] Load game externally --- dungeonbattle/game.py | 31 +++++++++++++++++++++++++++++++ main.py | 4 ++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 dungeonbattle/game.py diff --git a/dungeonbattle/game.py b/dungeonbattle/game.py new file mode 100644 index 0000000..92d7722 --- /dev/null +++ b/dungeonbattle/game.py @@ -0,0 +1,31 @@ +from .interfaces import Map +from .term_manager import TermManager + + +class Game: + INSTANCE = None + + def init(self) -> None: + Game.INSTANCE = self + with TermManager() as term_manager: + self._start_game(term_manager.screen) + + def _start_game(self, screen): + # TODO Generate map, or make the possibility to load another one + m = Map.load("example_map.txt") + while True: + screen.addstr(0, 0, m.draw_string()) + screen.refresh() + key = screen.getkey() + self.handle_key_pressed(key) + + def handle_key_pressed(self, key): + # TODO load keys from settings + if key == 'z' or key == 'KEY_UP': + pass # TODO Go up + if key == 's' or key == 'KEY_DOWN': + pass # TODO Go down + if key == 'q' or key == 'KEY_LEFT': + pass # TODO Go left + if key == 'd' or key == 'KEY_RIGHT': + pass # TODO Go right diff --git a/main.py b/main.py index 0eb26bf..a3c6f79 100755 --- a/main.py +++ b/main.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -from dungeonbattle.proof_of_concept import proof_of_concept +from dungeonbattle.game import Game if __name__ == "__main__": - proof_of_concept() + Game().init() From eea9b45f6cd7a891339773fa9a296121b2f4e31b Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 23 Oct 2020 15:00:59 +0200 Subject: [PATCH 2/5] Use map display --- dungeonbattle/game.py | 5 ++++- dungeonbattle/mapdisplay.py | 3 +-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dungeonbattle/game.py b/dungeonbattle/game.py index 92d7722..d220c23 100644 --- a/dungeonbattle/game.py +++ b/dungeonbattle/game.py @@ -1,4 +1,5 @@ from .interfaces import Map +from .mapdisplay import MapDisplay from .term_manager import TermManager @@ -13,8 +14,10 @@ class Game: def _start_game(self, screen): # TODO Generate map, or make the possibility to load another one m = Map.load("example_map.txt") + d = MapDisplay(m) + screen.refresh() while True: - screen.addstr(0, 0, m.draw_string()) + d.display(1, 6) screen.refresh() key = screen.getkey() self.handle_key_pressed(key) diff --git a/dungeonbattle/mapdisplay.py b/dungeonbattle/mapdisplay.py index f482b37..52d63c1 100644 --- a/dungeonbattle/mapdisplay.py +++ b/dungeonbattle/mapdisplay.py @@ -9,8 +9,7 @@ class MapDisplay: self.pad = curses.newpad(m.height, m.width+1) def update_pad(self): - for i in range(self.map.height): - self.pad.addstr(i, 0, self.map.tiles[i]) + self.pad.addstr(0, 0, self.map.draw_string()) for e in self.map.entities: self.pad.addch(e.y, e.x, e.img) From d264bb45cf05cbbda5db028b4e9e794b3f9a3813 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 23 Oct 2020 15:14:19 +0200 Subject: [PATCH 3/5] Handle player position in game display --- dungeonbattle/game.py | 40 +++++++++++++++++++++++++++++++------ dungeonbattle/mapdisplay.py | 4 +++- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/dungeonbattle/game.py b/dungeonbattle/game.py index d220c23..a82c2b0 100644 --- a/dungeonbattle/game.py +++ b/dungeonbattle/game.py @@ -14,10 +14,14 @@ class Game: def _start_game(self, screen): # TODO Generate map, or make the possibility to load another one m = Map.load("example_map.txt") - d = MapDisplay(m) + player = Player() + self.player = player + player.y = 1 + player.x = 6 + d = MapDisplay(m, player) screen.refresh() while True: - d.display(1, 6) + d.display(player.getPosY(), player.getPosX()) screen.refresh() key = screen.getkey() self.handle_key_pressed(key) @@ -25,10 +29,34 @@ class Game: def handle_key_pressed(self, key): # TODO load keys from settings if key == 'z' or key == 'KEY_UP': - pass # TODO Go up + self.player.move_up() if key == 's' or key == 'KEY_DOWN': - pass # TODO Go down + self.player.move_down() if key == 'q' or key == 'KEY_LEFT': - pass # TODO Go left + self.player.move_left() if key == 'd' or key == 'KEY_RIGHT': - pass # TODO Go right + self.player.move_right() + + +class Player: + # FIXME Should be elsewhere, only useful to don't break the previous code + y: int = 0 + x: int = 0 + + def move_up(self): + self.y -= 1 + + def move_down(self): + self.y += 1 + + def move_left(self): + self.x -= 1 + + def move_right(self): + self.x += 1 + + def getPosX(self): + return self.x + + def getPosY(self): + return self.y diff --git a/dungeonbattle/mapdisplay.py b/dungeonbattle/mapdisplay.py index 52d63c1..2e3b8cc 100644 --- a/dungeonbattle/mapdisplay.py +++ b/dungeonbattle/mapdisplay.py @@ -4,14 +4,16 @@ from dungeonbattle.interfaces import Map class MapDisplay: - def __init__(self, m: Map): + def __init__(self, m: Map, player): self.map = m self.pad = curses.newpad(m.height, m.width+1) + self.player = player def update_pad(self): self.pad.addstr(0, 0, self.map.draw_string()) for e in self.map.entities: self.pad.addch(e.y, e.x, e.img) + self.pad.addstr(self.player.getPosY(), self.player.getPosX(), '🐿') def display(self, y, x): deltay, deltax = (curses.LINES // 2) + 1, (curses.COLS //2) + 1 From 843748213930c60f4843f0ac37e6586917bf9ff8 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 23 Oct 2020 15:40:32 +0200 Subject: [PATCH 4/5] Clear screen before redrawing --- dungeonbattle/game.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dungeonbattle/game.py b/dungeonbattle/game.py index a82c2b0..9efd63f 100644 --- a/dungeonbattle/game.py +++ b/dungeonbattle/game.py @@ -19,10 +19,10 @@ class Game: player.y = 1 player.x = 6 d = MapDisplay(m, player) - screen.refresh() while True: - d.display(player.getPosY(), player.getPosX()) + screen.clear() screen.refresh() + d.display(player.getPosY(), player.getPosX()) key = screen.getkey() self.handle_key_pressed(key) From c85166ff899217be8ee245a0c3566b603b0894dc Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 23 Oct 2020 15:41:17 +0200 Subject: [PATCH 5/5] Remove proof of concept, <3 eichornchen --- dungeonbattle/proof_of_concept.py | 45 ------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 dungeonbattle/proof_of_concept.py diff --git a/dungeonbattle/proof_of_concept.py b/dungeonbattle/proof_of_concept.py deleted file mode 100644 index 9bd2dea..0000000 --- a/dungeonbattle/proof_of_concept.py +++ /dev/null @@ -1,45 +0,0 @@ -from .interfaces import Map, Tile -from .term_manager import TermManager - - -def proof_of_concept() -> None: - """ - Read an example map, parse it, then the (squirrel) player can move freely. - """ - # Load the example map - m = Map.load("example_map.txt") - - # Create the context manager to manipulate the screen - with TermManager() as term_manager: - stdscr = term_manager.screen - - # Draw the full map - stdscr.addstr(0, 0, m.draw_string()) - stdscr.refresh() - - cur = [1, 6] # (y,x) - # We are a squirrel - stdscr.addstr(1, 6, '🐿') - stdscr.refresh() - - while True: - # Get movements of the user - key = stdscr.getkey() - stdscr.addstr(cur[0], cur[1], Tile.FLOOR.value) - next_pos = cur[:] - if key == 'z' or key == 'KEY_UP': - next_pos[0] = cur[0] - 1 - if key == 's' or key == 'KEY_DOWN': - next_pos[0] = cur[0] + 1 - if key == 'q' or key == 'KEY_LEFT': - next_pos[1] = cur[1] - 1 - if key == 'd' or key == 'KEY_RIGHT': - next_pos[1] = cur[1] + 1 - # Check if we stay in the bounds - if 0 <= next_pos[0] < m.height and 0 <= next_pos[0] < m.width: - next_tile = m.tiles[next_pos[0]][next_pos[1]] - # Check if the new position is valid - if next_tile.can_walk(): - cur = next_pos - # Draw the squirrel - stdscr.addstr(cur[0], cur[1], '🐿')