Files
2026-09-24 15:45:31 +02:00

69 lines
2.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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)