Refactor key handling and add keybindings configuration for game actions
This commit is contained in:
@@ -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],
|
||||||
|
|||||||
@@ -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
|
||||||
+32
-4
@@ -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:
|
||||||
|
|||||||
+14
-12
@@ -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()
|
||||||
|
|||||||
@@ -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 ====================
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -1,2 +1,3 @@
|
|||||||
pysdl2
|
pysdl2
|
||||||
Pillow
|
Pillow
|
||||||
|
pyaml
|
||||||
Reference in New Issue
Block a user