Excalibur v0.30.0 Release
This is one of the biggest releases of Excalibur yet! Huge thanks to all the new contributors and everyone that assisted in the discord.
Special thanks @jyoung4242, @mattjennings, @cdelstad, @kamranayub, Drew Conley, and @jedeen for being constant support and help for the project and the entire community!
New Contributors
- @muhajirdev made their first contribution in #3026
- @aruru-weed made their first contribution in #3023
- @gavriguy made their first contribution in #3051
- @jellewijma made their first contribution in #3052
- @Autsider666 made their first contribution in #3094
- @robbertstevens made their first contribution in #3125
- @egodjuks made their first contribution in #3131
- @SamuelAsherRivello made their first contribution in #3174
- @mosesintech made their first contribution in #3214
- @blakearoberts made their first contribution in #3285
- @Adamduehansen made their first contribution in #3292
Features
- Added
ex.SpriteSheet.getTiledSprite(...)
to help pulling tiling sprites out of a sprite sheet - Alias the
engine.screen.drawWidth/drawHeight
withengine.screen.width/height
; - Added convenience types
ex.TiledSprite
andex.TiledAnimation
for Tiling Sprites and Animationsconst tiledGroundSprite = new ex.TiledSprite({ image: groundImage, width: game.screen.width, height: 200, wrapping: { x: ex.ImageWrapping.Repeat, y: ex.ImageWrapping.Clamp } }); const tilingAnimation = new ex.TiledAnimation({ animation: cardAnimation, sourceView: {x: 20, y: 20}, width: 200, height: 200, wrapping: ex.ImageWrapping.Repeat });
- Added new static builder for making images from canvases
ex.ImageSource.fromHtmlCanvasElement(image: HTMLCanvasElement, options?: ImageSourceOptions)
- Added GPU particle implementation for MANY MANY particles in the simulation, similar to the existing CPU particle implementation. Note
maxParticles
is new for GPU particles.var particles = new ex.GpuParticleEmitter({ pos: ex.vec(300, 500), maxParticles: 10_000, emitRate: 1000, radius: 100, emitterType: ex.EmitterType.Circle, particle: { beginColor: ex.Color.Orange, endColor: ex.Color.Purple, focus: ex.vec(0, -400), focusAccel: 1000, startSize: 100, endSize: 0, life: 3000, minSpeed: -100, maxSpeed: 100, angularVelocity: 2, randomRotation: true, transform: ex.ParticleTransform.Local } });
- Added
ex.assert()
that can be used to throw in development builds - Added
easing
option tomoveTo(...)
- Added new option bag style input to actions with durations in milliseconds instead of speed
player.actions.rotateTo({angleRadians: angle, duration: 1000, rotationType}); player.actions.moveTo({pos: ex.vec(100, 100), duration: 1000}); player.actions.scaleTo({scale: ex.vec(2, 2), duration: 1000}); player.actions.repeatForever(ctx => { ctx.curveTo({ controlPoints: [cp1, cp2, dest], duration: 5000, mode: 'uniform' }); ctx.curveTo({ controlPoints: [cp2, cp1, start1], duration: 5000, mode: 'uniform' }); });
- Added
ex.lerpAngle(startAngleRadians: number, endAngleRadians: number, rotationType: RotationType, time: number): number
in order to lerp angles between each other - Added
pointerenter
andpointerleave
events toex.TileMap
tiles! - Added
pointerenter
andpointerleave
events toex.IsometricMap
tiles! - Added new
ex.BezierCurve
type for drawing cubic bezier curves - Added 2 new actions
actor.actions.curveTo(...)
andactor.actions.curveBy(...)
- Added new
ex.lerp(...)
,ex.inverseLerp(...)
, andex.remap(...)
for numbers - Added new
ex.lerpVector(...)
,ex.inverseLerpVector(...)
, andex.remapVector(...)
forex.Vector
- Added new
actor.actions.flash(...)
Action
to flash a color for a period of time - Added a new
ex.NineSlice
Graphic
for creating arbitrarily resizable rectangular regions, useful for creating UI, backgrounds, and other resizable elements.var nineSlice = new ex.NineSlice({ width: 300, height: 100, source: inputTile, sourceConfig: { width: 64, height: 64, topMargin: 5, leftMargin: 7, bottomMargin: 5, rightMargin: 7 }, destinationConfig: { drawCenter: true, horizontalStretch: ex.NineSliceStretch.Stretch, verticalStretch: ex.NineSliceStretch.Stretch } }); actor.graphics.add(nineSlice);
- Added a method to force graphics on screen
ex.GraphicsComponent.forceOnScreen
- Added new
ex.Slide
scene transition, which can slide a screen shot of the current screen:up
,down
,left
, orright
. Optionally you can add anex.EasingFunction
, by defaultex.EasingFunctions.Linear
game.goToScene('otherScene', { destinationIn: new ex.Slide({ duration: 1000, easingFunction: ex.EasingFunctions.EaseInOutCubic, slideDirection: 'up' }) });
- Added inline SVG image support
ex.ImageSource.fromSvgString('<svg>...</svg>')
, note images produced this way still must be loaded. - Added ability to optionally specify sprite options in the
.toSprite(options:? SpriteOptions)
- The
ex.Engine
constructor had a newenableCanvasContextMenu
arg that can be used to enable the right click context menu, by default the context menu is disabled which is what most games seem to want. - Child
ex.Actor
inherits opacity of parents ex.Engine.timeScale
values of 0 are now supportedex.Trigger
now supports all valid actor constructor parameters fromex.ActorArgs
in addition toex.TriggerOptions
ex.Gif
can now handle default embedded GIF frame timings- New
ex.Screen.worldToPagePixelRatio
API that will return the ratio between excalibur pixels and the HTML pixels.- Additionally excalibur will now decorate the document root with this same value as a CSS variable
--ex-pixel-ratio
- Useful for scaling HTML UIs to match your game
.ui-container { pointer-events: none; position: absolute; transform-origin: 0 0; transform: scale( calc(var(--pixel-conversion)), calc(var(--pixel-conversion))); }
- Additionally excalibur will now decorate the document root with this same value as a CSS variable
- New updates to
ex.coroutine(...)
- New
ex.CoroutineInstance
is returned (still awaitable) - Control coroutine autostart with
ex.coroutine(function*(){...}, {autostart: false})
.start()
and.cancel()
coroutines- Nested coroutines!
- New
- Excalibur will now clean up WebGL textures that have not been drawn in a while, which improves stability for long game sessions
- If a graphic is drawn again it will be reloaded into the GPU seamlessly
- You can now query for colliders on the physics world
const scene = ...; const colliders = scene.physics.query(ex.BoundingBox.fromDimensions(...));
actor.oldGlobalPos
returns the globalPosition from the previous frame- create development builds of excalibur that bundlers can use in dev mode
- show warning in development when Entity hasn't been added to a scene after a few seconds
- New
RentalPool
type for sparse object pooling - New
ex.SparseHashGridCollisionProcessor
which is a simpler (and faster) implementation for broadphase pair generation. This works by bucketing colliders into uniform sized square buckets and using that to generate pairs. - CollisionContact can be biased toward a collider by using
contact.bias(collider)
. This adjusts the contact so that the given collider is colliderA, and is helpful if you
are doing mtv adjustments during precollision. angleBetween
medhod added to Vector class, to find the angle for which a vector needs to be rotated to match some given angle:const point = vec(100, 100) const destinationDirection = Math.PI / 4 const angleToRotate = point.angleBetween(destinationDirection, RotationType.ShortestPath) expect(point.rotate(angleToRotate).toAngle()).toEqual(destinationDirection)
Fixed
- Fixed issue where
ex.ParticleEmitter.clearParticles()
did not work - Fixed issue where the pointer
lastWorldPos
was not updated when the currentCamera
moved - Fixed issue where
cancel()
'd events still bubbled to the top level input handlers - Fixed issue where unexpected html HTML content from an image would silently hang the loader
- Fixed issue where Collision events ahd inconsistent targets, sometimes they were Colliders and sometimes they were Entities
- Fixed issue where
ex.Engine.screenshot()
images may not yet be loaded in time for use inex.Transition
s - Fixed issue where there would be an incorrect background color for 1 frame when transitioning to a new scene
- Fixed issue where
blockInput: true
on scene transition only blocked input events, not accessors likewasHeld(...)
etc. - Fixed issue where users could not easily define a custom
RendererPlugin
because the type was not exposed - Fixed issue where
ex.Fade
sometimes would not complete depending on the elapsed time - Fixed issue where
ex.PolygonColliders
would get trapped in infinite loop for degenerate polygons (< 3 vertices) - Fixed issue where certain devices that support large numbers of texture slots exhaust the maximum number of if statements (complexity) in the shader.
- Fixed issue where
ex.Label
where setting the opacity of caused a multiplicative opacity effect when actor opacity set - Fixed issue where the
ex.Loader
would have a low res logo on small configured resolution sizes - Fixed issue where
ex.Gif
was not parsing certain binary formats correctly - Fixed issue where the boot
ex.Loader
was removing pixelRatio override - Fixed
ex.RasterOptions
, it now extendsex.GraphicsOptions
which is the underlying truth - Fixed issue where rayCast
filter
would not be called in hit order - Fixed issue where rayCasts would return inconsistent orderings with the
ex.SparseHashGridCollisionProcessor
strategy - Fixed issue where CircleCollider tangent raycast did not work correctly
- Fixed issue where you were required to provide a transition if you provided a loader in the
ex.Engine.start('scene', { loader })
- Fixed issue where
ex.Scene.onPreLoad(loader: ex.DefaultLoader)
would lock up the engine if there was an empty loader - Fixed issue where
ex.Scene
scoped input events would preserve state and get stuck causing issues when switching back to the original scene. - Fixed issue where not all physical keys from the spec were present in
ex.Keys
including the reportedex.Keys.Tab
- Fixed invalid graphics types around
ex.Graphic.tint
- improve types to disallow invalid combo of collider/width/height/radius in actor args
- only add default color graphic for the respective collider used
- Fixed issue where
ex.SpriteFont
did not respect scale when measuring text - Fixed issue where negative transforms would cause collision issues because polygon winding would change.
- Fixed issue where removing and re-adding an actor would cause subsequent children added not to function properly with regards to their parent/child transforms
- Fixed issue where
ex.GraphicsSystem
would crash if a parent entity did not have aex.TransformComponent
- Fixed a bug in the new physics config merging, and re-arranged to better match the existing pattern
- Fixed a bug in
canonicalizeAngle
, don't allow the result to be 2PI, now it will be in semi-open range [0..2PI) - Removed circular dependency between
Actions
andMath
packages by movingRotationType
intoMath
package.
Changed/Updated
-
Remove units by default from parameters
-
Perf improve PolygonCollider.contains(...) perf by keeping geometry tests in local space.
-
Perf improvement to image rendering! with ImageRendererV2! Roughly doubles the performance of image rendering
-
Perf improvement to retrieving components with
ex.Entity.get()
which widely improves engine performance -
Non-breaking parameters that reference
delta
toelapsedMs
to better communicate intent and units -
Perf improvements to
ex.ParticleEmitter
- Use the same integrator as the MotionSystem in the tight loop
- Leverage object pools to increase performance and reduce allocations
-
Perf improvements to collision narrowphase and solver steps
- Working in the local polygon space as much as possible speeds things up
- Add another pair filtering condition on the
SparseHashGridCollisionProcessor
which reduces pairs passed to narrowphase - Switching to c-style loops where possible
- Caching get component calls
- Removing allocations where it makes sense
-
Perf Side.fromDirection(direction: Vector): Side - thanks @ikudrickiy!
-
Perf improvements to PointerSystem by using new spatial hash grid data structure
-
Perf improvements: Hot path allocations
- Reduce State/Transform stack hot path allocations in graphics context
- Reduce Transform allocations
- Reduce AffineMatrix allocations
-
Perf improvements to
CircleCollider
bounds calculations -
Switch from iterators to c-style loops which bring more speed
Entity
component iterationEntityManager
iterationEventEmitter
sGraphicsSystem
entity iterationPointerSystem
entity iteration
-
Perf improvements to
GraphicsGroup
by reducing per draw allocations in bounds calculations -
Applied increased TS strictness:
- Director API subtree
- Resource API subtree
- Graphics API subtree
- TileMap API subtree
Breaking Changes
ex.Engine.goto(...)
removed, useex.Engine.goToScene(...)
ex.GraphicsComponent.show(...)
removed, useex.GraphicsComponent.use(...)
ex.EventDispatcher
removed, useex.EventEmitter
instead.ex.Engine.getAntialiasing()
andex.Engine.setAntialiasing(bool)
have been removed, use the engine constructor parameter to configurenew ex.Engine({antialiasing: true})
or set on the screenengine.screen.antialiasing = true
ex.Physics.*
configuration statics removed, use the engine constructor parameter to configurenew ex.Engine({physics: ...})
ex.Input.*
namespace removed and types promoted toex.*
- Removed legacy
ex.Configurable
function type used for doing dark magic to allow types to be configured by instances of that same type 💥 - Collision events now only target
ex.Collider
types, this previously would sometimes emit anex.Entity
if you attached to theex.ColliderComponent
ex.PreCollisionEvent
ex.PostCollisionEvent
ex.ContactStartEvent
ex.ContactEndEvent
ex.CollisionPreSolveEvent
ex.CollisionPostSolveEvent
ex.CollisionStartEvent
ex.CollisionEndEvent
System.priority
is refactored to be static.ex.Timer
now only takes the option bag constructorPreDrawEvent
,PostDrawEvent
,PreTransformDrawEvent
,PostTransformDrawEvent
,PreUpdateEvent
,PostUpdateEvent
now useelapsedMs
instead ofdelta
for the elapsed milliseconds between the last frame.460696Trigger
API has been slightly changed:action
now returns the triggering entity:(entity: Entity) => void
target
now works in conjunction withfilter
instead of overwriting it.EnterTriggerEvent
andExitTriggerEvent
now contain aentity: Entity
property instead ofactor: Actor
ex.Vector.normalize()
return zero-vector ((0,0)
) instead of(0,1)
when normalizing a vector with a magnitude of 0ex.Gif
transparent color constructor arg is removed in favor of the built in Gif file mechanism- Remove core-js dependency, it is no longer necessary in modern browsers. Technically a breaking change for older browsers
ex.Particle
andex.ParticleEmitter
now have an API that looks like modern Excalibur APIsparticleSprite
is renamed tographic
particleRotationalVelocity
is renamed toangularVelocity
fadeFlag
is renamed tofade
acceleration
is renamed toacc
particleLife
is renamed tolife
minVel
is renamed tominSpeed
maxVel
is renamed tomaxSpeed
ParticleEmitter
now takes a separateparticle: ParticleConfig
parameter to disambiguate between particles parameters and emitter onesconst emitter = new ex.ParticleEmitter({ width: 10, height: 10, radius: 5, emitterType: ex.EmitterType.Rectangle, emitRate: 300, isEmitting: true, particle: { transform: ex.ParticleTransform.Global, opacity: 0.5, life: 1000, acc: ex.vec(10, 80), beginColor: ex.Color.Chartreuse, endColor: ex.Color.Magenta, startSize: 5, endSize: 100, minVel: 100, maxVel: 200, minAngle: 5.1, maxAngle: 6.2, fade: true, maxSize: 10, graphic: swordImg.toSprite(), randomRotation: true, minSize: 1 } });
Raw Changes
What's Changed
- chore: ensure consistent toEqualImage() resolution when running on hidpi displays by @mattjennings in #3018
- chore: enforce prettier and eslint by @mattjennings in #3014
- Fix url typo by @muhajirdev in #3026
- Make Entity Constructor's
components
option optional by @muhajirdev in #3027 - Fix typo in system docs by @muhajirdev in #3028
- Update Input docs by @muhajirdev in #3029
- Add actor.oldGlobalPos, deprecate getGlobalPos in favour of globalPos getter by @mattjennings in #3017
- fix: getSceneName use scenes #3022 by @aruru-weed in #3023
- feat: Implement unique action ids by @eonarheim in #3031
- Feat: provide development build for bundlers, warn on unadded entity by @mattjennings in #3032
- updated authors.yml and added mookie blog post by @jyoung4242 in #3035
- fix: [#3047] Animation glitch cause by uninitialized state by @eonarheim in #3048
- Update 00-your-first-game.mdx by @gavriguy in #3051
- Update 07-tilemap.mdx kenny.nl url changed to kenney.nl by @jellewijma in #3052
- fix: Cirular dependency on Actor by @JumpLink in #3056
- fix: [#3060] SpriteFont measureText with scale by @eonarheim in #3062
- fix: Polygon winding correct after negative transforms by @eonarheim in #3063
- pathfinding part 1 by @jyoung4242 in #3069
- Feat: z-indexes are relative to their parent by @mattjennings in #3070
- blog: added pathfinding part 2 by @jyoung4242 in #3074
- blog: update link in part 1 by @jyoung4242 in #3075
- fix: improve types to disallow invalid combo of collider args by @mattjennings in #3024
- blogpost: wfc article, modified for mdx by @jyoung4242 in #3090
- feat: Added default value to Canvas constructor by @Autsider666 in #3094
- feat: removed invalid null as value from Random.shuffle() by @Autsider666 in #3095
- feat: added getters width and height to Tilemap by @jyoung4242 in #3091
- blogpost: Cellular Automata by @jyoung4242 in #3100
- Simplified contains BoundingBox code by @Autsider666 in #3096
- doc config tweak by @jyoung4242 in #3105
- blogpost: Cellular Automata Typos by @jyoung4242 in #3108
- marketing: Print size + SVG logo by @kamranayub in #3109
- perf: Reduce allocations on the hot path by @eonarheim in #3111
- perf: Hash Grid Broadphase + Allocation Reduction by @eonarheim in #3071
- fix: getTile return type should include null by @Autsider666 in #3112
- feat: expose all actor exports by @Autsider666 in #3113
- perf: Improve narrowphase and realistic solver performance by @eonarheim in #3114
- chore: Update babel monorepo to v7.24.7 by @renovate in #3036
- chore: Update dependency @fortawesome/fontawesome-free to v6.5.2 by @renovate in #3037
- chore: Update dependency css-loader to v6.11.0 by @renovate in #3045
- chore: Update dependency @octokit/rest to v20.1.1 by @renovate in #3115
- chore: Update dependency serve to v14.2.3 by @renovate in #3040
- chore: Update storybook monorepo to v7.6.20 by @renovate in #3043
- chore: Update dependency core-js to v3.37.1 by @renovate in #3044
- Blogpost: auto tiling by @jyoung4242 in #3116
- chore: Update dependency node to v20.15.0 by @renovate in #3039
- chore: Update dependency eslint-plugin-jsdoc to v48.5.0 by @renovate in #3038
- fix: [#3119] Fix graphics type + apply strictness to Graphics types by @eonarheim in #3120
- feat: add CollisionContact.bias(collider) by @mattjennings in #3122
- Update JSDoc for System class by @robbertstevens in #3125
- fix: rewrite ClosestLine and PolygonPolygonClosestLine logic for improved accuracy on sloped polygons by @mattjennings in #3124
- refactor: Improve CPU Particles API + Perf by @eonarheim in #3118
- fix: [#3126] Fix keyboard events in scene scope by @eonarheim in #3127
- feat: WebGLTexture garbage collection by @eonarheim in #2974
- Add more common colors by @egodjuks in #3131
- chore: Upgrade docusaurus to 3.4.0 + new patch by @eonarheim in #3129
- fix: [#3128] Unused scene loader locks up engine by @eonarheim in #3133
- chore(deps-dev): bump ejs from 3.1.9 to 3.1.10 by @dependabot in #3046
- chore(deps-dev): bump braces from 3.0.2 to 3.0.3 by @dependabot in #3097
- fix: Emitter pool was created whether you used it or not by @eonarheim in #3138
- feat: Implement Collision Sub-Stepping by @eonarheim in #3136
- docs: #3132 Update all Markdown comment symbol links to {@apilink} by @Autsider666 in #3137
- feat: Flash Action by @jyoung4242 in #3142
- chore: Update dependency @types/webpack-env to v1.18.5 by @renovate in #3144
- chore: Update dependency karma to v6.4.4 by @renovate in #3145
- chore: Update dependency remark-emoji to v5.0.1 by @renovate in #3148
- chore: Update dependency rimraf to v5.0.10 by @renovate in #3149
- chore: Update dependency semver to v7.6.3 by @renovate in #3150
- chore: Update babel monorepo by @renovate in #3151
- chore: Update coverallsapp/github-action action to v2.3.0 by @renovate in #3152
- chore: Update dependency @fortawesome/fontawesome-free to v6.6.0 by @renovate in #3155
- chore: Update dependency lint-staged to v15.2.7 by @renovate in #3147
- chore: Update dependency husky to v9.1.4 by @renovate in #3158
- chore: Update dependency eslint-plugin-jsdoc to v48.11.0 by @renovate in #3156
- chore: Update dependency jasmine to v5.2.0 by @renovate in #3159
- feat: Coroutine instances by @eonarheim in #3154
- chore: Update dependency jasmine-core to v5.2.0 by @renovate in #3160
- chore: Update dependency node to v20.16.0 by @renovate in #3161
- fix: [#3167] Increase strictness in Resource types by @eonarheim in #3168
- feat: add Jetbrains .idea dir to .gitignore by @Autsider666 in #3169
- fix: Gif parsing did not work with certain formats by @eonarheim in #3173
- docs: Add limitations of SolverStrategy.Arcade by @SamuelAsherRivello in #3174
- Feat: [#3171] normalize zero vector by @Autsider666 in #3179
- Feat: [#3157] return target on trigger by @Autsider666 in #3176
- chore: Update dependency lint-staged to v15.2.9 by @renovate in #3188
- chore: Update dependency webpack to v5.94.0 [SECURITY] by @renovate in #3183
- chore: Update dependency @babel/preset-env to v7.25.4 by @renovate in #3184
- chore: Update dependency husky to v9.1.5 by @renovate in #3187
- chore: Update dependency node to v20.17.0 by @renovate in #3190
- chore: Update dependency docusaurus-plugin-typedoc-api to v4.2.1 by @renovate in #3185
- chore: Update dependency lint-staged to v15.2.10 by @renovate in #3195
- chore: Update react monorepo by @renovate in #3189
- chore: Update dependency prism-react-renderer to v2.4.0 by @renovate in #3191
- chore: Update docusaurus monorepo to v3.5.2 by @renovate in #3196
- chore: Update typescript-eslint monorepo to v7.18.0 by @renovate in #3197
- chore: Update dependency replace-in-file to v7.2.0 by @renovate in #3192
- revert "chore: Update docusaurus monorepo to v3.5.2" by @eonarheim in #3198
- fix: Rename delta to elapsedMs by @eonarheim in #3200
- On addon remove by @jyoung4242 in #3143
- feat: static System priority by @Autsider666 in #3207
- [#3213] Fix link typo in 02-conventions.mdx by @mosesintech in #3214
- fix: [#3215] Check shader complexity to avoid crash on certain hardware by @eonarheim in #3216
- chore: Update dependency babel-loader to v9.2.1 by @renovate in #3221
- chore: Update dependency @types/node to v20.16.10 by @renovate in #3217
- chore: Update dependency @types/react to v18.3.10 by @renovate in #3218
- chore: Update dependency karma-jasmine-order-reporter to v1.2.0 by @renovate in #3225
- chore: Update dependency eslint to v8.57.1 by @renovate in #3219
- chore: Update dependency husky to v9.1.6 by @renovate in #3220
- chore: Update dependency eslint-plugin-storybook to v0.9.0 by @renovate in #3222
- chore: Update dependency webpack to v5.95.0 by @renovate in #3226
- docs(events): Fuller example with pub/sub by @kamranayub in #3232
- chore: Update dependency jasmine to v5.3.0 by @renovate in #3223
- chore: Update dependency jasmine-core to v5.3.0 by @renovate in #3224
- chore: Update TimonVS/pr-labeler-action action to v5 by @renovate in #3229
- [#3236] Fix missing word typo in 06.1-actions.mdx by @mosesintech in #3237
- feat: Add alias fixed update timestep by @eonarheim in #3239
- chore(deps): bump cookie, express and socket.io by @dependabot in #3240
- chore(deps): bump cookie and express in /site by @dependabot in #3242
- chore: Update actions/stale action to v9 by @renovate in #3230
- chore: Update dependency @octokit/rest to v21 by @renovate in #3231
- feat: [#150] Implement SVG support in ImageSource with static builder by @eonarheim in #3244
- fix: [#3087]
blockInput: true
blocks input accessors by @eonarheim in #3235 - Fix Typo in Documentation: 15-tiled-plugin by @mosesintech in #3246
- feat: Add Slide Transition by @eonarheim in #3248
- chore: Update dependency mermaid to v10.9.3 [SECURITY] by @renovate in #3252
- chore(deps): bump http-proxy-middleware from 2.0.6 to 2.0.7 in /site by @dependabot in #3253
- chore(deps): bump webpack from 5.89.0 to 5.95.0 in /site by @dependabot in #3243
- fix: [#3098] Make collision events consistent targets by @eonarheim in #3238
- fix: [#3250] Stop cancelled pointer events from bubbling to the top level by @eonarheim in #3255
- feat: Nine-slice by @jyoung4242 in #3241
- chore: Update coverallsapp/github-action action to v2.3.4 by @renovate in #3256
- chore: Update dependency @types/react to v18.3.12 by @renovate in #3257
- chore: Update dependency serve to v14.2.4 by @renovate in #3258
- chore: Update dependency @mdx-js/react to v3.1.0 by @renovate in #3260
- chore: Update dependency eslint-plugin-storybook to v0.10.2 by @renovate in #3261
- chore: Update babel monorepo by @renovate in #3259
- chore: Update dependency node to v20.18.0 by @renovate in #3264
- chore: Update dependency jasmine to v5.4.0 by @renovate in #3262
- chore: Update dependency jasmine-core to v5.4.0 by @renovate in #3263
- chore: Update dependencies by @eonarheim in #3272
- chore: Update docusaurus monorepo to v3.5.2 by @renovate in #3228
- fix: [#3078] Pointer lastWorldPosition updates when the camera does by @eonarheim in #3245
- Probably a typo in explaining actor children by @isokissa in #3274
- perf: Improve ex.Entity.get(...) by @eonarheim in #3276
- docs: attempt a typedoc bump by @eonarheim in #3281
- chore(deps): bump cross-spawn from 7.0.3 to 7.0.5 in /site by @dependabot in #3279
- feat: Add ex.BezierCurve and CurveBy/CurveTo actions by @eonarheim in #3282
- Docs: Correct small typo by @isokissa in #3286
- feat: Actions with option bags and duration by @eonarheim in #3289
- [#3284] perf: reduce allocations for GraphicsGroup draw calls by @blakearoberts in #3285
- chore: update api with new deprecations by @eonarheim in #3290
- perf: Use geometry instancing in new ImageRendererV2 by @eonarheim in #3278
- perf: Improve pointer perf by keeping geometry local space by @eonarheim in #3013
- fixes broken link on screen element page. by @Adamduehansen in #3292
- chore: Update dependency @types/jasmine to v5.1.5 by @renovate in #3293
- chore: Update dependency husky to v9.1.7 by @renovate in #3295
- chore: Update dependency react-live to v4.1.8 by @renovate in #3297
- chore: Update dependency @types/node to v20.17.9 by @renovate in #3294
- chore: Update dependency mermaid to v11.4.1 by @renovate in #3296
- chore: Update dependency @fortawesome/fontawesome-free to v6.7.1 by @renovate in #3298
- chore: Update dependency eslint-plugin-storybook to v0.11.1 by @renovate in #3300
- chore: Update docusaurus monorepo to v3.6.3 by @renovate in #3304
- feat: GPU particles implementation by @eonarheim in #3212
- Revert "chore: Update docusaurus monorepo to v3.6.3" by @eonarheim in #3308
- chore(deps): bump path-to-regexp from 1.8.0 to 1.9.0 in /site by @dependabot in #3307
- chore: Update dependency @types/node to v22 by @renovate in #3305
- chore: Update dependency css-loader to v6.11.0 by @renovate in #3299
- feat: Tiling Sprites and Animations by @eonarheim in #3309
- feat: Make RotateTo+RotationType functionality more available by @isokissa in #3291
- Fix/docs typo mosesintech by @mosesintech in #3313
Full Changelog: v0.29.3...v0.30.0