From 8b10b4228e1df2959077f48a10e109512aa59f23 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 6 Jan 2022 11:09:43 -0500 Subject: [PATCH] Move around a player character --- actions.py | 14 +++++++++++ dejavu10x10_gs_tc.png | Bin 0 -> 8439 bytes input_handlers.py | 30 ++++++++++++++++++++++++ main.py | 53 ++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 2 ++ 5 files changed, 99 insertions(+) create mode 100644 actions.py create mode 100644 dejavu10x10_gs_tc.png create mode 100644 input_handlers.py create mode 100755 main.py create mode 100644 requirements.txt diff --git a/actions.py b/actions.py new file mode 100644 index 0000000..8fbce9d --- /dev/null +++ b/actions.py @@ -0,0 +1,14 @@ +class Action: + pass + + +class EscapeAction(Action): + pass + + +class MovementAction(Action): + def __init__(self, dx: int, dy: int): + super().__init__() + + self.dx = dx + self.dy = dy diff --git a/dejavu10x10_gs_tc.png b/dejavu10x10_gs_tc.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3adbe8661bf28ac1199ce662588fa4d9317162 GIT binary patch literal 8439 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 Optional[Action]: + raise SystemExit() + + def ev_keydown(self, event: tcod.event.KeyDown) -> Optional[Action]: + action: Optional[Action] = None + + key = event.sym + + if key == tcod.event.K_UP: + action = MovementAction(dx=0, dy=-1) + elif key == tcod.event.K_DOWN: + action = MovementAction(dx=0, dy=1) + elif key == tcod.event.K_LEFT: + action = MovementAction(dx=-1, dy=0) + elif key == tcod.event.K_RIGHT: + action = MovementAction(dx=1, dy=0) + + elif key == tcod.event.K_ESCAPE: + action = EscapeAction() + + # No valid key was pressed + return action diff --git a/main.py b/main.py new file mode 100755 index 0000000..ef0189e --- /dev/null +++ b/main.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +import tcod + +from actions import EscapeAction, MovementAction +from input_handlers import EventHandler + + +def main() -> None: + screen_width = 80 + screen_height = 50 + + player_x = int(screen_width / 2) + player_y = int(screen_height / 2) + + tileset = tcod.tileset.load_tilesheet( + "dejavu10x10_gs_tc.png", + 32, + 8, + tcod.tileset.CHARMAP_TCOD + ) + + event_handler = EventHandler() + + with tcod.context.new_terminal( + screen_width, + screen_height, + tileset=tileset, + title="Yet Another Roguelike Tutorial", + vsync=True, + ) as context: + root_console = tcod.Console(screen_width, screen_height, order="F") + while True: + root_console.print(x=player_x, y=player_y, string="@") + + # Actually display on the screen + context.present(root_console) + root_console.clear() + + for event in tcod.event.wait(): + action = event_handler.dispatch(event) + + if action is None: + continue + + if isinstance(action, MovementAction): + player_x += action.dx + player_y += action.dy + elif isinstance(action, EscapeAction): + raise SystemExit() + + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..dd23368 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +tcod>=11.13 +numpy>=1.18 \ No newline at end of file