mirror of
https://git.davidovski.xyz/tkinter-space-game.git
synced 2024-08-15 00:43:41 +00:00
127 lines
3.8 KiB
Python
127 lines
3.8 KiB
Python
from config import Config
|
|
from game import Game
|
|
|
|
|
|
class BossKey():
|
|
"""Object which manages the 'boss key' feature
|
|
When a key is pressed, then the screen switches to a "work"
|
|
related image
|
|
"""
|
|
|
|
FG = "#ffaa00"
|
|
BG = "#aaaaaa"
|
|
BG2 = "#ffffff"
|
|
FG2 = "#555555"
|
|
TEXT_SIZE = 30
|
|
|
|
def __init__(self, game: Game, pause_callback) -> None:
|
|
"""Initialises the boss key feature
|
|
|
|
:param game: The game which to use
|
|
:type game: Game
|
|
:param pause_callback: The function to call to pause the game
|
|
:rtype: None
|
|
"""
|
|
self.game = game
|
|
self.canvas = game.canvas
|
|
self.width, self.height = game.w * Config.SCALE, game.h * Config.SCALE
|
|
self.shapes = []
|
|
self.game.inputs.add_keypress_handler(self.on_key)
|
|
self.hidden = True
|
|
self.pause_callback = pause_callback
|
|
|
|
def on_key(self, event):
|
|
"""Handle key press events
|
|
|
|
:param event: The key press event
|
|
"""
|
|
if event.keysym == self.game.inputs.settings.boss \
|
|
and self.hidden:
|
|
self.pause_callback()
|
|
self.create_shapes()
|
|
self.hidden = False
|
|
return True
|
|
|
|
if not self.hidden:
|
|
self.delete_shapes()
|
|
self.hidden = True
|
|
return True
|
|
|
|
return False
|
|
|
|
def create_rectangle(self, x, y, w, h, color):
|
|
"""Create a rectangle object
|
|
|
|
:param x: x coordinate
|
|
:param y: y coordinate
|
|
:param w: width
|
|
:param h: height
|
|
:param color: The colour of the rectangle
|
|
"""
|
|
self.shapes.append(self.canvas.create_rectangle(
|
|
x, y, x+w, y+h, fill=color, state="disabled"))
|
|
|
|
def write_text(self, x, y, text):
|
|
"""Create a text object
|
|
|
|
:param x: x coordiante
|
|
:param y: y coordinate
|
|
:param text: The text used for this label
|
|
"""
|
|
self.shapes.append(self.canvas.create_text(
|
|
x, y, text=text, fill=BossKey.BG2,
|
|
font=(f"Helvetica {BossKey.TEXT_SIZE} bold"), state="disabled"))
|
|
|
|
def create_shapes(self):
|
|
"""Create all the shapes needed for the calculator"""
|
|
width = self.width
|
|
height = self.height
|
|
padding = width // 50
|
|
|
|
num_rows = 5
|
|
num_cols = 4
|
|
|
|
grid_width = width // num_cols
|
|
grid_height = height // (num_rows+1)
|
|
|
|
self.create_rectangle(0, 0, width, height, BossKey.BG)
|
|
self.create_rectangle(padding,
|
|
padding,
|
|
width - padding*2,
|
|
grid_height-padding*2,
|
|
BossKey.FG2)
|
|
|
|
symbols = [
|
|
"(", ")", "%", "AC",
|
|
"7", "8", "9", "/",
|
|
"4", "5", "6", "x",
|
|
"1", "2", "3", "-",
|
|
"0", ".", "=", "+"
|
|
]
|
|
for row in range(num_rows):
|
|
for col in range(num_cols):
|
|
color = BossKey.FG2
|
|
if row == 0 or col == num_cols - 1:
|
|
color = BossKey.FG
|
|
x = col*grid_width+padding
|
|
y = row*grid_height+padding+grid_height
|
|
w = grid_width-padding*2
|
|
h = grid_height-padding*2
|
|
self.create_rectangle(x, y, w, h, color)
|
|
|
|
offset_x = x + padding + (
|
|
grid_width
|
|
- padding*2
|
|
- BossKey.TEXT_SIZE) // 2
|
|
|
|
offset_y = y + padding + (
|
|
grid_height-padding * 2
|
|
- BossKey.TEXT_SIZE) // 2
|
|
|
|
symbol = symbols[col + row*num_cols]
|
|
self.write_text(offset_x, offset_y, symbol)
|
|
|
|
def delete_shapes(self):
|
|
"""Remove all the shapes used for the calculator"""
|
|
for shape in self.shapes:
|
|
self.canvas.delete(shape)
|