Browse Source

Refactor key handling and add keybindings configuration for game actions

master
Matteo Benedetto 4 months ago
parent
commit
1269913275
  1. 4
      conf/keybinding_game.json
  2. 19
      conf/keybindings.yaml
  3. 36
      engine/controls.py
  4. 26
      engine/sdl2.py
  5. 11
      rats.py
  6. 3
      requirements.txt

4
conf/keybinding_game.json

@ -1,10 +1,10 @@
{ {
"new_rat": ["Return", 13], "new_rat": [["keyup", "Return"], ["keydown", "Return"]],
"kill_rat": ["D"], "kill_rat": ["D"],
"toggle_audio": ["M"], "toggle_audio": ["M"],
"toggle_full_screen": ["F"], "toggle_full_screen": ["F"],
"scroll_up": ["Up", 8], "scroll_up": [["keydown", "Up"], ["keydown", "Up"]],
"scroll_down": ["Down", 9], "scroll_down": ["Down", 9],
"scroll_left": ["Left", 10], "scroll_left": ["Left", 10],
"scroll_right": ["Right", 11], "scroll_right": ["Right", 11],

19
conf/keybindings.yaml

@ -0,0 +1,19 @@
keybinding_game:
keydown_Return: spawn_rat
keydown_D: kill_rat
keydown_M: toggle_audio
keydown_F: toggle_full_screen
keydown_Up: start_scrolling|Up
keydown_Down: start_scrolling|Down
keydown_Left: start_scrolling|Left
keydown_Right: start_scrolling|Right
keyup_Up: stop_scrolling
keyup_Down: stop_scrolling
keyup_Left: stop_scrolling
keyup_Right: stop_scrolling
keydown_Space: spawn_new_bomb
keydown_N: spawn_nuclear_bomb
keybinding_start_menu:
keydown_Return: reset_game
keydown_Escape: quit_game

36
engine/controls.py

@ -2,9 +2,38 @@
# The key_pressed method is called when a key is pressed, and it contains the logic for handling different key presses. # The key_pressed method is called when a key is pressed, and it contains the logic for handling different key presses.
import random import random
import yaml
# read yaml config file
bindings = {}
with open("conf/keybindings.yaml", "r") as f:
bindings = yaml.safe_load(f)
class KeyBindings: class KeyBindings:
def trigger(self, action):
print(f"Triggering action: {action}")
# Check if the action is in the bindings
if action in bindings[f"keybinding_{self.game_status}"]:
value = bindings[f"keybinding_{self.game_status}"][action]
# Call the corresponding method
if value:
print(f"Calling method: {value}")
if "|" in value:
method_name, *args = value.split("|")
method = getattr(self, method_name)
method(*args)
else:
getattr(self, value)()
else:
print(f"Action {action} not found in keybindings for {self.game_status}")
return
print(f"Action {action} not found in keybindings for {self.game_status}")
return None
def key_pressed(self, key, coords=None): def key_pressed(self, key, coords=None):
if key != "mouse":
key = [key, coords]
print(f"Key pressed: {key}")
keybindings = self.configs[f"keybinding_{self.game_status}"] keybindings = self.configs[f"keybinding_{self.game_status}"]
if key in keybindings.get("quit", []): if key in keybindings.get("quit", []):
self.render_engine.close() self.render_engine.close()
@ -46,12 +75,11 @@ class KeyBindings:
self.points = 0 self.points = 0
self.start_game() self.start_game()
def spawn_new_bomb(self):
self.spawn_bomb(self.pointer)
def quit_game(self): def quit_game(self):
self.render_engine.close() self.render_engine.close()
def key_released(self, key):
if key in ["Up", "Down", "Left", "Right", 8, 9, 10, 11]:
self.stop_scrolling()
def start_scrolling(self, direction): def start_scrolling(self, direction):
self.scrolling_direction = direction self.scrolling_direction = direction
if not self.scrolling: if not self.scrolling:

26
engine/sdl2.py

@ -68,7 +68,7 @@ class GameWindow:
self.white_flash_opacity = 255 self.white_flash_opacity = 255
# Input handling # Input handling
self.key_down, self.key_up, self.axis_scroll = key_callback self.trigger = key_callback
self.button_cursor = [0, 0] self.button_cursor = [0, 0]
self.buttons = {} self.buttons = {}
@ -379,27 +379,29 @@ class GameWindow:
for event in events: for event in events:
if event.type == sdl2.SDL_QUIT: if event.type == sdl2.SDL_QUIT:
self.running = False self.running = False
elif event.type == sdl2.SDL_KEYDOWN and self.key_down: elif event.type == sdl2.SDL_KEYDOWN:
# print in file keycode # print in file keycode
keycode = event.key.keysym.sym keycode = event.key.keysym.sym
open("keycode.txt", "a").write(f"{keycode}\n")
key = sdl2.SDL_GetKeyName(event.key.keysym.sym).decode('utf-8') key = sdl2.SDL_GetKeyName(event.key.keysym.sym).decode('utf-8')
# Check for Right Ctrl key to trigger white flash # Check for Right Ctrl key to trigger white flash
if event.key.keysym.sym == sdl2.SDLK_RCTRL: self.trigger(f"keydown_{key}")
self.trigger_white_flash() elif event.type == sdl2.SDL_KEYUP:
else:
self.key_down(key)
elif event.type == sdl2.SDL_KEYUP and self.key_up:
key = sdl2.SDL_GetKeyName(event.key.keysym.sym).decode('utf-8') key = sdl2.SDL_GetKeyName(event.key.keysym.sym).decode('utf-8')
self.key_up(key) self.trigger(f"keyup_{key}")
elif event.type == sdl2.SDL_MOUSEMOTION: elif event.type == sdl2.SDL_MOUSEMOTION:
self.key_down("mouse", coords=(event.motion.x, event.motion.y)) self.trigger(f"mousemove_{event.motion.x}, {event.motion.y}")
elif event.type == sdl2.SDL_JOYBUTTONDOWN: elif event.type == sdl2.SDL_JOYBUTTONDOWN:
key = event.jbutton.button key = event.jbutton.button
self.key_down(key) self.trigger(f"joybuttondown_{key}")
elif event.type == sdl2.SDL_JOYBUTTONUP: elif event.type == sdl2.SDL_JOYBUTTONUP:
key = event.jbutton.button key = event.jbutton.button
self.key_up(key) self.trigger(f"joybuttonup_{key}")
elif event.type == sdl2.SDL_JOYHATMOTION:
hat = event.jhat.hat
value = event.jhat.value
self.trigger(f"joyhatmotion_{hat}_{value}")
# Present the rendered frame # Present the rendered frame
self.renderer.present() self.renderer.present()

11
rats.py

@ -22,7 +22,7 @@ class MiceMaze(
self.full_screen = False self.full_screen = False
self.render_engine = engine.GameWindow(self.map.width, self.map.height, self.render_engine = engine.GameWindow(self.map.width, self.map.height,
self.cell_size, "Mice!", self.cell_size, "Mice!",
key_callback=(self.key_pressed, self.key_released, self.axis_scroll)) key_callback=self.trigger)
self.load_assets() self.load_assets()
self.render_engine.window.show() self.render_engine.window.show()
self.pointer = (random.randint(1, self.map.width-2), random.randint(1, self.map.height-2)) self.pointer = (random.randint(1, self.map.width-2), random.randint(1, self.map.height-2))
@ -68,6 +68,15 @@ class MiceMaze(
self.background_texture = None self.background_texture = None
for _ in range(5): for _ in range(5):
self.spawn_rat() self.spawn_rat()
def reset_game(self):
self.pause = False
self.game_status = "game"
self.game_end = (False, None)
self.units.clear()
self.points = 0
self.start_game()
# ==================== GAME LOGIC ==================== # ==================== GAME LOGIC ====================

3
requirements.txt

@ -1,2 +1,3 @@
pysdl2 pysdl2
Pillow Pillow
pyaml
Loading…
Cancel
Save