summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Gayot <olivier.gayot@sigexec.com>2020-12-24 20:51:02 +0100
committerOlivier Gayot <olivier.gayot@sigexec.com>2020-12-24 21:04:29 +0100
commit70b86bc8ae2b6a5f74e492870f020d63bdc2631f (patch)
treeb9e8c5be7d07cbc6384e280dd92f0ec42f23b570
parentc6fb0ab91ceae3e83651d53dde7e3c02fc3e2a85 (diff)
Cleanly handle the inputs
Signed-off-by: Olivier Gayot <olivier.gayot@sigexec.com>
-rwxr-xr-xcameltris.py80
1 files changed, 53 insertions, 27 deletions
diff --git a/cameltris.py b/cameltris.py
index b850685..2c82aa9 100755
--- a/cameltris.py
+++ b/cameltris.py
@@ -3,6 +3,7 @@
import argparse
import contextlib
import enum
+from functools import partial
import random
import sys
import time
@@ -16,6 +17,10 @@ class WouldCollide(Exception):
pass
+class PlayerQuit(Exception):
+ pass
+
+
class Piece():
def __init__(self):
self.square = square_template.copy()
@@ -324,10 +329,37 @@ class Player:
def rotate_piece_clockwise(self):
self.current_piece.rotate_clockwise()
- if has_collision(self.current_piece_position[0], self.current_piece_position[1]):
+ if self.has_collision(self.current_piece_position[0], self.current_piece_position[1]):
self.current_piece.rotate_counter_clockwise()
raise WouldCollide()
+ def handle_input_pressed(self, event):
+ if self.controller.get_input_down(event) == Input.QUIT:
+ raise PlayerQuit()
+
+ with contextlib.suppress(WouldCollide):
+ if self.controller.get_input_down(event) == Input.MOVE_RIGHT:
+ self.move_piece_right()
+ self.das = 0
+ if self.controller.get_input_down(event) == Input.MOVE_LEFT:
+ self.move_piece_left()
+ self.das = 0
+ if self.controller.get_input_down(event) == Input.ROTATE_CLOCKWISE:
+ self.rotate_piece_clockwise()
+ if self.controller.get_input_down(event) == Input.ROTATE_COUNTER_CLOCKWISE:
+ self.rotate_piece_counter_clockwise()
+ if self.controller.get_input_down(event) == Input.MOVE_DOWN:
+ self.piece_drop_frames = 0
+ self.pressing_down_countdown = 3
+ try:
+ self.move_piece_down()
+ except WouldCollide:
+ self.stick_piece()
+
+ def handle_input_released(self, event):
+ if self.controller.get_input_up(event) == Input.MOVE_DOWN:
+ self.pressing_down_countdown = None
+
PARSER = argparse.ArgumentParser()
@@ -379,37 +411,31 @@ frames_per_gridcell = [48, 43, 38, 33, 28, 23, 18, 13, 8, 6, 5, 5, 5, 4, 4, 4, 3
clock = pygame.time.Clock()
+def handle_input_pressed(instance, event):
+ if not isinstance(player.controller, instance):
+ return
+
+ player.handle_input_pressed(event)
+
+def handle_input_released(instance, event):
+ if not isinstance(player.controller, instance):
+ return
+
+ player.handle_input_released(event)
+
+event_handler = dict()
+event_handler[pygame.QUIT] = lambda _: sys.exit()
+event_handler[pygame.KEYDOWN] = partial(handle_input_pressed, KeyboardController)
+event_handler[pygame.KEYUP] = partial(handle_input_released, KeyboardController)
+event_handler[pygame.JOYBUTTONDOWN] = partial(handle_input_pressed, JoystickController)
+event_handler[pygame.JOYBUTTONUP] = partial(handle_input_released, JoystickController)
while True:
player.piece_drop_frames += 1
for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- elif event.type == controller.downevent:
- if controller.get_input_down(event) == Input.QUIT:
- sys.exit()
- with contextlib.suppress(WouldCollide):
- if controller.get_input_down(event) == Input.MOVE_RIGHT:
- player.move_piece_right()
- player.das = 0
- if controller.get_input_down(event) == Input.MOVE_LEFT:
- player.move_piece_left()
- player.das = 0
- if controller.get_input_down(event) == Input.ROTATE_CLOCKWISE:
- player.rotate_piece_clockwise()
- if controller.get_input_down(event) == Input.ROTATE_COUNTER_CLOCKWISE:
- player.rotate_piece_counter_clockwise()
- if controller.get_input_down(event) == Input.MOVE_DOWN:
- player.piece_drop_frames = 0
- player.pressing_down_countdown = 3
- try:
- player.move_piece_down()
- except WouldCollide:
- player.stick_piece()
- elif event.type == controller.upevent:
- if controller.get_input_up(event) == Input.MOVE_DOWN:
- player.pressing_down_countdown = None
+ with contextlib.suppress(KeyError):
+ event_handler[event.type](event)
player.das += 1
if player.das == 16: