Skip to content

Releases: excaliburjs/Excalibur

Excalibur v0.28.4 Release

22 Dec 03:52
Compare
Choose a tag to compare

excalibur logo

Another small release! A few bug fixes and some enhancements to materials!

water-material.mp4

Materials

2 new uniforms

  • u_screen_texture - This is the texture of the screen right before the material draw call
  • u_time_ms - This is the milliseconds since page navigation (performance.now() under the hood)

2 new attribute/varyings

  • a_screenuv - The vertex attribute corresponding to the screen uv relative to the current graphic
  • v_screenuv - The fragment varying corresponding to the screen uv relative to the current graphic

Finally there is a new convenience api for updating shader values in materials. .update(shader => {...})

  game.input.pointers.primary.on('move', evt => {
    heartActor.pos = evt.worldPos;
    swirlMaterial.update(shader => {
      shader.trySetUniformFloatVector('iMouse', evt.worldPos);
    });
  });

What's Changed

Full Changelog: v0.28.3...v0.28.4

Excalibur v0.28.3 Release

12 Dec 15:10
Compare
Choose a tag to compare

excalibur logo

Small release, fixed a couple bugs!

  • Materials were crashing Excalibur if you tried to render different ones at once
  • Raycasting against collision groups wasn't working as expected!

What's Changed

Full Changelog: v0.28.2...v0.28.3

Excalibur v0.28.2 Release

02 Dec 02:40
Compare
Choose a tag to compare

excalibur logo

This was mostly a bug fix release, lots of small fixes! No breaking changes. Notably there are some performance improvements to TileMap by utilizing a QuadTree to help offscreen culling.

Fixes & Features

Dependencies

Dependency

  • chore: Update dependency @babel/core to v7.22.11 by @renovate in #2746
  • chore: Update dependency @fortawesome/fontawesome-free to v6.4.2 by @renovate in #2747
  • chore: Update dependency jasmine-core to v5.1.1 by @renovate in #2749
  • chore: Update dependency serve to v14.2.1 by @renovate in #2751
  • chore: Update dependency node to v18.17.1 by @renovate in #2750
  • chore: Update dependency core-js to v3.32.1 by @renovate in #2748
  • chore: Update dependency eslint to v8.48.0 by @renovate in #2752
  • chore: Update dependency @types/node to v18.17.13 by @renovate in #2760
  • chore: Update dependency eslint-config-prettier to v8.10.0 by @renovate in #2753
  • chore: Update dependency eslint-plugin-jsdoc to v46.5.1 by @renovate in #2754
  • chore: Update coverallsapp/github-action action to v2.2.3 by @renovate in #2777
  • chore: Update dependency @types/jasmine to v4.3.6 by @renovate in #2778
  • chore: Update dependency @types/react-color to v3.0.7 by @renovate in #2779
  • chore: Update dependency @types/webpack-env to v1.18.2 by @renovate in #2780
  • chore: Update dependency core-js to v3.32.2 by @renovate in #2781
  • chore: Update dependency @babel/core to v7.23.0 by @renovate in #2782
  • chore: Update dependency eslint to v8.50.0 by @renovate in #2783
  • chore: Update dependency core-js to v3.33.0 by @renovate in #2786
  • chore: Update dependency eslint-plugin-jsdoc to v46.8.2 by @renovate in #2784
  • chore: Update dependency node to v18.18.0 by @renovate in #2785
  • [chore] Upgrade typescript by @eonarheim in #2798
  • chore: Update dependency @types/webpack-env to v1.18.4 by @renovate in #2797
  • chore: Update dependency @babel/core to v7.23.3 by @renovate in #2795
  • chore: Update dependency @types/react-color to v3.0.10 by @renovate in #2796
  • chore: Update dependency @babel/core to v7.23.5 by @renovate in #2813
  • chore: Update dependency core-js to v3.33.3 by @renovate in #2814
  • chore: Update dependency @types/jasmine to v4.6.4 by @renovate in #2817
  • chore: Update dependency @fortawesome/fontawesome-free to v6.5.1 by @renovate in #2816
  • chore: Update dependency ts-loader to v9.5.1 by @renovate in #2821
  • chore: Update dependency node to v18.19.0 by @renovate in #2820
  • chore: Update dependency eslint to v8.54.0 by @renovate in #2818
  • chore: Update dependency eslint-plugin-jsdoc to v46.9.0 by @renovate in #2819
  • chore: Update dependency rimraf to v5 by @renovate in #2757
  • chore(deps-dev): bump browserify-sign from 4.2.1 to 4.2.2 by @dependabot in #2794
  • chore: Update dependency typescript to v5.3.2 by @renovate in #2823
  • chore: Update dependency eslint-config-prettier to v9 by @renovate in #2755
  • chore: Update dependency replace-in-file to v7 by @renovate in #2724
  • chore: Update dependency webpack to v5.89.0 by @renovate in #2824
  • chore: Update actions/checkout action to v4 by @renovate in #2828
  • chore: Update typescript-eslint monorepo to v6.13.1 by @renovate in #2827
  • chore: Update actions/setup-node action to v4 by @renovate in #2829
  • chore: Update dependency @types/jasmine to v5 by @renovate in #2830
  • chore: Update dependency webpack-cli to v5 by @renovate in #2832
  • chore: Update dependency @types/node to v18.19.1 by @renovate in #2833

