Did some bullshit to make popups "work"

This commit is contained in:
2025-06-24 14:36:17 +01:00
parent 40b00a71dc
commit 60cabb227c
2 changed files with 46 additions and 9 deletions

View File

@ -2,9 +2,11 @@ import tomllib
import time import time
import NoPELib import NoPELib
import pygame
from .events import Timeout from .events import Timeout
from .anim import AnimatedObject from .anim import AnimatedObject
from .utils import centre
class Game: class Game:
def __init__(self, surface): def __init__(self, surface):
@ -18,8 +20,17 @@ class Game:
with open('./game.toml', 'r') as f: with open('./game.toml', 'r') as f:
self.cfg = tomllib.loads(f.read()) self.cfg = tomllib.loads(f.read())
self.surf = surface # The surface that gets drawn by the launcher.
# Contains the game surface, and overlays.
self._surf = surface
# The games serface
self.surf = pygame.Surface(self._surf.size)
self.size = self.surf.size self.size = self.surf.size
# Pre-render semi-transparent black surface
self._dimSurf = pygame.Surface(self._surf.size)
self._dimSurf.set_alpha(128)
pygame.draw.rect(self._dimSurf, (50, 50, 50), (0, 0, self.size[0], self.size[1]))
self.pm = NoPELib.PlayersManager(self.cfg['name'], playersPath='../players.json') self.pm = NoPELib.PlayersManager(self.cfg['name'], playersPath='../players.json')
# Holds all the timeouts that haven't been fired yet # Holds all the timeouts that haven't been fired yet
self._timeouts = [] self._timeouts = []
@ -50,7 +61,14 @@ class Game:
if not self._haltUpdate: if not self._haltUpdate:
self.update() self.update()
# TODO: Draw things like debug menu, etc. # Draw the game surface onto the main surface
self._surf.blit(self.surf, (0, 0))
# If there's a popup
if self._popupMenu is not None:
# Dim the screen
self._surf.blit(self._dimSurf, (0, 0))
self._surf.blit(centre(self._popupMenu, self.size), (0, 0))
def onEvent(self, event): def onEvent(self, event):
""" """
@ -66,6 +84,12 @@ class Game:
if not self._haltEvents: if not self._haltEvents:
self.onEvent(event) self.onEvent(event)
if event.type == pygame.KEYDOWN and self._popupMenu is not None:
if event.key == 13 and event.mod & 0b10000000: # R-CTRL + ENTER
self._popupMenu = None
self._haltUpdate = False
self._haltEvents = False
def close(self): def close(self):
""" """
Intended to be overridden by the game developer. Intended to be overridden by the game developer.
@ -110,23 +134,37 @@ class Game:
return any(timeout.timeoutID == timeoutID for timeout in self._timeouts) return any(timeout.timeoutID == timeoutID for timeout in self._timeouts)
def popup(self, title: str, text: str, haltUpdate: bool=False, haltEvents: bool=True): def popup(self, title: str, message: str, haltUpdate: bool=False, haltEvents: bool=True):
""" """
Pops up a dialogue box. Pops up a dialogue box.
Args: Args:
title (str): The big "title" text to be displayed. title (str): The big "title" text to be displayed.
text (str): The main body text to be displayed. message (str): The main body text to be displayed.
haltUpdate (bool): If True, the games update() method will not be called until haltUpdate (bool): If True, the games update() method will not be called until
the popup is dismissed. Default: False. the popup is dismissed. Default: False.
haltEvents (bool): If True, the games onEvent() method will not be called until haltEvents (bool): If True, the games onEvent() method will not be called until
the popup is dismissed. Default: True. the popup is dismissed. Default: True.
""" """
POPUP_MARGINS = 10
FONT_BIG = pygame.font.SysFont('', 50)
FONT_NORM = pygame.font.SysFont('', 32)
titleSurf = FONT_BIG.render(title, True, (128, 128, 128))
messageSurf = FONT_NORM.render(message, True, (128, 128, 128))
w = max(titleSurf.get_width(), messageSurf.get_width())
w += POPUP_MARGINS*2
h = titleSurf.get_height() + messageSurf.get_height()
h += POPUP_MARGINS*3
self._haltUpdate = haltUpdate self._haltUpdate = haltUpdate
self._haltEvents = haltEvents self._haltEvents = haltEvents
self._popupMenu = pygame.Surface((w, h))
self._popupMenu.fill((0, 0, 0))
self._popupMenu.blit(centre(titleSurf, (w, titleSurf.get_height())), (0, POPUP_MARGINS))
self._popupMenu.blit(centre(messageSurf, (w, messageSurf.get_height())), (0, titleSurf.get_height()+POPUP_MARGINS*2))
def punish(self, player, intensity: float): def punish(self, player, intensity: float):
""" """

View File

@ -12,11 +12,10 @@ def centre(surface: pygame.Surface, size: tuple[int, int]) -> pygame.Surface:
pygame.Surface pygame.Surface
""" """
surf = pygame.Surface(size) surf = pygame.Surface(size, pygame.SRCALPHA, 32)
offX = surf.size[0]//2 - surface.size[0]//2 offX = surf.size[0]//2 - surface.size[0]//2
offY = surf.size[1]//2 - surface.size[1]//2 offY = surf.size[1]//2 - surface.size[1]//2
surf.blit(surface, (offX, offY)) surf.blit(surface, (offX, offY))
return surf return surf