Folge-Issue aus #302 (Antwort 2 im Kommentar vom 2026-10-03): Die Mausposition soll sich durch eine bestimmte Kamera umrechnen lassen, nicht nur durch die Hauptkamera.
Befund
Die Laufzeit rechnet den Mauszeiger über eine Kamera in die Welt um (world.pointer). Seit #302 ist das die Hauptkamera, also die erste eingeschaltete ohne Overlay.
Davon lesen Mouse position (x, y, inside) und Is hovered (Treffertest an dieser Stelle).
Eine Overlay-Kamera aus #302 kann woanders stehen und anders zoomen. Ein Knopf im UI, den nur sie zeigt, liegt dann in der Welt an einer ganz anderen Stelle als der Mauszeiger der Hauptkamera. Is hovered trifft ihn deshalb nicht, obwohl die Maus sichtbar darüber steht.
Zu bauen (Vorschlag)
Eingang camera (Objekt) an Mouse position und Is hovered. Offen bleibt alles wie heute: Es rechnet die Hauptkamera.
Mit einer Kamera am Eingang wird der Bildschirmpunkt durch deren Bild umgerechnet. Das ist das Bild, das #302 auf die Fläche der Hauptkamera legt (Fit).
inside heißt dann: Die Maus liegt auf dem Bild dieser Kamera.
Eine ausgeschaltete Kamera am Eingang liefert inside = false, so wie heute ohne aktive Kamera.
Beweis beim Schließen
Hauptkamera bei (0, 0), Overlay-Kamera bei (1000, 0) mit Zoom 2: Dieselbe Mausstelle ergibt über beide Kameras die erwarteten zwei Weltpunkte.
Ein Sprite auf UI, das nur die Overlay-Kamera zeigt: Is hovered mit dieser Kamera am Eingang wird wahr, sobald die Maus darüber steht. Ohne Kamera am Eingang bleibt es falsch.
Offen (mit Vorschlag)
Soll Is hovered die Kamera selbst finden? Gemeint ist: die Kamera, die den Render-Layer des Objekts sieht. Vorschlag: nein. Sehen mehrere Kameras denselben Layer, wäre das nicht eindeutig, und ein offener Eingang soll wie heute bleiben.
Klicks durch Overlay-Kameras:Mouse button bleibt, wie es ist, weil eine Taste keine Stelle hat. Vorschlag: nichts ändern.
Folge-Issue aus #302 (Antwort 2 im Kommentar vom 2026-10-03): Die Mausposition soll sich durch eine bestimmte Kamera umrechnen lassen, nicht nur durch die Hauptkamera.
## Befund
- Die Laufzeit rechnet den Mauszeiger über **eine** Kamera in die Welt um (`world.pointer`). Seit #302 ist das die Hauptkamera, also die erste eingeschaltete ohne `Overlay`.
- Davon lesen `Mouse position` (x, y, inside) und `Is hovered` (Treffertest an dieser Stelle).
- Eine Overlay-Kamera aus #302 kann woanders stehen und anders zoomen. Ein Knopf im UI, den nur sie zeigt, liegt dann in der Welt an einer ganz anderen Stelle als der Mauszeiger der Hauptkamera. `Is hovered` trifft ihn deshalb nicht, obwohl die Maus sichtbar darüber steht.
## Zu bauen (Vorschlag)
- Eingang **`camera`** (Objekt) an `Mouse position` und `Is hovered`. Offen bleibt alles wie heute: Es rechnet die Hauptkamera.
- Mit einer Kamera am Eingang wird der Bildschirmpunkt durch deren Bild umgerechnet. Das ist das Bild, das #302 auf die Fläche der Hauptkamera legt (Fit).
- `inside` heißt dann: Die Maus liegt auf dem Bild dieser Kamera.
- Eine ausgeschaltete Kamera am Eingang liefert `inside` = false, so wie heute ohne aktive Kamera.
## Beweis beim Schließen
- Hauptkamera bei (0, 0), Overlay-Kamera bei (1000, 0) mit Zoom 2: Dieselbe Mausstelle ergibt über beide Kameras die erwarteten zwei Weltpunkte.
- Ein Sprite auf `UI`, das nur die Overlay-Kamera zeigt: `Is hovered` mit dieser Kamera am Eingang wird wahr, sobald die Maus darüber steht. Ohne Kamera am Eingang bleibt es falsch.
## Offen (mit Vorschlag)
1. **Soll `Is hovered` die Kamera selbst finden?** Gemeint ist: die Kamera, die den Render-Layer des Objekts sieht. Vorschlag: nein. Sehen mehrere Kameras denselben Layer, wäre das nicht eindeutig, und ein offener Eingang soll wie heute bleiben.
2. **Klicks durch Overlay-Kameras:** `Mouse button` bleibt, wie es ist, weil eine Taste keine Stelle hat. Vorschlag: nichts ändern.
admin
added this to the Development project 2026-10-03 15:21:55 +02:00
Eingang camera an Mouse position und Is hovered. Offen gelassen rechnet weiter die Hauptkamera, genau wie bisher.
Mit einer Kamera am Eingang wird der Mauszeiger durch das Bild dieser Kamera umgerechnet, so wie #302 es auf das Hauptbild legt (eingepasst, zentriert). Die Regel steht als reine Funktion in pointerThrough (src/core/properties/camera.ts).
in view (Mouse position) heißt dann: Die Maus liegt auf dem Bild dieser Kamera.
Eine Kamera, die nicht gezeichnet wird, liefert in view = false. Das gilt für eine ausgeschaltete Kamera, für eine zweite Kamera ohne Overlay und für ein Objekt, das gar keine Kamera ist.
Deine zwei offenen Punkte sind wie vorgeschlagen umgesetzt: Is hovered sucht sich keine Kamera selbst, und Mouse button (auch On click) bleibt bei der Hauptkamera.
Was ich selbst festgelegt habe
Die Ansicht meldet zusätzlich, wo die Maus im Hauptbild liegt, als Anteil von dessen Breite und Höhe. Die Laufzeit rechnet daraus für jede Kamera um.
Grund: world.pointer wird nur bei Mausereignissen neu berechnet. Hätte ich „Zeiger minus aktuelle Hauptkamera“ gerechnet, wäre die Maus bei laufender Hauptkamera über das HUD gewandert, obwohl sie still steht.
Der Unit-Test prüft genau das: Die Hauptkamera rückt um 500 weiter, der Punkt durch das Overlay bleibt (1050, 25).
Beweis
Zwei Weltpunkte: Hauptkamera bei (0, 0), Overlay bei (1000, 0) mit Zoom 2. Dieselbe Mausstelle ergibt (100, 50) durch die Hauptkamera und (1050, 25) durch das Overlay (Unit-Test).
Gleich mit dem Bild: An vier Bildschirmpunkten und für zwei Kameras landet die Regel auf demselben Weltpunkt wie overlayView + screenToWorld, also wie das gezeichnete Bild. Eine davon ist schmaler als das Hauptbild, damit fällt auch der Rand daneben richtig.
Im Browser (e2e 63c2): Overlay mit Zoom 2, echte Maus 30 Einheiten rechts der Bildmitte. Das Log zeigt true (Is hovered durch das Overlay auf dem grünen Sprite), false (ohne Kamera) und x = 2015 (Overlay auf 2000, plus 15).
Gegenproben greifen:
Math.max statt Math.min in der Regel lässt den Bild-Vergleich fallen.
Ohne die Prüfung „wird gezeichnet“ fällt der Test mit der ausgeschalteten und der zweiten normalen Kamera.
Meldet die Ansicht immer die Bildmitte, fällt 63c2 mit x = 2000 statt 2015.
Nebenbei
1d0fa7b (Zoom bis 20×) hatte einen Unit-Test kaputt gemacht.play-settings.test.ts erwartete, dass 8 keine Stufe ist. Er prüft jetzt 20 als oberste Stufe und 21 als ungültig. Den Fehler habe ich damals nicht gesehen, weil ich nur view.test.ts und e2e 60 gefahren habe.
Behaviors, Abschnitt Mouse: der Eingang camera, in view, und wie man einen HUD-Knopf klickt.
Concepts: Verweis statt „#304 is about asking another“, dazu die Messung aus Schritt 63.
Architecture: gamePointer und pointerThrough.
Development: Summe 1730.
Erledigt mit 70f3608.
## Was gebaut ist
- **Eingang `camera`** an `Mouse position` und `Is hovered`. Offen gelassen rechnet weiter die Hauptkamera, genau wie bisher.
- **Mit einer Kamera am Eingang** wird der Mauszeiger durch das Bild dieser Kamera umgerechnet, so wie #302 es auf das Hauptbild legt (eingepasst, zentriert). Die Regel steht als reine Funktion in `pointerThrough` (`src/core/properties/camera.ts`).
- **`in view`** (`Mouse position`) heißt dann: Die Maus liegt auf dem Bild dieser Kamera.
- **Eine Kamera, die nicht gezeichnet wird**, liefert `in view` = false. Das gilt für eine ausgeschaltete Kamera, für eine zweite Kamera ohne *Overlay* und für ein Objekt, das gar keine Kamera ist.
- **Deine zwei offenen Punkte** sind wie vorgeschlagen umgesetzt: `Is hovered` sucht sich keine Kamera selbst, und `Mouse button` (auch `On click`) bleibt bei der Hauptkamera.
## Was ich selbst festgelegt habe
- **Die Ansicht meldet zusätzlich, wo die Maus im Hauptbild liegt**, als Anteil von dessen Breite und Höhe. Die Laufzeit rechnet daraus für jede Kamera um.
- Grund: `world.pointer` wird nur bei Mausereignissen neu berechnet. Hätte ich „Zeiger minus aktuelle Hauptkamera“ gerechnet, wäre die Maus bei laufender Hauptkamera über das HUD gewandert, obwohl sie still steht.
- Der Unit-Test prüft genau das: Die Hauptkamera rückt um 500 weiter, der Punkt durch das Overlay bleibt (1050, 25).
## Beweis
- **Zwei Weltpunkte:** Hauptkamera bei (0, 0), Overlay bei (1000, 0) mit Zoom 2. Dieselbe Mausstelle ergibt (100, 50) durch die Hauptkamera und (1050, 25) durch das Overlay (Unit-Test).
- **Gleich mit dem Bild:** An vier Bildschirmpunkten und für zwei Kameras landet die Regel auf demselben Weltpunkt wie `overlayView` + `screenToWorld`, also wie das gezeichnete Bild. Eine davon ist schmaler als das Hauptbild, damit fällt auch der Rand daneben richtig.
- **Im Browser (e2e 63c2):** Overlay mit Zoom 2, echte Maus 30 Einheiten rechts der Bildmitte. Das Log zeigt `true` (`Is hovered` durch das Overlay auf dem grünen Sprite), `false` (ohne Kamera) und x = 2015 (Overlay auf 2000, plus 15).
- **Gegenproben greifen:**
- `Math.max` statt `Math.min` in der Regel lässt den Bild-Vergleich fallen.
- Ohne die Prüfung „wird gezeichnet“ fällt der Test mit der ausgeschalteten und der zweiten normalen Kamera.
- Meldet die Ansicht immer die Bildmitte, fällt 63c2 mit x = 2000 statt 2015.
## Nebenbei
- **`1d0fa7b` (Zoom bis 20×) hatte einen Unit-Test kaputt gemacht.** `play-settings.test.ts` erwartete, dass 8 keine Stufe ist. Er prüft jetzt 20 als oberste Stufe und 21 als ungültig. Den Fehler habe ich damals nicht gesehen, weil ich nur `view.test.ts` und e2e 60 gefahren habe.
## Tests (auf `melektaus-atx`)
```
Gate → 231 Files, 3526 Tests, CHECK EXIT 0 (+6)
e2e 63 → ALL PASSED – 12 checks (+1, Summe 1730)
```
## Doku
Wiki bfbab14:
- *Behaviors*, Abschnitt *Mouse*: der Eingang `camera`, `in view`, und wie man einen HUD-Knopf klickt.
- *Concepts*: Verweis statt „#304 is about asking another“, dazu die Messung aus Schritt 63.
- *Architecture*: `gamePointer` und `pointerThrough`.
- *Development*: Summe 1730.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Folge-Issue aus #302 (Antwort 2 im Kommentar vom 2026-10-03): Die Mausposition soll sich durch eine bestimmte Kamera umrechnen lassen, nicht nur durch die Hauptkamera.
Befund
world.pointer). Seit #302 ist das die Hauptkamera, also die erste eingeschaltete ohneOverlay.Mouse position(x, y, inside) undIs hovered(Treffertest an dieser Stelle).Is hoveredtrifft ihn deshalb nicht, obwohl die Maus sichtbar darüber steht.Zu bauen (Vorschlag)
camera(Objekt) anMouse positionundIs hovered. Offen bleibt alles wie heute: Es rechnet die Hauptkamera.insideheißt dann: Die Maus liegt auf dem Bild dieser Kamera.inside= false, so wie heute ohne aktive Kamera.Beweis beim Schließen
UI, das nur die Overlay-Kamera zeigt:Is hoveredmit dieser Kamera am Eingang wird wahr, sobald die Maus darüber steht. Ohne Kamera am Eingang bleibt es falsch.Offen (mit Vorschlag)
Is hovereddie Kamera selbst finden? Gemeint ist: die Kamera, die den Render-Layer des Objekts sieht. Vorschlag: nein. Sehen mehrere Kameras denselben Layer, wäre das nicht eindeutig, und ein offener Eingang soll wie heute bleiben.Mouse buttonbleibt, wie es ist, weil eine Taste keine Stelle hat. Vorschlag: nichts ändern.vorschläge passen denke ich
Erledigt mit
70f3608.Was gebaut ist
cameraanMouse positionundIs hovered. Offen gelassen rechnet weiter die Hauptkamera, genau wie bisher.pointerThrough(src/core/properties/camera.ts).in view(Mouse position) heißt dann: Die Maus liegt auf dem Bild dieser Kamera.in view= false. Das gilt für eine ausgeschaltete Kamera, für eine zweite Kamera ohne Overlay und für ein Objekt, das gar keine Kamera ist.Is hoveredsucht sich keine Kamera selbst, undMouse button(auchOn click) bleibt bei der Hauptkamera.Was ich selbst festgelegt habe
world.pointerwird nur bei Mausereignissen neu berechnet. Hätte ich „Zeiger minus aktuelle Hauptkamera“ gerechnet, wäre die Maus bei laufender Hauptkamera über das HUD gewandert, obwohl sie still steht.Beweis
overlayView+screenToWorld, also wie das gezeichnete Bild. Eine davon ist schmaler als das Hauptbild, damit fällt auch der Rand daneben richtig.true(Is hovereddurch das Overlay auf dem grünen Sprite),false(ohne Kamera) und x = 2015 (Overlay auf 2000, plus 15).Math.maxstattMath.minin der Regel lässt den Bild-Vergleich fallen.Nebenbei
1d0fa7b(Zoom bis 20×) hatte einen Unit-Test kaputt gemacht.play-settings.test.tserwartete, dass 8 keine Stufe ist. Er prüft jetzt 20 als oberste Stufe und 21 als ungültig. Den Fehler habe ich damals nicht gesehen, weil ich nurview.test.tsund e2e 60 gefahren habe.Tests (auf
melektaus-atx)Doku
Wiki bfbab14:
camera,in view, und wie man einen HUD-Knopf klickt.gamePointerundpointerThrough.