diff --git a/CHANGELOG.md b/CHANGELOG.md index fc95887ce..1069243f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added +- Added missing dual of `ex.GraphicsComponent.add()`, you can now `ex.GraphicsComponent.remove(name)`; - Added additional options to `ex.Animation.fromSpriteSheetCoordinates()` you can now pass any valid `ex.GraphicOptions` to influence the sprite per frame ```typescript const anim = ex.Animation.fromSpriteSheetCoordinates({ diff --git a/sandbox/tests/camera-animation/index.html b/sandbox/tests/camera-animation/index.html new file mode 100644 index 000000000..15f2626a1 --- /dev/null +++ b/sandbox/tests/camera-animation/index.html @@ -0,0 +1,11 @@ + + + + + + Camera Animation + + + + + \ No newline at end of file diff --git a/src/engine/EntityComponentSystem/Component.ts b/src/engine/EntityComponentSystem/Component.ts index cbabd6c43..5b0b1df04 100644 --- a/src/engine/EntityComponentSystem/Component.ts +++ b/src/engine/EntityComponentSystem/Component.ts @@ -72,7 +72,7 @@ export abstract class Component { onAdd?(owner: Entity): void; /** - * Optional callback called when a component is added to an entity + * Optional callback called when a component is removed from an entity */ onRemove?(previousOwner: Entity): void; } \ No newline at end of file diff --git a/src/engine/Graphics/GraphicsComponent.ts b/src/engine/Graphics/GraphicsComponent.ts index d79773d29..a49c2974e 100644 --- a/src/engine/Graphics/GraphicsComponent.ts +++ b/src/engine/Graphics/GraphicsComponent.ts @@ -254,6 +254,19 @@ export class GraphicsComponent extends Component { return graphicToSet; } + /** + * Removes a registered graphic, if the removed graphic is the current it will switch to the default + * @param name + */ + public remove(name: string) { + delete this._graphics[name]; + delete this._options[name]; + if (this._current === name) { + this._current = 'default'; + this.recalculateBounds(); + } + } + /** * Shows a graphic, will be removed * @param nameOrGraphic @@ -265,7 +278,9 @@ export class GraphicsComponent extends Component { } /** - * Use a graphic only, swap out any graphics on the **default** layer, returns the new [[Graphic]] + * Use a graphic only, will set the default graphic. Returns the new [[Graphic]] + * + * Optionally override the stored options * @param nameOrGraphic * @param options */ diff --git a/src/spec/GraphicsComponentSpec.ts b/src/spec/GraphicsComponentSpec.ts index b8c632a4b..25607a191 100644 --- a/src/spec/GraphicsComponentSpec.ts +++ b/src/spec/GraphicsComponentSpec.ts @@ -131,6 +131,30 @@ describe('A Graphics ECS Component', () => { }); }); + it('can remove graphics', () => { + const rect = new ex.Rectangle({ + width: 40, + height: 40 + }); + const sut = new ex.GraphicsComponent(); + + sut.add('rect', rect, { offset: ex.vec(1, 2), anchor: ex.vec(1, 1) }); + expect(sut.current).toBe(undefined); + expect(sut.currentOptions).toBe(undefined); + + expect(sut.getNames()).toEqual(['rect']); + + sut.use('rect'); + expect(sut.current).toEqual(rect); + expect(sut.currentOptions).toEqual(undefined); + + sut.remove('rect'); + + expect(sut.current).toBe(undefined); + expect(sut.currentOptions).toBe(undefined); + expect(sut.getNames()).toEqual([]); + }); + it('can show graphics by name if it exists', () => { const rect = new ex.Rectangle({ width: 40,