69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
"""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)
|