diff --git a/src/engine/Actor.ts b/src/engine/Actor.ts index 4a8c0806a..81e54b9ca 100644 --- a/src/engine/Actor.ts +++ b/src/engine/Actor.ts @@ -679,7 +679,9 @@ export class Actor extends Entity implements Eventable, PointerEvents, CanInitia clone.addComponent((clone.motion = this.motion.clone() as MotionComponent), true); clone.addComponent((clone.actions = this.actions.clone() as ActionsComponent), true); clone.addComponent((clone.body = this.body.clone() as BodyComponent), true); - clone.addComponent((clone.collider = this.collider.clone() as ColliderComponent), true); + if (this.collider.get()) { + clone.addComponent((clone.collider = this.collider.clone() as ColliderComponent), true); + } const builtInComponents: Component[] = [ this.transform, diff --git a/src/spec/ActorSpec.ts b/src/spec/ActorSpec.ts index 515806451..00242b42e 100644 --- a/src/spec/ActorSpec.ts +++ b/src/spec/ActorSpec.ts @@ -143,6 +143,42 @@ describe('A game actor', () => { expect(sut.color).toEqual(original.color); }); + it('can be cloned with null collider', () => { + const original = new ex.Actor({ + width: 10, + height: 100, + anchor: ex.vec(0, 1), + color: ex.Color.Azure + }); + original.pos = ex.vec(10, 20); + original.vel = ex.vec(30, 30); + + original.collider.clear(); + const sut = original.clone(); + + expect(sut.get(ex.TransformComponent)).not.toBe(original.get(ex.TransformComponent)); + expect(sut.get(ex.MotionComponent)).not.toBe(original.get(ex.MotionComponent)); + expect(sut.get(ex.ActionsComponent)).not.toBe(original.get(ex.ActionsComponent)); + expect(sut.get(ex.PointerComponent)).not.toBe(original.get(ex.PointerComponent)); + expect(sut.get(ex.BodyComponent)).not.toBe(original.get(ex.BodyComponent)); + expect(sut.get(ex.ColliderComponent)).not.toBe(original.get(ex.ColliderComponent)); + expect(sut.get(ex.GraphicsComponent)).not.toBe(original.get(ex.GraphicsComponent)); + + // New refs + expect(sut).not.toBe(original); + expect(sut.id).not.toBe(original.id); + expect(sut.color).not.toBe(original.color); + expect(sut.anchor).not.toBe(original.anchor); + + // Same values + expect(sut.pos).toBeVector(original.pos); + expect(sut.vel).toBeVector(original.vel); + expect(sut.width).toBe(original.width); + expect(sut.height).toBe(original.height); + expect(sut.anchor).toEqual(original.anchor); + expect(sut.color).toEqual(original.color); + }); + it('should have default properties set', () => { const actor = new ex.Actor();