proejct commit

This commit is contained in:
2026-09-24 15:45:31 +02:00
commit 82d52be8a5
63 changed files with 8748 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
"""Hilfsfunktionen, um die Anwendung headless per Event zu bedienen.
Die Tests posten echte pygame-Events in die Event-Queue und rufen dann
:meth:`sandbox.main.App.frame` auf – genau wie die Hauptschleife. So wird die komplette
Kette Event → Sidebar/InputHandler → Werkzeuge → Physik → Zeichnen durchlaufen.
"""
import pygame
from sandbox.main import App
from sandbox.physics import Vector2
#: Dauer eines Test-Frames (60 Bilder/s → je zwei Physikschritte).
FRAME = 1 / 60
def screen_pos(app: App, x: float, y: float) -> tuple[int, int]:
"""Bildschirmposition eines Weltpunkts (auf ganze Pixel gerundet)."""
sx, sy = app.viewport.to_screen(Vector2(x, y))
return (round(sx), round(sy))
def frames(app: App, count: int = 1) -> None:
"""Lässt die Anwendung einige Frames laufen."""
for _ in range(count):
app.frame(FRAME)
def post(event_type: int, **attributes: object) -> None:
"""Legt ein Event in die pygame-Queue."""
pygame.event.post(pygame.event.Event(event_type, **attributes))
def press(app: App, pos: tuple[int, int], button: int = pygame.BUTTON_LEFT) -> None:
"""Maustaste an ``pos`` drücken (ein Frame)."""
post(pygame.MOUSEBUTTONDOWN, pos=pos, button=button)
frames(app)
def move(app: App, pos: tuple[int, int]) -> None:
"""Maus nach ``pos`` bewegen (ein Frame)."""
post(pygame.MOUSEMOTION, pos=pos, rel=(0, 0), buttons=(1, 0, 0))
frames(app)
def release(app: App, pos: tuple[int, int], button: int = pygame.BUTTON_LEFT) -> None:
"""Maustaste an ``pos`` loslassen (ein Frame)."""
post(pygame.MOUSEBUTTONUP, pos=pos, button=button)
frames(app)
def click(app: App, pos: tuple[int, int], button: int = pygame.BUTTON_LEFT) -> None:
"""Klick (Drücken und Loslassen) an ``pos``."""
press(app, pos, button)
release(app, pos, button)
def key(app: App, name: str) -> None:
"""Taste drücken (Name wie in ``pygame.key.key_code``)."""
post(pygame.KEYDOWN, key=pygame.key.key_code(name), mod=0, unicode="", scancode=0)
frames(app)
def wheel(app: App, pos: tuple[int, int], steps: int) -> None:
"""Mausrad über ``pos`` drehen."""
move(app, pos)
post(pygame.MOUSEWHEEL, x=0, y=steps, flipped=False)
frames(app)