Editing while playing: play runs on a runtime copy, new Game tab (Scene | Game | Graph)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
cb8885359f
commit
c3a533c4e5
14 files changed
+408
-118
No files matched your search
@@ -16,20 +16,27 @@ Live: <https://nockal.com/game-maker/> · Widget playground: <https://nockal.com
|
||||
| **Collider** | A shape (box or circle) for collision detection, placed as a **child** of the object it belongs to (its *body*). Drawn as a green outline in edit mode only. |
|
||||
| **Override** | A per-object value that replaces the asset's value for one property. Only changed keys are stored; the inspector marks them bold and offers a reset (↺). |
|
||||
| **Default** | Every property has a schema default. Asset values that differ from it are marked bold in the inspector and can be reset (↺) the same way an override can. |
|
||||
| **Edit mode** | The viewport draws the project model; panels, grid, gizmos and drag-to-move are active. |
|
||||
| **Play mode** | A `World` is instantiated from the active scene (one entity per scene object, resolved properties as mutable state). Systems tick it; nothing writes back. **Stop discards the world.** |
|
||||
| **Edit mode** | The Scene tab draws the project model; panels, grid, gizmos and drag-to-move are active. |
|
||||
| **Play mode** | The editor switches to a **runtime copy** of the project (same ids). A `World` is instantiated from its active scene (one entity per scene object, resolved properties as mutable state) and shown in the **Game** tab. Systems tick it and mirror their changes into the copy; every panel stays open and edits the copy, which the world picks up immediately. **Stop discards world and copy** – the saved model is never touched. |
|
||||
|
||||
**The camera defines what is rendered.** A camera asset has a view size (`width` × `height`,
|
||||
default 640×360) and a `zoom`; the frame it covers in world units is `size / zoom`. In edit
|
||||
mode that frame is drawn as an outline. In play mode only that frame is rendered – fitted into
|
||||
the viewport with black letterboxing – and objects outside it are culled. A scene without a
|
||||
camera renders nothing in play mode. Play has no built-in behaviour (no input, no movement):
|
||||
default 640×360) and a `zoom`; the frame it covers in world units is `size / zoom`. The Scene
|
||||
tab draws that frame as an outline. The Game tab renders only that frame – fitted into the
|
||||
view with black letterboxing – and objects outside it are culled. A scene without a camera
|
||||
renders nothing in the Game tab. Play has no built-in behaviour (no input, no movement):
|
||||
everything that happens is defined by behavior graphs.
|
||||
|
||||
**Editing while playing.** Play opens the Game tab but leaves the editor fully usable: the
|
||||
Scene tab shows the live positions (symbols, gizmos and dragging included), the hierarchy and
|
||||
inspector show and edit the running objects, the graph can be changed, undo/redo work on the
|
||||
play session's own history. All of it happens in the runtime copy: values a behavior changes
|
||||
appear as overrides (bold, ↺ resets to the asset value), objects a graph destroys vanish from
|
||||
the lists, and Esc/Stop brings back exactly what was saved. Autosave pauses while playing.
|
||||
|
||||
## Behaviors (node graphs)
|
||||
|
||||
A behavior asset holds a Blueprint-style graph edited in the **Graph** tab of the centre
|
||||
area (the **Scene** tab shows the viewport). Ports come in two kinds: **exec** (white
|
||||
area (the **Scene** tab shows the editable scene, the **Game** tab the running game). Ports come in two kinds: **exec** (white
|
||||
arrows, control flow) and **data** (coloured circles; `number`, `boolean`, `string`,
|
||||
`object`, `any`). Event nodes start a pulse; the interpreter follows exec edges and pulls
|
||||
data inputs lazily from connected outputs. Unconnected data inputs use the inline value
|
||||
@@ -59,7 +66,7 @@ shown on the node and editable in the inspector.
|
||||
the empty canvas pans. Everything is undoable.
|
||||
- **Selection-bound**: the Graph tab shows the behavior the current selection refers to
|
||||
(asset, placed object or node); with nothing or a non-behavior selected it is empty.
|
||||
- **Live view**: Play always switches to the Scene tab; switch back to Graph while playing and
|
||||
- **Live view**: Play always switches to the Game tab; switch to Graph while playing and
|
||||
the exec edges and nodes that just ran light up – the same canvas draws editor and game, so
|
||||
this costs nothing extra.
|
||||
- **Runtime**: `BehaviorSystem` creates one `GraphInterpreter` per behavior entity; graphs only
|
||||
@@ -132,7 +139,7 @@ src/core/ model, property schema, resolve, commands, store – no Pixi
|
||||
src/core/graph/ graph model, node registry + built-in nodes, interpreter (headless, unit-tested)
|
||||
src/runtime/ World, Entity, System interface, Input tracker, CollisionSystem, BehaviorSystem
|
||||
src/ui/ widget toolkit (generic, knows nothing about assets)
|
||||
src/viewport/ scene renderer: model in edit mode, world in play mode
|
||||
src/viewport/ scene renderer: Scene tab (model, editable) and Game tab (world through its camera)
|
||||
src/editor/ App composition, state, panels, inspector field factory
|
||||
src/editor/graph/ GraphEditor (canvas), NodeView, NodePalette
|
||||
api/ PHP backend data/projects/ persisted projects
|
||||
|
||||
Reference in new issue
Block a user