Game interface
A HUD is a view of game state, not a source of it. Render it from the current state each frame or on each transition; never store gameplay truth in the DOM or a UI element.
Choose the UI layer
- Build the interface in the natural UI layer for the surface — a DOM or React overlay, or the
Engine
screenandelementUI — decided with thebuild-appskill. Keep it outside gameplay model hierarchies, asassemble-scenerequires. - For a screen-space Engine UI, adapt a user-interface example with
find-examplesrather than guessing element anchoring, scaling, and font handling.
Drive from state
- Map each overlay to a game state and each indicator to a snapshot field. A transition shows or
hides overlays; it does not duplicate the state the game already owns (see
manage-game-state). - An indicator that is idle most of the time toggles
enabledwith its visibility; an element left drawing at opacity 0 still costs a draw call every frame (seereduce-draw-calls). - Anchor and scale elements to the viewport so the layout holds at the target resolution and on resize. Verify at the acceptance resolution, not the default window size.
- Keep copy minimal and legible over the scene: back text with a plate or shadow where the frame is
bright, and unify interface colour with the scene's grade from
light-scene.
Prove it reflects state
Drive real input through every transition and confirm with screenshots that the correct overlay shows and each indicator tracks the snapshot — a reload meter empties and refills, a timer advances, a menu appears only in its state. A saved filepath or a visibility flag is not visual evidence; inspect the returned pixels as the local agent guide requires.
Choose the authoring surface with the build-app skill and build the interface through its own UI
primitives before reaching into the Engine.