proejct commit
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user