tighogg

fighting game for the terminal
git clone https://git.ce9e.org/tighogg.git

commit
22c26011c28ac187f71e2383189bf1d75578a8a4
parent
81d65201fa0fb7669f087fc95966439b13d8a42b
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2021-05-08 08:42
use low level APIs

-	own mainloop, not just render on key
-	blitting colored strings is complicated

Diffstat

M tighogg.py 41 +++++++++++++++++++++++++++++------------

1 files changed, 29 insertions, 12 deletions


diff --git a/tighogg.py b/tighogg.py

@@ -1,3 +1,7 @@
   -1     1 import sys
   -1     2 import shutil
   -1     3 import time
   -1     4 
    1     5 import boon
    2     6 
    3     7 LEFT = 0
@@ -10,8 +14,8 @@ class Player:
   10    14     def __init__(self, x, y, direction, color):
   11    15         self.x = x
   12    16         self.y = y
   -1    17         self.direction = direction
   13    18         self.color = color
   14    -1         self.direction = LEFT
   15    19         self.running = False
   16    20         self.weapon = '-'
   17    21 
@@ -33,26 +37,30 @@ class Player:
   33    37             yield r' Λ '
   34    38 
   35    39     def render(self):
   36    -1         for line in self._render():
   37    -1             line = line.replace('w', self.weapon)
   38    -1             line = (
   -1    40         for i, line in enumerate(self._render()):
   -1    41             x = self.x - 1 + len(line) - len(line.lstrip())
   -1    42             y = self.y - 2 + i
   -1    43             boon.move(y, x)
   -1    44             sys.stdout.write(
   39    45                 boon.get_cap('setaf', self.color)
   40    46                 + boon.get_cap('bold')
   41    -1                 + line
   -1    47                 + line.strip().replace('w', self.weapon)
   42    48                 + boon.get_cap('sgr0')
   43    49             )
   44    -1             yield line
   45    50 
   46    51 
   47    -1 class Game(boon.App):
   -1    52 class Game:
   48    53     def __init__(self):
   49    -1         super().__init__()
   50    54         self.player1 = Player(10, 10, RIGHT, YELLOW)
   51    -1         self.player2 = Player(10, 10, LEFT, GREEN)
   -1    55         self.player2 = Player(20, 10, LEFT, GREEN)
   -1    56         self.running = True
   52    57 
   53    -1     def render(self, rows, cols):
   54    -1         yield from self.player1.render()
   55    -1         yield from self.player2.render()
   -1    58     def render(self):
   -1    59         cols, rows = shutil.get_terminal_size()
   -1    60         sys.stdout.write(boon.get_cap('clear'))
   -1    61         self.player1.render()
   -1    62         self.player2.render()
   -1    63         sys.stdout.flush()
   56    64 
   57    65     def on_key(self, key):
   58    66         if key == 'q':
@@ -78,6 +86,15 @@ class Game(boon.App):
   78    86         elif key == 's':
   79    87             self.player2.running = False
   80    88 
   -1    89     def run(self):
   -1    90         self.running = True
   -1    91         with boon.fullscreen():
   -1    92             while self.running:
   -1    93                 last = time.time()
   -1    94                 self.on_key(boon.getch())
   -1    95                 self.render()
   -1    96                 time.sleep(1 / 30 - (time.time() - last))
   -1    97 
   81    98 
   82    99 if __name__ == '__main__':
   83   100     game = Game()