API reference
Every public class, method, and event in @codexo/exojs. Generated from source.
classImageLayerNode
A scene node that renders one Tiled ImageLayer as a single RepeatingSprite wrapped in a Container. The layer's pixel `offset` becomes this node's position; `parallax` is resolved per frame in _collectContent by patching the node position against the camera centre (exactly like import('./TileLayerNode').TileLayerNode), then restoring it. When `repeatX`/`repeatY` is set the wrapped sprite is grown each frame to cover the visible view with a period-aligned origin, so the pattern tiles seamlessly and scrolls with parallax. A repeat axis or a `parallax` factor other than `1` both make this node's rendered position and/or size camera-dependent at collect time, so its static bounds cannot be culled against - such a node opts out of view culling (`cullable = false`). `visible`, `opacity`, and `tintColor` are applied **once at construction**: ImageLayer is immutable, so there is nothing to re-sync per frame. A layer whose `texture` is `null` (image failed to load / not yet available) produces an empty node with no children - it occupies its offset in the scene graph but draws nothing. The node references - but never owns - the ImageLayer and its Loader-owned texture: destroy frees the wrapped sprite but leaves the layer and texture intact. Image-layer nodes are band-selectable exactly like tile-layer nodes: list the image layer in a import('./TileMapView').TileMapViewOptions.bands definition and the band stacks it by the map's combined document order, or parent an unbanded node into the scene directly wherever the image belongs in draw order. For a `repeatX`/`repeatY` node, bounds and hit-test queries reflect the coverage geometry computed by the last _collectContent call (since that geometry is recomputed per collect, not maintained incrementally), which is also why such a node force-disables `cullable`. A repeating or parallax node also re-sizes its wrapped sprite as the camera crosses period boundaries, which content-dirties an enclosing retained group the same way a streamed layer does - give it the same treatment (its own `RetainedContainer`, or none).
import { ImageLayerNode } from '@codexo/exojs-tilemap'A scene node that renders one Tiled ImageLayer as a single RepeatingSprite wrapped in a Container.
The layer's pixel `offset` becomes this node's position; `parallax` is resolved per frame in _collectContent by patching the node position against the camera centre (exactly like import('./TileLayerNode').TileLayerNode), then restoring it. When `repeatX`/`repeatY` is set the wrapped sprite is grown each frame to cover the visible view with a period-aligned origin, so the pattern tiles seamlessly and scrolls with parallax. A repeat axis or a `parallax` factor other than `1` both make this node's rendered position and/or size camera-dependent at collect time, so its static bounds cannot be culled against - such a node opts out of view culling (`cullable = false`).
`visible`, `opacity`, and `tintColor` are applied **once at construction**: ImageLayer is immutable, so there is nothing to re-sync per frame. A layer whose `texture` is `null` (image failed to load / not yet available) produces an empty node with no children - it occupies its offset in the scene graph but draws nothing.
The node references - but never owns - the ImageLayer and its Loader-owned texture: destroy frees the wrapped sprite but leaves the layer and texture intact. Image-layer nodes are band-selectable exactly like tile-layer nodes: list the image layer in a import('./TileMapView').TileMapViewOptions.bands definition and the band stacks it by the map's combined document order, or parent an unbanded node into the scene directly wherever the image belongs in draw order.
For a `repeatX`/`repeatY` node, bounds and hit-test queries reflect the coverage geometry computed by the last _collectContent call (since that geometry is recomputed per collect, not maintained incrementally), which is also why such a node force-disables `cullable`. A repeating or parallax node also re-sizes its wrapped sprite as the camera crosses period boundaries, which content-dirties an enclosing retained group the same way a streamed layer does - give it the same treatment (its own `RetainedContainer`, or none).
_onChildListChanged(): voidblur(): thisclearFilters(): thiscollect(builder: RenderPlanBuilder, seq?: number): voidcollidesWith(target: CollidableContract for objects that participate in collision detection. Implemented by all concrete shape classes as well as `SceneNode`.): CollisionResponseResult of a successful Collidable.collidesWith call. Contains the two participating shapes, the penetration depth, containment flags, and the minimum-translati… | nullcontains(x: number, y: number): booleandestroy(): voidfocus(): thisgetBounds(out?: RectangleMutable axis-aligned rectangle defined by a top-left origin `(x, y)` and dimensions `(width, height)`. Implements Collidable with full SAT collision response f…): RectangleMutable axis-aligned rectangle defined by a top-left origin `(x, y)` and dimensions `(width, height)`. Implements Collidable with full SAT collision response f…invalidateCache(): thisinvalidateContent(): thismove(x: number, y: number): thisproject(axis: VectorConcrete mutable 2D vector with full AbstractVector arithmetic and Collidable collision support (treated as a point collider). `Vector.temp` provides a shared…, result: IntervalA closed scalar interval `[min, max]` used by the SAT collision solver to represent the projection of a shape onto a separating axis. `Interval.temp` provides…): IntervalA closed scalar interval `[min, max]` used by the SAT collision solver to represent the projection of a shape onto a separating axis. `Interval.temp` provides…removeChildAt(index: number): thisremoveChildren(begin: number, end: number): thisrender(backend: RenderBackend): thisrotate(degrees: number): thissetChildIndex(child: RenderNodeSceneNode that can produce visual output. Adds the rendering pipeline features on top of the structural transform/bounds carried by SceneNode: post-process `fi…, index: number): thissetLocalBounds(x: number, y: number, width: number, height: number): thissetOrigin(x: number, y: number): thissetPosition(x: number, y: number): thissetRotation(degrees: number): thissetScale(x: number, y: number): thissetSkew(x: number, y: number): thisswapChildren(firstChild: RenderNodeSceneNode that can produce visual output. Adds the rendering pipeline features on top of the structural transform/bounds carried by SceneNode: post-process `fi…, secondChild: RenderNodeSceneNode that can produce visual output. Adds the rendering pipeline features on top of the structural transform/bounds carried by SceneNode: post-process `fi…): thisupdateBounds(): thisupdateParentTransform(): thisupdateTransform(): thiscursor: null | stringdraggable: booleanfocusable: booleanname: null | stringtabIndex: numberbottom: numbercacheAsTexture: booleancacheResolution: TargetResolutionclip: booleanclipShape: GeometryNon-renderable geometry data object used by advanced rendering paths. Geometry owns only vertex/index data and its layout metadata; it is not a scene node, has… | RectangleMutable axis-aligned rectangle defined by a top-left origin `(x, y)` and dimensions `(width, height)`. Implements Collidable with full SAT collision response f… | nullcullable: booleandestroyed: booleanheight: numberinteractive: booleanisAlignedBox: booleanleft: numberpreserveDrawOrder: booleanright: numberrotation: numberskewX: numberskewY: numbertop: numbervisible: booleanwidth: numberx: numbery: numberzIndex: numberonBlur: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[RenderNodeSceneNode that can produce visual output. Adds the rendering pipeline features on top of the structural transform/bounds carried by SceneNode: post-process `fi…]>onContextMenu: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onDrag: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onDragEnd: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onDragStart: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onFocus: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[RenderNodeSceneNode that can produce visual output. Adds the rendering pipeline features on top of the structural transform/bounds carried by SceneNode: post-process `fi…]>onKeyDown: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[KeyEventEnvelope dispatched by `app.interaction` to the focused RenderNode for keyboard input, then bubbled up its entire parent chain - same DOM-style shape as Intera…]>onKeyUp: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[KeyEventEnvelope dispatched by `app.interaction` to the focused RenderNode for keyboard input, then bubbled up its entire parent chain - same DOM-style shape as Intera…]>onPointerDown: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onPointerMove: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onPointerOut: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onPointerOver: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onPointerTap: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>onPointerUp: SignalLightweight typed event emitter. Each `Signal` represents one named notification channel (e.g. `onResize`, `onFrame`). Listeners are added with Signal.add or S…<[InteractionEventDOM-Event-shaped envelope dispatched by InteractionSystem to interactive scene nodes. Bubbles up the *entire* parent chain - `target` stays pinned to the hit-d…]>