New Contributors

Full Changelog: v0.28.0...v0.28.2

Excalibur v0.28.0 Release

11 Aug 01:36
Compare
Choose a tag to compare

image

This was a big release! We have a ton of new features and a lot of bugfixes that came out of the community!

🎥 Watch the video!

Added Features!

Plugin Updates!

  • Tiled Plugin - Object layers are included by default, bug fixes, Tile properties, and Tile by point/coord
  • Aseprite Plugin - Native .aseprite file support!

New Samples

Fixes

New Contributors

Contributors (Sorry if I missed you! Send me a note and I'll fix it)

We cannot stress how pleased and grateful we are for all the assistance in the issues, PRs, discussion, samples, templates, plugins, and everything else! Y'all are the nicest bunch on the internet!

Dependencies

Dependency updates

Read more

Excalibur v0.27.0 Release

09 Jul 01:19
Compare
Choose a tag to compare

image

This was a big release! We have a ton of new features and a lot of bugfixes that came out of the community!

🎥 Watch the video!

See migration guide for v0.26.x -> v0.27.0

Added Features!

New Samples

Template/Plugin Updates

Performance Improvements

  • perf: Adjust TileMap to avoid perf hit on big maps
  • perf: Refactor Transform & AffineMatrix + related perf improvements by @eonarheim in #2346
  • perf: Improve collision system performance by @eonarheim in #2351

Fixes

Dependency updates

Contributors

  • @malitherl - Congratulations on their first code contribution in #2317
  • @mattjennings - Congratulations on their first contribution in #2377
  • @ewal - Thank you for posting about basic patterns in discussions and really digging into the mysterious tsserver issue!
  • @salsa2k - Thank you for actor moving, pathfinding, and image loading discussions
  • @SimponGoril - Thank you for sharing the Crab based puzzle game! #2360
  • @pdrhlik - Thank you for helping with a tile collider issue with edges in the discussions
  • @Joshua-Beatty - Thank you for creating a new Capacitorjs plugin for safe area awareness on mobile! #2349
  • @KokoDoko - Thank you for the issue for physics bounciness/degrees of freedom & the discussion around esm and type information
  • @mattjennings - So many contributions!
    • Thank you for creating a new meta-framework called Merlin that works with Vite and Excalibur to remove resource loading friction! #2342
    • Thank you for the cool scene transition samples
    • Thank you for the opening the Arcade physics issues #2344 #2343
    • Thank you for ray casting discussion!
    • Thank you for the vscode eslint fix
    • Thank you for spotting the docs linking issue
    • Thanks for the contributions to Scene activation
  • @HxShard - Many thanks!
    • Thank you for opening the Image.decode() issue that affected chrome!
    • Thank you for the fix for Tiled custom properties
    • Thank you for the fix for Tiled TiledMapResource#getSpriteForGid inconsitency
  • @ilnicki - Thank you for opening the issue around the event dispatcher!
  • @EzraMoore65 - Thank you for the issue around sound playback!
  • @chrisk-7777 - Many valuable updates to the docs, dev-tool dynamic scene issue, and a great parallel actions discussion!
  • @lecoqjacob - Grid based movement discussion
  • @ttay24 - Great discussion about fullscreen, html based UI, and Tiled plugin contribution
  • @kgish - Great discussion about Excalibur's future and tragectory
  • @ivanjermakov - Thank you for the CollisionType issue around the docs being incorrect and spotting another issue when physics is disabled
  • @YunlongYang - Thank you for debugging the webpack template with us
  • @tenpaMk2 - Thank you for more examples!
  • @divinitas-art - Thank you for the cool shadows post, ex.Canvas discussion, and bug find!
  • If I missed your name for anything let me know and I'll ammend the release notes!

Full Changelog: v0.26.0...v0.27.0

Excalibur v0.26.0 Release

21 May 00:49
Compare
Choose a tag to compare

image

This was a big release! We have a ton of new features and a lot of improvements to performance especially around Firefox

See migration guide for v0.25.x -> v0.26.0

Added Features!

  • feat: Add arbitrary non-convex polygon support by @eonarheim in #2239

    • Added arbitrary non-convex polygon support (only non-self intersecting) with ex.PolygonCollider(...).triangulate() which builds a new ex.CompositeCollider composed of triangles.

      triangulation

  • feat: Fast BoundingBox overlap and transform by @eonarheim in #2241

  • perf: Add zIndexChanged$ + Improve pointer system perf by @eonarheim in #2242

  • feat: Implement IsometricMap & refactor TileMap with some perf boosts by @eonarheim in #2254

    • ex.TileMap now supports per Tile custom colliders!

      custom-colliders

      const tileMap = new ex.TileMap(...);
      const tile = tileMap.getTile(0, 0);
      tile.solid = true;
      tile.addCollider(...); // add your custom collider!
    • New ex.IsometricMap for drawing isometric grids! (They also support custom colliders via the same mechanism as ex.TileMap)

      isometic-tiled

      new ex.IsometricMap({
          pos: ex.vec(250, 10),
          tileWidth: 32,
          tileHeight: 16,
          columns: 15,
          rows: 15
        });
      • ex.IsometricTile now come with a ex.IsometricEntityComponent which can be applied to any entity that needs to be correctly sorted to preserve the isometric illusion
      • ex.IsometricEntitySystem generates a new z-index based on the elevation and y position of an entity with ex.IsometricEntityComponent
  • feat: Add pixelRatio override for Text rendering by @eonarheim in #2294

  • perf(motion): Improve capture transform perf by @eonarheim in #2278

  • perf(graphics): Implement sorted draw calls by @eonarheim in #2277

    • Added draw call sorting new ex.Engine({useDrawSorting: true}) to efficiently draw render plugins in batches to avoid expensive renderer switching as much as possible. By default this is turned on, but can be opted out of.
  • feat(graphics): [#2288] Implement SpriteSheet builder with custom sourceViews by @eonarheim in #2302

    • Added feature to build SpriteSheets from a list of different sized source views using ex.SpriteSheet.fromImageSourceWithSourceViews(...)
        const ss = ex.SpriteSheet.fromImageSourceWithSourceViews({
          image,
          sourceViews: [
            {x: 0, y: 0, width: 20, height: 30},
            {x: 20, y: 0, width: 40, height: 50},
          ]
        });
  • feat: FitScreenAndFill and FitContainerAndFill Display Modes by @Joshua-Beatty in #2272

    fitandfill

  • feat: [#2272] Add Fit Screen/Container and Zoom by @eonarheim in #2312

    fitandzoom

  • feat: [#2313] Add New Line Graphics Object by @eonarheim in #2314

    const lineActor = new ex.Actor({
      pos: ex.vec(100, 0)
    });
    lineActor.graphics.anchor = ex.Vector.Zero;
    lineActor.graphics.use(new ex.Line({
      start: ex.vec(0, 0),
      end: ex.vec(200, 200),
      color: ex.Color.Green,
      thickness: 10
    }));
    game.add(lineActor);
  • feat: Add Raster quality + lineCap by @eonarheim in #2315

    • Added new parameter to ex.Raster({quality: 4}) to specify the internal scaling for the bitmap, this is useful for improving the rendering quality of small rasters due to sampling error.
  • feat(graphics): Add canvas 2d fallback mechanism by @eonarheim in #2310

    • Added new performance fallback configuration to ex.Engine for developers to help players experiencing poor performance in non-standard browser configurations
      • This will fallback to the Canvas2D rendering graphics context which usually performs better on non hardware accelerated browsers, currently postprocessing effects are unavailable in this fallback.
      • By default if a game is running at 20fps or lower for 100 frames or more after the game has started it will be triggered, the developer can optionally show a player message that is off by default.
        var game = new ex.Engine({
          ...
          configurePerformanceCanvas2DFallback: {
            allow: true, // opt-out of the fallback
            showPlayerMessage: true, // opt-in to a player pop-up message
            threshold: { fps: 20, numberOfFrames: 100 } // configure the threshold to trigger the fallback
          }
        });
  • feat: Implement parallax motion component and system by @eonarheim in #2303

    • Added new ex.ParallaxComponent for creating parallax effects on the graphics, entities with this component are drawn differently and a collider will not be where you expect. It is not recommended you use colliders with parallax entities.

      parallax3

      const actor = new ex.Actor();
      // The actor will be drawn shifted based on the camera position scaled by the parallax factor
      actor.addComponent(new ParallaxComponent(ex.vec(0.5, 0.5)));
  • perf: Various performance improvements by @eonarheim in #2309

  • Added ex.Vector.min(...) and ex.Vector.max(...) to find the min/max of each vector component between 2 vectors.

  • Added ex.TransformComponent.zIndexChange$ observable to watch when z index changes.

Fixes

  • refactor: Rename multv/multm to multiply by @eonarheim in #2240
  • fix: #2263 keyboard wasPressed works in onPostUpdate lifecycle by @eonarheim in #2270
  • chore: Updates to improve test flakiness by @eonarheim in #2246
  • fix: [#2109] Replace the features link by @SulthanNK in #2299
  • fix: [#2300] CompositeColliders count as a whole for collisionstart/collisionend events by @eonarheim in #2301
  • fix(graphics): Large Text segments render properly by breaking them into smaller pieces by @eonarheim in #2295
  • fix: Tilemap incorrectly offscreen and update parallax to use Tiled formula by @eonarheim in #2316
  • fix: Tweak browser params to fix flaky test runner disconnect by @eonarheim in #2311

What's Changed

Read more

Excalibur v0.25.3 Release

05 Feb 23:53
Compare
Choose a tag to compare

image

What's Changed

This is a maintenance release with some key bug fixes, notably some quality of life log messages to avoid loading images that are too large, and a fix for Pixel 6 devices to prevent crashing.

Bug Fixes

Build Dependencies Updated

Full Changelog: v0.25.2...v0.25.3

Excalibur v0.25.2 Release

22 Jan 04:30
Compare
Choose a tag to compare

image

What's Changed

See migration guide for v0.25.x -> v0.25.2

Plugin Updates!

  • Excalibur Dev Tools for game debugging!
    image
  • Lots of quality of life improvements in the Tiled plugin
    • Tiled data is added to corresponding Entities via TiledObjectComponent and TiledLayerComponent
    • Tiled name's become excalibur Entity names
    • Layers and object use Tiled Z-indexing by default

Added Features

  • feat: [#577] [#1170] Implement new Clock API by @eonarheim in #2122
    • Added new Clock api to manage the core main loop. Clocks hide the implementation detail of how the mainloop runs, users just knows that it ticks somehow. Clocks additionally encapsulate any related browser timing, like performance.now()
      1. StandardClock encapsulates the existing requestAnimationFrame api logic
      2. TestClock allows a user to manually step the mainloop, this can be useful for frame by frame debugging #1170
      3. The base abstract clock implements the specifics of elapsed time
  • Added a new feature to Engine options to set a maximum fps new ex.Engine({...options, maxFps: 30}). This can be useful when needing to deliver a consistent experience across devices.
  • feat: Post Processing Improvements + Pre-multiplied alpha by @eonarheim in #2142
    • New ex.ScreenShader helper for building custom shader based post processors, read docs for more info
  • feat: Support image filtering modes on ImageSource & Raster Graphics by @eonarheim in #2168
  • feat: Fixes and updates to support @excaliburjs/dev-tools by @eonarheim in #2169
  • feat+refactor: Renderer simplification and Render plugins by @eonarheim in #2185
    • Added ability to build custom renderer plugins that are accessible to the ex.ExcaliburGraphicsContext.draw<TCustomRenderer>(...) after registering them ex.ExcaliburGraphicsContext.register(new LineRenderer())
    • Added ability to draw circles and rectangles with outlines! ex.ExcaliburGraphicsContext.drawCircle(...) and ex.ExcaliburGraphicsContext.drawRectangle(...)
  • Added ex.CoordPlane can be set in the new ex.Actor({coordPlane: CoordPlane.Screen}) constructor
  • Added convenience feature, setting the color, sets the color on default graphic if applicable
  • Added support for different webgl texture blending modes as ex.ImageFiltering :
    • ex.ImageSource can now specify a blend mode before the image is loaded
    • ex.ImageFiltering.Blended - Blended is useful when you have high resolution artwork and would like it blended and smoothed
    • ex.ImageFiltering.Pixel - Pixel is useful when you do not want smoothing aka antialiasing applied to your graphics.
  • Excalibur will set a "default" blend mode based on the ex.EngineOption antialiasing property, but can be overridden per graphic
    • antialiasing: true, then the blend mode defaults to ex.ImageFiltering.Blended
    • antialiasing: false, then the blend mode defaults to ex.ImageFiltering.Pixel
  • Pointers can now be configured to use the collider or the graphics bounds as the target for pointers with the ex.PointerComponent
    • useColliderShape - (default true) uses the collider component geometry for pointer events
    • useGraphicsBounds - (default false) uses the graphics bounds for pointer events
  • Added new measureText method to the ex.SpriteFont and ex.Font to return the bounds of any particular text

Breaking Changes

  • ex.Util.extend() is removed, modern js spread operator {...someobject, ...someotherobject} handles this better.
  • Excalibur post processing is now moved to the engine.graphicsContext.addPostProcessor()
  • Breaking change to ex.PostProcessor, all post processors must now now implement this interface
    export interface PostProcessor {
      intialize(gl: WebGLRenderingContext): void;
      getShader(): Shader;
      getLayout(): VertexLayout;
    }
  • Excalibur ex.EventEmitter on longer overrides the this parameter in callbacks
    // change this type of code
    this.on('precollision', this.onPreCollision);
    
    // to this
    this.on('precollision', (evt) => this.onPreCollision(evt));

Deprecated

  • The static Engine.createMainLoop is now marked deprecated and will be removed in v0.26.0, it is replaced by the Clock api
  • Mark legacy draw routines in ex.Engine, ex.Scene, and ex.Actor deprecated

Bug Fixes

  • fix: Performance improvements avoid expensive calculations by @eonarheim in #2197
    • Big improvement v0.25.0 on the left and v0.25.2 on the right! We stay above 30fps @ 4000 actors! More to come in the future!
    • image
  • fix: Arcade Solver Jitter on stacked/overlapped tiles by @eonarheim in #2104
  • fix: [#2106] Safari 13.1 Does not boot + Safari Pointers by @eonarheim in #2107
  • fix: Prevent pair generation for composite colliders by @eonarheim in #2131
  • fix: Clock runs game simulation too fast sometimes when limiting fps by @eonarheim in #2162
  • fix: Prevent SpriteFonts from logging excessive warnings by @eonarheim in #2163
  • fix: [#2152] SpriteFont and Font alignment by @eonarheim in #2153
  • fix(tsconfig): restrict types array by @kamranayub in #2160
  • fix: [#1815] TileMap tiling artifact by @eonarheim in #2146
  • fix: CircleCollider now handles transforms properly by @eonarheim in #2191
  • fix: [#2192] Actor.center returns global position by @eonarheim in #2193

Changed/Refactor

Docs

Build Dependencies Updated

Read more

Excalibur v0.25.1 Release

06 Nov 02:32
Compare
Choose a tag to compare

image

What's Changed

Deprecated

  • Actions asPromise() renamed to toPromise(), will be removed in v0.26.0

Added Features

  • feat: [#1892] Animations should allow you to specify the total duration by @catrielmuller in #2065
    • ex.Animation now support totalDuration that will calculate automatically each frame duration based on how many frames have.
    • withEngine utils support an aditional options parameter to override the Engine default options.
    • Story to show a play / pause implementation.
  • chore(webpack): add experimental esm bundle output by @kamranayub in #2064
    • Experimental: Native ES module bundle distribution in package esm/excalibur.js entrypoint
  • feat: [#2069] Add easy reverse support to Animations by @eonarheim in #2070
    • ex.Animation now supports .reverse() to reverse the direction of play in an animation, use the ex.Animation.direction to inspect if the animation is playing in the ex.AnimationDirection.Forward direction or the ex.AnimationDirection.Backward direction.
  • feat: [#2044] Add Current Graphics Keys to GraphicsComponent by @ignoreintuition in #2072

Bug Fixes

  • fix: loader button position on window resize
  • fix: issue with setting ex.TileMap.z to a value
  • fix: crash in debug system if there is no collider geometry
  • fix: [#2049]: ImageSource loading error message by @nidble in #2052
  • fix: [#1431] Dispatch the hidePlayButton on the Button Event to prevent that keep on the screen on some situations [#1431] by @catrielmuller in #2066
  • fix: [#2076] Defer initialization until after final resolution calculated by @eonarheim in #2093
  • fix: [#1731] Replace TSC build constant + Simplify version generation by @eonarheim in #2053
  • revert: VSCode Workbench Colors configurations by @catrielmuller in #2067

Updates

  • chore: Update copyright with initial commit year by @jedeen in #2056

Docs

Changed/Refactor

  • feat: Refactor Actions to ECS System and Component by @eonarheim in #2061
    • Internal Actions implementation converted to ECS system and component, this is a backwards compatible change with v0.25.0
    • ex.ActionsSystem and ex.ActionsComponent now wrap the existing ex.ActionContext
    • Actions can be shared with all entities now!
  • Dispatch the hidePlayButton on the Button Event to prevent that keep on the screen on some situations [#1431].
  • Revert VSCode Workbench Colors

Build Dependencies Updates

Contributors

Full Changelog: v0.25.0...v0.25.1

Excalibur v0.25.0 Release

04 Oct 01:14
Compare
Choose a tag to compare

image

See migration guide for v0.24.5 -> v0.25.0

We've had tons of community contributions since the last release. Heartfelt thanks to everyone in the discussions, issues and PRs!

Contributors:

Breaking Changes

  • Actor Drawing: ex.Actor.addDrawing, ex.Actor.setDrawing, onPostDraw(), and onPreDraw() are no longer on by default and will be removed in v0.26.0, they are available behind a flag ex.Flags.useLegacyDrawing()

    • For custom drawing use the ex.Canvas
  • ex.Actor.rx has been renamed to ex.Actor.angularVelocity

  • Rename ex.Edge to ex.EdgeCollider and ex.ConvexPolygon to ex.PolygonCollider to avoid confusion and maintian consistency

  • ex.Label constructor now only takes the option bag constructor and the font properties have been replaced with ex.Font

    const label = new ex.Label({
      text: 'My Text',
      x: 100,
      y: 100,
      font: new ex.Font({
        family: 'Consolas',
        size: 32
      })
    });
  • ex.Physics.debug properties for Debug drawing are now moved to engine.debug.physics, engine.debug.collider, and engine.debug.body.

    • Old debugDraw(ctx: CanvasRenderingContext2D) methods are removed.
  • Collision Pair's are now between Collider's and not bodies

  • PerlinNoise has been removed from the core repo will now be offered as a plugin

  • Legacy drawing implementations are moved behind ex.LegacyDrawing new Graphics implemenations of Sprite, SpriteSheet, Animation are now the default import.

    • To use any of the ex.LegacyDrawing.* implementations you must opt-in with the ex.Flags.useLegacyDrawing() note: new graphics do not work in this egacy mode
  • Renames CollisionResolutionStrategy.Box collision resolution strategy to Arcade

  • Renames CollisionResolutionStrategy.RigidBody collision resolution strategy to Realistic

  • Collider is now a first class type and encapsulates what Shape used to be. Collider is no longer a member of the Body

  • CollisionType and CollisionGroup are now a member of the Body component, the reasoning is they define how the simulated physics body will behave in simulation.

  • Timer's no longer automatically start when added to a Scene, this Timer.start() must be called. (#1865)

  • Timer.complete is now read-only to prevent odd bugs, use reset(), stop(), and start() to manipulate timers.

  • Actor.actions.repeat() and Actor.actions.repeatForever() now require a handler that specifies the actions to repeat. This is more clear and helps prevent bugs like #1891

    const actor = new ex.Actor();
    
    actor.actions
      // Move up in a zig-zag by repeating 5 times
      .repeat((ctx) => {
        ctx.moveBy(10, 0, 10);
        ctx.moveBy(0, 10, 10);
      }, 5)
      .callMethod(() => {
        console.log('Done repeating!');
      });
  • Removes Entity.components as a way to access, add, and remove components

  • ex.Camera.z has been renamed to property ex.Camera.zoom which is the zoom factor

  • ex.Camera.zoom(...) has been renamed to function ex.Camera.zoomOverTime()

  • TileMap no longer needs registered SpriteSheets, Sprite's can be added directly to Cell's with addGraphic

  • Directly changing debug drawing by engine.isDebug = value has been replaced by engine.showDebug(value) and engine.toggleDebug() (#1655)

  • UIActor Class instances need to be replaced to ScreenElement (This Class it's marked as Obsolete) (#1656)

  • Switch to browser based promise, the Excalibur implementation ex.Promise is marked deprecated (#994)

  • DisplayMode's have changed (#1733) & (#1928):

    • DisplayMode.FitContainer fits the screen to the available width/height in the canvas parent element, while maintaining aspect ratio and resolution
    • DisplayMode.FillContainer update the resolution and viewport dyanmically to fill the available space in the canvas parent element, DOES NOT preserve aspectRatio
    • DisplayMode.FitScreen fits the screen to the available browser window space, while maintaining aspect ratio and resolution
    • DisplayMode.FillScreen now does what DisplayMode.FullScreen used to do, the resolution and viewport dynamically adjust to fill the available space in the window, DOES NOT preserve aspectRatio (#1733)
    • DisplayMode.FullScreen is now removed, use Screen.goFullScreen().
  • SpriteSheet now is immutable after creation to reduce chance of bugs if you modified a public field. The following properties are read-only: columns, rows, spWidth, spHeight, image, sprites and spacing.

  • Engine.pointerScope now defaults to a more expected ex.Input.PointerScope.Canvas instead of ex.Input.PointerScope.Document which can cause frustrating bugs if building an HTML app with Excalibur

Added

  • New property center to Screen to encapsulate screen center coordinates calculation considering zoom and device pixel ratio
  • New ex.Shape.Capsule(width, height) helper for defining capsule colliders, these are useful for ramps or jagged floor colliders.
  • New collision group constructor argument added to Actornew Actor({collisionGroup: collisionGroup})
  • SpriteSheet.getSprite(x, y) can retrieve a sprite from the SpriteSheet by x and y coordinate. For example, getSprite(0, 0) returns the top left sprite in the sheet.
    • SpriteSheet's now have dimensionality with rows and columns optionally specified, if not there is always 1 row, and sprites.length columns
  • new Actor({radius: 10}) can now take a radius parameter to help create circular actors
  • The ExcaliburGraphicsContext now supports drawing debug text
  • Entity may also now optionally have a name, this is useful for finding entities by name or when displaying in debug mode.
  • New DebugSystem ECS system will show debug drawing output for things toggled on/off in the engine.debug section, this allows for a less cluttered debug experience.
    • Each debug section now has a configurable color.
  • Turn on WebGL support with ex.Flags.useWebGL()
  • Added new helpers to CollisionGroup to define groups that collide with specified groups CollisionGroup.collidesWith([groupA, groupB])
    • Combine groups with const groupAandB = CollisionGroup.combine([groupA, groupB])
    • Invert a group instance const everthingButGroupA = groupA.invert()
  • Improved Collision Simulation
    • New ECS based CollisionSystem and MotionSystem
    • Rigid body's can now sleep for improved performance
    • Multiple contacts now supported which improves stability
    • Iterative solver for improved stability
  • Added ColliderComponent to hold individual Collider implementations like Circle, Box, or CompositeCollider
    • Actor.collider.get() will get the current collider
    • Actor.collider.set(someCollider) allows you to set a specific collider
  • New CompositeCollider type to combine multiple colliders together into one for an entity
    • Composite colliders flatten into their individual colliders in the collision system
    • Composite collider keeps it's internal colliders in a DynamicTree for fast .collide checks
  • New TransformComponent to encapsulate Entity transform, that is to say position, rotation, and scale
  • New MotionComponent to encapsulate Entity transform values changing over time like velocity and acceleration
  • Added multi-line support to Text graphics (#1866)
  • Added TileMap arbitrary graphics support with .addGraphic() (#1862)
  • Added TileMap row and column accessors getRows() and getColumns() (#1859)
  • Added the ability to store arbitrary data in TileMap cells with Cell.data.set('key', 'value') and Cell.data.get('key') (#1861)
  • Actions moveTo(), moveBy(), easeTo(), scaleTo(), and scaleBy() now have vector overloads
  • Animation.fromSpriteSheet will now log a warning if an index into the SpriteSheet is invalid (#1856)
  • new ImageSource() will now log a warning if an image type isn't fully supported. (#1855)
  • Timer.start() to explicitly start timers, and Timer.stop() to stop timers and "rewind" them.
  • Timer.timeToNextAction will return the milliseconds until the next action callback
  • Timer.timeElapsedTowardNextAction will return the milliseconds counted towards the next action callback
  • BoundingBox now has a method for detecting zero dimensions in width or height `hasZeroDimen...
Read more