All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
- [[ex.Input.Gamepad]]
isButtonPressed
has been renamed toisButtonHeld
- Added ability to perform arbitrary ray casts into
ex.Scene
, theex.PhysicsWorld
can be passed a variety of options to influence the types of ray cast hits that are returnedconst engine = new ex.Engine({...}); const enemyGroup = ex.CollisionGroupManager.create('enemy'); const ray = new ex.Ray(ex.vec(0, 0), ex.Vector.Right); const hits = engine.currentScene.physics.rayCast(ray, { /** * Optionally specify to search for all colliders that intersect the ray cast, not just the first which is the default */ searchAllColliders: true, /** * Optionally specify the maximum distance in pixels to ray cast, default is Infinity */ maxDistance: 100, /** * Optionally specify a collision group to consider in the ray cast, default is All */ collisionGroup: enemyGroup });
- Added the emitted particle transform style as part of
ex.ParticleEmitter({particleTransform: ex.ParticleTransform.Global})
, [[ParticleTransform.Global]] is the default and emits particles as if they were world space objects, useful for most effects. If set to [[ParticleTransform.Local]] particles are children of the emitter and move relative to the emitter as they would in a parent/child actor relationship. - Added
wasButtonReleased
andwasButtonPressed
methods to [[ex.Input.Gamepad]] - Added
clone()
method toex.SpriteSheet
- Fixed issue where zero mtv collisions cause erroneous precollision events to be fired in the
ArcadeSolver
andRealisticSolver
- Fixed issue where calling
.kill()
on a child entity would not remove it from the parentEntity
- Fixed issue where calling
.removeAllChildren()
would not remove all the children from the parentEntity
- Fixed issue where world origin was inconsistent when the using
ex.DisplayMode.FitScreenAndFill
when the screen was resized. - Fixed issue where context opacity was not respected when set in a
preDraw
- Fixed issue where
ex.Sound.loop
was not working, and switching tab visibility would cause odd behavior with loopingex.Sound
- Fixed issue where adding a
ex.ParticleEmitter
as a child did not position particles according to the parent - Fixed issue where screenshots from
ex.Engine.screenshot()
did not match the smoothing set on the engine. - Fixed incorrect event type returned when
ex.Actor.on('postupdate', (event) => {...})
. - Fixed issue where using numerous
ex.Text
instances would cause Excalibur to crash webgl by implementing a global font cache. - Fixed issue where child entities did not inherit the scene from their parent
- Fixed issue where
ex.Font
would become corrupted when re-used by multipleex.Text
instances - Fixed
engine.on('visible')
event not firing - Fixed
EventDispatcher.emit
converting falsy values toex.GameEvent
. It will only convertundefined
ornull
values now.
ex.Engine.snapToPixel
now defaults tofalse
, it was unexpected to have pixel snapping on by default it has now been switched.- The
ex.Physics.useRealisticPhysics()
physics solver has been updated to fix a bug in bounciness to be more physically accurate, this does change how physics behaves. Settingex.Body.bounciness = 0
will simulate the old behavior. ex.TransformComponent.posChanged$
has been removed, it incurs a steep performance costex.EventDispatcher
meta events 'subscribe' and 'unsubscribe' were unused and undocumented and have been removedex.TileMap
tlies are now drawn from the lower left by default to match withex.IsometricMap
and Tiled, but can be configured withrenderFromTopOfGraphic
to restore the previous behavior.- Scene
onActivate
andonDeactivate
methods have been changed to receive a single parameter, an object containing thepreviousScene
,nextScene
, and optionaldata
passed in fromgoToScene()
-
Added new configurable
ex.TileMap
option for rendering from the bottom or the top of the graphic, this matches withex.IsometricMap
and how Tiled rendersrenderFromTopOfGraphic
, by defaultfalse
and renders from the bottom.const tileMap = new ex.TileMap({ renderFromTopOfGraphic: false })
-
Added new
ex.Future
type which is a convenient way of wrapping a native browser promise and resolving/rejecting laterconst future = new ex.Future(); const promise = future.promise; // returns promise promise.then(() => { console.log('Resolved!'); }); future.resolve(); // resolved promise
-
Added new
ex.Semaphore
type to limit the number of concurrent cans in a section of code, this is used internally to work around a chrome browser limitation, but can be useful for throttling network calls or even async game events.const semaphore = new ex.Semaphore(10); // Only allow 10 concurrent between enter() and exit() ... await semaphore.enter(); await methodToBeLimited(); semaphore.exit();
-
Added new
ex.WatchVector
type that can observe changes to x/y more efficiently thanex.watch()
-
Added performance improvements
ex.Vector.distance
improvementex.BoundingBox.transform
improvement
-
Added ability to clone
ex.Vector.clone(destVector)
into a destination vector -
Added new
ex.Transform
type that is a light weight container for transformation data. This logic has been extracted from theex.TransformComponent
, this makes it easy to passex.Transform
s around. Additionally the extractedex.Transform
logic has been refactored for performance. -
Added new
ex.AffineMatrix
that is meant for 2D affine transformations, it uses less memory and performs less calculations than theex.Matrix
which uses a 4x4 Float32 matrix. -
Added new fixed update step to Excalibur! This allows developers to configure a fixed FPS for the update loop. One advantage of setting a fix update is that you will have a more consistent and predictable physics simulation. Excalibur graphics will be interpolated automatically to avoid any jitter in the fixed update.
- If the fixed update FPS is greater than the display FPS, excalibur will run multiple updates in a row (at the configured update elapsed) to catch up, for example there could be X updates and 1 draw each clock step.
- If the fixed update FPS is less than the display FPS, excalibur will skip updates until it meets the desired FPS, for example there could be no update for 1 draw each clock step.
const game = new ex.Engine({ fixedUpdateFps: 20 // 20 fps fixed update, or a fixed update delta of 50 milliseconds }); // turn off interpolation on a per actor basis const actor = new ex.Actor({...}); actor.body.enableFixedUpdateInterpolate = false; game.add(game);
-
Allowed setting playback
ex.Sound.duration
which will limit the amount of time that a clip plays from the current playback position. -
Added a new lightweight
ex.StateMachine
type for building finite state machinesconst machine = ex.StateMachine.create({ start: 'STOPPED', states: { PLAYING: { onEnter: () => { console.log("playing"); }, transitions: ['STOPPED', 'PAUSED'] }, STOPPED: { onEnter: () => { console.log("stopped"); }, transitions: ['PLAYING', 'SEEK'] }, SEEK: { transitions: ['*'] }, PAUSED: { onEnter: () => { console.log("paused") }, transitions: ['PLAYING', 'STOPPED'] } } });
-
Added
ex.Sound.seek(positionInSeconds)
which will allow you to see to a place in the sound, this will implicitly pause the sound -
Added
ex.Sound.getTotalPlaybackDuration()
which will return the total time in the sound in seconds. -
Allow tinting of
ex.Sprite
's by setting a newtint
property, renderers must support the tint property in order to function.const imageSource = new ex.ImageSource('./path/to/image.png'); await imageSource.load(); const sprite = imageSource.toSprite(); sprite.tint = ex.Color.Red;
-
Added
ex.Sound.getPlaybackPosition()
which returns the current playback position in seconds of the currently playing sound. -
Added
ex.Sound.playbackRate
which allows developers to get/set the current rate of playback. 1.0 is the default playback rate, 2.0 is twice the speed, and 0.5 is half speed. -
Added missing
ex.EaseBy
action type, usesex.EasingFunctions
to move relative from the current entity position. -
Added 2 new
Action
types to enable running parallel actions.ex.ActionSequence
which allows developers to specify a sequence of actions to run in order, andex.ParallelActions
to run multiple actions at the same time.const actor = new ex.Actor(); const parallel = new ex.ParallelActions([ new ex.ActionSequence(actor, ctx => ctx.moveTo(ex.vec(100, 0), 100)), new ex.ActionSequence(actor, ctx => ctx.rotateTo(Math.PI/2, Math.PI/2)) ]); actor.actions.runAction(parallel); // actor will now move to (100, 100) and rotate to Math.PI/2 at the same time!!
-
Add target element id to
ex.Screen.goFullScreen('some-element-id')
to influence the fullscreen element in the fullscreen browser API. -
Added optional
data
parameter togoToScene
, which gets passed to the target scene'sonActivate
method.class SceneA extends ex.Scene { /* ... */ onActivate(context: ex.SceneActivationContext<{ foo: string }>) { console.log(context.data.foo); // bar } } engine.goToScene('sceneA', { foo: 'bar' })
- Added the ability to select variable duration into Timer constructor.
const random = new ex.Random(1337); const timer = new ex.Timer({ random, interval: 500, randomRange: [0, 500] })
-
Fixed issue with
ex.Canvas
andex.Raster
graphics that forced their dimensions to the next highest power of two. -
Fixed issue with
ex.Engine.snapToPixel
where positions very close to pixel boundary created jarring 1 pixel oscillations. -
Fixed bug where a deferred
goToScene
would preserve the incorrect scene soengine.add(someActor)
would place actors in the wrong scene after transitioning to another. -
Fixed usability issue and log warning if the
ex.ImageSource
is not loaded and a draw was attempted. -
Fixed bug in
ex.Physics.useRealisticPhysics()
solver whereex.Body.bounciness
was not being respected in the simulation -
Fixed bug in
ex.Physics.useRealisticPhysics()
solver whereex.Body.limitDegreeOfFreedom
was not working all the time. -
Fixed bug in
Clock.schedule
where callbacks would not fire at the correct time, this was because it was scheduling using browser time and not the clock's internal time. -
Fixed issue in Chromium browsers where Excalibur crashes if more than 256
Image.decode()
calls are happening in the same frame. -
Fixed issue where
ex.EdgeCollider
were not working properly inex.CompositeCollider
forex.TileMap
's -
Fixed issue where
ex.BoundingBox
overlap return false due to floating point rounding error causing multiple collisions to be evaluated sometimes -
Fixed issue with
ex.EventDispatcher
where removing a handler that didn't already exist would remove another handler by mistake -
Fixed issue with
ex.EventDispatcher
where concurrent modifications of the handler list where handlers would or would not fire correctly and throw -
Tweak to the
ex.ArcadeSolver
to produce more stable results by adjusting by an infinitesimal epsilon- Contacts with overlap smaller than the epsilon are ignored
- Colliders with bounds that overlap smaller than the epsilon are ignored
-
Fixed issue with
ex.ArcadeSolver
based collisions where colliders were catching on seams when sliding along a floor of multiple colliders. This was by sorting contacts by distance between bodies. -
Fixed issue with
ex.ArcadeSolver
where corner contacts would zero out velocity even if the bodies were already moving away from the contact "divergent contacts". -
Fixed issue where
ex.Sound
wasn't being paused when the browser window lost focus
- Updated the collision system to improve performance
- Cache computed values where possible
- Avoid calculating transformations until absolutely necessary
- Avoid calling methods in tight loops
ex.Engine.configurePerformanceCanvas2DFallback
no longer requiresthreshold
orshowPlayerMessage
ex.Engine.snapToPixel
now defaults tofalse
- Most places where
ex.Matrix
was used have been switched toex.AffineMatrix
- Most places where
ex.TransformComponent
was used have been switched toex.Transform
ex.Line
has be replaced with a new Graphics type, the old geometric behavior is now under the typeex.LineSegment
- Notable deprecated types removed
ex.SortedList
old sorted list is removedex.Collection
old collection type is removedex.Util
import site, exported code promotedex.*
ex.DisplayMode.Position
is removed, use CSS to position the canvasex.Trait
interface, traits are not longer supportedex.Promises
old promise implementation is removed in favor of browser promises
- Notable method & property removals
ex.Actor
.getZIndex()
and.setZIndex()
removed use.z
ex.Scene
.screenElements
removed in favor of.entities
.addScreenElement(...)
removed use.add(...)
.addTileMap(...)
removed use.add(...)
.removeTileMap(...)
removed use.remove(...)
ex.Timer
.unpause()
removed use.resume()
ex.Camera
.rx
removed use.angularVelocity
ex.BodyComponent
.sx
removed use.scaleFactor
.rx
removed use.angularVelocity
ex.ActionsComponent
.asPromise()
removed use.toPromise()
ex.ActionContext
.asPromise()
removed use.toPromise()
ex.Color
- Misspellings corrected
- The old drawing API had been removed from excalibur, this should not affect you unless you were using the
ex.Flags.useLegacyDrawing()
orex.Flags.useCanvasGraphicsContext()
.- Notably all implementations of
Drawable
are removed, use the newGraphics
API - Methods on actor
ex.Actor.setDrawing(...)
,ex.Actor.addDrawing(...)
are removed, use theex.Actor.graphics.add(...)
,ex.Actor.graphics.show(...)
andex.Actor.graphics.use(...)
- The
ex.Actor.onPreDraw(...)
andex.Actor.onPostDraw(...)
are removed, useex.Actor.graphics.onPreDraw(...)
andex.Actor.graphics.onPostDraw(...)
- The events
predraw
andpostdraw
are removed ex.Scene.onPreDraw()
andex.Scene.onPostDraw()
are now called with theExcaliburGraphicsContext
instead of anCanvasRenderingContext2D
- Notably all implementations of
ex.TileMap
has several breaking changes around naming, but brings it consistent with Tiled terminology and the newex.IsometricMap
. Additionally the new names are easier to follow.- Constructor has been changed to the following
new ex.TileMap({ pos: ex.vec(100, 100), tileWidth: 64, tileHeight: 48, rows: 20, columns: 20 });
ex.Cell
has been renamed toex.Tile
ex.Tile
now usesaddGraphic(...)
,removeGraphic(...)
,clearGraphics()
andgetGraphics()
instead of having an accessibleex.Tile.graphics
array.
ex.TileMap.data
has been renamed toex.TileMap.tiles
ex.TileMap.getCell(..)
has been renamed toex.TileMap.getTile(...)
ex.TileMap.getCellByIndex(...)
has been renamed toex.TileMap.getTileByIndex(...)
ex.TileMap.getCellByPoint(...)
has been renamed toex.TileMap.getTileByPoint(...)
- Constructor has been changed to the following
-
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. -
Added new
ex.Line
graphics object for drawing lines!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);
-
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 } });
-
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.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)));
-
Added feature to build
SpriteSheet
s from a list of different sized source views usingex.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}, ] });
-
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. -
Added the ability to clone into a target
Matrix
this is useful to save allocations and in turn garbage collection pauses. -
ex.Engine
now support setting the pixel ratio in the constructornew ex.Engine({pixelRatio: 2})
, this is useful for smoothex.Text
rendering whenantialiasing: false
and rendering pixel art type graphics -
ex.TileMap
now supports per Tile 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 asex.TileMap
)new ex.IsometricMap({ pos: ex.vec(250, 10), tileWidth: 32, tileHeight: 16, columns: 15, rows: 15 });
ex.IsometricTile
now come with aex.IsometricEntityComponent
which can be applied to any entity that needs to be correctly sorted to preserve the isometric illusionex.IsometricEntitySystem
generates a new z-index based on theelevation
and y position of an entity withex.IsometricEntityComponent
-
Added arbitrary non-convex polygon support (only non-self intersecting) with
ex.PolygonCollider(...).triangulate()
which builds a newex.CompositeCollider
composed of triangles. -
Added faster
ex.BoundingBox.transform(...)
implementation. -
Added faster
ex.BoundingBox.overlap(...)
implementation. -
Added
ex.Vector.min(...)
andex.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. -
Added new display mode
ex.DisplayMode.FitContainerAndFill
. -
Added new display mode
ex.DisplayMode.FitScreenAndFill
. -
Added new display mode
ex.DisplayMode.FitContainerAndZoom
. -
Added new display mode
ex.DisplayMode.FitScreenAndZoom
.
- Fixed unreleased issue where fixed update interpolation was incorrect with child actors
- Fixed unreleased bug where CompositeCollider components would not collide appropriately because contacts did not have unique ids
- Fixed issue where CompositeColliders treat separate constituents as separate collisionstart/collisionend which is unexpected
- Fixed issue where resources that failed to load would silently fail making debugging challenging
- Fixed issue where large pieces of Text were rendered as black rectangles on mobile, excalibur now internally breaks these into smaller chunks in order to render them.
- Fixed issue #2263 where keyboard input
wasPressed
was not working in theonPostUpdate
lifecycle - Fixed issue #2263 where there were some keys missing from the
ex.Input.Keys
enum, includingEnter
- Fixed issue where Rectangle line renderer did not respect z order
- Performance improvement to the
ex.Loader
screen keeping frame rates higher by only updating the backingex.Canvas
when there are changes - Improved collision broadphase by swapping to a more efficient
ex.BoundingBox.overlaps
check - Improved collision narrowphase by improving
ex.PolygonCollider
calculations for localBounds, bounds, and transformed point geometry - Improved Text/Font performance by internally caching expensive native
measureText()
calls - Performance improvement to GraphicsSystem
- Performance improvement to the transform capture of the previous frame transform and motion
- Split offscreen detection into a separate system
- Renamed
ex.Matrix.multv()
andex.Matrix.multm()
toex.Matrix.multiply()
which matches our naming conventions
- Small breaking change to
engine.screenshot()
you must now useawait engine.screenshot()
. This avoids copy buffer performance impact ofpreserveDrawingBuffer: true
by capturing a screen shot request on the next frame when the buffer has not yet been cleared.
- Fixed issue where collision normals are inaccurate on polygon colliders that offset from their origin
- Fixed issue where only Pixel 6 devices crash when using their MAX_TEXTURE_IMAGE_UNITS, artificially cap Excalibur to 125 textures max
- Fixed issue [#2224] where pointer events sometimes didn't work in mobile platforms due to
touch-action
not being set tonone
- Fixed issue [#2203] where
engine.screenshot()
did not work in the WebGL implementation - Fixed issue [#1528] where screenshots didn't match the displayed game's size in HiDPI displays, images are now consistent with the game. If you want the full scaled image pass
engine.screenshot(true)
to preserve HiDPI Resolution. - Fixed issue [#2206] error and warning logs for large images to help developers identify error situations in the webgl implementation
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 interfaceexport interface PostProcessor { intialize(gl: WebGLRenderingContext): void; getShader(): Shader; }
- The static
Engine.createMainLoop
is now marked deprecated and will be removed in v0.26.0, it is replaced by theClock
api - Mark legacy draw routines in
ex.Engine
,ex.Scene
, andex.Actor
deprecated
-
Added ability to build custom renderer plugins that are accessible to the
ex.ExcaliburGraphicsContext.draw<TCustomRenderer>(...)
after registering themex.ExcaliburGraphicsContext.register(new LineRenderer())
-
Added ability to draw circles and rectangles with outlines!
ex.ExcaliburGraphicsContext.drawCircle(...)
andex.ExcaliburGraphicsContext.drawRectangle(...)
-
Added
ex.CoordPlane
can be set in thenew ex.Actor({coordPlane: CoordPlane.Screen})
constructor -
Added convenience feature, setting the color, sets the color on default graphic if applicable
-
Added a
DebugGraphicsComponent
for doing direct debug draw in theDebugSystem
-
Added back TileMap debug draw
-
Added
ex.Scene.timers
to expose the list of timers -
Added support for different webgl texture blending modes as
ex.ImageFiltering
:ex.ImageFiltering.Blended
- Blended is useful when you have high resolution artwork and would like it blended and smoothedex.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 graphicantialiasing: true
, then the blend mode defaults toex.ImageFiltering.Blended
antialiasing: false
, then the blend mode defaults toex.ImageFiltering.Pixel
-
ex.Text/ex.Font
defaults to blended which improves the default look of text rendering dramatically! -
ex.Circle
andex.Polygon
also default to blended which improves the default look dramatically! -
ex.ImageSource
can now specify a blend mode before the Image is loaded, otherwise -
Added new
measureText
method to theex.SpriteFont
andex.Font
to return the bounds of any particular text -
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, likeperformance.now()
StandardClock
encapsulates the existingrequestAnimationFrame
api logicTestClock
allows a user to manually step the mainloop, this can be useful for frame by frame debugging #1170- 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. -
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 eventsuseGraphicsBounds
- (default false) uses the graphics bounds for pointer events
- Fixed issue [#2192] where Actor.center was not correct in child actors
- Fixed issue where
ex.CircleCollider
s did not respect rotation/scale when offset - Fixed issue [#2157] when compiling in TS strict mode complaining about
ex.Poolable
- Fixed issue where scaled graphics were not calculating the correct bounds
- Fixed unreleased issue where clock implementation was not updating frame id
- Fixed alpha pre-multiply math in multiple shaders
- Fixed label initialization of fonts, passing a font in the constructor work
- Fixed bug in sprite bounds calculations not taking scale into account
- Fixed bug with pointer api where clicking on screen coordinate actors didn't work
- Fixed [#1815] issue where Camera would jitter when using a strategies based off of actors in the previous frame.
- Fixed issue where TileMaps would sometimes have a geometry seam that may not fall on an actual screen pixel causing a visible gap between tiles and the background
--
- Fixed unreleased issue where SpriteFonts log every frame they detect a misconfigured font.
- Fixed unreleased issue where clock when constraining fps would pass larger than expected elapsed times to the simulation causing things to "speed up" bizarrely
- Fixed unreleased issue where games with no resources would crash
- Fixed issue [#2152] where shared state in
ex.Font
andex.SpriteFont
prevented text from aligning properly when re-used - Fixed issue where fast moving
CompositeCollider
s were erroneously generating pairs for their constituent parts - Fixed Safari 13.1 crash when booting Excalibur because of they odd MediaQuery API in older Safari
- Fixed issue where pointers did not work because of missing types
- Fixed issue with
ArcadeSolver
where stacked/overlapped tiles would double solve the position of the collider for the same overlap - Fixed issue where changing the
ex.Sprite.width
orex.Sprite.height
did not resize the graphic. - Fixed issue where initial Actor anchors set in the constructor were not being set in the graphics component
- EventDispatcher
EventDispatcher
- doesn't require the target object. The context ofthis
is not tampered anymore.
- Pointers
PointerAbstraction
- is fixed to maintain reference
- The following Engine's pieces:
Collision
Graphics
Resources
Trigger
are updated to reflect the new EventDispatcher behavior. - Refactor camera/screen interaction to utilize transforms instead of bespoke coordinate conversion
- Updated Graphics to improve general performance
- Updated the webgl primitives to make building
ex.Shader
s,ex.VertexBuffer
s, andex.VertexLayout
s much easier - Broke up the internal monolithic shader into separate internal renderer plugins
- Changed the debug system to separate displaying the debug position point (
game.debug.transform.showPosition = true
) and debug position label (game.debug.transform.showPositionLabel = true
) ex.ColorBlindCorrector
is renamed toex.ColorBlindnessPostProcessor
, andex.ColorBlindness
is renamed toex.ColorBlindnessMode
- Color blindness can still be corrected or simulated:
game.debug.colorBlindMode.correct(ex.ColorBlindnessMode.Deuteranope)
game.debug.colorBlindMode.simulate(ex.ColorBlindnessMode.Deuteranope)
- Color blindness can still be corrected or simulated:
- Excalibur now uses pre-multiplied alpha automatically, images will be unpacked into memory using
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true)
- Excalibur FPS is now sampled over 100ms blocks, this gives a more usable fps in the stats. The sampler is available off of the engine clock
engine.clock.fpsSampler.fps
- Pointer Events:
- Event types (up, down, move, etc) now all exist in 2 types
ex.Input.PointerEvent
andex.Input.WheelEvent
- The
stopPropagation()
method used to cancel further dispatches has been renamed tocancel()
to match other events API. - Events no longer have a reference to the
pointer
but now have all of the same information that was availabe on the pointerworldPos
,screenPos
,pagePos
- Event types (up, down, move, etc) now all exist in 2 types
0.25.1 - 2021-11-05
- Experimental: Native ES module bundle distribution in package
esm/excalibur.js
entrypoint (#2064) withEngine
utils support an aditional options parameter to override the Engine default options.- Story to show a play / pause implementation.
ex.Animation
now supporttotalDuration
that will calculate automatically each frame duration based on how many frames have.ex.Animation
now supports.reverse()
to reverse the direction of play in an animation, use theex.Animation.direction
to inspect if the animation is playing in theex.AnimationDirection.Forward
direction or theex.AnimationDirection.Backward
direction.
- Pointer system refactored into 2 parts:
- First is an ECS style system
ex.PointerSystem
that dispatches events to Entities/Actors - Second is an event receiver
ex.PointerEventReceiver
which is responsible for collecting the native browser events - The API is mostly backwards compatible breaking changes are listed in the breaking change section, event types have been simplified, and
stopPropagation()
and been renamed tocancel()
- First is an ECS style system
- Internal Actions implementation converted to ECS system and component, this is a backwards compatible change with v0.25.0
ex.ActionsSystem
andex.ActionsComponent
now wrap the existingex.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
- Actions
asPromise()
renamed totoPromise()
- Fixed loader button position on window resize
- Fixed issue with setting
ex.TileMap.z
to a value - Fixed crash in debug system if there is no collider geometry
- Fixed ImageSource loading error message [#2049]
0.25.0 - 2021-10-03
-
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
- 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 heighthasZeroDimensions()
BoundingBox
's can now bytransform
'd by aMatrix
- Added
new Entity(components: Component[])
constructor overload to create entities with components quickly. - Added
Entity.get(type: ComponentType)
to get strongly typed components if they exist on the entity. - Added
Entity.has(type: ComponentType)
overload to check if an entity has a component of that type. - Added
Entity.hasTag(tag: string)
,Entity.addTag(tag: string)
, andEntity.removeTag(tag: string, force: boolean)
.- Tag
offscreen
is now added to entities that are offscreen
- Tag
- Added
Entity.componentAdded$
andEntity.componentRemoved$
for observing component changes on an entity. - For child/parent entities:
- Added
Entity.addChild(entity: Entity)
,Entity.removeChild(entity: Entity)
,Entity.removeAllChildren()
for managing child entities - Added
Entity.addTemplate(templateEntity: Entity)
for adding template entities or "prefab". - Added
Entity.parent
readonly accessor to the parent (if exists), andEntity.unparent()
to unparent an entity. - Added
Entity.getAncestors()
is a sorted list of parents starting with the topmost parent. - Added
Entity.children
readonly accessor to the list of children.
- Added
- Add the ability to press enter to start the game after loaded
- Add Excalibur Feature Flag implementation for releasing experimental or preview features (#1673)
- Color now can parse RGB/A string using Color.fromRGBString('rgb(255, 255, 255)') or Color.fromRGBString('rgb(255, 255, 255, 1)')
DisplayMode.FitScreen
will now scale the game to fit the available space, preserving theaspectRatio
. (#1733)SpriteSheet.spacing
now accepts a structure{ top: number, left: number, margin: number }
for custom spacing dimensions (#1788)SpriteSheet.ctor
now has an overload that acceptsspacing
for consistency although the object constructor is recommended (#1788)- Add
SpriteSheet.getSpacingDimensions()
method to retrieve calculated spacing dimensions (#1788) - Add
KeyEvent.value?: string
which is the key value (or "typed" value) that the browser detected. For example, holding Shift and pressing 9 will have a value of(
which is the typed character. - Add
KeyEvent.originalEvent?: KeyboardEvent
which exposes the raw keyboard event handled from the browser. - Added a new getter to GraphicsComponent.ts called currentKeys that will return the names of the graphics shown in all layers
- Added a new getter to GraphicsLayer called currentKeys that will the names of the graphics shown in this layer
Gif
now supports new graphics componentAlgebra.ts
refactored into separate files inMath/
- Engine/Scene refactored to make use of the new ECS world which simplifies their logic
TileMap
now uses the built inCollider
component instead of custom collision code.- Updates the Excalibur ECS implementation for ease of use and Excalibur draw system integration
- Adds "ex." namespace to built in component types like "ex.transform"
- Adds
ex.World
to encapsulate all things ECS - Adds
ex.CanvasDrawSystem
to handle all HTML Canvas 2D drawing via ECS - Updates
ex.Actor
to use newex.TransformComponent
andex.CanvasDrawComponent
Timer.unpause()
has be deprecated in favor ofTimer.resume()
(#1864)- Removed UIActor Stub in favor of ScreenElement (#1656)
ex.SortedList
as deprecatedex.Promise
is marked deprecated (#994)ex.DisplayMode.Position
CSS can accomplish this task better than Excalibur (#1733)
- Fixed allow
ex.ColliderComponent
to not have a collider - Fixed issue where collision events were not being forwarded from individual colliders in a
ex.CompositeCollider
- Fixed issue where
ex.CompositeCollider
's individual colliders were erroneously generating pairs - Fixed issue where
GraphicsOptions
width/height
could not be used to define aex.Sprite
with equivalentsourceView
anddestSize
(#1863) - Fixed issue where
ex.Scene.onActivate/onDeactivate
were called with the wrong arguments (#1850) - Fixed issue where no width/height argmunents to engine throws an error
- Fixed issue where zero dimension image draws on the ExcaliburGraphicsContext throw an error
- Fixed issue where the first scene onInitialize fires at Engine contructor time and before the "play button" clicked (#1900)
- Fixed issue where the "play button" click was being interpreted as an input event excalibur needed to handle (#1854)
- Fixed issue where pointer events were not firing at the ex.Engine.input.pointers level (#1439)
- Fixed issue where pointer events propagate in an unexpected order, now they go from high z-index to low z-index (#1922)
- Fixed issue with Raster padding which caused images to grow over time (#1897)
- Fixed N+1 repeat/repeatForever bug (#1891)
- Fixed repeat/repeatForever issue with
rotateTo
(#635) - Entity update lifecycle is now called correctly
- Fixed GraphicsSystem
enterviewport
andexitviewport
event - Fixed DOM element leak when restarting games, play button elements piled up in the DOM.
- Fixed issues with
ex.Sprite
not rotating/scaling correctly around the anchor (Related to TileMap plugin updates excaliburjs/excalibur-tiled#4, excaliburjs/excalibur-tiled#23, excaliburjs/excalibur-tiled#108)- Optionally specify whether to draw around the anchor or not
drawAroundAnchor
- Optionally specify whether to draw around the anchor or not
- Fixed in the browser "FullScreen" api, coordinates are now correctly mapped from page space to world space (#1734)
- Fix audio decoding bug introduced in excaliburjs#1707
- Fixed issue with promise resolve on double resource load (#1434)
- Fixed Firefox bug where scaled graphics with anti-aliasing turned off are not pixelated (#1676)
- Fixed z-index regression where actors did not respect z-index (#1678)
- Fixed Animation flicker bug when switching to an animation (#1636)
- Fixed
ex.Actor.easeTo
actions, they now use velocity to move Actors (#1638) - Fixed
Scene
constructor signature to make theEngine
argument optional (#1363) - Fixed
anchor
properly of single shapeActor
#1535 - Fixed Safari bug where
Sound
resources would fail to load (#1848)
0.24.5 - 2020-09-07
- [#1361] Makes use of proxies, Excalibur longer supports IE11 💥 ([#1361]excaliburjs#1361)
- Adds new ECS Foundations API, which allows excalibur core behavior to be manipulated with ECS style code ([#1361]excaliburjs#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 Animation flicker bug on the first frame when using animations with scale, anchors, or rotation. (#1636)
0.24.4 - 2020-09-02
- 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
- 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
- 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)
0.24.0 - 2020-04-23
- Remove obsolete
.extend()
semantics in Class.ts as as well as related test cases.
- 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)
- 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)
ex.Vector.magnitude()
will be removed inv0.25.0
, useex.Vector.size()
. (#1277)
- 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)
0.23.0 - 2019-06-08
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.
- 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. - New interface
Clonable<T>
to indicate if an object contains a clone method - New 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)
- 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
(moment of inertia) - Renamed
restitution
to the propertybounciness
- Moved
collisionType
toActor.body.collider.type
- Moved
Actor.integrate
toActor.body.integrate
- Add new
- 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.restitution
- 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 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)
0.22.0 - 2019-04-06
ex.BaseCamera
replaced withCamera
(#1087)
- Added
enableCanvasTransparency
property that can enable/disable canvas transparency (#1096)
- Upgraded Excalibur to TypeScript 3.3.3333 (#1052)
- Added exceptions on
SpriteSheetImpl
constructor to check if the source texture dimensions are valid (#1108)
0.21.0 - 2019-02-02
- Added ability to automatically convert .gif files to SpriteSheet, Animations, and Sprites (#153)
- New
viewport
property on camera to return a world space bounding box of the current visible area (#1078)
- Updated
ex.Color
andex.Vector
constants to be static getters that return new instances each time, eliminating a common source of bugs (#1085) - Remove optionality of engine in constructor of Scene and _engine private with an underscore prefix (#1067)
- Rename
ex.BaseCamera
toCamera
,ex.BaseCamera
will be removed inv0.22.0
(#1087)
- Fixed issue of early offscreen culling related to zooming in and out (#1078)
- Fixed issue where setting
suppressPlayButton: true
blocks load in certain browsers (#1079) - Fixed issue where the absence of a pointer button caused an error in the console(#1153)
0.20.0 - 2018-12-10
ex.PauseAfterLoader
removed, useex.Loader
instead (#1031)
- Added strongly-typed
EventTypes
enum to Events.ts to avoid magic strings (#1066)
- Added parameter on SpriteSheet constructor so you can define how many pixels of space are between sprites (#1058)
0.19.1 - 2018-10-22
- Fixed issue where there were missing files in the dist (Loader.css, Loader.logo.png) (#1057)
0.19.0 - 2018-10-13
- Excalibur user documentation has now moved to excaliburjs.com/docs
- Excalibur will now prompt for user input before starting the game to be inline with the new webaudio requirements from chrome/mobile browsers (#1031)
PauseAfterLoader
for iOS in favor of new click-to-play functionality built into the defaultLoader
(#1031)
- Fixed issue where Edge web audio playback was breaking (#1047)
- Fixed issue where pointer events do not work in mobile (#1044)
- Fixed issue where iOS was not loading by including the right polyfills (#1043)
- Fixed issue where sprites do not work in Firefox (#980)
- Fixed issue where collision pairs could sometimes be incorrect (#975)
- Fixed box collision velocity resolution so that objects resting on a surface do not accumulate velocity (#986)
0.18.0 - 2018-08-04
Sound.setVolume()
replaced withSound.volume
Sound.setLoop()
replaced withSound.loop
- Add
Scene.isActorInDrawTree
method to determine if an actor is in the scene's draw tree.
- Fixed missing
exitviewport/enterviewport
events on Actors.on/once/off signatures (#978) - Fix issue where Actors would not be properly added to a scene if they were removed from that scene during the same frame (#979)
0.17.0 - 2018-06-04
- Property scope
Pointer.actorsUnderPointer
changed to private Sprite.sx
replaced withSprite.x
Sprite.sy
replaced withSprite.y
Sprite.swidth
replaced withSprite.width
Sprite.sheight
replaced withSprite.height
- Allow timers to limit repeats to a finite number of times (#957)
- Convenience method on Scene to determine whether it is the current scene. Scene.isCurrentScene() (#982)
- New
PointerEvent.stopPropagation()
method added. Works the same way as (https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation
) (#912) - New
Actor.getAncestors()
method, which retrieves full array of current Actor ancestors - Static
Actor.defaults
prop, which implementsIActorDefaults
. - Native sound events now exposed
volumechange
- on playing sound volume change;pause
- on playback pause;stop
- on playback stop;emptied
- on data cleanup(f.e. when setting new data);resume
- on playback resume;playbackstart
- on playback start;playbackend
- on playback end;
- Added
Sound.instances
getter, which returns active tracks. Playing or paused - Added
Sound.getTrackId(track: [[AudioInstance]])
method. Which returns id of track provided, if it is in list of active tracks.
- Refactored Easing functions to be reversable (#944)
- Now at creation every
Actor.anchor
prop is set to defaultActor.defaults.anchor
. - Scene.remove(Actor) now starts the Actor.Kill event cycle (#981)
CapturePointer.update()
method now doesn't propagate event to actor, just verifies pointer events for actor.- Added
Sound.volume
&Sound.loop
properties as a replacement forSound.setVolume()
andSound.setLoop()
. The methodssetVolume
andsetLoop
have been marked obsolete.
- Added missing variable assignments to TileMapImpl constructor (#957)
- Correct setting audio volume level from
value
tosetValueAtTime
to comply with deprecation warning in Chrome 59 (#953) - Force HiDPI scaling to always be at least 1 to prevent visual artifacts in some browsers
- Recalculate physics geometry when width/height change on Actor (#948)
- Fix camera move chaining (#944)
- Fix
pickSet(allowDuplicates: true)
now returns the proper length array with correct elements (#977) Index
export order to preventalmond.js
from creation of corrupted modules loading order.Sound.pause()
now saves correct timings.- Fix
ex.Vector.isValid
edgecase atInfinity
(#1006)
0.16.0 - 2018-03-31
- New typesafe and override safe event lifecycle overriding, all
onEventName
handlers will no longer be dangerous to override (#582)- New lifecycle event
onPreKill
andonPostKill
- New lifecycle event
- SpriteSheets can now produce animations from custom sprite coordinates
SpriteSheet.getAnimationByCoords(engine, coords[], speed)
(#918) - Added drag and drop support for Actors (#134)
- New Event
enter
- New Event
leave
- New Event
pointerenter
- New Event
pointerleave
- New Event
pointerdragstart
- New Event
pointerdragend
- New Event
pointerdragmove
- New Event
pointerdragenter
- New Event
pointerdragleave
- New Class
PointerDragEvent
which extendsPointerEvent
- New Class
GlobalCoordinates
that contains Vectors for the world, the page, and the screen. - Added property
ICapturePointerConfig.captureDragEvents
which controls whether to emit drag events to the actor - Added property
PointerEvent.pointer
which equals the original pointer object
- New Event
Sprite.sx
,Sprite.sy
,Sprite.swidth
,Sprite.sheight
have been deprecated in favor ofSprite.x
,Sprite.y
,Sprite.width
,Sprite.height
(#918)
- Added missing lifecycle event handlers on Actors, Triggers, Scenes, Engine, and Camera (#582)
- Tile Maps now correctly render negative x-axis coordinates (#904)
- Offscreen culling in HiDPI mode (#949)
- Correct bounds check to check drawWidth/drawHeight for HiDPI
- suppressHiDPIScaling now also suppresses pixel ratio based scaling
- Extract and separate Sprite width/height from drawWidth/drawHeight to prevent context corruption (#951)
0.15.0 - 2018-02-16
LockedCamera
replaced withBaseCamera.strategy.lockToActor
SideCamera
replaced withBaseCamera.strategy.lockToActorAxis
Body.wasTouching
replaced with event typeCollisionEnd
- Option bag constructors have been added for commonly-used classes (see Constructors.md) (#410)
0.14.0 - 2017-12-02
- Triggers now have a new option bag constructor using the
ITriggerOptions
interface. (#863). update
event replaced withpostupdate
eventCollisionEvent
replaced byPreCollisionEvent
getDrawWidth()
andgetDrawHeight()
replaced with the gettersdrawWidth
anddrawHeight
PointerEvent.x
andPointerEvent.y
replaced withPointerEvent.pos
- Automatic HiDPI screen detection and scaling in excalibur internals to correct blurry bitmap rendering on HiDPI screens. This feature can optionally be suppressed with
IEngineOptions.suppressHiDPIScaling
. - Added new line utility
Line.normal()
andLine.distanceToPoint
(#703) - Added new PolygonArea utility
PolygonArea.getClosestFace(point)
(#703) - Triggers now fire an
EnterTriggerEvent
when an actor enters the trigger, and anExitTriggerEvent
when an actor exits the trigger. (#863) - Actors have a new events
CollisionStart
which when 2 actors first start colliding andCollisionEnd
when 2 actors are no longer colliding. (#863) - New camera strategies implementation for following targets in a scene. Allows for custom strategies to be implemented on top of some prebuilt
LockCameraToActorStrategy
which behaves likeLockedCamera
and can be switched on withCamera.strategy.lockToActor(actor)
.LockCameraToActorAxisStrategy
which behaves likeSideCamera
and can be switched on withCamera.strategy.lockToActorAxis(actor, ex.Axis.X)
ElasticToActorStrategy
which is a new strategy that elastically moves the camera to an actor and can be switched on withCamera.strategy.elasticToActor(actor, cameraElasticity, cameraFriction)
CircleAroundActorStrategy
which is a new strategy that will follow an actor when a certain radius from the camera focus and can be switched on withCamera.strategy.circleAroundActor(actor)
Trigger
has been rebuilt to provide a better experience
Body.wasTouching
has been deprecated in favor of a new event typeCollisionEnd
(#863)SideCamera
andLockedCamera
are deprecated in favor of camera strategies
- Fixed odd jumping behavior when polygons collided with the end of an edge (#703)
0.13.0 - 2017-10-07
Scene.children
replaced withScene.actors
- Convenience getters implemented
halfDrawWidth
,halfDrawHeight
,halfCanvasWidth
,halfCanvasHeight
,canvasWidth
, andcanvasHeight
. - New pause/unpause feature for timers to help with more robust pausing (#885)
- New event listening feature to listen to events only
.once(...)
then unsubscribe automatically (#745) - New collision event
postcollision
to indicate if collision resolution occured (#880)
PointerEvent.x
andPointerEvent.y
, in favor ofPointerEvent.pos
(#612)CollisionEvent
has been deprecated in favor of the more clearPreCollisionEvent
(#880)getDrawWidth()
andgetDrawHeight()
have been marked obsolete and changed into the gettersdrawWidth
anddrawHeight
respectively in order to progressively make getters/setters consistent (#861)
- Fixed same instance of color potentially being shared, and thus mutated, between instance actors (#840)
- Fixed bug where active and passive type collisions would resolve when they shouldn't in rigid body physics mode (#880)
0.12.0 2017-08-12
CollisionType.Elastic
has been removedPromises.wrap
has been replaced withPromise.resolve
- Added new hsl and hex format options in Color.toString(format). rgb is the default to maintain backwards compatibility (#852)
Animation.loop
property now to set totrue
by default (#583)- Added backgroundColor to engine options as part of Engine constructor (#846)
ex.Scene.children
is nowex.Scene.actors
(#796)
0.11.0 2017-06-10
- Renamed
Utils.removeItemToArray()
toUtils.removeItemFromArray()
(#798)
- Added optional volume argument to
Sound.play(volume?: number)
, which will play the Audio file at anywhere from mute (volume
is 0.0) to full volume (volume
is 1.0). (#801) - Added another DisplayMode option:
DisplayMode.Position
. When this is selected as the displayMode type, the user must specify a newposition
option (#781) - Added a static method
distance
to theVector
class (#517) - Added
WheelEvent
event type for thewheel
browser event, Excalibur now supports scroll wheel (#808)
- Camera zoom over time now returns a promise that resolves on completion (#800)
- Edge builds have more descriptive versions now containing build number and Git commit hash (e.g.
0.10.0-alpha.105#commit
) (#777)
- Fixed camera zoom over time, before it did not work at all (#800)
- Fixed semi-colon key not being detected on Firefox and Opera. (#789)
0.10.0 2017-04-07
- Rename
Engine.width
andEngine.height
to beEngine.canvasWidth
andEngine.canvasHeight
(#591) - Rename
Engine.getWidth
andEngine.getHeight
to beEngine.getDrawWidth
andEngine.getDrawHeight
(#591) - Changed
GameEvent
to be a generic type for TypeScript, allowing strongly typing thetarget
property. (#724) - Removed
Body.useEdgeCollision()
parametercenter
(#724)
- Added
Engine.isPaused
to retrieve the running status of Engine (#750) - Added
Engine.getWorldBounds
to provide a quick way to get the top left corner and bottom right corner of the screen (#729) - Added predraw and postdraw events to
Engine
class. These events happen when prior to and after a draw (#744) - Added Perlin noise generation helper
ex.PerlinGenerator
for 1d, 2d, and 3d noise, along with drawing utilities (#491) - Added font styles support for normal, italic, and oblique in addition to bold text support (#563)
- Update project to use TypeScript 2.2.2 (#762)
- Changed
Util.extend
to includeObject.assign
functionality (#763)
- Update the order of the affine transformations to fix bug when scaling and rotating Actors (#770)
0.9.0 2017-02-09
- Added
preupdate
,postupdate
,predraw
,postdraw
events to TileMap - Added
ex.Random
with seed support via Mersenne Twister algorithm (#538) - Added extended feature detection and reporting to
ex.Detector
(#707)ex.Detector.getBrowserFeatures()
to retrieve the support matrix of the current browserex.Detector.logBrowserFeatures()
to log the support matrix to the console (runs at startup when in Debug mode)
- Added
@obsolete
decorator to help give greater visibility to deprecated methods (#684) - Added better support for module loaders and TypeScript importing. See Installation docs for more info. (#606)
- Added new Excalibur example project templates (#706, #733):
- Added
Pointer.lastPagePos
,Pointer.lastScreenPos
andPointer.lastWorldPos
that store the last pointer move coordinates (#509)
- Fixed Scene/Actor activation and initialization order, actors were not being initialized before scene activation causing bugs (#661)
- Fixed bug where the engine would not load if a loader was provided without any resources (#565)
- Fixed bug where an Actor/UIActor/TileMap added during a Timer callback would not initialize before running
draw
loop. (#584) - Fixed bug where on slower systems a Sprite may not be drawn on the first
draw
frame (#748)
0.8.0 2016-12-04
ex.Vector.magnitude
alias that callsex.Vector.distance()
to get magnitude of Vector (#663)- Added new
ex.Line
utilities (#662):ex.Line.slope
for the raw slope (m) valueex.Line.intercept
for the Y intercept (b) valueex.Line.findPoint(x?, y?)
to find a point given an X or a Y valueex.Line.hasPoint(x, y, threshold)
to determine if given point lies on the line
- Added
Vector.One
andVector.Half
constants (#649) - Added
Vector.isValid
to check for null, undefined, Infinity, or NaN vectors method as part of (#665) - Added
ex.Promise.resolve
andex.Promise.reject
static methods (#501) - PhantomJS based testing infrastructure to accurately test browser features such as image diffs on canvas drawing (#521)
- Added some basic debug stat collection to Excalibur (#97):
- Added
ex.Engine.stats
to hold frame statistic information - Added
ex.Engine.debug
to hold debug flags and current frame stats - Added
preframe
andpostframe
events toEngine
as hooks - Added ex.Physics statistics to the Excalibur statistics collection
- Added
- Added new fast body collision detection to Excalibur to prevent fast moving objects from tunneling through other objects (#665)
- Added DynamicTree raycast to query the scene for bounds that intersect a ray
- Added fast BoundingBox raycast test
- Internal physics names refactored to be more readable and to use names more in line with game engine terminology (explicit broadphase and narrowphase called out)
ex.Promise.wrap
(#501)
- Fix
Actor.oldPos
andActor.oldVel
values on update (#666) - Fix
Label.getTextWidth
returns incorrect result (#679) - Fix semi-transparent PNGs appear garbled (#687)
- Fix incorrect code coverage metrics, previously our test process was reporting higher than actual code coverage (#521)
- Fix
Actor.getBounds()
andActor.getRelativeBounds()
to return accurate bounding boxes based on the scale and rotation of actors. (#692)
0.7.1 - 2016-10-03
- Refactored and modified Sound API (#644)
Sound.setData
now returns a Promise which differs from previous API- Removed internal
FallbackAudio
andSound
classes and replaced with singleSound
class - Added
AudioTagInstance
andWebAudioInstance
internal classes
ex.Promise.join(Promise[])
support (in addition to...promises
support) (#642)- Moved build artifacts to separate excalibur-dist repository (#648)
ex.Events
namespace and typed event handler.on(...)
overloads for default events on core excalibur objects (#639)Engine.timescale
property (default: 1.0) to add time-scaling to the engine for time-based movements (#543)- Two new parameters to
ex.Util.DrawUtil.line
that accept a line thickness and end-cap style (#658)
Actor.actions.fade
properly supporting fading between 0 and 1 and vice versa (#640)- Fix issues with audio offset tracking and muting while game is invisible (#644)
Actor.getHeight()
andActor.getWidth()
now take into account parent scaling (#645)Actor.debugDraw
now works properly for child actors (#505, #645)- Sprite culling was double scaling calculations (#646)
- Fix negative zoom sprite culling (#539)
- Fix Actor updates happening more than once per frame, causing multiple pointer events to trigger (#643)
- Fix
Actor.on('pointerup')
capturePointer events opt-in on event handler. The opt-in was triggering correctly for handlers on 'pointerdown' and 'pointermove', but not 'pointerup'.
0.7.0 - 2016-08-29
- Code marked 'Obsolete' has been removed (#625, #603)
Actor
addEventListener
getWorldX
,getWorldY
clearActions
,easeTo
,moveTo
,moveBy
,rotateTo
,rotateBy
,scaleTo
,scaleBy
,blink
,fade
,delay
,die
,callMethod
,asPromise
,repeat
,repeatForever
,follow
,meet
Class
addEventListener
,removeEventListener
Engine
- parameterized constructor
addChild
,removeChild
UpdateEvent
removed
Scene.addChild
andScene.removeChild
are now protected- Removed ex.Template and ex.Binding (#627)
- New physics system, physical properties for Actors (#557, #472)
- Read The Docs support for documentation (#558)
- Continuous integration builds unstable packages and publishes them (#567)
- Sound and Texture resources can now process data (#574)
- Actors now throw an event when they are killed (#585)
- "Tap to Play" button for iOS to fulfill platform audio requirements (#262)
- Generic lerp/easing functions (#320)
- Whitespace checking for conditional statements (#634)
- Initial support for Yeoman generator (#578)
- Upgraded Jasmine testing framework to version 2.4 (#126)
- Updated TypeScript to 1.8 (#596)
- Improved contributing document (#560)
- Improved local and global coordinate tracking for Actors (#60)
- Updated loader image to match new logo and theme (#615)
- Ignored additional files for Bower publishing (#614)
- Actions on the action context threw an error (#564)
- Actor
getLeft()
,getTop()
,getBottom()
andgetRight()
did not respect anchors (#568) - Actor.actions.rotateTo and rotateBy were missing RotationType (#575)
- Actors didn't behave correctly when killed and re-added to game (#586)
- Default fontFamily for Label didn't work with custom FontSize or FontUnit (#471)
- Fixed issues with testing sandbox (#609)
- Issue with camera lerp (#555)
- Issue setting initial opacity on Actors (#511)
- Children were not being updated by their parent Actors (#616)
- Center-anchored Actors were not drawn at the correct canvas coordinates when scaled (#618)
0.6.0 - 2016-01-19
- GamePads now have a connection event (#473)
- Unit circle drawing for debug mode (#467)
- Engine now fails gracefully in unsupported browsers (#386)
- Global fatal error catching (#381)
- MockEngine for testing (#360)
- Code coverage reports via Coveralls (#169)
- SpriteFonts now support different target colors (#148)
- Cameras now have position, velocity, and acceleration properties (#490)
Actor.addChild()
changed toActor.add()
(#519)Actor.removeChild()
changed toActor.remove()
(#519)- Documentation is only deployed on changes to the main git branch (#483)
- A warning message is now displayed if no supported audio format is provided for a browser (#476)
- Updated TSLint directory scanning (#442, #443, #447)
- Deprecated older methods (#399)
- Changed API for Key events (#502)
- Actors now properly collide with TileMaps (#541)
- Gamepad detection is fixed (#460, #518)
- Actor scale now correctly occurs after translation (#514)
- Actors now respect the
visible
property of their children (#513) - Fixed centered sprite drawing on Actors (#507)
- Animation
freezeframe
is now properly set to last Animation frame by default (#506) - It is no longer possible to add the same Actor to a scene multiple times (#504)
- Text alignment on SpriteFonts with Labels is fixed (#484)
- Engine pointer events properly fire when a camera is zoomed (#480)
- Fixed a small bug in rotateTo (#469)
- Setting Label colors now works (#468)
- Labels now respect set font (#372)
- UIActor now respects visibility (#368)
- Solid color Actors now respect opacity (#364)
- TileMap culling uses proper width and height values (#293)
- Font API changed while fixing font size issue
0.5.1 - 2015-06-26
- Actors can now recursively check the containment of their children (#453)
RotateTo
andRotateBy
now support ShortestPath, LongestPath, Clockwise, and Counterclockwise rotation (#461)
Actor.contains()
did not work for child actors (#147)- Unexpected placement occasionally occurred for Actors with certain collision types (#319)
- Velocity wasn’t updating properly when fixed and active Actors collided (#454)
- Actors removed with actor.kill() were not being removed from the draw tree (#458)
RotateTo
andRotateBy
weren’t using the shortest angle by default (#282)- Sprite width and height didn’t take scaling into account (#437)
- Fixed error message when calling
Actor.setDrawing()
on a non-existent key (#456)
0.5.0 - 2015-06-03
- resource cache busting (#280)
- HTML5 Gamepad API support (#15)
- Browserify support (#312)
- ‘blur’ and ‘visible’ events to detect when the browser window a game is in has focus (#385)
- Z-index support for Actors, allowing for specific ordered drawing (#356)
- unlocked drawing for UI elements (#354)
Promise.join()
to return a new promise when promises passed to it have been resolved (#341, #340)- ability to skip a frame in an animation (#313)
- You can now remove effects from
IDrawable
objects (#303) - generic
Resource
type to allow for XHR loading (#297) - gray
Color
constants (#209)
- Renamed
engine.addChild()
toengine.add()
(#288) - Renamed
setSpriteTransformationPoint()
tosetAnchor()
(#269) - Renamed
TopCamera
toLockedCamera
(#184) - Renamed
Actor.pipeline
toActor.traits
(#351) - Actor anchoring now uses center origin by default (#299)
- Actor updates (movement, collision, etc.) now use a pipeline (#330)
- Organized classes, files, and project structure (#182, #347)
- Improvements to collision detection (#345, #332)
- Loop optimizations for performance improvements (#296)
- Updated to TypeScript 1.4 (#393)
- Improved pointer event handling so touch and mouse events can be captured together (#334)
- Improved
Point
andVector
methods and rotation (#323, #302) Color
is now treated as a vector to allow for changes (#298)- Cleaned up event type consistency (#273)
- There is now a default instance of a
Camera
(#270) - TSLint now used to enforce code quality
- A Sprite’s dimensions weren’t validated against the size of its texture (#318)
- Improved sprite drawing performance issues (#316)
- Actors were sometimes throwing duplicate collision events (#284)
- Actors were not setting their initial opacity correctly (#307)
- Particle emitters couldn’t emit less than 60 particles per second (#301)
- Fixed issue with TileMap collisions (#286)
- Animations with duplicate frames weren’t being created correctly (#283)
- Separated drawing and collision logic for CollisionMaps (now TileMap) (#285)
- Errors in promises were being swallowed if no error callback was supplied (#337)
- A null promise was being returned if no loader was given to
Engine.start()
(#335) - Changed default collisionType to ‘PreventCollision’ (#324)
- Color didn’t handle alpha = 0 correctly (#257)
- Blink action usage was confusing (#279)
- Couldn’t use the
width
andheight
properties of a Texture after it loaded (#355) - Using
on(‘pointerdown’)
would not automatically enable pointer capturing (#398) - Unsubscribing from an event sometimes removed other event handlers (#366)
Actor.setCenterDrawing()
was hard-coded to true (#375)- Console was undefined in IE9. (#378)
- Pointers were not handling mobile Safari touch events (#382)
- Fixed debug mode drawing (#274)
- Flipping a sprite didn’t factor in scaling (#401)
- Sound continued to play when the game was paused (#383)
UIActor.kill()
didn’t remove the actor (#373)- Passing an empty array to
ex.Promise.join
resulted in unresolved promises (#365) - MouseUp / TouchEnd events weren’t capture correctly if outside of canvas (#374)
- Clearing actions from an empty action queue caused problems (#409)
Scene.onActivate()
was being called before Scene.onInitialize() (#418)- New z-indexing wasn’t cleaning up after itself (#433)
- Fixed issue with world / screen coordinates in UIActors (#371)
- Fade action didn’t work for text (#261)
- Fade action didn’t work for plain-color actors (#256)
- Collision events weren’t being published for both collision participants (#254)
- The loading bar was misrepresenting the time taken to decode audio files (#106)
actor.getCenter()
wasn’t returning the correct value (#438)- Cameras were on the engine instead of the scene, resulting in scene transition problems (#277)
- Actors with sprites larger than the actor would disappear prematurely from the screen (#287)
- Derived classes can now use offscreen culling (#294)
- Fixed issue with TileMap culling (#444)
0.2.2 - 2014-04-15
- Removed extra declarations file from package that was causing visual studio build problems
0.2.0 - 2014-04-09
- Visual Studio 2013 template support (#139)
- Collision Map for building large static collidable levels (#33)
- Redundant fallback sound sources for cross browser support (#125)
- Particle Emitter implementation (#52)
- Trigger implementation (#91)
- Timer implementation (#76)
- Camera Effects: zoom, shake (#55)
- Polygon IDrawable (#93)
- Alias 'on' and 'off' for 'addEventListener' and 'removeEventListener' (#229)
- Optimized draw so only on screen elements are drawn (#239)
- Support Scale in the x and y directions for actors (#118)
- Added notion of collision grouping (#100)
- New Events like 'enterviewport', 'exitviewport', and 'initialize' (#215, #224)
- Textures allow direct pixel manipulation (#155)
- Static Logger improvements with '.debug()', '.info()', '.warn()' and '.error()' (#81)
- Added callMethod() action to actor (#244)
- Added fade() action to actor (#104)
- Added follow() and meet() action to actor (#77)
- 'engine.goToScene()' replaces push and pop (#168)
- More intuitive starting workflow (#149)
- Collisions are now more concrete on actors with CollisionType (#241)
- Namespace all types with 'ex' to prevent Excalibur from polluting the global (#87)
- Refactor SceneNode to Scene (#135)
- Refactor keys (#115)
- Build system with Grunt (#92)
- Collision event was firing after other actor has been killed (#228)
- Additional actor was killed when actor.kill() is called (#226)
- Fixed loading bar (#195)
- ex.Color.Yellow constant was wrong (#122)
- removeEventListener did not exist off of engine (#175)
- Excalibur promises should not swallow exceptions in promise callbacks (#176)
- Actor.extend did not work on actor subclasses (#103)
0.1.1 - 2013-12-19
- Actor based paradigm for managing game objects
- Built-in scripting for actors, allowing objects to move, rotate, blink, scale, and repeat actions
- Entity-entity collision detection
- Event support to react to events happening in the game
- Camera abstraction to easily think about the view port
- Multiple display modes including fixed size, full screen, and dynamic container
- Scene stack support to create multiple game levels
- Sprite sheet and animation support
- Simple sound library for game audio, supporting the Web Audio API and the HTML Audio API
- Promise implementation for managing asynchronous behavior
- Resource loading with optional custom progress bars