Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Sep 27, 2025

This PR contains the following updates:

Package Change Age Confidence
excalibur 0.30.3 -> 0.32.0 age confidence

Release Notes

excaliburjs/Excalibur (excalibur)

v0.32.0

Compare Source

Breaking Changes
  • Behavior change: Realistic physics bodies can now sleep by default canSleepByDefault
  • Behavior change: The sleepBias default is lowered to 0.5 from .9
  • Behavior change: Bodies do not sleep until all bodies in an Island are low motion for at least sleepTimeThreshold, default 1000ms
  • Debug: Improve body related information output in the debug draw
Deprecated
  • Legacy EasingFunctions.* are deprecated in favor of the simpler forms
  • Legacy ex.BoundingBox.draw(..) is deprecated, use ex.BoundBox.debug(...)
Added
  • Added new contact ex.Island physics optimization, excalibur physics bodies will now wake or sleep the entire connected graph of bodies,
    this only works in the Realistic solver, but it's a huge perf win.

  • Added new ex.angleDifference(angle1, angle2) for calculating differences between angles in [0, 2Pi)

  • Added new debug stats to the frame to measure ECS system durations in milliseconds

      const stats: Record<string, number> = engine.stats.currFrame.systemDuration;
      // "update:CollisionSystem.update" -> .50
  • Added new parameter to ex.Sounds to schedule start time, this allows you to synchronize playback of multiple audio tracks

    const start500MsFromNow = AudioContextFactory.currentTime() + 500;
    
    Resources.MusicSurface.play({ volume: .5, scheduledStartTime: start500MsFromNow });
    // Start layered tracks at 0 volume so they are synchronized
    Resources.MusicIndDrums.play({ volume: 0, scheduledStartTime: start500MsFromNow });
    Resources.MusicIndTopper.play({ volume: 0, scheduledStartTime: start500MsFromNow });
    Resources.MusicGroovyDrums.play({ volume: 0, scheduledStartTime: start500MsFromNow });
    Resources.MusicGroovyTopper.play({ volume: 0, scheduledStartTime: start500MsFromNow });
  • Added new Timer events!

    const timer = new ex.Timer({...});
    timer.events.on('complete', () => {...}); // after the last repeat
    timer.events.on('action', () => {...}); // every fire of the timer
    timer.events.on('start', () => {...}); // after the timer is started
    timer.events.on('stop', () => {...}); // after the timer is stopped 
    timer.events.on('pause', () => {...}); // after every pause
    timer.events.on('resume', () => {...}); // after every resume
    timer.events.on('cancel', () => {...}); // after cancel
    
    // or specify the onComplete in the constructor
    const timer2 = new ex.Timer({
        onComplete: () => {...},
        ...
    });
  • Added a way to configure general debug settings on text

    class DebugConfig { 
      ...
        public settings = {
          text: {
            foreground: Color.Black,
            background: Color.Transparent,
            border: Color.Transparent
          },
          z: {
            text:  Number.POSITIVE_INFINITY,
            point: Number.MAX_SAFE_INTEGER - 1,
            ray:   Number.MAX_SAFE_INTEGER - 1,
            dashed:Number.MAX_SAFE_INTEGER - 2,
            solid: Number.MAX_SAFE_INTEGER - 3
          }
        }
      ...
    }
  • Added foreground and background color to ex.DebugText

  • Added a convenience parameter to set the initial graphics or material in an Actor

    const cloudSprite = cloud.toSprite();
    const swirlMaterial = game.graphicsContext.createMaterial({
      name: 'swirl',
      fragmentSource
    });
    const actor = new ex.Actor({
        graphic: cloudSprite,
        material: swirlMaterial
    });
  • Simpler easing functions of the form (currentTime: number) => number instead of the 4 parameter legacy ones

  • Support for disabling integration for all offscreen entities, or on a per entity basis

    // for all entities
    const game = new ex.Engine({
        physics: {
          integration: {
            // defaults to false
            onScreenOnly: true
          },
      });
    
    // per entity (only if engine is off)
    const actor = new ex.Actor(...);
    actor.get(MotionComponent).integration.onScreenOnly = true;
  • DX: Support for Visual Studio Code Dev Containers for an out-of-the-box contribution dev environment

  • DX: Support for Vitest UI for browser testing

Fixed
  • Fixed possible perf issue in canonicalizeAngle if a large angle was provided it could take a long time
  • Fixed issue where physics bodies did not sleep under certain situations, especially when gravity was high.
  • Fixed issue where Animation fromSpriteSheet was ignoring repeated sprite sheet indices
  • Fixed issue where setting the width/height of a ScreenElement was incorrectly scaled when supplied with a scale in the ctor
  • Fixed issue where onRemove would sometimes not be called
  • Fixed issue where pointer containment WAS NOT being uses on collision shape geometry, only their bounds
  • Fixed issue where overriding built in uniforms and graphics no longer worked as v0.30.x
  • Fixed issue where clearSchedule during a scheduled callback could cause a cb to be skipped
  • Fixed issue where specifying custom events was difficult in TypeScript switched from export type ...Events { to export interface ...Events { which allows declaration merging by user game code to specify custom events
  • Fixed issue where the Loader could run twice even if already loaded when included in the scene loader.
  • Fixed issue where pixel ratio was accidentally doubled during load if the loader was included in the scene loader.
  • Fixed issue where Slide trasition did not work properly when DisplayMode was FitScreenAndFill
  • Fixed issue where not(tags) and not(component) queries weren't updating in the querymanager
  • Fixed Tilemap/Isometric map pointer performance on moderate to large maps, we changed the strategy to only consider tiles under the pointer instead of try to do sorted dispatch on NxM tiles.
  • Fixed issue that caused coroutines to not automatically discover the engine scheduler when inside an async lifecycle sometimes. This is because of the stack replacement issue of async/await the context reverts too soon.
  • Fixed issue actor kill event was triggered twice
Updates
  • Perf improvement in debug draw mode
  • When overriding a built-in uniform/graphic there is now a warning in dev excalibur builds
  • Camera zoom and move now support new easing functions form
  • MoveTo/MoveBy actions now support new easing function form
  • Transitions now support new easing functions form
  • Deps: Upgraded to Playwright 1.55.1
  • Tests: Split test suite into unit and visual tests
Changed
  • Debug Text Font is switched to the more legible monogram

v0.31.0

Compare Source

Breaking Changes
Deprecated
Added
  • Added new ex.Camera.setStrategies() and ex.Camera.strategies for additional control of strategy order
  • Fixed ex.Font measureText always using 10px sans-serif on the first call on some browsers
  • Added a new ex.Sound({...}) option back constructor to set all the same props available on sound
  • Added a new ex.SoundManager type for managing groups of audio/sound effects/music volume in an easier way
const soundManager = new ex.SoundManger({
  channels: ['fx', 'music', 'background'],
  sounds: {
    jumpSnd: { sound: jumpSnd, volume: 0.4, channels: ['fx'] },
    forestSnd: { sound: forestSnd, volume: 0.2, channels: ['music', 'background'] },
    challengeMusic: { sound: challengeMusic, volume: 0.2, channels: ['music'] },
    guitarLoop: { sound: guitarLoop, volume: 0.2, channels: ['music'] }
  }
});

// play a specific sound
soundManager.play('jumpSnd');

// mute a specific channel with all member sounds
soundManager.channel.mute('music');

// mute all sound
soundManager.mute();
// unmute all sound that was previously muted, and resume playing from the current location
soundManager.unmute();

// unmute a specific channel that was muted
soundManager.channel.unmute('music');

// play a specific channel
soundManager.channel.play('music');

// set the max volume of an entire channel
soundManager.channel.setVolume('music', 0.9);
  • Added ex.Animation.data to store arbitrary meta data for an animation. Data can be directly added in the constructor as an option, by using the optional data argument in fromSpriteSheet(...) and as an option in fromSpriteSheetCoordinates({...})
  • Added a new configuration option to ex.Engine({global: ...}) where you can provide a keyboard global to override if iframe detection fails for anyway.
  • Added new way to output data from scenes onDeactivate(), returning data will be passed to the next SceneActivationContext in the previousSceneData property!
  • Added new transitionstart and transitionend events to ex.Scenes
  • Pipe navigation* events to ex.Engine
  • Added ability to use ex.Vector to specify offset and margin in SpriteSheet.fromImageSource({..})
  • New PostProcessor.onDraw() hook to handle uploading textures
  • Adds contact solve bias to RealisticSolver, this allows customization on which direction contacts are solved first. By default there is no bias set to 'none'.
  • Queries can now take additional options to filter in/out by components or tags.
const query = new Query({
  // all fields are optional
  components: {
    all: [ComponentA, ComponentB] as const, // important for type safety!
    any: [ComponentC, ComponentD] as const, // important for type safety!
    not: [ComponentE]
  },
  tags: {
    all: ['tagA', 'tagB'],
    any: ['tagC', 'tagD'],
    not: ['tagE']
  }
})

// previous constructor type still works and is shorthand for components.all
new Query([ComponentA, ComponentB] as const)
  • Queries can now match all entities by specifying no filters
const query = new Query({})
  • Adds maxVel attribute to MotionComponent, which clamps velocity on separated X and Y axes
  • Add Clock.clearSchedule(id) and have Clock.schedule return an ID so you can clear a scheduled callback before it fires
Fixed
  • Fixed issue where ParticleEmitter Particle did not receive z index value from emitter when in World space
  • Fixed issue where an animation that was anim.reset() inside of an animation event handler like anim.once('end', () => anim.reset()) would not work correctly
  • Fixed issue where GpuParticleEmitter did not rotate with their parents
  • Fixed issue where Cpu ParticleEmitter did not respect ParticleTransform.Local
  • Fixed issue where same origin iframes did not work properly with keyboard & pointer events
  • Fixed issue where the initial scene onPreLoad was not being run
  • Fixed unecessary coupling with ex.ColliderComponent/ex.BodyComponent that prevented collider tracking on entities that have ex.TransformComponent/ex.ColliderComponent, this influenced users doing Entity level ECS with pointer events.
  • Fixed issue where passing 0 to ex.Sound.play(0) would not set the volume to 0, instead the previous volume would play.
  • Fixed issue where the Actor.color did not respect being set
  • Fixed offscreen culling issue when using parallax on TileMaps
  • Fixed division by 0 when timescale is 0 in actions
  • Fixed onTransition on the initial scene transition
  • Fixed ex.TriggerOptions type to all optional parameters
  • Fixed issue where the ActorArgs type hint would not error when providing a color causing confusion when it didn't produce a default graphic.
  • Fixed false positive warning when adding timers
  • Fixed issue where gamepad buttons wouldn't progress the default loader play button
  • Add defense around middling Safari fullscreen support and update documentation
  • Fixed issue where non-standard gamepad buttons would not be emitted by Excalibur
    • Added an additional param to the ex.GamepadButtonEvent indexto disabiguate between ex.Buttons.Unknown
  • Fixed issue where Realistic solver would not sort contacts by distance causing some artifacts on seams
  • Fixed issue with CompositeCollider where large TileMaps would sometimes causes odd collision behavior in the Realistic Solver when the body & collider components are far apart in a TileMap.
  • Fixed crash on Xiaomi Redmi Phones by lazy loading the GPU particle renderer, GPU particles still do not work on these phones
  • Add warning if World.add() falls through! This is caused by multiple versions of Excalibur usually
  • Fixed CollidePolygonPolygon crash with some defense against invalid separation
  • Fixed issue with PostProcessor where it would not run correctly if no actors present
  • Removed warning in development for unadded entities
  • Fixed memory leaks from retained entities in Map<Entity>
Updates
Changed
  • Updated ex.Camera.addStrategy() to accept multiple strategies
  • Changed the behavior of fromSpriteSheet(...), fromSpriteSheetCoordinates({...}) and clone() of ex.Animation to return the subclass if called from there
  • Optimized BoundingBox.rayCast and BoundingBox.rayCastTime
  • Optimized BoundingBox.intersect(otherBoundingBox)
  • Change logging behavior for entities not in scenes, only log in dev builds

Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot force-pushed the renovate/excalibur-0.x branch from 72737cf to be659e6 Compare December 23, 2025 17:49
@renovate renovate bot changed the title chore: Update dependency excalibur to v0.31.0 chore: Update dependency excalibur to v0.32.0 Dec 23, 2025
@renovate renovate bot changed the title chore: Update dependency excalibur to v0.32.0 chore: Update dependency excalibur to v0.32.0 - autoclosed Dec 23, 2025
@renovate renovate bot closed this Dec 23, 2025
@renovate renovate bot deleted the renovate/excalibur-0.x branch December 23, 2025 21:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant