Compare commits

..

7 Commits

Author SHA1 Message Date
265322f58b My bad team, this one will work for sure 2025-06-22 18:09:09 +01:00
5dbd9211de Added awaitingTimeout function (not tested, good luck team) 2025-06-22 18:00:42 +01:00
2a0def7fa6 Added NoPELib integration 2025-06-22 17:36:43 +01:00
08d6261d3f Updated version 2025-06-21 23:08:39 +01:00
95afab5431 Implemented centre() 2025-06-21 23:03:38 +01:00
d897a3744d Added documentation for createAnimObj() 2025-06-21 23:03:27 +01:00
4161ec9c5b Added timeouts 2025-06-21 23:03:11 +01:00
5 changed files with 82 additions and 11 deletions

View File

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "gameUtils"
version = "0.0.1.dev0"
version = "1.0.0"
description = "A set of utilities to make the game development process less painful (despite the organisation name) and more unified."
authors = [{ name = "Brosef" }]
dependencies = ["pygame-ce"]

View File

@ -4,3 +4,4 @@ from .anim import AnimationHandler
from .anim import AnimatedObject
from .events import AnimStart
from .events import AnimFinish
from .events import Timeout

View File

@ -1,5 +1,8 @@
from .events import Timeout
from .anim import AnimatedObject
import NoPELib
import tomllib
import time
class Game:
def __init__(self, surface):
@ -10,15 +13,24 @@ class Game:
surface (pygame.Surface): The surface the game devs draw on.
"""
self.surf = surface
self.size = self.surf.size
self.pm = None
with open('./game.toml', 'r') as f:
self.cfg = tomllib.loads(f.read())
self.surf = surface
self.size = self.surf.size
self.pm = NoPELib.PlayersManager(self.cfg['name'], playersPath='../players.json')
# Holds all the timeouts that haven't been fired yet
self._timeouts = []
def update(self):
pass
"""
Updates some core things in the background.
"""
for timeout in self._timeouts.copy():
if timeout.fireOn <= time.perf_counter():
self.onEvent(timeout)
self._timeouts.remove(timeout)
def onEvent(self, event):
pass
@ -27,4 +39,39 @@ class Game:
pass
def createAnimObj(self, *args, **kwargs):
"""
Creates an animated object.
Args:
objectID (str): The ID of the object.
baseFrame (str): The path to the base frame.
"""
return AnimatedObject(self, *args, **kwargs)
def timeout(self, id: str, delay: float):
"""
Fires a Timeout event with the specified ID
after the specified delay.
Args:
id (str): The timeout ID.
delay (float): How long (in seconds)
to wait before firing.
"""
self._timeouts.append(Timeout(id, time.perf_counter()+delay))
def awaitingTimeout(self, id: str):
"""
Tells you if a timeout ID is on the timeout stack.
Args:
id (str): The timeout ID.
Returns:
bool: True if there is a timeout with that ID
ID on the stack, False otherwise.
"""
return any([timeout.timeoutID == id for timeout in self._timeouts])

View File

@ -1,3 +1,5 @@
import time
class _event:
def __init__(self):
self.type = self.__class__
@ -19,3 +21,16 @@ class AnimFinish(_event):
def __repr__(self):
return f'<AnimFinish | {self.objectID=} | {self.animationID=}>'
class Timeout(_event):
def __init__(self, timeoutID, fireOn):
super().__init__()
# The timeout ID specified by the user
self.timeoutID = timeoutID
# When the event should be fired
self.fireOn = fireOn
# When it was created
self.created = time.perf_counter()
def __repr__(self):
return f'<Timeout | {self.timeoutID=} | {self.fireOn=} | {self.created=}>'

View File

@ -1,14 +1,22 @@
import pygame
def centre(surface: pygame.Surface, rect: tuple[int, int, int, int]) -> pygame.Surface:
def centre(surface: pygame.Surface, size: tuple[int, int]) -> pygame.Surface:
"""
Centres a surface within a given rectangle.
Args:
surface: The surface to be centred.
rect: The rectangle the surface will be centred in.
size: The size of the rectangle the surface will be centred in.
Returns:
pygame.Surface
"""
pass
surf = pygame.Surface(size)
offX = surf.size[0]//2 - surface.size[0]//2
offY = surf.size[1]//2 - surface.size[1]//2
surf.blit(surface, (offX, offY))
return surf