Releases: excaliburjs/Excalibur
Excalibur v0.25.0 Release
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:
- @jedeen
- @kamranayub
- @alanag13
- @DaVince
- @DrSensor
- @djcsdy
- @catrielmuller
- @AndrewCraswell
- @miqh
- @rledford
- @SirPedr
- @helloausrine
- @dpayne5
- @herobank110
- @didii
- @Charkui
- @muirch
- @rumansaleem
- @mogoh
- @kala2
- @MrBartusek
- @josh
- @LokiMidgard
- @romaintailhurat
- @EduardoHidalgo
- @jaredegan
Breaking Changes
-
Actor Drawing:
ex.Actor.addDrawing
,ex.Actor.setDrawing
,onPostDraw()
, andonPreDraw()
are no longer on by default and will be removed in v0.26.0, they are available behind a flagex.Flags.useLegacyDrawing()
- For custom drawing use the
ex.Canvas
- For custom drawing use the
-
ex.Actor.rx
has been renamed toex.Actor.angularVelocity
-
Rename
ex.Edge
toex.EdgeCollider
andex.ConvexPolygon
toex.PolygonCollider
to avoid confusion and maintian consistency -
ex.Label
constructor now only takes the option bag constructor and the font properties have been replaced withex.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 toengine.debug.physics
,engine.debug.collider
, andengine.debug.body
.- Old
debugDraw(ctx: CanvasRenderingContext2D)
methods are removed.
- Old
-
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 ofSprite
,SpriteSheet
,Animation
are now the default import.- To use any of the
ex.LegacyDrawing.*
implementations you must opt-in with theex.Flags.useLegacyDrawing()
note: new graphics do not work in this egacy mode
- To use any of the
-
Renames
CollisionResolutionStrategy.Box
collision resolution strategy toArcade
-
Renames
CollisionResolutionStrategy.RigidBody
collision resolution strategy toRealistic
-
Collider
is now a first class type and encapsulates whatShape
used to be.Collider
is no longer a member of theBody
-
CollisionType
andCollisionGroup
are now a member of theBody
component, the reasoning is they define how the simulated physics body will behave in simulation. -
Timer
's no longer automatically start when added to aScene
, thisTimer.start()
must be called. (#1865) -
Timer.complete
is now read-only to prevent odd bugs, usereset()
,stop()
, andstart()
to manipulate timers. -
Actor.actions.repeat()
andActor.actions.repeatForever()
now require a handler that specifies the actions to repeat. This is more clear and helps prevent bugs like #1891const 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 propertyex.Camera.zoom
which is the zoom factor -
ex.Camera.zoom(...)
has been renamed to functionex.Camera.zoomOverTime()
-
TileMap no longer needs registered SpriteSheets,
Sprite
's can be added directly toCell
's withaddGraphic
- The confusing
TileSprite
type is removed (Related to TileMap plugin updates excaliburjs/excalibur-tiled#4, excaliburjs/excalibur-tiled#23, excaliburjs/excalibur-tiled#108)
- The confusing
-
Directly changing debug drawing by
engine.isDebug = value
has been replaced byengine.showDebug(value)
andengine.toggleDebug()
(#1655) -
UIActor
Class instances need to be replaced toScreenElement
(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 resolutionDisplayMode.FillContainer
update the resolution and viewport dyanmically to fill the available space in the canvas parent element, DOES NOT preserveaspectRatio
DisplayMode.FitScreen
fits the screen to the available browser window space, while maintaining aspect ratio and resolutionDisplayMode.FillScreen
now does whatDisplayMode.FullScreen
used to do, the resolution and viewport dynamically adjust to fill the available space in the window, DOES NOT preserveaspectRatio
(#1733)DisplayMode.FullScreen
is now removed, useScreen.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
andspacing
. -
Engine.pointerScope
now defaults to a more expectedex.Input.PointerScope.Canvas
instead ofex.Input.PointerScope.Document
which can cause frustrating bugs if building an HTML app with Excalibur
Added
- New property
center
toScreen
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 Actor
new 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 withrows
andcolumns
optionally specified, if not there is always 1 row, andsprites.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 aname
, 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 theengine.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 groupsCollisionGroup.collidesWith([groupA, groupB])
- Combine groups with
const groupAandB = CollisionGroup.combine([groupA, groupB])
- Invert a group instance
const everthingButGroupA = groupA.invert()
- Combine groups with
- Improved Collision Simulation
- New ECS based
CollisionSystem
andMotionSystem
- Rigid body's can now sleep for improved performance
- Multiple contacts now supported which improves stability
- Iterative solver for improved stability
- New ECS based
- Added
ColliderComponent
to hold individualCollider
implementations likeCircle
,Box
, orCompositeCollider
Actor.collider.get()
will get the current colliderActor.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 accessorsgetRows()
andgetColumns()
(#1859) - Added the ability to store arbitrary data in
TileMap
cells withCell.data.set('key', 'value')
andCell.data.get('key')
(#1861) - Actions
moveTo()
,moveBy()
,easeTo()
,scaleTo()
, andscaleBy()
now have vector overloads Animation.fromSpriteSheet
will now log a warning if an index into theSpriteSheet
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, andTimer.stop()
to stop timers and "rewind" them.Timer.timeToNextAction
will return the milliseconds until the next action callbackTimer.timeElapsedTowardNextAction
will return the milliseconds counted towards the next action callbackBoundingBox
now has a method for detecting zero dimensions in width or height `hasZeroDimen...
Excalibur v0.24.5 Release
Breaking Changes
Added
- Adds new ECS Foundations API, which allows excalibur core behavior to be manipulated with ECS style code ([#1361]#1361)
- Adds new
ex.Entity
&ex.EntityManager
which represent anything that can do something in a Scene and are containers for Components - Adds new
ex.Component
type which allows encapsulation of state on entities - Adds new
ex.Query
&ex.QueryManager
which allows queries over entities that match a component list - Adds new
ex.System
type which operates on matching Entities to do some behavior in Excalibur. - Adds new
ex.Observable
a small observable implementation for observing Entity component changes over time
- Adds new
Fixed
- Fixed Animation flicker bug on the first frame when using animations with scale, anchors, or rotation. (#1636)
Changes
- chore: Switch to main
- feat: Implement ECS Foundations (#1316)
- chore: Update storybook monorepo to v6 (major) (#1634)
- chore: Update dependency karma-jasmine to v4 (#1633)
- chore: Update Node.js to v12.18.3 (#1600)
- chore: [#1487] Remove audio tag implementation (#1552)
- chore: Remove flakey test, reopen #1547
- chore: Update dependency puppeteer to v5 (#1614)
- fix: [#1636] Animation flicker on first frame (#1637)
- fix: Documentation link
Excalibur v0.24.4 Release
Breaking Changes
Added
- Add new
ex.Screen
abstraction to manage viewport size and resolution independently and all other screen related logic. (#1617)- New support for the browser fullscreen API
- Add color blind mode simulation and correction in debug object.
(#390) - Add
LimitCameraBoundsStrategy
, which always keeps the camera locked to within the given bounds. (#1498) - Add mechanisms to manipulate the
Loader
screen. (#1417)- Logo position
Loader.logoPosition
- Play button position
Loader.playButtonPosition
- Loading bar position
Loader.loadingBarPosition
- Loading bar color
Loader.loadingBarColor
by default is white, but can be any excaliburex.Color
- Logo position
Changed
- Remove usage of
mock.engine
from the tests. Use real engine instead. - Upgrade Excalibur to TypeScript 3.9.2
- Upgrade Excalibur to Node 12 LTS
Deprecated
Removed
Fixed
- Fixed Loader play button markup and styles are now cleaned up after clicked (#1431)
- Fixed Excalibur crashing when embedded within a cross-origin IFrame (#1151)
- Fixed performance issue where uneccessary effect processing was occurring for opacity changes (#1549)
- Fixed issue when loading images from a base64 strings that would crash the loader (#1543)
- Fixed issue where actors that were not in scene still received pointer events (#1555)
- Fixed Scene initialization order when using the lifecycle overrides (#1553)
Changes
- chore: Update dependency @types/node to v14.6.2
- chore: Update dependency @types/jasmine to v3.5.14
- chore: Update dependency eslint to v7.8.1
- chore: Update storybook monorepo to v5.3.21
- chore: Update dependency tslint to v6.1.3
- chore: Update dependency typedoc to v0.19.0
- chore: Update dependency prettier to v2.1.1
- chore: Update dependency ts-loader to v8.0.3
- chore: Update dependency lint-staged to v10.2.13
- chore: Update dependency karma to v5.2.0
- chore: Update dependency grunt to v1.3.0
- chore: Update dependency css-loader to v4.2.2
- chore: Update dependency copy-webpack-plugin to v6.1.0
- chore: Update dependency @fortawesome/fontawesome-free to v5.14.0
- chore: Update dependency @babel/core to v7.11.5
- chore: Update Versions + CSS Loader Regression (#1619)
- chore: Update dependency @types/jasmine to v3.5.12
- chore: Update dependency @types/node to v14.6.0
- chore: Update dependency eslint to v7.7.0
- fix: [#1547] Flakey tests (#1618)
- chore: Update dependency css-loader to v4 (#1612)
- chore: Update dependency ts-loader to v8 (#1615)
- chore: Update jasmine monorepo
- chore: Update dependency webpack to v4.44.1
- chore: Update dependency karma-coverage to v2.0.3
- chore: Update dependency karma to v5.1.1
- chore: Update dependency grunt to v1.2.1
- fix: [#1549] Remove unecessary sprite effect for opacity (#1550)
- feat: [#1617] Screen Resolution Abstraction (#1598)
- chore: Update dependency webpack-cli to v3.3.12
- chore: Update dependency typedoc to v0.17.8
- chore: Update dependency puppeteer to v3.3.0
- chore: Update dependency lint-staged to v10.2.11
- chore: Update dependency eslint to v7.3.1
- chore: Update dependency karma to v5.1.0
- chore: Update dependency copyfiles to v2.3.0
- chore: Update dependency css-loader to v3.6.0
- chore: Update dependency copy-webpack-plugin to v6.0.3
- chore: Update dependency @types/node to v14.0.14
- chore: Update dependency @types/react-color to v3.0.4
- chore: Update dependency @fortawesome/fontawesome-free to v5.13.1
- chore: Update dependency @types/jasmine to v3.5.11
- chore: Update dependency @babel/core to v7.10.4
- chore: Update Node.js to v12.18.2
- chore: Update dependency copy-webpack-plugin to v6 (#1573)
- fix: [#805] Replace mock.engine by real engine (#1514)
- chore: Update dependency eslint-plugin-jsdoc to v22.2.0
- fix: [#1555] Pointer events should only work on actors in scene (#1556)
- chore: Update dependency eslint to v7 (#1574)
- chore: Update dependency karma-coverage-istanbul-reporter to v3 (#1576)
- docs: [#1538] Update our Code of Conduct (#1579)
- chore: Update dependency serve to v11.3.2
- chore: Update dependency @types/react-color to v3.0.2
- chore: Update dependency @types/node to v14.0.9
- chore: Update storybook monorepo to v5.3.19
- chore: Update dependency typescript to v3.9.3
- chore: Update typescript-eslint monorepo to v2.34.0
- chore: Update dependency typedoc to v0.17.7
- chore: Update dependency ts-loader to v7.0.5
- chore: Update dependency puppeteer to v3.2.0
- chore: Update dependency lint-staged to v10.2.7
- chore: Update dependency karma-jasmine to v3.3.1
- chore: Update dependency karma to v5.0.9
- chore: Update dependency @types/node to v14.0.6
- chore: Update dependency @babel/core to v7.10.2
- chore: Update Node.js to v12.17.0
- chore: Pin dependency lint-staged to 10.2.2
- fix: [#1553] Scene
onInitialize
order (#1554) - fix: [#1417] [#1431] Loader positioning, allow customization, clean-up html (#1507)
- fix: [#1543] Correct loading base64 string images (#1546)
- chore: Switch to lint-staged (#1551)
- chore: Update to node 12 (#1545)
- chore: Update dependency @babel/core to v7.9.6
- [chore] Update dependency webpack to v4.43.0 (#1524)
- chore: fix https in package-lock.json
- chore: Upgrade to TypeScript 3.9.2 (#1544)
- feat: [#1498] Implement Camera Bounds Strategy (#1526)
- [chore] update typedoc-default-themes
- docs: Streamline language in the readme (#1537)
- chore: [#1508] Update Renovate/release commit format (#1540)
- [chore] Fix nuget publish
Excalibur v0.24.3 Release
Changes
- [chore] Update release automation
- [chore] Add actions intro story and split rotate story (#1534)
- [chore]: Add more action stories (#1532)
- [chore] Update dependency tslint to v6.1.2
- [chore] Update dependency typedoc to v0.17.6
- [chore] Update dependency ts-loader to v7.0.2
- [chore] Update dependency lint-staged to v10.2.2
- [chore] Update dependency puppeteer to v3.0.2
- [chore] Update dependency lint-staged to v10.2.1
- [chore] Update dependency karma to v5.0.4
- [#290] Add correction and simulation of colorblindness (#1515)
Excalibur v0.24.1 Release
Excalibur v0.24.0 Release
Breaking Changes
- Remove obsolete
.extend()
semantics in Class.ts as as well as related test cases.
Added
- Added new option for constructing bounding boxes. You can now construct with an options
object rather than only individual coordinate parameters. (#1151) - Added new interface for specifying the type of the options object passed to the
bounding box constructor. - Added the
ex.vec(x, y)
shorthand for creating vectors.
(#1340) - Added new event
processed
toSound
that passes processedstring | AudioBuffer
data. (#1474) - Added new property
duration
toSound
andAudioInstance
that exposes the track's duration in seconds when Web Audio API is used. (#1474)
Changed
- Animation no longer mutate underlying sprites, instead they draw the sprite using the animations parameters. This allows more robust flipping at runtime. (#1258)
- Changed obsolete decorator to only log the same message 5 times. (#1281)
- Switched to core-js based polyfills instead of custom written ones (#1214)
- Updated to TypeScript@3.6.4 and node 10 LTS build
Sound.stop()
now always rewinds the track, even when the sound is paused. (#1474)
Deprecated
ex.Vector.magnitude()
will be removed inv0.25.0
, useex.Vector.size()
. (#1277)
Fixed
- Fixed Excalibur crashing when displaying both a tilemap and a zero-size actor (#1418)
- Fixed animation flipping behavior (#1172)
- Fixed actors being drawn when their opacity is 0 (#875)
- Fixed iframe event handling, excalibur will respond to keyboard events from the top window (#1294)
- Fixed camera to be vector backed so
ex.Camera.x = ?
andex.Camera.pos.setTo(...)
both work as expected(#1299) - Fixed missing on/once/off signatures on
ex.Pointer
(#1345) - Fixed sounds not being stopped when
Engine.stop()
is called. (#1476)
Thanks to @JeTmAn1981, @gargrave, @SirKitboard, @Guzzler, @saahilk, @djcsdy, @chrispanag, @MaanasArora, @jlennox, @jweissman, @HParker, @jurca, and @DaVince for their contributions!
Excalibur v0.23.0
Thanks to @DavidLi119, @radist2s, @magnusandy, @djcsdy, and @ZuzuZain for their contributions!
Breaking Changes
ex.Actor.scale
,ex.Actor.sx/sy
,ex.Actor.actions.scaleTo/scaleBy
will not work as expected with new collider implementation, set width and height directly. These features will be completely removed in v0.24.0.
Added
- Add new collision group implementation (#1091, #862)
- New
ex.Collider
type which is the container for all collision related behavior and state. Actor is now extracted from collision. - Added interface
Clonable<T>
to indicate if an object contains a clone method - Added interface
Eventable<T>
to indicated if an object can emit and receive events ex.Vector.scale
now also works with vector inputex.BoundingBox.fromDimension(width: number, height: number)
can generate a bounding box from a width and heightex.BoundingBox.translate(pos: Vector)
will create a new bounding box shifted bypos
ex.BoundingBox.scale(scale: Vector)
will create a new bounding box scaled byscale
- Added
isActor()
andisCollider()
type guards - Added
ex.CollisionShape.draw
collision shapes can now be drawn, actor's will use these shapes if no other drawing is specified - Added a
getClosestLineBetween
method toCollisionShape
's for returning the closest line between 2 shapes (#1071)
Changed
-
Change
ex.Actor.within
to use surface of object geometry instead of the center to make judgements (#1071) -
Changed
moveBy
,rotateBy
, andscaleBy
to operate relative to the current actor position at a speed, instead of moving to an absolute by a certain time. -
Changed event handlers in excalibur to expect non-null event objects, before
hander: (event?: GameEvent) => void
implied that event could be null. This change addresses (#1147) making strict null/function checks compatible with new typescript. -
Changed collision system to remove actor coupling, in addition
ex.Collider
is a new type that encapsulates all collision behavior. Useex.Actor.body.collider
to interact with collisions in Excalibur (#1119)- Add new
ex.Collider
type that is the housing for all collision related code- The source of truth for
ex.CollisionType
is now on collider, with a convenience getter on actor - The collision system now operates on
ex.Collider
's notex.Actor
's
- The source of truth for
ex.CollisionType
has been moved to a separate file outside ofActor
- CollisionType is switched to a string enum, style guide also updated
ex.CollisionPair
now operates on a pair ofex.Colliders
's instead ofex.Actors
'sex.CollisionContact
now operates on a pair ofex.Collider
's instead ofex.Actors
'sex.Body
has been modified to house all the physical position/transform information- Integration has been moved from actor to
Body
as a physical concern useBoxCollision
has been renamed touseBoxCollider
useCircleCollision
has been renamed touseCircleCollider
usePolygonCollision
has been renamed tousePolygonCollider
useEdgeCollision
has been renamed touseEdgeCollider
- Integration has been moved from actor to
- Renamed
ex.CollisionArea
toex.CollisionShape
ex.CircleArea
has been renamed toex.Circle
ex.PolygonArea
has been renamed toex.ConvexPolygon
ex.EdgeArea
has been renamed toex.Edge
- Renamed
getWidth()
&setWidth()
to propertywidth
- Actor and BoundingBox are affected
- Renamed
getHeight()
&setHeight()
to propertyheight
- Actor and BoundingBox are affected
- Renamed
getCenter()
to the propertycenter
- Actor, BoundingBox, and Cell are affected
- Renamed
getBounds()
to the propertybounds
- Actor, Collider, and Shapes are affected
- Renamed
getRelativeBounds()
to the propertylocalBounds
- Actor, Collider, and Shapes are affected
- Renamed
moi()
to the propertyinertia
standing for moment of inertia - Renamed
restition
to the propertybounciness
- Moved
collisionType
toActor.body.collider.type
- Moved
Actor.integrate
toActor.body.integrate
- Add new
Deprecated
-
Legacy groups
ex.Group
will be removed in v0.24.0, use collision groups as a replacement (#1091) -
Legacy collision groups off
Actor
will be removed in v0.24.0, useActor.body.collider.collisionGroup
(#1091) -
Removed
NaiveCollisionBroadphase
as it was no longer used -
Renamed methods and properties will be available until
v0.24.0
-
Deprecated collision attributes on actor, use
Actor.body.collider
Actor.x
&Actor.y
will be removed inv0.24.0
useActor.pos.x
&Actor.pos.y
Actor.collisionArea
will be removed inv0.24.0
useActor.body.collider.shape
Actor.getLeft()
,Actor.getRight()
,Actor.getTop()
, andActor.getBottom
are deprecated- Use
Actor.body.collider.bounds.(left|right|top|bottom)
- Use
Actor.getGeometry()
andActor.getRelativeGeometry()
are removed, useCollider
- Collision related properties on Actor moved to
Collider
, useActor.body.collider
Actor.torque
Actor.mass
Actor.moi
Actor.friction
Actor.restition
- Collision related methods on Actor moved to
Collider
, useActor.body.collider
orActor.body.collider.bounds
Actor.getSideFromIntersect(intersect)
->BoundingBox.sideFromIntersection
Actor.collidesWithSide(actor)
->Actor.body.collider.bounds.intersectWithSide
Actor.collides(actor)
->Actor.body.collider.bounds.intersect
Fixed
- Fixed issue where leaking window/document handlers was possible when calling
ex.Engine.stop()
andex.Engine.start()
. (#1063) - Fixed wrong
Camera
andLoader
scaling on HiDPI screens when optionsuppressHiDPIScaling
is set. (#1120) - Fixed polyfill application by exporting a
polyfill()
function that can be called. (#1132) - Fixed
Color.lighten()
(#1084)
Excalibur v0.22.0
Excalibur v0.21.0
Thanks to @kevin192291 and @dylanavery720 for their contributions!
Added
- Added ability to automatically convert .gif files to SpriteSheet, Animations, and Sprites #153 courtesy of @kevin192291
- Add new
viewport
property to camera to return a world space bounding box of the current visible area #1078
Changed
- Updated
ex.Color
andex.Vector
constants to be static getters that return new instances each time, eliminating a source of bugs in excalibur #1085 - Remove optionality of engine in constructor of Scene and _engine private with an underscore prefix (#1067) courtesy of @dylanavery720
Deprecated
- Rename
ex.BaseCamera
toCamera
,ex.BaseCamera
will be removed inv0.22.0
#1087
Fixed
Excalibur v0.20.0
Thanks to @T00mm , @atanasbozhkov for their contributions!
Breaking Changes
ex.PauseAfterLoader
removed, use Useex.Loader
instead
Added
- Added strongly typed EvenTypes enum to Events.ts to avoid magic strings #1066
Changed
- Added parameter on SpriteSheet constructor so you can define how many pixel spacing is between sprites #1058
Fixed
- Fixed issue where there were missing files in the dist (Loader.css, Loader.logo.png) (#1057)