diff --git a/CHANGELOG.md b/CHANGELOG.md index e0b30f72..9004b863 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ are returned ### Fixed +- Fixed issue where the `ex.ScreenElement` anchor was not being accounted for properly when passed as a constructor parameter. - Fixed issue where you could not use multiple instances of Excalibur on the same page, you can now have as many Excalibur's as you want (up to the webgl context limit). - Fixed issue where `ex.ScreenElement` would log a warning when created without a height or width - Fixed issue where `ex.Sound` would get confused parsing and playing sound files with a querystring in their path diff --git a/sandbox/tests/screenelement/index.html b/sandbox/tests/screenelement/index.html new file mode 100644 index 00000000..b58b83c5 --- /dev/null +++ b/sandbox/tests/screenelement/index.html @@ -0,0 +1,13 @@ + + + + + + + Screen Element + + + + + + \ No newline at end of file diff --git a/sandbox/tests/screenelement/index.ts b/sandbox/tests/screenelement/index.ts new file mode 100644 index 00000000..a9840262 --- /dev/null +++ b/sandbox/tests/screenelement/index.ts @@ -0,0 +1,29 @@ + +var engine = new ex.Engine({ + width: 600, + height: 400 +}); + +engine.debug.entity.showId = false; +engine.debug.collider.showGeometry = true; +engine.debug.transform.showPosition = true; + +engine.showDebug(true); + +var image = new ex.ImageSource('./spritefont.png'); + +var loader = new ex.Loader([image]); + +var screenElement = new ex.ScreenElement({ + pos: ex.vec(engine.screen.halfDrawWidth, engine.screen.halfDrawHeight), + width: 100, + height: 100, + anchor: ex.Vector.Half +}); +// screenElement.collider.useBoxCollider(100, 100, ex.Vector.Half); + +screenElement.graphics.use(image.toSprite(), { anchor: ex.vec(0.5, 0.5) }); + +engine.currentScene.add(screenElement); + +engine.start(loader); \ No newline at end of file diff --git a/sandbox/tests/screenelement/spritefont.png b/sandbox/tests/screenelement/spritefont.png new file mode 100644 index 0000000000000000000000000000000000000000..a7fbf645bcf9e05dbcaf779bdf0610385cb06295 GIT binary patch literal 1357 zcmeAS@N?(olHy`uVBq!ia0y~yU}R!oU@+xiV_;xd<^J>|0|NtNage(c!@6@aFBupZ zSkfJR9T^xl_H+M9WMyDr;4JWnEM{QfI}E~%$MaXDFfcGkmAFQf1m~xflqVLYG6W=M z=9TFAxrQi|8S9zq85+8Ob~0yRVAUpVuwY2nPftj@-}x!cmp#CguX(UWL9KmX%(`Cofu z@7BICdVA)DSw{ZS&1Yx(RBPYe`_AZX*sk3Remh!g-_5<3dMowu+eF0%b>4kB&1}lsS9!_hyX@aiRxiIWZ4*~%`F7{6*K^dqfBww(D%fmst?l`Y z@blWsYp>oc<`56uws`mHM}6mP^WS{>-1kEJZK&UG?d9KH?ejlcSq>uS+O`)6rdsdXt+?&3^{(o-uXjFv()U8^?b{c5$=|QpW%LJ3-{e&?^_$l6 zTG#4RS{Flat$v}Gq5oK*ZOYqakAMr?k{#FWpSGc#*nXoPBS)dyZduVB$(RK3fpPEIxrIWn3cxOzWAHKpHq#_hb`R&r4yE_A_>6FGf%h@Mum)@QF z&TsA=;k%Q2tCGF9c$ZAhoDPejE6dji#V!TA_U6T#m)bUYl`LMLen_!LV|BpvO|o-k zb2U~!$*Z%wc$c?w_Wom^z1|%wJ{PvaJM!rg?@xB~inmSL{qtw%J6n*#*`0OE=JFhN zJYF?#p^M*?{SrPI*p$5qDnu7Rb+O|a3YGUp$W{kiVPu1V&bbJTv#EGsM7 zzVY;y&B^8M82Jc2(iYCV+j`i4&41-iPy(8Lao@c3Mc!L}ueYsyFMa#nKi;2r=bkq- zbKIZ){*gf4&ncmcq-$;8U)VR#|H!u8^^aawTSwn5c~{|F_x@%2g?}&aoh$g!`B;4Z z{$ro}UZmfed9in1`O$ToYY$H@xBq!&V{Os#;GcK>?T=sHd$#aLr}nM6FW))cD}Pt9 zsrGdFzW>(s@66}^lUeM)CB42-WB&o4-J*ASZ{56j_t?74y#C)0OP7}%vHtqn|8ubY zcmKl=)%i-|F7BJ>UsATw^6o_QcR%ibF)puf+xR-~ZTdrje~bZP;LzTEL*VVXIo~{= z@6GS{er)&W&+E=T%f0{iUo<@7;s~VKHGhBcF6!wzpqtcV&A`CG;OXk;vd$@?2>?1- B!W94j literal 0 HcmV?d00001 diff --git a/src/engine/ScreenElement.ts b/src/engine/ScreenElement.ts index 9664b24b..4177cad2 100644 --- a/src/engine/ScreenElement.ts +++ b/src/engine/ScreenElement.ts @@ -25,9 +25,11 @@ export class ScreenElement extends Actor { constructor(config?: ActorArgs) { super({ ...config }); this.get(TransformComponent).coordPlane = CoordPlane.Screen; - this.anchor = vec(0, 0); - this.body.collisionType = CollisionType.PreventCollision; - if (config?.width > 0 && config?.height > 0) { + this.anchor = config?.anchor ?? vec(0, 0); + this.body.collisionType = config?.collisionType ?? CollisionType.PreventCollision; + if (!config?.collider && + config?.width > 0 && + config?.height > 0) { this.collider.useBoxCollider(this.width, this.height, this.anchor); } } diff --git a/src/spec/ScreenElementSpec.ts b/src/spec/ScreenElementSpec.ts index 8f8d7f76..f79621e2 100644 --- a/src/spec/ScreenElementSpec.ts +++ b/src/spec/ScreenElementSpec.ts @@ -48,6 +48,44 @@ describe('A ScreenElement', () => { expect(logger.warn).not.toHaveBeenCalled(); }); + it('can be constructed with a non-default anchor', () => { + + const sut = new ScreenElement({ + width: 100, + height: 100, + anchor: ex.vec(.5, .5) + }); + + expect(sut.anchor).toBeVector(ex.vec(.5, .5)); + expect(sut.collider.get()).toBeInstanceOf(ex.PolygonCollider); + expect(sut.collider.get().bounds.width).toBe(100); + expect(sut.collider.get().bounds.height).toBe(100); + expect(sut.collider.get().bounds.left).toBe(-50); + expect(sut.collider.get().bounds.right).toBe(50); + expect(sut.collider.get().bounds.top).toBe(-50); + expect(sut.collider.get().bounds.bottom).toBe(50); + }); + + it('can be constructed with a non-default collider', () => { + + const sut = new ScreenElement({ + width: 100, + height: 100, + collisionType: ex.CollisionType.Active, + collider: ex.Shape.Circle(50) + }); + + expect(sut.anchor).toBeVector(ex.vec(0, 0)); + expect(sut.body.collisionType).toBe(ex.CollisionType.Active); + expect(sut.collider.get()).toBeInstanceOf(ex.CircleCollider); + expect(sut.collider.get().bounds.width).toBe(100); + expect(sut.collider.get().bounds.height).toBe(100); + expect(sut.collider.get().bounds.left).toBe(-50); + expect(sut.collider.get().bounds.right).toBe(50); + expect(sut.collider.get().bounds.top).toBe(-50); + expect(sut.collider.get().bounds.bottom).toBe(50); + }); + it('is drawn when visible', () => { screenElement.graphics.visible = true; screenElement.graphics.onPostDraw = jasmine.createSpy('draw');