excalibur 0.25.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/.nvmrc +1 -1
  2. package/CHANGELOG.md +49 -9
  3. package/LICENSE.md +1 -1
  4. package/README.md +8 -12
  5. package/build/dist/Actions/Action/Blink.d.ts +3 -3
  6. package/build/dist/Actions/Action/Delay.d.ts +1 -5
  7. package/build/dist/Actions/Action/Die.d.ts +3 -5
  8. package/build/dist/Actions/Action/EaseTo.d.ts +4 -2
  9. package/build/dist/Actions/Action/Fade.d.ts +3 -3
  10. package/build/dist/Actions/Action/Follow.d.ts +6 -4
  11. package/build/dist/Actions/Action/Meet.d.ts +6 -4
  12. package/build/dist/Actions/Action/MoveBy.d.ts +6 -4
  13. package/build/dist/Actions/Action/MoveTo.d.ts +6 -4
  14. package/build/dist/Actions/Action/Repeat.d.ts +2 -2
  15. package/build/dist/Actions/Action/RepeatForever.d.ts +2 -2
  16. package/build/dist/Actions/Action/RotateBy.d.ts +4 -3
  17. package/build/dist/Actions/Action/RotateTo.d.ts +4 -3
  18. package/build/dist/Actions/Action/ScaleBy.d.ts +4 -3
  19. package/build/dist/Actions/Action/ScaleTo.d.ts +4 -3
  20. package/build/dist/Actions/Action.d.ts +2 -2
  21. package/build/dist/Actions/ActionContext.d.ts +16 -10
  22. package/build/dist/Actions/ActionQueue.d.ts +3 -3
  23. package/build/dist/Actions/ActionsComponent.d.ts +236 -0
  24. package/build/dist/Actions/ActionsSystem.d.ts +9 -0
  25. package/build/dist/Actions/Index.d.ts +2 -0
  26. package/build/dist/Actor.d.ts +10 -8
  27. package/build/dist/Engine.d.ts +6 -1
  28. package/build/dist/EntityComponentSystem/EntityManager.d.ts +1 -0
  29. package/build/dist/Graphics/Animation.d.ts +64 -0
  30. package/build/dist/Graphics/Context/ExcaliburGraphicsContext.d.ts +1 -1
  31. package/build/dist/Graphics/Context/ExcaliburGraphicsContextWebGL.d.ts +6 -0
  32. package/build/dist/Graphics/GraphicsComponent.d.ts +2 -0
  33. package/build/dist/Loader.css +1 -0
  34. package/build/dist/Loader.d.ts +1 -0
  35. package/build/dist/Screen.d.ts +3 -0
  36. package/build/dist/excalibur.js +14369 -13942
  37. package/build/dist/excalibur.js.map +1 -1
  38. package/build/dist/excalibur.min.js +1 -1
  39. package/build/dist/excalibur.min.js.LICENSE.txt +1 -1
  40. package/build/dist/excalibur.min.js.map +1 -1
  41. package/build/esm/Actions/Action/Blink.d.ts +17 -0
  42. package/build/esm/Actions/Action/CallMethod.d.ts +10 -0
  43. package/build/esm/Actions/Action/Delay.d.ts +12 -0
  44. package/build/esm/Actions/Action/Die.d.ts +11 -0
  45. package/build/esm/Actions/Action/EaseTo.d.ts +21 -0
  46. package/build/esm/Actions/Action/Fade.d.ts +17 -0
  47. package/build/esm/Actions/Action/Follow.d.ts +23 -0
  48. package/build/esm/Actions/Action/Meet.d.ts +23 -0
  49. package/build/esm/Actions/Action/MoveBy.d.ts +22 -0
  50. package/build/esm/Actions/Action/MoveTo.d.ts +21 -0
  51. package/build/esm/Actions/Action/Repeat.d.ts +16 -0
  52. package/build/esm/Actions/Action/RepeatForever.d.ts +20 -0
  53. package/build/esm/Actions/Action/RotateBy.d.ts +27 -0
  54. package/build/esm/Actions/Action/RotateTo.d.ts +26 -0
  55. package/build/esm/Actions/Action/ScaleBy.d.ts +24 -0
  56. package/build/esm/Actions/Action/ScaleTo.d.ts +23 -0
  57. package/build/esm/Actions/Action.d.ts +10 -0
  58. package/build/esm/Actions/ActionContext.d.ts +219 -0
  59. package/build/esm/Actions/ActionQueue.d.ts +56 -0
  60. package/build/esm/Actions/Actionable.d.ts +4 -0
  61. package/build/esm/Actions/ActionsComponent.d.ts +236 -0
  62. package/build/esm/Actions/ActionsSystem.d.ts +9 -0
  63. package/build/{dist/Actions/Index.js → esm/Actions/Index.d.ts} +2 -1
  64. package/build/{dist/Actions/RotationType.js → esm/Actions/RotationType.d.ts} +6 -8
  65. package/build/esm/Actor.d.ts +727 -0
  66. package/build/esm/Camera.d.ts +360 -0
  67. package/build/{dist/Class.js → esm/Class.d.ts} +12 -17
  68. package/build/esm/Collision/BodyComponent.d.ts +208 -0
  69. package/build/esm/Collision/BoundingBox.d.ts +109 -0
  70. package/build/esm/Collision/ColliderComponent.d.ts +98 -0
  71. package/build/esm/Collision/Colliders/CircleCollider.d.ts +92 -0
  72. package/build/esm/Collision/Colliders/ClosestLineJumpTable.d.ts +23 -0
  73. package/build/esm/Collision/Colliders/Collider.d.ts +94 -0
  74. package/build/esm/Collision/Colliders/CollisionJumpTable.d.ts +14 -0
  75. package/build/esm/Collision/Colliders/CompositeCollider.d.ts +38 -0
  76. package/build/esm/Collision/Colliders/EdgeCollider.d.ts +112 -0
  77. package/build/esm/Collision/Colliders/PolygonCollider.d.ts +138 -0
  78. package/build/esm/Collision/Colliders/SeparatingAxis.d.ts +46 -0
  79. package/build/esm/Collision/Colliders/Shape.d.ts +54 -0
  80. package/build/esm/Collision/CollisionSystem.d.ts +26 -0
  81. package/build/{dist/Collision/CollisionType.js → esm/Collision/CollisionType.d.ts} +6 -8
  82. package/build/esm/Collision/Detection/CollisionContact.d.ts +53 -0
  83. package/build/esm/Collision/Detection/CollisionProcessor.d.ts +28 -0
  84. package/build/esm/Collision/Detection/DynamicTree.d.ts +85 -0
  85. package/build/esm/Collision/Detection/DynamicTreeCollisionProcessor.d.ts +40 -0
  86. package/build/esm/Collision/Detection/Pair.d.ts +31 -0
  87. package/build/{dist/Collision/Group/CollisionGroup.js → esm/Collision/Group/CollisionGroup.d.ts} +17 -36
  88. package/build/esm/Collision/Group/CollisionGroupManager.d.ts +30 -0
  89. package/build/{dist/Collision/Index.js → esm/Collision/Index.d.ts} +0 -1
  90. package/build/esm/Collision/Integrator.d.ts +6 -0
  91. package/build/esm/Collision/MotionSystem.d.ts +11 -0
  92. package/build/esm/Collision/Physics.d.ts +133 -0
  93. package/build/esm/Collision/Side.d.ts +21 -0
  94. package/build/esm/Collision/Solver/ArcadeSolver.d.ts +15 -0
  95. package/build/esm/Collision/Solver/ContactConstraintPoint.d.ts +43 -0
  96. package/build/esm/Collision/Solver/RealisticSolver.d.ts +21 -0
  97. package/build/esm/Collision/Solver/Solver.d.ts +50 -0
  98. package/build/esm/Color.d.ts +244 -0
  99. package/build/esm/Configurable.d.ts +9 -0
  100. package/build/esm/Debug/Debug.d.ts +327 -0
  101. package/build/esm/Debug/DebugFlags.d.ts +11 -0
  102. package/build/esm/Debug/DebugSystem.d.ts +29 -0
  103. package/build/{dist/Debug/index.js → esm/Debug/index.d.ts} +0 -1
  104. package/build/esm/Deprecated.d.ts +0 -0
  105. package/build/esm/Drawing/Animation.d.ts +196 -0
  106. package/build/esm/Drawing/CanvasDrawComponent.d.ts +10 -0
  107. package/build/esm/Drawing/CanvasDrawingSystem.d.ts +23 -0
  108. package/build/esm/Drawing/Index.d.ts +9 -0
  109. package/build/esm/Drawing/Polygon.d.ts +74 -0
  110. package/build/esm/Drawing/Sprite.d.ts +159 -0
  111. package/build/esm/Drawing/SpriteEffects.d.ts +120 -0
  112. package/build/esm/Drawing/SpriteSheet.d.ts +184 -0
  113. package/build/esm/Drawing/Texture.d.ts +44 -0
  114. package/build/esm/Engine.d.ts +586 -0
  115. package/build/esm/EntityComponentSystem/Component.d.ts +69 -0
  116. package/build/esm/EntityComponentSystem/Components/MotionComponent.d.ts +55 -0
  117. package/build/esm/EntityComponentSystem/Components/TransformComponent.d.ts +103 -0
  118. package/build/esm/EntityComponentSystem/Entity.d.ts +247 -0
  119. package/build/esm/EntityComponentSystem/EntityManager.d.ts +35 -0
  120. package/build/esm/EntityComponentSystem/Query.d.ts +51 -0
  121. package/build/esm/EntityComponentSystem/QueryManager.d.ts +48 -0
  122. package/build/esm/EntityComponentSystem/System.d.ts +107 -0
  123. package/build/esm/EntityComponentSystem/SystemManager.d.ts +45 -0
  124. package/build/esm/EntityComponentSystem/Util.d.ts +1 -0
  125. package/build/esm/EntityComponentSystem/World.d.ts +45 -0
  126. package/build/{dist/EntityComponentSystem/index.js → esm/EntityComponentSystem/index.d.ts} +0 -1
  127. package/build/esm/EventDispatcher.d.ts +51 -0
  128. package/build/esm/Events/MediaEvents.d.ts +47 -0
  129. package/build/esm/Events.d.ts +475 -0
  130. package/build/esm/Flags.d.ts +62 -0
  131. package/build/esm/Graphics/Animation.d.ts +189 -0
  132. package/build/esm/Graphics/Canvas.d.ts +24 -0
  133. package/build/esm/Graphics/Circle.d.ts +15 -0
  134. package/build/esm/Graphics/Context/ExcaliburGraphicsContext.d.ts +155 -0
  135. package/build/esm/Graphics/Context/ExcaliburGraphicsContext2DCanvas.d.ts +87 -0
  136. package/build/esm/Graphics/Context/ExcaliburGraphicsContextWebGL.d.ts +111 -0
  137. package/build/esm/Graphics/Context/batch.d.ts +11 -0
  138. package/build/esm/Graphics/Context/debug-text.d.ts +24 -0
  139. package/build/esm/Graphics/Context/draw-image-command.d.ts +47 -0
  140. package/build/esm/Graphics/Context/image-renderer.d.ts +39 -0
  141. package/build/esm/Graphics/Context/line-renderer.d.ts +22 -0
  142. package/build/esm/Graphics/Context/point-renderer.d.ts +22 -0
  143. package/build/esm/Graphics/Context/renderer.d.ts +66 -0
  144. package/build/esm/Graphics/Context/shader.d.ts +81 -0
  145. package/build/esm/Graphics/Context/state-stack.d.ts +10 -0
  146. package/build/esm/Graphics/Context/texture-loader.d.ts +33 -0
  147. package/build/esm/Graphics/Context/transform-stack.d.ts +12 -0
  148. package/build/esm/Graphics/Context/webgl-util.d.ts +12 -0
  149. package/build/esm/Graphics/Font.d.ts +57 -0
  150. package/build/{dist/Graphics/FontCommon.js → esm/Graphics/FontCommon.d.ts} +54 -37
  151. package/build/esm/Graphics/Graphic.d.ts +129 -0
  152. package/build/esm/Graphics/GraphicsComponent.d.ts +224 -0
  153. package/build/esm/Graphics/GraphicsDiagnostics.d.ts +5 -0
  154. package/build/esm/Graphics/GraphicsGroup.d.ts +24 -0
  155. package/build/esm/Graphics/GraphicsSystem.d.ts +35 -0
  156. package/build/esm/Graphics/ImageSource.d.ts +53 -0
  157. package/build/esm/Graphics/Polygon.d.ts +17 -0
  158. package/build/esm/Graphics/Raster.d.ts +105 -0
  159. package/build/esm/Graphics/Rectangle.d.ts +13 -0
  160. package/build/esm/Graphics/Sprite.d.ts +59 -0
  161. package/build/esm/Graphics/SpriteFont.d.ts +53 -0
  162. package/build/esm/Graphics/SpriteSheet.d.ts +137 -0
  163. package/build/esm/Graphics/Text.d.ts +29 -0
  164. package/build/{dist/Graphics/index.js → esm/Graphics/index.d.ts} +0 -4
  165. package/build/esm/Id.d.ts +8 -0
  166. package/build/esm/Input/CapturePointerConfig.d.ts +13 -0
  167. package/build/esm/Input/EngineInput.d.ts +8 -0
  168. package/build/esm/Input/Gamepad.d.ts +227 -0
  169. package/build/{dist/Input/Index.js → esm/Input/Index.d.ts} +0 -1
  170. package/build/esm/Input/Keyboard.d.ts +187 -0
  171. package/build/esm/Input/Pointer.d.ts +134 -0
  172. package/build/esm/Input/PointerEvents.d.ts +170 -0
  173. package/build/esm/Input/Pointers.d.ts +78 -0
  174. package/build/esm/Interfaces/Audio.d.ts +29 -0
  175. package/build/esm/Interfaces/AudioImplementation.d.ts +25 -0
  176. package/build/esm/Interfaces/Clonable.d.ts +3 -0
  177. package/build/esm/Interfaces/Drawable.d.ts +97 -0
  178. package/build/esm/Interfaces/Evented.d.ts +31 -0
  179. package/build/{dist/Interfaces/Index.js → esm/Interfaces/Index.d.ts} +0 -1
  180. package/build/esm/Interfaces/LifecycleEvents.d.ts +167 -0
  181. package/build/esm/Interfaces/Loadable.d.ts +18 -0
  182. package/build/esm/Interfaces/PointerEventHandlers.d.ts +40 -0
  183. package/build/esm/Interfaces/Trait.d.ts +9 -0
  184. package/build/esm/Label.d.ts +146 -0
  185. package/build/esm/Loader.d.ts +174 -0
  186. package/build/{dist/Math/Index.js → esm/Math/Index.d.ts} +0 -1
  187. package/build/esm/Math/Random.d.ts +125 -0
  188. package/build/esm/Math/global-coordinates.d.ts +10 -0
  189. package/build/esm/Math/line.d.ts +95 -0
  190. package/build/esm/Math/matrix.d.ts +110 -0
  191. package/build/esm/Math/projection.d.ts +10 -0
  192. package/build/esm/Math/ray.d.ts +25 -0
  193. package/build/esm/Math/vector-view.d.ts +18 -0
  194. package/build/esm/Math/vector.d.ts +201 -0
  195. package/build/esm/Particles.d.ts +244 -0
  196. package/build/esm/Polyfill.d.ts +6 -0
  197. package/build/esm/PostProcessing/ColorBlindCorrector.d.ts +28 -0
  198. package/build/{dist/PostProcessing/Index.js → esm/PostProcessing/Index.d.ts} +0 -1
  199. package/build/esm/PostProcessing/PostProcessor.d.ts +6 -0
  200. package/build/esm/Promises.d.ts +87 -0
  201. package/build/esm/Resources/Gif.d.ts +117 -0
  202. package/build/{dist/Resources/Index.js → esm/Resources/Index.d.ts} +0 -1
  203. package/build/esm/Resources/Resource.d.ts +31 -0
  204. package/build/esm/Resources/Sound/AudioContext.d.ts +7 -0
  205. package/build/{dist/Resources/Sound/Index.js → esm/Resources/Sound/Index.d.ts} +0 -1
  206. package/build/esm/Resources/Sound/Sound.d.ts +79 -0
  207. package/build/esm/Resources/Sound/WebAudioInstance.d.ts +45 -0
  208. package/build/esm/Scene.d.ts +301 -0
  209. package/build/esm/Screen.d.ts +285 -0
  210. package/build/esm/ScreenElement.d.ts +13 -0
  211. package/build/esm/TileMap.d.ts +222 -0
  212. package/build/esm/Timer.d.ts +93 -0
  213. package/build/esm/Traits/CapturePointer.d.ts +10 -0
  214. package/build/{dist/Traits/Index.js → esm/Traits/Index.d.ts} +0 -1
  215. package/build/esm/Traits/OffscreenCulling.d.ts +11 -0
  216. package/build/esm/Trigger.d.ts +48 -0
  217. package/build/esm/Util/Actors.d.ts +12 -0
  218. package/build/esm/Util/Browser.d.ts +28 -0
  219. package/build/esm/Util/CullingBox.d.ts +23 -0
  220. package/build/esm/Util/Decorators.d.ts +15 -0
  221. package/build/esm/Util/Detector.d.ts +40 -0
  222. package/build/esm/Util/DrawUtil.d.ts +69 -0
  223. package/build/esm/Util/EasingFunctions.d.ts +59 -0
  224. package/build/{dist/Util/Index.js → esm/Util/Index.d.ts} +0 -1
  225. package/build/esm/Util/Log.d.ts +109 -0
  226. package/build/esm/Util/Observable.d.ts +55 -0
  227. package/build/esm/Util/Pool.d.ts +44 -0
  228. package/build/esm/Util/SortedList.d.ts +52 -0
  229. package/build/esm/Util/Sound.d.ts +4 -0
  230. package/build/esm/Util/Util.d.ts +196 -0
  231. package/build/esm/Util/Watch.d.ts +8 -0
  232. package/build/esm/Util/WebAudio.d.ts +15 -0
  233. package/build/esm/excalibur.d.ts +2 -0
  234. package/build/esm/excalibur.js +28874 -0
  235. package/build/esm/excalibur.js.map +1 -0
  236. package/build/esm/excalibur.min.js +3 -0
  237. package/build/esm/excalibur.min.js.LICENSE.txt +7 -0
  238. package/build/esm/excalibur.min.js.map +1 -0
  239. package/build/{dist/index.js → esm/index.d.ts} +4 -18
  240. package/package.json +31 -25
  241. package/wallaby.js +2 -0
  242. package/build/dist/Actions/Action/Blink.js +0 -45
  243. package/build/dist/Actions/Action/Blink.js.map +0 -1
  244. package/build/dist/Actions/Action/CallMethod.js +0 -21
  245. package/build/dist/Actions/Action/CallMethod.js.map +0 -1
  246. package/build/dist/Actions/Action/Delay.js +0 -28
  247. package/build/dist/Actions/Action/Delay.js.map +0 -1
  248. package/build/dist/Actions/Action/Die.js +0 -21
  249. package/build/dist/Actions/Action/Die.js.map +0 -1
  250. package/build/dist/Actions/Action/EaseTo.js +0 -66
  251. package/build/dist/Actions/Action/EaseTo.js.map +0 -1
  252. package/build/dist/Actions/Action/Fade.js +0 -42
  253. package/build/dist/Actions/Action/Fade.js.map +0 -1
  254. package/build/dist/Actions/Action/Follow.js +0 -51
  255. package/build/dist/Actions/Action/Follow.js.map +0 -1
  256. package/build/dist/Actions/Action/Meet.js +0 -48
  257. package/build/dist/Actions/Action/Meet.js.map +0 -1
  258. package/build/dist/Actions/Action/MoveBy.js +0 -42
  259. package/build/dist/Actions/Action/MoveBy.js.map +0 -1
  260. package/build/dist/Actions/Action/MoveTo.js +0 -35
  261. package/build/dist/Actions/Action/MoveTo.js.map +0 -1
  262. package/build/dist/Actions/Action/Repeat.js +0 -31
  263. package/build/dist/Actions/Action/Repeat.js.map +0 -1
  264. package/build/dist/Actions/Action/RepeatForever.js +0 -37
  265. package/build/dist/Actions/Action/RepeatForever.js.map +0 -1
  266. package/build/dist/Actions/Action/RotateBy.js +0 -88
  267. package/build/dist/Actions/Action/RotateBy.js.map +0 -1
  268. package/build/dist/Actions/Action/RotateTo.js +0 -87
  269. package/build/dist/Actions/Action/RotateTo.js.map +0 -1
  270. package/build/dist/Actions/Action/ScaleBy.js +0 -47
  271. package/build/dist/Actions/Action/ScaleBy.js.map +0 -1
  272. package/build/dist/Actions/Action/ScaleTo.js +0 -58
  273. package/build/dist/Actions/Action/ScaleTo.js.map +0 -1
  274. package/build/dist/Actions/Action.js +0 -2
  275. package/build/dist/Actions/Action.js.map +0 -1
  276. package/build/dist/Actions/ActionContext.js +0 -297
  277. package/build/dist/Actions/ActionContext.js.map +0 -1
  278. package/build/dist/Actions/ActionQueue.js +0 -87
  279. package/build/dist/Actions/ActionQueue.js.map +0 -1
  280. package/build/dist/Actions/Actionable.js +0 -2
  281. package/build/dist/Actions/Actionable.js.map +0 -1
  282. package/build/dist/Actions/Index.js.map +0 -1
  283. package/build/dist/Actions/RotationType.js.map +0 -1
  284. package/build/dist/Actor.js +0 -856
  285. package/build/dist/Actor.js.map +0 -1
  286. package/build/dist/Camera.js +0 -627
  287. package/build/dist/Camera.js.map +0 -1
  288. package/build/dist/Class.js.map +0 -1
  289. package/build/dist/Collision/BodyComponent.js +0 -347
  290. package/build/dist/Collision/BodyComponent.js.map +0 -1
  291. package/build/dist/Collision/BoundingBox.js +0 -355
  292. package/build/dist/Collision/BoundingBox.js.map +0 -1
  293. package/build/dist/Collision/ColliderComponent.js +0 -201
  294. package/build/dist/Collision/ColliderComponent.js.map +0 -1
  295. package/build/dist/Collision/Colliders/CircleCollider.js +0 -215
  296. package/build/dist/Collision/Colliders/CircleCollider.js.map +0 -1
  297. package/build/dist/Collision/Colliders/ClosestLineJumpTable.js +0 -211
  298. package/build/dist/Collision/Colliders/ClosestLineJumpTable.js.map +0 -1
  299. package/build/dist/Collision/Colliders/Collider.js +0 -26
  300. package/build/dist/Collision/Colliders/Collider.js.map +0 -1
  301. package/build/dist/Collision/Colliders/CollisionJumpTable.js +0 -301
  302. package/build/dist/Collision/Colliders/CollisionJumpTable.js.map +0 -1
  303. package/build/dist/Collision/Colliders/CompositeCollider.js +0 -232
  304. package/build/dist/Collision/Colliders/CompositeCollider.js.map +0 -1
  305. package/build/dist/Collision/Colliders/EdgeCollider.js +0 -253
  306. package/build/dist/Collision/Colliders/EdgeCollider.js.map +0 -1
  307. package/build/dist/Collision/Colliders/PolygonCollider.js +0 -389
  308. package/build/dist/Collision/Colliders/PolygonCollider.js.map +0 -1
  309. package/build/dist/Collision/Colliders/SeparatingAxis.js +0 -67
  310. package/build/dist/Collision/Colliders/SeparatingAxis.js.map +0 -1
  311. package/build/dist/Collision/Colliders/Shape.js +0 -102
  312. package/build/dist/Collision/Colliders/Shape.js.map +0 -1
  313. package/build/dist/Collision/CollisionSystem.js +0 -116
  314. package/build/dist/Collision/CollisionSystem.js.map +0 -1
  315. package/build/dist/Collision/CollisionType.js.map +0 -1
  316. package/build/dist/Collision/Detection/CollisionContact.js +0 -46
  317. package/build/dist/Collision/Detection/CollisionContact.js.map +0 -1
  318. package/build/dist/Collision/Detection/CollisionProcessor.js +0 -2
  319. package/build/dist/Collision/Detection/CollisionProcessor.js.map +0 -1
  320. package/build/dist/Collision/Detection/DynamicTree.js +0 -442
  321. package/build/dist/Collision/Detection/DynamicTree.js.map +0 -1
  322. package/build/dist/Collision/Detection/DynamicTreeCollisionProcessor.js +0 -228
  323. package/build/dist/Collision/Detection/DynamicTreeCollisionProcessor.js.map +0 -1
  324. package/build/dist/Collision/Detection/Pair.js +0 -74
  325. package/build/dist/Collision/Detection/Pair.js.map +0 -1
  326. package/build/dist/Collision/Group/CollisionGroup.js.map +0 -1
  327. package/build/dist/Collision/Group/CollisionGroupManager.js +0 -52
  328. package/build/dist/Collision/Group/CollisionGroupManager.js.map +0 -1
  329. package/build/dist/Collision/Index.js.map +0 -1
  330. package/build/dist/Collision/Integrator.js +0 -11
  331. package/build/dist/Collision/Integrator.js.map +0 -1
  332. package/build/dist/Collision/MotionSystem.js +0 -38
  333. package/build/dist/Collision/MotionSystem.js.map +0 -1
  334. package/build/dist/Collision/Physics.js +0 -163
  335. package/build/dist/Collision/Physics.js.map +0 -1
  336. package/build/dist/Collision/Side.js +0 -51
  337. package/build/dist/Collision/Side.js.map +0 -1
  338. package/build/dist/Collision/Solver/ArcadeSolver.js +0 -96
  339. package/build/dist/Collision/Solver/ArcadeSolver.js.map +0 -1
  340. package/build/dist/Collision/Solver/ContactConstraintPoint.js +0 -83
  341. package/build/dist/Collision/Solver/ContactConstraintPoint.js.map +0 -1
  342. package/build/dist/Collision/Solver/RealisticSolver.js +0 -248
  343. package/build/dist/Collision/Solver/RealisticSolver.js.map +0 -1
  344. package/build/dist/Collision/Solver/Solver.js +0 -37
  345. package/build/dist/Collision/Solver/Solver.js.map +0 -1
  346. package/build/dist/Color.js +0 -461
  347. package/build/dist/Color.js.map +0 -1
  348. package/build/dist/Configurable.js +0 -32
  349. package/build/dist/Configurable.js.map +0 -1
  350. package/build/dist/Debug/Debug.js +0 -339
  351. package/build/dist/Debug/Debug.js.map +0 -1
  352. package/build/dist/Debug/DebugFlags.js +0 -13
  353. package/build/dist/Debug/DebugFlags.js.map +0 -1
  354. package/build/dist/Debug/DebugSystem.js +0 -242
  355. package/build/dist/Debug/DebugSystem.js.map +0 -1
  356. package/build/dist/Debug/index.js.map +0 -1
  357. package/build/dist/Deprecated.js +0 -2
  358. package/build/dist/Deprecated.js.map +0 -1
  359. package/build/dist/Drawing/Animation.js +0 -285
  360. package/build/dist/Drawing/Animation.js.map +0 -1
  361. package/build/dist/Drawing/CanvasDrawComponent.js +0 -16
  362. package/build/dist/Drawing/CanvasDrawComponent.js.map +0 -1
  363. package/build/dist/Drawing/CanvasDrawingSystem.js +0 -95
  364. package/build/dist/Drawing/CanvasDrawingSystem.js.map +0 -1
  365. package/build/dist/Drawing/Index.js +0 -10
  366. package/build/dist/Drawing/Index.js.map +0 -1
  367. package/build/dist/Drawing/Polygon.js +0 -129
  368. package/build/dist/Drawing/Polygon.js.map +0 -1
  369. package/build/dist/Drawing/Sprite.js +0 -356
  370. package/build/dist/Drawing/Sprite.js.map +0 -1
  371. package/build/dist/Drawing/SpriteEffects.js +0 -246
  372. package/build/dist/Drawing/SpriteEffects.js.map +0 -1
  373. package/build/dist/Drawing/SpriteSheet.js +0 -413
  374. package/build/dist/Drawing/SpriteSheet.js.map +0 -1
  375. package/build/dist/Drawing/Texture.js +0 -80
  376. package/build/dist/Drawing/Texture.js.map +0 -1
  377. package/build/dist/Engine.js +0 -871
  378. package/build/dist/Engine.js.map +0 -1
  379. package/build/dist/EntityComponentSystem/Component.js +0 -65
  380. package/build/dist/EntityComponentSystem/Component.js.map +0 -1
  381. package/build/dist/EntityComponentSystem/Components/MotionComponent.js +0 -33
  382. package/build/dist/EntityComponentSystem/Components/MotionComponent.js.map +0 -1
  383. package/build/dist/EntityComponentSystem/Components/TransformComponent.js +0 -249
  384. package/build/dist/EntityComponentSystem/Components/TransformComponent.js.map +0 -1
  385. package/build/dist/EntityComponentSystem/Entity.js +0 -452
  386. package/build/dist/EntityComponentSystem/Entity.js.map +0 -1
  387. package/build/dist/EntityComponentSystem/EntityManager.js +0 -121
  388. package/build/dist/EntityComponentSystem/EntityManager.js.map +0 -1
  389. package/build/dist/EntityComponentSystem/Query.js +0 -91
  390. package/build/dist/EntityComponentSystem/Query.js.map +0 -1
  391. package/build/dist/EntityComponentSystem/QueryManager.js +0 -90
  392. package/build/dist/EntityComponentSystem/QueryManager.js.map +0 -1
  393. package/build/dist/EntityComponentSystem/System.js +0 -76
  394. package/build/dist/EntityComponentSystem/System.js.map +0 -1
  395. package/build/dist/EntityComponentSystem/SystemManager.js +0 -96
  396. package/build/dist/EntityComponentSystem/SystemManager.js.map +0 -1
  397. package/build/dist/EntityComponentSystem/Util.js +0 -5
  398. package/build/dist/EntityComponentSystem/Util.js.map +0 -1
  399. package/build/dist/EntityComponentSystem/World.js +0 -55
  400. package/build/dist/EntityComponentSystem/World.js.map +0 -1
  401. package/build/dist/EntityComponentSystem/index.js.map +0 -1
  402. package/build/dist/EventDispatcher.js +0 -133
  403. package/build/dist/EventDispatcher.js.map +0 -1
  404. package/build/dist/Events/MediaEvents.js +0 -75
  405. package/build/dist/Events/MediaEvents.js.map +0 -1
  406. package/build/dist/Events.js +0 -497
  407. package/build/dist/Events.js.map +0 -1
  408. package/build/dist/Flags.js +0 -90
  409. package/build/dist/Flags.js.map +0 -1
  410. package/build/dist/Graphics/Animation.js +0 -230
  411. package/build/dist/Graphics/Animation.js.map +0 -1
  412. package/build/dist/Graphics/Canvas.js +0 -34
  413. package/build/dist/Graphics/Canvas.js.map +0 -1
  414. package/build/dist/Graphics/Circle.js +0 -39
  415. package/build/dist/Graphics/Circle.js.map +0 -1
  416. package/build/dist/Graphics/Context/ExcaliburGraphicsContext.js +0 -2
  417. package/build/dist/Graphics/Context/ExcaliburGraphicsContext.js.map +0 -1
  418. package/build/dist/Graphics/Context/ExcaliburGraphicsContext2DCanvas.js +0 -177
  419. package/build/dist/Graphics/Context/ExcaliburGraphicsContext2DCanvas.js.map +0 -1
  420. package/build/dist/Graphics/Context/ExcaliburGraphicsContextWebGL.js +0 -188
  421. package/build/dist/Graphics/Context/ExcaliburGraphicsContextWebGL.js.map +0 -1
  422. package/build/dist/Graphics/Context/batch.js +0 -24
  423. package/build/dist/Graphics/Context/batch.js.map +0 -1
  424. package/build/dist/Graphics/Context/debug-text.js +0 -47
  425. package/build/dist/Graphics/Context/debug-text.js.map +0 -1
  426. package/build/dist/Graphics/Context/draw-image-command.js +0 -179
  427. package/build/dist/Graphics/Context/draw-image-command.js.map +0 -1
  428. package/build/dist/Graphics/Context/image-renderer.js +0 -295
  429. package/build/dist/Graphics/Context/image-renderer.js.map +0 -1
  430. package/build/dist/Graphics/Context/line-renderer.js +0 -70
  431. package/build/dist/Graphics/Context/line-renderer.js.map +0 -1
  432. package/build/dist/Graphics/Context/point-renderer.js +0 -67
  433. package/build/dist/Graphics/Context/point-renderer.js.map +0 -1
  434. package/build/dist/Graphics/Context/renderer.js +0 -75
  435. package/build/dist/Graphics/Context/renderer.js.map +0 -1
  436. package/build/dist/Graphics/Context/shader.js +0 -189
  437. package/build/dist/Graphics/Context/shader.js.map +0 -1
  438. package/build/dist/Graphics/Context/state-stack.js +0 -27
  439. package/build/dist/Graphics/Context/state-stack.js.map +0 -1
  440. package/build/dist/Graphics/Context/texture-loader.js +0 -84
  441. package/build/dist/Graphics/Context/texture-loader.js.map +0 -1
  442. package/build/dist/Graphics/Context/transform-stack.js +0 -30
  443. package/build/dist/Graphics/Context/transform-stack.js.map +0 -1
  444. package/build/dist/Graphics/Context/webgl-util.js +0 -26
  445. package/build/dist/Graphics/Context/webgl-util.js.map +0 -1
  446. package/build/dist/Graphics/Font.js +0 -209
  447. package/build/dist/Graphics/Font.js.map +0 -1
  448. package/build/dist/Graphics/FontCommon.js.map +0 -1
  449. package/build/dist/Graphics/Graphic.js +0 -147
  450. package/build/dist/Graphics/Graphic.js.map +0 -1
  451. package/build/dist/Graphics/GraphicsComponent.js +0 -276
  452. package/build/dist/Graphics/GraphicsComponent.js.map +0 -1
  453. package/build/dist/Graphics/GraphicsDiagnostics.js +0 -9
  454. package/build/dist/Graphics/GraphicsDiagnostics.js.map +0 -1
  455. package/build/dist/Graphics/GraphicsGroup.js +0 -66
  456. package/build/dist/Graphics/GraphicsGroup.js.map +0 -1
  457. package/build/dist/Graphics/GraphicsSystem.js +0 -161
  458. package/build/dist/Graphics/GraphicsSystem.js.map +0 -1
  459. package/build/dist/Graphics/ImageSource.js +0 -117
  460. package/build/dist/Graphics/ImageSource.js.map +0 -1
  461. package/build/dist/Graphics/Polygon.js +0 -51
  462. package/build/dist/Graphics/Polygon.js.map +0 -1
  463. package/build/dist/Graphics/Raster.js +0 -209
  464. package/build/dist/Graphics/Raster.js.map +0 -1
  465. package/build/dist/Graphics/Rectangle.js +0 -24
  466. package/build/dist/Graphics/Rectangle.js.map +0 -1
  467. package/build/dist/Graphics/Sprite.js +0 -81
  468. package/build/dist/Graphics/Sprite.js.map +0 -1
  469. package/build/dist/Graphics/SpriteFont.js +0 -116
  470. package/build/dist/Graphics/SpriteFont.js.map +0 -1
  471. package/build/dist/Graphics/SpriteSheet.js +0 -116
  472. package/build/dist/Graphics/SpriteSheet.js.map +0 -1
  473. package/build/dist/Graphics/Text.js +0 -82
  474. package/build/dist/Graphics/Text.js.map +0 -1
  475. package/build/dist/Graphics/index.js.map +0 -1
  476. package/build/dist/Id.js +0 -8
  477. package/build/dist/Id.js.map +0 -1
  478. package/build/dist/Input/CapturePointerConfig.js +0 -5
  479. package/build/dist/Input/CapturePointerConfig.js.map +0 -1
  480. package/build/dist/Input/EngineInput.js +0 -2
  481. package/build/dist/Input/EngineInput.js.map +0 -1
  482. package/build/dist/Input/Gamepad.js +0 -358
  483. package/build/dist/Input/Gamepad.js.map +0 -1
  484. package/build/dist/Input/Index.js.map +0 -1
  485. package/build/dist/Input/Keyboard.js +0 -267
  486. package/build/dist/Input/Keyboard.js.map +0 -1
  487. package/build/dist/Input/Pointer.js +0 -205
  488. package/build/dist/Input/Pointer.js.map +0 -1
  489. package/build/dist/Input/PointerEvents.js +0 -309
  490. package/build/dist/Input/PointerEvents.js.map +0 -1
  491. package/build/dist/Input/Pointers.js +0 -405
  492. package/build/dist/Input/Pointers.js.map +0 -1
  493. package/build/dist/Interfaces/Audio.js +0 -2
  494. package/build/dist/Interfaces/Audio.js.map +0 -1
  495. package/build/dist/Interfaces/AudioImplementation.js +0 -11
  496. package/build/dist/Interfaces/AudioImplementation.js.map +0 -1
  497. package/build/dist/Interfaces/Clonable.js +0 -2
  498. package/build/dist/Interfaces/Clonable.js.map +0 -1
  499. package/build/dist/Interfaces/Drawable.js +0 -2
  500. package/build/dist/Interfaces/Drawable.js.map +0 -1
  501. package/build/dist/Interfaces/Evented.js +0 -2
  502. package/build/dist/Interfaces/Evented.js.map +0 -1
  503. package/build/dist/Interfaces/Index.js.map +0 -1
  504. package/build/dist/Interfaces/LifecycleEvents.js +0 -51
  505. package/build/dist/Interfaces/LifecycleEvents.js.map +0 -1
  506. package/build/dist/Interfaces/Loadable.js +0 -2
  507. package/build/dist/Interfaces/Loadable.js.map +0 -1
  508. package/build/dist/Interfaces/PointerEventHandlers.js +0 -2
  509. package/build/dist/Interfaces/PointerEventHandlers.js.map +0 -1
  510. package/build/dist/Interfaces/Trait.js +0 -2
  511. package/build/dist/Interfaces/Trait.js.map +0 -1
  512. package/build/dist/Label.js +0 -262
  513. package/build/dist/Label.js.map +0 -1
  514. package/build/dist/Loader.js +0 -344
  515. package/build/dist/Loader.js.map +0 -1
  516. package/build/dist/Math/Index.js.map +0 -1
  517. package/build/dist/Math/Random.js +0 -239
  518. package/build/dist/Math/Random.js.map +0 -1
  519. package/build/dist/Math/global-coordinates.js +0 -30
  520. package/build/dist/Math/global-coordinates.js.map +0 -1
  521. package/build/dist/Math/line.js +0 -194
  522. package/build/dist/Math/line.js.map +0 -1
  523. package/build/dist/Math/matrix.js +0 -425
  524. package/build/dist/Math/matrix.js.map +0 -1
  525. package/build/dist/Math/projection.js +0 -24
  526. package/build/dist/Math/projection.js.map +0 -1
  527. package/build/dist/Math/ray.js +0 -52
  528. package/build/dist/Math/ray.js.map +0 -1
  529. package/build/dist/Math/vector-view.js +0 -25
  530. package/build/dist/Math/vector-view.js.map +0 -1
  531. package/build/dist/Math/vector.js +0 -326
  532. package/build/dist/Math/vector.js.map +0 -1
  533. package/build/dist/Particles.js +0 -436
  534. package/build/dist/Particles.js.map +0 -1
  535. package/build/dist/Polyfill.js +0 -56
  536. package/build/dist/Polyfill.js.map +0 -1
  537. package/build/dist/PostProcessing/ColorBlindCorrector.js +0 -193
  538. package/build/dist/PostProcessing/ColorBlindCorrector.js.map +0 -1
  539. package/build/dist/PostProcessing/Index.js.map +0 -1
  540. package/build/dist/PostProcessing/PostProcessor.js +0 -2
  541. package/build/dist/PostProcessing/PostProcessor.js.map +0 -1
  542. package/build/dist/Promises.js +0 -205
  543. package/build/dist/Promises.js.map +0 -1
  544. package/build/dist/Resources/Gif.js +0 -490
  545. package/build/dist/Resources/Gif.js.map +0 -1
  546. package/build/dist/Resources/Index.js.map +0 -1
  547. package/build/dist/Resources/Resource.js +0 -74
  548. package/build/dist/Resources/Resource.js.map +0 -1
  549. package/build/dist/Resources/Sound/AudioContext.js +0 -16
  550. package/build/dist/Resources/Sound/AudioContext.js.map +0 -1
  551. package/build/dist/Resources/Sound/Index.js.map +0 -1
  552. package/build/dist/Resources/Sound/Sound.js +0 -257
  553. package/build/dist/Resources/Sound/Sound.js.map +0 -1
  554. package/build/dist/Resources/Sound/WebAudioInstance.js +0 -160
  555. package/build/dist/Resources/Sound/WebAudioInstance.js.map +0 -1
  556. package/build/dist/Scene.js +0 -443
  557. package/build/dist/Scene.js.map +0 -1
  558. package/build/dist/Screen.js +0 -611
  559. package/build/dist/Screen.js.map +0 -1
  560. package/build/dist/ScreenElement.js +0 -33
  561. package/build/dist/ScreenElement.js.map +0 -1
  562. package/build/dist/TileMap.js +0 -465
  563. package/build/dist/TileMap.js.map +0 -1
  564. package/build/dist/Timer.js +0 -198
  565. package/build/dist/Timer.js.map +0 -1
  566. package/build/dist/Traits/CapturePointer.js +0 -16
  567. package/build/dist/Traits/CapturePointer.js.map +0 -1
  568. package/build/dist/Traits/Index.js.map +0 -1
  569. package/build/dist/Traits/OffscreenCulling.js +0 -35
  570. package/build/dist/Traits/OffscreenCulling.js.map +0 -1
  571. package/build/dist/Trigger.js +0 -107
  572. package/build/dist/Trigger.js.map +0 -1
  573. package/build/dist/Util/Actors.js +0 -19
  574. package/build/dist/Util/Actors.js.map +0 -1
  575. package/build/dist/Util/Browser.js +0 -66
  576. package/build/dist/Util/Browser.js.map +0 -1
  577. package/build/dist/Util/CullingBox.js +0 -104
  578. package/build/dist/Util/CullingBox.js.map +0 -1
  579. package/build/dist/Util/Decorators.js +0 -78
  580. package/build/dist/Util/Decorators.js.map +0 -1
  581. package/build/dist/Util/Detector.js +0 -167
  582. package/build/dist/Util/Detector.js.map +0 -1
  583. package/build/dist/Util/DrawUtil.js +0 -115
  584. package/build/dist/Util/DrawUtil.js.map +0 -1
  585. package/build/dist/Util/EasingFunctions.js +0 -118
  586. package/build/dist/Util/EasingFunctions.js.map +0 -1
  587. package/build/dist/Util/Index.js.map +0 -1
  588. package/build/dist/Util/Log.js +0 -195
  589. package/build/dist/Util/Log.js.map +0 -1
  590. package/build/dist/Util/Observable.js +0 -60
  591. package/build/dist/Util/Observable.js.map +0 -1
  592. package/build/dist/Util/Pool.js +0 -72
  593. package/build/dist/Util/Pool.js.map +0 -1
  594. package/build/dist/Util/SortedList.js +0 -261
  595. package/build/dist/Util/SortedList.js.map +0 -1
  596. package/build/dist/Util/Sound.js +0 -22
  597. package/build/dist/Util/Sound.js.map +0 -1
  598. package/build/dist/Util/Util.js +0 -401
  599. package/build/dist/Util/Util.js.map +0 -1
  600. package/build/dist/Util/Watch.js +0 -67
  601. package/build/dist/Util/Watch.js.map +0 -1
  602. package/build/dist/Util/WebAudio.js +0 -62
  603. package/build/dist/Util/WebAudio.js.map +0 -1
  604. package/build/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excalibur.js","mappings":"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;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,mDAAmD;AACnD,IAAI;AACJ,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtDA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;;;;;;;ACNA,gBAAgB,mBAAO,CAAC,IAAyB;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA,kBAAkB,mBAAO,CAAC,IAA0B;AACpD,UAAU,mBAAO,CAAC,GAAkB;;AAEpC;AACA;AACA;;AAEA;AACA;AACA,+CAA+C,aAAa;AAC5D;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;AChBA,aAAa,mBAAO,CAAC,IAAqB;AAC1C,iBAAiB,mBAAO,CAAC,IAA0B;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;ACTA,gBAAgB,mBAAO,CAAC,IAAyB;;AAEjD;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAM,gBAAgB,qBAAM;AAC3C;AACA,iBAAiB,cAAc;;;;;;;;ACb/B,eAAe,mBAAO,CAAC,IAAwB;;AAE/C,uBAAuB;;AAEvB;AACA;AACA;;;;;;;;ACNA;;;;;;;;ACAA,kBAAkB,mBAAO,CAAC,IAA0B;AACpD,YAAY,mBAAO,CAAC,IAAoB;AACxC,oBAAoB,mBAAO,CAAC,IAAsC;;AAElE;AACA;AACA;AACA;AACA,uBAAuB;AACvB,GAAG;AACH,CAAC;;;;;;;;ACVD,YAAY,mBAAO,CAAC,IAAoB;AACxC,cAAc,mBAAO,CAAC,IAA0B;;AAEhD;;AAEA;AACA;AACA;AACA;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ACzB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE7B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,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,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE3B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAE7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAE7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG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","sources":["webpack:///../../node_modules/core-js/es/array/sort.js","webpack:///../../node_modules/core-js/es/object/keys.js","webpack:///../../node_modules/core-js/internals/a-callable.js","webpack:///../../node_modules/core-js/internals/an-object.js","webpack:///../../node_modules/core-js/internals/array-includes.js","webpack:///../../node_modules/core-js/internals/array-method-is-strict.js","webpack:///../../node_modules/core-js/internals/array-sort.js","webpack:///../../node_modules/core-js/internals/classof-raw.js","webpack:///../../node_modules/core-js/internals/classof.js","webpack:///../../node_modules/core-js/internals/copy-constructor-properties.js","webpack:///../../node_modules/core-js/internals/create-non-enumerable-property.js","webpack:///../../node_modules/core-js/internals/create-property-descriptor.js","webpack:///../../node_modules/core-js/internals/descriptors.js","webpack:///../../node_modules/core-js/internals/document-create-element.js","webpack:///../../node_modules/core-js/internals/engine-ff-version.js","webpack:///../../node_modules/core-js/internals/engine-is-ie-or-edge.js","webpack:///../../node_modules/core-js/internals/engine-user-agent.js","webpack:///../../node_modules/core-js/internals/engine-v8-version.js","webpack:///../../node_modules/core-js/internals/engine-webkit-version.js","webpack:///../../node_modules/core-js/internals/entry-unbind.js","webpack:///../../node_modules/core-js/internals/enum-bug-keys.js","webpack:///../../node_modules/core-js/internals/export.js","webpack:///../../node_modules/core-js/internals/fails.js","webpack:///../../node_modules/core-js/internals/function-bind-context.js","webpack:///../../node_modules/core-js/internals/function-name.js","webpack:///../../node_modules/core-js/internals/get-built-in.js","webpack:///../../node_modules/core-js/internals/get-method.js","webpack:///../../node_modules/core-js/internals/global.js","webpack:///../../node_modules/core-js/internals/has.js","webpack:///../../node_modules/core-js/internals/hidden-keys.js","webpack:///../../node_modules/core-js/internals/ie8-dom-define.js","webpack:///../../node_modules/core-js/internals/indexed-object.js","webpack:///../../node_modules/core-js/internals/inspect-source.js","webpack:///../../node_modules/core-js/internals/internal-state.js","webpack:///../../node_modules/core-js/internals/is-callable.js","webpack:///../../node_modules/core-js/internals/is-forced.js","webpack:///../../node_modules/core-js/internals/is-object.js","webpack:///../../node_modules/core-js/internals/is-pure.js","webpack:///../../node_modules/core-js/internals/is-symbol.js","webpack:///../../node_modules/core-js/internals/native-symbol.js","webpack:///../../node_modules/core-js/internals/native-weak-map.js","webpack:///../../node_modules/core-js/internals/object-define-property.js","webpack:///../../node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack:///../../node_modules/core-js/internals/object-get-own-property-names.js","webpack:///../../node_modules/core-js/internals/object-get-own-property-symbols.js","webpack:///../../node_modules/core-js/internals/object-keys-internal.js","webpack:///../../node_modules/core-js/internals/object-keys.js","webpack:///../../node_modules/core-js/internals/object-property-is-enumerable.js","webpack:///../../node_modules/core-js/internals/ordinary-to-primitive.js","webpack:///../../node_modules/core-js/internals/own-keys.js","webpack:///../../node_modules/core-js/internals/path.js","webpack:///../../node_modules/core-js/internals/redefine.js","webpack:///../../node_modules/core-js/internals/require-object-coercible.js","webpack:///../../node_modules/core-js/internals/set-global.js","webpack:///../../node_modules/core-js/internals/shared-key.js","webpack:///../../node_modules/core-js/internals/shared-store.js","webpack:///../../node_modules/core-js/internals/shared.js","webpack:///../../node_modules/core-js/internals/to-absolute-index.js","webpack:///../../node_modules/core-js/internals/to-indexed-object.js","webpack:///../../node_modules/core-js/internals/to-integer.js","webpack:///../../node_modules/core-js/internals/to-length.js","webpack:///../../node_modules/core-js/internals/to-object.js","webpack:///../../node_modules/core-js/internals/to-primitive.js","webpack:///../../node_modules/core-js/internals/to-property-key.js","webpack:///../../node_modules/core-js/internals/to-string-tag-support.js","webpack:///../../node_modules/core-js/internals/to-string.js","webpack:///../../node_modules/core-js/internals/try-to-string.js","webpack:///../../node_modules/core-js/internals/uid.js","webpack:///../../node_modules/core-js/internals/use-symbol-as-uid.js","webpack:///../../node_modules/core-js/internals/well-known-symbol.js","webpack:///../../node_modules/core-js/modules/es.array.sort.js","webpack:///../../node_modules/core-js/modules/es.object.keys.js","webpack:///./Loader.css","webpack:///../../node_modules/css-loader/dist/runtime/api.js","webpack:///../../node_modules/css-loader/dist/runtime/sourceMaps.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./Polyfill.ts","webpack:///./Flags.ts","webpack:///./Id.ts","webpack:///./Util/Log.ts","webpack:///./Math/Random.ts","webpack:///./Collision/Side.ts","webpack:///./Util/Util.ts","webpack:///./Util/Decorators.ts","webpack:///./Math/vector.ts","webpack:///./Color.ts","webpack:///./Collision/BoundingBox.ts","webpack:///./Math/matrix.ts","webpack:///./Graphics/Context/transform-stack.ts","webpack:///./Graphics/Context/state-stack.ts","webpack:///./Graphics/Context/shader.ts","webpack:///./Graphics/Context/shaders/line-vertex.glsl","webpack:///./Graphics/Context/shaders/line-fragment.glsl","webpack:///./Graphics/Context/batch.ts","webpack:///./Graphics/GraphicsDiagnostics.ts","webpack:///./Util/Pool.ts","webpack:///./Graphics/Context/renderer.ts","webpack:///./Graphics/Context/line-renderer.ts","webpack:///./Graphics/Context/shaders/image-vertex.glsl","webpack:///./Graphics/Context/shaders/image-fragment.glsl","webpack:///./Graphics/Context/draw-image-command.ts","webpack:///./Graphics/Context/webgl-util.ts","webpack:///./Graphics/Context/texture-loader.ts","webpack:///./Graphics/Context/image-renderer.ts","webpack:///./Graphics/Context/shaders/point-vertex.glsl","webpack:///./Graphics/Context/shaders/point-fragment.glsl","webpack:///./Graphics/Context/point-renderer.ts","webpack:///./Graphics/Graphic.ts","webpack:///./Util/Watch.ts","webpack:///./Graphics/Raster.ts","webpack:///./Graphics/Canvas.ts","webpack:///./Events.ts","webpack:///./EventDispatcher.ts","webpack:///./Resources/Resource.ts","webpack:///./Drawing/SpriteEffects.ts","webpack:///./Drawing/Texture.ts","webpack:///./Configurable.ts","webpack:///./Drawing/Sprite.ts","webpack:///./Graphics/Sprite.ts","webpack:///./Graphics/ImageSource.ts","webpack:///./Drawing/Animation.ts","webpack:///./Graphics/FontCommon.ts","webpack:///./Drawing/SpriteSheet.ts","webpack:///./Graphics/SpriteSheet.ts","webpack:///./Graphics/SpriteFont.ts","webpack:///./Graphics/Context/debug-font.png","webpack:///./Graphics/Context/debug-text.ts","webpack:///./Graphics/Context/ExcaliburGraphicsContextWebGL.ts","webpack:///./Screen.ts","webpack:///./Resources/Sound/AudioContext.ts","webpack:///./Util/WebAudio.ts","webpack:///./Class.ts","webpack:///./Util/DrawUtil.ts","webpack:///./Loader.logo.png","webpack:///./Loader.ts","webpack:///./Util/Detector.ts","webpack:///./Collision/CollisionType.ts","webpack:///./Collision/Physics.ts","webpack:///./Math/vector-view.ts","webpack:///./EntityComponentSystem/Component.ts","webpack:///./EntityComponentSystem/Components/TransformComponent.ts","webpack:///./EntityComponentSystem/Components/MotionComponent.ts","webpack:///./Collision/Group/CollisionGroup.ts","webpack:///./Util/Observable.ts","webpack:///./Collision/Detection/Pair.ts","webpack:///./Math/projection.ts","webpack:///./Collision/Detection/DynamicTree.ts","webpack:///./Math/ray.ts","webpack:///./Collision/Detection/DynamicTreeCollisionProcessor.ts","webpack:///./Collision/Colliders/Collider.ts","webpack:///./Collision/Colliders/CompositeCollider.ts","webpack:///./Math/line.ts","webpack:///./Collision/Colliders/ClosestLineJumpTable.ts","webpack:///./Collision/Colliders/CircleCollider.ts","webpack:///./Collision/Detection/CollisionContact.ts","webpack:///./Collision/Colliders/SeparatingAxis.ts","webpack:///./Collision/Colliders/CollisionJumpTable.ts","webpack:///./Collision/Colliders/EdgeCollider.ts","webpack:///./Collision/Colliders/PolygonCollider.ts","webpack:///./Collision/Colliders/Shape.ts","webpack:///./Collision/ColliderComponent.ts","webpack:///./Collision/BodyComponent.ts","webpack:///./Util/CullingBox.ts","webpack:///./Traits/OffscreenCulling.ts","webpack:///./Traits/CapturePointer.ts","webpack:///./EntityComponentSystem/Entity.ts","webpack:///./Drawing/CanvasDrawComponent.ts","webpack:///./Graphics/GraphicsComponent.ts","webpack:///./Graphics/Rectangle.ts","webpack:///./Graphics/Circle.ts","webpack:///./Util/EasingFunctions.ts","webpack:///./Actions/ActionQueue.ts","webpack:///./Actions/Action/Repeat.ts","webpack:///./Actions/Action/RepeatForever.ts","webpack:///./Actions/Action/MoveBy.ts","webpack:///./Actions/Action/MoveTo.ts","webpack:///./Actions/RotationType.ts","webpack:///./Actions/Action/RotateTo.ts","webpack:///./Actions/Action/RotateBy.ts","webpack:///./Actions/Action/ScaleTo.ts","webpack:///./Actions/Action/ScaleBy.ts","webpack:///./Actions/Action/CallMethod.ts","webpack:///./Actions/Action/EaseTo.ts","webpack:///./Actions/Action/Blink.ts","webpack:///./Actions/Action/Fade.ts","webpack:///./Actions/Action/Delay.ts","webpack:///./Actions/Action/Die.ts","webpack:///./Actions/Action/Follow.ts","webpack:///./Actions/Action/Meet.ts","webpack:///./Actions/ActionContext.ts","webpack:///./Actions/ActionsComponent.ts","webpack:///./Actor.ts","webpack:///./ScreenElement.ts","webpack:///./Timer.ts","webpack:///./TileMap.ts","webpack:///./Camera.ts","webpack:///./Util/Actors.ts","webpack:///./Trigger.ts","webpack:///./EntityComponentSystem/System.ts","webpack:///./EntityComponentSystem/EntityManager.ts","webpack:///./EntityComponentSystem/Util.ts","webpack:///./EntityComponentSystem/Query.ts","webpack:///./EntityComponentSystem/QueryManager.ts","webpack:///./EntityComponentSystem/SystemManager.ts","webpack:///./EntityComponentSystem/World.ts","webpack:///./Collision/Integrator.ts","webpack:///./Collision/MotionSystem.ts","webpack:///./Collision/Solver/Solver.ts","webpack:///./Collision/Solver/ArcadeSolver.ts","webpack:///./Collision/Solver/ContactConstraintPoint.ts","webpack:///./Collision/Solver/RealisticSolver.ts","webpack:///./Collision/CollisionSystem.ts","webpack:///./Graphics/Animation.ts","webpack:///./Graphics/GraphicsGroup.ts","webpack:///./Particles.ts","webpack:///./Graphics/GraphicsSystem.ts","webpack:///./Drawing/CanvasDrawingSystem.ts","webpack:///./Debug/DebugSystem.ts","webpack:///./Actions/ActionsSystem.ts","webpack:///./Scene.ts","webpack:///./PostProcessing/ColorBlindCorrector.ts","webpack:///./Debug/DebugFlags.ts","webpack:///./Debug/Debug.ts","webpack:///./Input/Keyboard.ts","webpack:///./Input/Pointer.ts","webpack:///./Input/PointerEvents.ts","webpack:///./Math/global-coordinates.ts","webpack:///./Input/Pointers.ts","webpack:///./Input/Gamepad.ts","webpack:///./Util/Browser.ts","webpack:///./Graphics/Context/ExcaliburGraphicsContext2DCanvas.ts","webpack:///./Engine.ts","webpack:///./Math/Index.ts","webpack:///./Debug/index.ts","webpack:///./Events/MediaEvents.ts","webpack:///./Graphics/Font.ts","webpack:///./Graphics/Text.ts","webpack:///./Label.ts","webpack:///./Actions/Index.ts","webpack:///./Collision/Group/CollisionGroupManager.ts","webpack:///./Collision/Index.ts","webpack:///./Drawing/Polygon.ts","webpack:///./Drawing/Index.ts","webpack:///./Interfaces/AudioImplementation.ts","webpack:///./Interfaces/LifecycleEvents.ts","webpack:///./Interfaces/Index.ts","webpack:///./PostProcessing/Index.ts","webpack:///./Resources/Sound/WebAudioInstance.ts","webpack:///./Util/Sound.ts","webpack:///./Resources/Sound/Sound.ts","webpack:///./Resources/Sound/Index.ts","webpack:///./Resources/Gif.ts","webpack:///./Resources/Index.ts","webpack:///./EntityComponentSystem/index.ts","webpack:///./Graphics/Polygon.ts","webpack:///./Graphics/index.ts","webpack:///./Input/Index.ts","webpack:///./Traits/Index.ts","webpack:///./Util/Index.ts","webpack:///./Util/SortedList.ts","webpack:///./Promises.ts","webpack:///./index.ts"],"sourcesContent":["require('../../modules/es.array.sort');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('Array', 'sort');\n","require('../../modules/es.object.keys');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.keys;\n","var isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw TypeError(tryToString(argument) + ' is not a function');\n};\n","var isObject = require('../internals/is-object');\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw TypeError(String(argument) + ' is not an object');\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","// TODO: use something more complex like timsort?\nvar floor = Math.floor;\n\nvar mergeSort = function (array, comparefn) {\n var length = array.length;\n var middle = floor(length / 2);\n return length < 8 ? insertionSort(array, comparefn) : merge(\n mergeSort(array.slice(0, middle), comparefn),\n mergeSort(array.slice(middle), comparefn),\n comparefn\n );\n};\n\nvar insertionSort = function (array, comparefn) {\n var length = array.length;\n var i = 1;\n var element, j;\n\n while (i < length) {\n j = i;\n element = array[i];\n while (j && comparefn(array[j - 1], element) > 0) {\n array[j] = array[--j];\n }\n if (j !== i++) array[j] = element;\n } return array;\n};\n\nvar merge = function (left, right, comparefn) {\n var llength = left.length;\n var rlength = right.length;\n var lindex = 0;\n var rindex = 0;\n var result = [];\n\n while (lindex < llength || rindex < rlength) {\n if (lindex < llength && rindex < rlength) {\n result.push(comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]);\n } else {\n result.push(lindex < llength ? left[lindex++] : right[rindex++]);\n }\n } return result;\n};\n\nmodule.exports = mergeSort;\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nvar firefox = userAgent.match(/firefox\\/(\\d+)/i);\n\nmodule.exports = !!firefox && +firefox[1];\n","var UA = require('../internals/engine-user-agent');\n\nmodule.exports = /MSIE|Trident/.test(UA);\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] < 4 ? 1 : match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var userAgent = require('../internals/engine-user-agent');\n\nvar webkit = userAgent.match(/AppleWebKit\\/(\\d+)\\./);\n\nmodule.exports = !!webkit && +webkit[1];\n","var global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\n\nvar call = Function.call;\n\nmodule.exports = function (CONSTRUCTOR, METHOD, length) {\n return bind(call, global[CONSTRUCTOR].prototype[METHOD], length);\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var aCallable = require('../internals/a-callable');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aCallable(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar has = require('../internals/has');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = has(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n","var aCallable = require('../internals/a-callable');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return func == null ? undefined : aCallable(func);\n};\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","var toObject = require('../internals/to-object');\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty.call(toObject(it), key);\n};\n","module.exports = {};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- requied for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","var isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n if (wmhas.call(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (objectHas(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = function (argument) {\n return typeof argument === 'function';\n};\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : isCallable(it);\n};\n","module.exports = false;\n","var isCallable = require('../internals/is-callable');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && Object(it) instanceof $Symbol;\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol();\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap));\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","var isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = fn.call(input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = fn.call(input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar has = require('../internals/has');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var name = options && options.name !== undefined ? options.name : key;\n var state;\n if (isCallable(value)) {\n if (String(name).slice(0, 7) === 'Symbol(') {\n name = '[' + String(name).replace(/^Symbol\\(([^)]*)\\)/, '$1') + ']';\n }\n if (!has(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n createNonEnumerableProperty(value, 'name', name);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof name == 'string' ? name : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n});\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (key, value) {\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(global, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.18.1',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\n});\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.es/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = exoticToPrim.call(input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","var toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : String(key);\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var classof = require('../internals/classof');\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return String(argument);\n};\n","module.exports = function (argument) {\n try {\n return String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {\n if (NATIVE_SYMBOL && has(Symbol, name)) {\n WellKnownSymbolsStore[name] = Symbol[name];\n } else {\n WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n }\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\nvar internalSort = require('../internals/array-sort');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar FF = require('../internals/engine-ff-version');\nvar IE_OR_EDGE = require('../internals/engine-is-ie-or-edge');\nvar V8 = require('../internals/engine-v8-version');\nvar WEBKIT = require('../internals/engine-webkit-version');\n\nvar test = [];\nvar nativeSort = test.sort;\n\n// IE8-\nvar FAILS_ON_UNDEFINED = fails(function () {\n test.sort(undefined);\n});\n// V8 bug\nvar FAILS_ON_NULL = fails(function () {\n test.sort(null);\n});\n// Old WebKit\nvar STRICT_METHOD = arrayMethodIsStrict('sort');\n\nvar STABLE_SORT = !fails(function () {\n // feature detection can be too slow, so check engines versions\n if (V8) return V8 < 70;\n if (FF && FF > 3) return;\n if (IE_OR_EDGE) return true;\n if (WEBKIT) return WEBKIT < 603;\n\n var result = '';\n var code, chr, value, index;\n\n // generate an array with more 512 elements (Chakra and old V8 fails only in this case)\n for (code = 65; code < 76; code++) {\n chr = String.fromCharCode(code);\n\n switch (code) {\n case 66: case 69: case 70: case 72: value = 3; break;\n case 68: case 71: value = 4; break;\n default: value = 2;\n }\n\n for (index = 0; index < 47; index++) {\n test.push({ k: chr + index, v: value });\n }\n }\n\n test.sort(function (a, b) { return b.v - a.v; });\n\n for (index = 0; index < test.length; index++) {\n chr = test[index].k.charAt(0);\n if (result.charAt(result.length - 1) !== chr) result += chr;\n }\n\n return result !== 'DGBEFHACIJK';\n});\n\nvar FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;\n\nvar getSortCompare = function (comparefn) {\n return function (x, y) {\n if (y === undefined) return -1;\n if (x === undefined) return 1;\n if (comparefn !== undefined) return +comparefn(x, y) || 0;\n return toString(x) > toString(y) ? 1 : -1;\n };\n};\n\n// `Array.prototype.sort` method\n// https://tc39.es/ecma262/#sec-array.prototype.sort\n$({ target: 'Array', proto: true, forced: FORCED }, {\n sort: function sort(comparefn) {\n if (comparefn !== undefined) aCallable(comparefn);\n\n var array = toObject(this);\n\n if (STABLE_SORT) return comparefn === undefined ? nativeSort.call(array) : nativeSort.call(array, comparefn);\n\n var items = [];\n var arrayLength = toLength(array.length);\n var itemsLength, index;\n\n for (index = 0; index < arrayLength; index++) {\n if (index in array) items.push(array[index]);\n }\n\n items = internalSort(items, getSortCompare(comparefn));\n itemsLength = items.length;\n index = 0;\n\n while (index < itemsLength) array[index] = items[index++];\n while (index < arrayLength) delete array[index++];\n\n return array;\n }\n});\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Buttons styles start */\\r\\n\\r\\nbutton#excalibur-play {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n z-index: 999;\\r\\n border-radius: 6px;\\r\\n border: none;\\r\\n /*border: 3px solid;\\r\\n border-color: white;\\r\\n box-shadow: 0 0 10px #ccc;*/\\r\\n padding: 1rem 1.5rem 1rem 4rem;\\r\\n margin: 0;\\r\\n text-decoration: none;\\r\\n background: #00b233;\\r\\n color: #ffffff;\\r\\n font-family: sans-serif;\\r\\n font-size: 2rem;\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n cursor: pointer;\\r\\n text-align: center;\\r\\n transition: background 250ms ease-in-out, transform 150ms ease;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n\\r\\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\\r\\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\\r\\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\\r\\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\\r\\n animation: excalibur-button-fadein 200ms;\\r\\n}\\r\\n\\r\\n/*\\r\\nbutton#excalibur-play {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\nbutton#excalibur-play:after {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 8px solid;\\r\\n border-color: transparent transparent transparent white;\\r\\n left: 35px;\\r\\n top: 24px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:before {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 3px solid;\\r\\n left: 19px;\\r\\n top: 14px;\\r\\n border-radius: 20px;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:hover,\\r\\nbutton#excalibur-play:focus {\\r\\n background: #00982c;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:focus {\\r\\n outline: 1px solid #fff;\\r\\n outline-offset: -4px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:active {\\r\\n transform: scale(0.99);\\r\\n}\\r\\n\\r\\n@keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Firefox < 16 */\\r\\n@-moz-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Safari, Chrome and Opera > 12.1 */\\r\\n@-webkit-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Internet Explorer */\\r\\n@-ms-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Opera < 12.1 */\\r\\n@-o-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./Loader.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;;AAEzB;EACE,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ;;+BAE6B;EAC7B,8BAA8B;EAC9B,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,cAAc;EACd,uBAAuB;EACvB,eAAe;EACf,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB,8DAA8D;EAC9D,wBAAwB;EACxB,qBAAqB;;EAErB,gDAAgD,EAAE,oCAAoC;EACtF,6CAA6C,EAAE,iBAAiB;EAChE,4CAA4C,EAAE,sBAAsB;EACpE,2CAA2C,EAAE,iBAAiB;EAC9D,wCAAwC;AAC1C;;AAEA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,uDAAuD;EACvD,UAAU;EACV,SAAS;EACT,QAAQ;EACR,SAAS;AACX;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,mBAAmB;EACnB,WAAW;EACX,YAAY;AACd;;AAEA;;EAEE,mBAAmB;AACrB;;AAEA;EACE,uBAAuB;EACvB,oBAAoB;AACtB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,oCAAoC;AACpC;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,sBAAsB;AACtB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF;;AAEA,iBAAiB;AACjB;EACE;IACE,UAAU;EACZ;EACA;IACE,UAAU;EACZ;AACF\",\"sourcesContent\":[\"/* Buttons styles start */\\r\\n\\r\\nbutton#excalibur-play {\\r\\n display: inline-block;\\r\\n position: relative;\\r\\n z-index: 999;\\r\\n border-radius: 6px;\\r\\n border: none;\\r\\n /*border: 3px solid;\\r\\n border-color: white;\\r\\n box-shadow: 0 0 10px #ccc;*/\\r\\n padding: 1rem 1.5rem 1rem 4rem;\\r\\n margin: 0;\\r\\n text-decoration: none;\\r\\n background: #00b233;\\r\\n color: #ffffff;\\r\\n font-family: sans-serif;\\r\\n font-size: 2rem;\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n cursor: pointer;\\r\\n text-align: center;\\r\\n transition: background 250ms ease-in-out, transform 150ms ease;\\r\\n -webkit-appearance: none;\\r\\n -moz-appearance: none;\\r\\n\\r\\n -webkit-animation: excalibur-button-fadein 200ms; /* Safari, Chrome and Opera > 12.1 */\\r\\n -moz-animation: excalibur-button-fadein 200ms; /* Firefox < 16 */\\r\\n -ms-animation: excalibur-button-fadein 200ms; /* Internet Explorer */\\r\\n -o-animation: excalibur-button-fadein 200ms; /* Opera < 12.1 */\\r\\n animation: excalibur-button-fadein 200ms;\\r\\n}\\r\\n\\r\\n/*\\r\\nbutton#excalibur-play {\\r\\n display: none;\\r\\n}*/\\r\\n\\r\\nbutton#excalibur-play:after {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 8px solid;\\r\\n border-color: transparent transparent transparent white;\\r\\n left: 35px;\\r\\n top: 24px;\\r\\n width: 0;\\r\\n height: 0;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:before {\\r\\n position: absolute;\\r\\n content: '';\\r\\n border: 3px solid;\\r\\n left: 19px;\\r\\n top: 14px;\\r\\n border-radius: 20px;\\r\\n width: 30px;\\r\\n height: 30px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:hover,\\r\\nbutton#excalibur-play:focus {\\r\\n background: #00982c;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:focus {\\r\\n outline: 1px solid #fff;\\r\\n outline-offset: -4px;\\r\\n}\\r\\n\\r\\nbutton#excalibur-play:active {\\r\\n transform: scale(0.99);\\r\\n}\\r\\n\\r\\n@keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Firefox < 16 */\\r\\n@-moz-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Safari, Chrome and Opera > 12.1 */\\r\\n@-webkit-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Internet Explorer */\\r\\n@-ms-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Opera < 12.1 */\\r\\n@-o-keyframes excalibur-button-fadein {\\r\\n from {\\r\\n opacity: 0;\\r\\n }\\r\\n to {\\r\\n opacity: 1;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n\n content += cssWithMappingToString(item);\n\n if (needLayer) {\n content += \"}\";\n }\n\n if (item[2]) {\n content += \"}\";\n }\n\n if (item[4]) {\n content += \"}\";\n }\n\n return content;\n }).join(\"\");\n }; // import a list of modules into the list\n\n\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var _i = 0; _i < this.length; _i++) {\n var id = this[_i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i2 = 0; _i2 < modules.length; _i2++) {\n var item = [].concat(modules[_i2]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n }\n\n return [content].join(\"\\n\");\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import 'core-js/es/array/sort';\r\nimport 'core-js/es/object/keys';\r\n\r\n/**\r\n * Polyfill adding function\r\n */\r\nexport function polyfill() {\r\n /* istanbul ignore next */\r\n if (typeof window === 'undefined') {\r\n window = <any>{\r\n audioContext: function () {\r\n return;\r\n }\r\n };\r\n }\r\n /* istanbul ignore next */\r\n if (typeof window !== 'undefined' && !window.requestAnimationFrame) {\r\n (<any>window).requestAnimationFrame =\r\n (<any>window).webkitRequestAnimationFrame ||\r\n (<any>window).mozRequestAnimationFrame ||\r\n function (callback: Function) {\r\n window.setInterval(callback, 1000 / 60);\r\n };\r\n }\r\n /* istanbul ignore next */\r\n if (typeof window !== 'undefined' && !window.cancelAnimationFrame) {\r\n (<any>window).cancelAnimationFrame =\r\n (<any>window).webkitCancelAnimationFrame ||\r\n (<any>window).mozCancelAnimationFrame ||\r\n function () {\r\n return;\r\n };\r\n }\r\n /* istanbul ignore next */\r\n if (typeof window !== 'undefined' && !(<any>window).AudioContext) {\r\n if ((<any>window).webkitAudioContext) {\r\n const ctx = (<any>window).webkitAudioContext;\r\n const replaceMe = ctx.prototype.decodeAudioData;\r\n (<any>window).webkitAudioContext.prototype.decodeAudioData = function (arrayBuffer: ArrayBuffer) {\r\n return new Promise((resolve, reject) => {\r\n replaceMe.call(this, arrayBuffer, resolve, reject);\r\n });\r\n };\r\n }\r\n\r\n (<any>window).AudioContext =\r\n (<any>window).AudioContext ||\r\n (<any>window).webkitAudioContext ||\r\n (<any>window).mozAudioContext ||\r\n (<any>window).msAudioContext ||\r\n (<any>window).oAudioContext;\r\n }\r\n\r\n /* istanbul ignore next */\r\n if (typeof window !== 'undefined' && !(<any>window).devicePixelRatio) {\r\n (<any>window).devicePixelRatio = window.devicePixelRatio || 1;\r\n }\r\n}\r\n","\r\n/**\r\n * Features in preview\r\n */\r\nexport enum Experiments {\r\n WebGL = 'use-webgl'\r\n}\r\n\r\n/**\r\n * Legacy features that will go away\r\n */\r\nexport enum Legacy {\r\n Canvas = 'use-canvas-context',\r\n LegacyDrawing = 'use-legacy-drawing'\r\n}\r\n\r\n/**\r\n * Flags is a feature flag implementation for Excalibur. They can only be operated **before [[Engine]] construction**\r\n * after which they are frozen and are read-only.\r\n *\r\n * Flags are used to enable experimental or preview features in Excalibur.\r\n */\r\nexport class Flags {\r\n private static _FROZEN = false;\r\n private static _FLAGS: Record<string, boolean> = {};\r\n\r\n /**\r\n * Freeze all flag modifications making them readonly\r\n */\r\n public static freeze() {\r\n Flags._FROZEN = true;\r\n }\r\n\r\n /**\r\n * Resets internal flag state, not meant to be called by users. Only used for testing.\r\n *\r\n * Calling this in your game is UNSUPPORTED\r\n * @internal\r\n */\r\n public static _reset() {\r\n Flags._FROZEN = false;\r\n Flags._FLAGS = {};\r\n }\r\n\r\n /**\r\n * Turn on webgl support\r\n */\r\n public static useWebGL() {\r\n Flags.enable(Experiments.WebGL);\r\n }\r\n\r\n public static useCanvasGraphicsContext() {\r\n Flags.enable(Legacy.Canvas);\r\n }\r\n\r\n /**\r\n * @deprecated Recommended not to use legacy drawing, going away in v0.26.0\r\n */\r\n public static useLegacyDrawing() {\r\n Flags.enable(Legacy.LegacyDrawing);\r\n }\r\n\r\n /**\r\n * Enable a specific feature flag by name. **Note: can only be set before [[Engine]] constructor time**\r\n * @param flagName\r\n */\r\n public static enable(flagName: string): void {\r\n if (this._FROZEN) {\r\n throw Error('Feature flags can only be enabled before Engine constructor time');\r\n }\r\n Flags._FLAGS[flagName] = true;\r\n }\r\n\r\n /**\r\n * Disable a specific feature flag by name. **Note: can only be set before [[Engine]] constructor time**\r\n * @param flagName\r\n */\r\n public static disable(flagName: string): void {\r\n if (this._FROZEN) {\r\n throw Error('Feature flags can only be disabled before Engine constructor time');\r\n }\r\n Flags._FLAGS[flagName] = false;\r\n }\r\n\r\n /**\r\n * Check if a flag is enabled. If the flag is disabled or does not exist `false` is returned\r\n * @param flagName\r\n */\r\n public static isEnabled(flagName: string): boolean {\r\n return !!Flags._FLAGS[flagName];\r\n }\r\n\r\n /**\r\n * Show a list of currently known flags\r\n */\r\n public static show(): string[] {\r\n return Object.keys(Flags._FLAGS);\r\n }\r\n}\r\n","export type Id<T extends string> = {\r\n type: T,\r\n value: number\r\n};\r\n\r\n/**\r\n *\r\n */\r\nexport function createId<T extends string>(type: T, value: number): Id<T> {\r\n return { type, value };\r\n};\r\n","/* eslint-disable no-console */\r\n/**\r\n * Logging level that Excalibur will tag\r\n */\r\nexport enum LogLevel {\r\n Debug,\r\n Info,\r\n Warn,\r\n Error,\r\n Fatal\r\n}\r\n\r\n/**\r\n * Static singleton that represents the logging facility for Excalibur.\r\n * Excalibur comes built-in with a [[ConsoleAppender]] and [[ScreenAppender]].\r\n * Derive from [[Appender]] to create your own logging appenders.\r\n */\r\nexport class Logger {\r\n private static _INSTANCE: Logger = null;\r\n private _appenders: Appender[] = [];\r\n\r\n constructor() {\r\n if (Logger._INSTANCE) {\r\n throw new Error('Logger is a singleton');\r\n }\r\n Logger._INSTANCE = this;\r\n // Default console appender\r\n Logger._INSTANCE.addAppender(new ConsoleAppender());\r\n return Logger._INSTANCE;\r\n }\r\n\r\n /**\r\n * Gets or sets the default logging level. Excalibur will only log\r\n * messages if equal to or above this level. Default: [[LogLevel.Info]]\r\n */\r\n public defaultLevel: LogLevel = LogLevel.Info;\r\n\r\n /**\r\n * Gets the current static instance of Logger\r\n */\r\n public static getInstance(): Logger {\r\n if (Logger._INSTANCE == null) {\r\n Logger._INSTANCE = new Logger();\r\n }\r\n return Logger._INSTANCE;\r\n }\r\n\r\n /**\r\n * Adds a new [[Appender]] to the list of appenders to write to\r\n */\r\n public addAppender(appender: Appender): void {\r\n this._appenders.push(appender);\r\n }\r\n\r\n /**\r\n * Clears all appenders from the logger\r\n */\r\n public clearAppenders(): void {\r\n this._appenders.length = 0;\r\n }\r\n\r\n /**\r\n * Logs a message at a given LogLevel\r\n * @param level The LogLevel`to log the message at\r\n * @param args An array of arguments to write to an appender\r\n */\r\n private _log(level: LogLevel, args: any[]): void {\r\n if (level == null) {\r\n level = this.defaultLevel;\r\n }\r\n\r\n const len = this._appenders.length;\r\n\r\n for (let i = 0; i < len; i++) {\r\n if (level >= this.defaultLevel) {\r\n this._appenders[i].log(level, args);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Writes a log message at the [[LogLevel.Debug]] level\r\n * @param args Accepts any number of arguments\r\n */\r\n public debug(...args: any[]): void {\r\n this._log(LogLevel.Debug, args);\r\n }\r\n\r\n /**\r\n * Writes a log message at the [[LogLevel.Info]] level\r\n * @param args Accepts any number of arguments\r\n */\r\n public info(...args: any[]): void {\r\n this._log(LogLevel.Info, args);\r\n }\r\n\r\n /**\r\n * Writes a log message at the [[LogLevel.Warn]] level\r\n * @param args Accepts any number of arguments\r\n */\r\n public warn(...args: any[]): void {\r\n this._log(LogLevel.Warn, args);\r\n }\r\n\r\n /**\r\n * Writes a log message at the [[LogLevel.Error]] level\r\n * @param args Accepts any number of arguments\r\n */\r\n public error(...args: any[]): void {\r\n this._log(LogLevel.Error, args);\r\n }\r\n\r\n /**\r\n * Writes a log message at the [[LogLevel.Fatal]] level\r\n * @param args Accepts any number of arguments\r\n */\r\n public fatal(...args: any[]): void {\r\n this._log(LogLevel.Fatal, args);\r\n }\r\n}\r\n\r\n/**\r\n * Contract for any log appender (such as console/screen)\r\n */\r\nexport interface Appender {\r\n /**\r\n * Logs a message at the given [[LogLevel]]\r\n * @param level Level to log at\r\n * @param args Arguments to log\r\n */\r\n log(level: LogLevel, args: any[]): void;\r\n}\r\n\r\n/**\r\n * Console appender for browsers (i.e. `console.log`)\r\n */\r\nexport class ConsoleAppender implements Appender {\r\n /**\r\n * Logs a message at the given [[LogLevel]]\r\n * @param level Level to log at\r\n * @param args Arguments to log\r\n */\r\n public log(level: LogLevel, args: any[]): void {\r\n // Check for console support\r\n if (!console && !console.log && console.warn && console.error) {\r\n // todo maybe do something better than nothing\r\n return;\r\n }\r\n\r\n // Create a new console args array\r\n const consoleArgs: any[] = [];\r\n consoleArgs.unshift.apply(consoleArgs, args);\r\n consoleArgs.unshift('[' + LogLevel[level] + '] : ');\r\n\r\n if (level < LogLevel.Warn) {\r\n // Call .log for Debug/Info\r\n if (console.log.apply) {\r\n // this is required on some older browsers that don't support apply on console.log :(\r\n console.log.apply(console, consoleArgs);\r\n } else {\r\n console.log(consoleArgs.join(' '));\r\n }\r\n } else if (level < LogLevel.Error) {\r\n // Call .warn for Warn\r\n if (console.warn.apply) {\r\n console.warn.apply(console, consoleArgs);\r\n } else {\r\n console.warn(consoleArgs.join(' '));\r\n }\r\n } else {\r\n // Call .error for Error/Fatal\r\n if (console.error.apply) {\r\n console.error.apply(console, consoleArgs);\r\n } else {\r\n console.error(consoleArgs.join(' '));\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * On-screen (canvas) appender\r\n */\r\nexport class ScreenAppender implements Appender {\r\n // @todo Clean this up\r\n\r\n private _messages: string[] = [];\r\n private _canvas: HTMLCanvasElement;\r\n private _ctx: CanvasRenderingContext2D;\r\n\r\n /**\r\n * @param width Width of the screen appender in pixels\r\n * @param height Height of the screen appender in pixels\r\n */\r\n constructor(width?: number, height?: number) {\r\n this._canvas = <HTMLCanvasElement>document.createElement('canvas');\r\n this._canvas.width = width || window.innerWidth;\r\n this._canvas.height = height || window.innerHeight;\r\n this._canvas.style.position = 'absolute';\r\n // eslint-disable-next-line\r\n this._ctx = <CanvasRenderingContext2D>this._canvas.getContext('2d'); // eslint-disable-line\r\n document.body.appendChild(this._canvas);\r\n }\r\n\r\n /**\r\n * Logs a message at the given [[LogLevel]]\r\n * @param level Level to log at\r\n * @param args Arguments to log\r\n */\r\n public log(level: LogLevel, args: any[]): void {\r\n const message = args.join(',');\r\n\r\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\r\n\r\n this._messages.unshift('[' + LogLevel[level] + '] : ' + message);\r\n\r\n let pos = 10;\r\n let opacity = 1.0;\r\n for (let i = 0; i < this._messages.length; i++) {\r\n this._ctx.fillStyle = 'rgba(255,255,255,' + opacity.toFixed(2) + ')';\r\n this._ctx.fillText(this._messages[i], 200, pos);\r\n pos += 10;\r\n opacity = opacity > 0 ? opacity - 0.05 : 0;\r\n }\r\n }\r\n}\r\n","/**\r\n * @module\r\n * Pseudo-Random Utility\r\n *\r\n * A pseudo-random utility to add seeded random support for help in\r\n * generating things like terrain or reproducible randomness. Uses the\r\n * [Mersenne Twister](https://en.wikipedia.org/wiki/Mersenne_Twister) algorithm.\r\n */\r\n\r\n/**\r\n * 32-bit mask\r\n */\r\nconst BITMASK32: number = 0xffffffff;\r\n\r\n/**\r\n * Pseudo-random number generator following the Mersenne_Twister algorithm. Given a seed this generator will produce the same sequence\r\n * of numbers each time it is called.\r\n * See https://en.wikipedia.org/wiki/Mersenne_Twister for more details.\r\n * Uses the MT19937-32 (2002) implementation documented here http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html\r\n *\r\n * Api inspired by http://chancejs.com/# https://github.com/chancejs/chancejs\r\n */\r\nexport class Random {\r\n // Separation point of one one word, the number of bits in the lower bitmask 0 <= r <= w-1\r\n private _lowerMask: number = 0x7fffffff; // 31 bits same as _r\r\n private _upperMask: number = 0x80000000; // 34 high bits\r\n\r\n // Word size, 64 bits\r\n private _w: number = 32;\r\n\r\n // Degree of recurrence\r\n private _n: number = 624;\r\n\r\n // Middle word, an offset used in the recurrence defining the series x, 1<=m<n\r\n private _m: number = 397;\r\n // coefficients of teh rational normal form twist matrix\r\n private _a: number = 0x9908b0df;\r\n\r\n // tempering bit shifts and masks\r\n private _u: number = 11;\r\n private _s: number = 7;\r\n private _b: number = 0x9d2c5680;\r\n private _t: number = 15;\r\n private _c: number = 0xefc60000;\r\n private _l: number = 18;\r\n private _f: number = 1812433253;\r\n\r\n private _mt: number[];\r\n\r\n private _index: number;\r\n\r\n /**\r\n * If no seed is specified, the Date.now() is used\r\n */\r\n constructor(public seed?: number) {\r\n this._mt = new Array<number>(this._n);\r\n // need to mask to support higher bit machines\r\n this._mt[0] = (seed || Date.now()) >>> 0;\r\n\r\n for (let i = 1; i < this._n; i++) {\r\n const s = this._mt[i - 1] ^ (this._mt[i - 1] >>> (this._w - 2));\r\n // numbers are bigger than the JS max safe int, add in 16-bit chunks to prevent IEEE rounding errors on high bits\r\n this._mt[i] = (((this._f * ((s & 0xffff0000) >>> 16)) << 16) + this._f * (s & 0xffff) + i) >>> 0;\r\n }\r\n this._index = this._n;\r\n }\r\n\r\n /**\r\n * Apply the twist\r\n */\r\n private _twist(): void {\r\n const mag01 = [0x0, this._a];\r\n let y = 0,\r\n i = 0;\r\n for (; i < this._n - this._m; i++) {\r\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\r\n this._mt[i] = this._mt[i + this._m] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\r\n }\r\n for (; i < this._n - 1; i++) {\r\n y = (this._mt[i] & this._upperMask) | (this._mt[i + 1] & this._lowerMask);\r\n this._mt[i] = this._mt[i + (this._m - this._n)] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\r\n }\r\n y = (this._mt[this._n - 1] & this._upperMask) | (this._mt[0] & this._lowerMask);\r\n this._mt[this._n - 1] = this._mt[this._m - 1] ^ (y >>> 1) ^ (mag01[y & 0x1] & BITMASK32);\r\n\r\n this._index = 0;\r\n }\r\n\r\n /**\r\n * Return next 32 bit integer number in sequence\r\n */\r\n public nextInt(): number {\r\n if (this._index >= this._n) {\r\n this._twist();\r\n }\r\n\r\n let y = this._mt[this._index++];\r\n\r\n y ^= y >>> this._u;\r\n y ^= (y << this._s) & this._b;\r\n y ^= (y << this._t) & this._c;\r\n y ^= y >>> this._l;\r\n\r\n return y >>> 0;\r\n }\r\n\r\n /**\r\n * Return a random floating point number between [0, 1)\r\n */\r\n public next(): number {\r\n return this.nextInt() * (1.0 / 4294967296.0); // divided by 2^32\r\n }\r\n\r\n /**\r\n * Return a random floating point in range [min, max) min is included, max is not included\r\n */\r\n public floating(min: number, max: number): number {\r\n return (max - min) * this.next() + min;\r\n }\r\n\r\n /**\r\n * Return a random integer in range [min, max] min is included, max is included.\r\n * Implemented with rejection sampling, see https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.i13tdiu5a\r\n */\r\n public integer(min: number, max: number): number {\r\n return Math.floor((max - min + 1) * this.next() + min);\r\n }\r\n\r\n /**\r\n * Returns true or false randomly with 50/50 odds by default.\r\n * By default the likelihood of returning a true is .5 (50%).\r\n * @param likelihood takes values between [0, 1]\r\n */\r\n public bool(likelihood: number = 0.5): boolean {\r\n return this.next() <= likelihood;\r\n }\r\n\r\n /**\r\n * Returns one element from an array at random\r\n */\r\n public pickOne<T>(array: Array<T>): T {\r\n return array[this.integer(0, array.length - 1)];\r\n }\r\n\r\n /**\r\n * Returns a new array random picking elements from the original\r\n * @param array Original array to pick from\r\n * @param numPicks can be any positive number\r\n * @param allowDuplicates indicates whether the returned set is allowed duplicates (it does not mean there will always be duplicates\r\n * just that it is possible)\r\n */\r\n public pickSet<T>(array: Array<T>, numPicks: number, allowDuplicates: boolean = false): Array<T> {\r\n if (allowDuplicates) {\r\n return this._pickSetWithDuplicates(array, numPicks);\r\n } else {\r\n return this._pickSetWithoutDuplicates(array, numPicks);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a new array randomly picking elements in the original (not reused)\r\n * @param array Array to pick elements out of\r\n * @param numPicks must be less than or equal to the number of elements in the array.\r\n */\r\n private _pickSetWithoutDuplicates<T>(array: Array<T>, numPicks: number): Array<T> {\r\n if (numPicks > array.length || numPicks < 0) {\r\n throw new Error('Invalid number of elements to pick, must pick a value 0 < n <= length');\r\n }\r\n if (numPicks === array.length) {\r\n return array;\r\n }\r\n\r\n const result: Array<T> = new Array<T>(numPicks);\r\n let currentPick = 0;\r\n const tempArray = array.slice(0);\r\n while (currentPick < numPicks) {\r\n const index = this.integer(0, tempArray.length - 1);\r\n result[currentPick++] = tempArray[index];\r\n tempArray.splice(index, 1);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new array random picking elements from the original allowing duplicates\r\n * @param array Array to pick elements out of\r\n * @param numPicks can be any positive number\r\n */\r\n private _pickSetWithDuplicates<T>(array: Array<T>, numPicks: number): Array<T> {\r\n // Typescript numbers are all floating point, so do we add check for int? (or floor the input?)\r\n if (numPicks < 0) {\r\n throw new Error('Invalid number of elements to pick, must pick a value 0 <= n < MAX_INT');\r\n }\r\n const result = new Array<T>(numPicks);\r\n for (let i = 0; i < numPicks; i++) {\r\n result[i] = this.pickOne(array);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns a new array that has its elements shuffled. Using the Fisher/Yates method\r\n * https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\r\n */\r\n public shuffle<T>(array: Array<T>): Array<T> {\r\n const tempArray = array.slice(0);\r\n let swap: T = null;\r\n for (let i = 0; i < tempArray.length - 2; i++) {\r\n const randomIndex = this.integer(i, tempArray.length - 1);\r\n swap = tempArray[i];\r\n tempArray[i] = tempArray[randomIndex];\r\n tempArray[randomIndex] = swap;\r\n }\r\n\r\n return tempArray;\r\n }\r\n\r\n /**\r\n * Generate a list of random integer numbers\r\n * @param length the length of the final array\r\n * @param min the minimum integer number to generate inclusive\r\n * @param max the maximum integer number to generate inclusive\r\n */\r\n public range(length: number, min: number, max: number): Array<number> {\r\n const result: Array<number> = new Array(length);\r\n for (let i = 0; i < length; i++) {\r\n result[i] = this.integer(min, max);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the result of a d4 dice roll\r\n */\r\n public d4() {\r\n return this.integer(1, 4);\r\n }\r\n\r\n /**\r\n * Returns the result of a d6 dice roll\r\n */\r\n public d6() {\r\n return this.integer(1, 6);\r\n }\r\n\r\n /**\r\n * Returns the result of a d8 dice roll\r\n */\r\n public d8() {\r\n return this.integer(1, 8);\r\n }\r\n\r\n /**\r\n * Returns the result of a d10 dice roll\r\n */\r\n public d10() {\r\n return this.integer(1, 10);\r\n }\r\n\r\n /**\r\n * Returns the result of a d12 dice roll\r\n */\r\n public d12() {\r\n return this.integer(1, 12);\r\n }\r\n\r\n /**\r\n * Returns the result of a d20 dice roll\r\n */\r\n public d20() {\r\n return this.integer(1, 20);\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\r\n\r\n/**\r\n * An enum that describes the sides of an axis aligned box for collision\r\n */\r\nexport enum Side {\r\n None = 'None',\r\n Top = 'Top',\r\n Bottom = 'Bottom',\r\n Left = 'Left',\r\n Right = 'Right'\r\n}\r\n\r\nexport module Side {\r\n /**\r\n * Returns the opposite side from the current\r\n */\r\n export function getOpposite(side: Side): Side {\r\n if (side === Side.Top) {\r\n return Side.Bottom;\r\n }\r\n if (side === Side.Bottom) {\r\n return Side.Top;\r\n }\r\n if (side === Side.Left) {\r\n return Side.Right;\r\n }\r\n if (side === Side.Right) {\r\n return Side.Left;\r\n }\r\n\r\n return Side.None;\r\n }\r\n\r\n /**\r\n * Given a vector, return the Side most in that direction (via dot product)\r\n */\r\n export function fromDirection(direction: Vector): Side {\r\n const directions = [Vector.Left, Vector.Right, Vector.Up, Vector.Down];\r\n const directionEnum = [Side.Left, Side.Right, Side.Top, Side.Bottom];\r\n\r\n let max = -Number.MAX_VALUE;\r\n let maxIndex = -1;\r\n for (let i = 0; i < directions.length; i++) {\r\n if (directions[i].dot(direction) > max) {\r\n max = directions[i].dot(direction);\r\n maxIndex = i;\r\n }\r\n }\r\n return directionEnum[maxIndex];\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\r\nimport { Random } from '../Math/Random';\r\nimport { Side } from '../Collision/Side';\r\n\r\n/**\r\n * Two PI constant\r\n */\r\nexport const TwoPI: number = Math.PI * 2;\r\n\r\n/**\r\n * Merges one or more objects into a single target object\r\n *\r\n * @param deep Whether or not to do a deep clone\r\n * @param target The target object to attach properties on\r\n * @param objects The objects whose properties to merge\r\n * @returns Merged object with properties from other objects\r\n */\r\nexport function extend(deep: boolean, target: any, ...objects: any[]): any;\r\n\r\n/**\r\n * Merges one or more objects into a single target object\r\n *\r\n * @param target The target object to attach properties on\r\n * @param object2 The second object whose properties to merge\r\n * @returns Merged object with properties from other objects\r\n */\r\nexport function extend<T1, T2>(target: T1, object2: T2): T1 & T2;\r\n\r\n/**\r\n * Merges one or more objects into a single target object\r\n *\r\n * @param target The target object to attach properties on\r\n * @param object2 The second object whose properties to merge\r\n * @param object3 The third object whose properties to merge\r\n * @returns Merged object with properties from other objects\r\n */\r\nexport function extend<T1, T2, T3>(target: T1, object2: T2, object3: T3): T1 & T2 & T3;\r\n\r\n/**\r\n * Merges one or more objects into a single target object\r\n *\r\n * @param target The target object to attach properties on\r\n * @param objects The objects whose properties to merge\r\n * @returns Merged object with properties from other objects\r\n */\r\nexport function extend(target: any, ...objects: any[]): any;\r\n\r\n/**\r\n * Merges one or more objects into a single target object\r\n *\r\n * @returns Merged object with properties from other objects\r\n * @credit https://gomakethings.com/vanilla-javascript-version-of-jquery-extend/\r\n */\r\nexport function extend() {\r\n const extended: { [key: string]: any } = {};\r\n let deep = false;\r\n let i = 0;\r\n const length = arguments.length;\r\n\r\n // Check if a deep merge\r\n if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') {\r\n deep = arguments[0];\r\n i++;\r\n }\r\n\r\n // Merge the object into the extended object\r\n const assignExists = typeof (<any>Object).assign === 'function';\r\n let merge = null;\r\n if (!assignExists) {\r\n merge = function (obj: any) {\r\n for (const prop in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\r\n // If deep merge and property is an object, merge properties\r\n if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {\r\n extended[prop] = extend(true, extended[prop], obj[prop]);\r\n } else {\r\n extended[prop] = obj[prop];\r\n }\r\n }\r\n }\r\n };\r\n } else {\r\n merge = (<any>Object).assign;\r\n }\r\n\r\n // Loop through each object and conduct a merge\r\n for (; i < length; i++) {\r\n const obj = arguments[i];\r\n if (!assignExists) {\r\n merge(obj);\r\n } else {\r\n merge(extended, obj);\r\n }\r\n }\r\n\r\n return extended;\r\n}\r\n\r\n/**\r\n * Encode a string in base64\r\n * @deprecated This will be removed in v0.26.0\r\n */\r\nexport function base64Encode(inputStr: string) {\r\n const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\r\n let outputStr = '';\r\n let i = 0;\r\n\r\n while (i < inputStr.length) {\r\n //all three \"& 0xff\" added below are there to fix a known bug\r\n //with bytes returned by xhr.responseText\r\n const byte1 = inputStr.charCodeAt(i++) & 0xff;\r\n const byte2 = inputStr.charCodeAt(i++) & 0xff;\r\n const byte3 = inputStr.charCodeAt(i++) & 0xff;\r\n\r\n const enc1 = byte1 >> 2;\r\n const enc2 = ((byte1 & 3) << 4) | (byte2 >> 4);\r\n\r\n let enc3, enc4;\r\n if (isNaN(byte2)) {\r\n enc3 = enc4 = 64;\r\n } else {\r\n enc3 = ((byte2 & 15) << 2) | (byte3 >> 6);\r\n if (isNaN(byte3)) {\r\n enc4 = 64;\r\n } else {\r\n enc4 = byte3 & 63;\r\n }\r\n }\r\n\r\n outputStr += b64.charAt(enc1) + b64.charAt(enc2) + b64.charAt(enc3) + b64.charAt(enc4);\r\n }\r\n\r\n return outputStr;\r\n}\r\n\r\n/**\r\n * Sugar that will use `nullishVal` if it's not null or undefined. Simulates the `??` operator\r\n * @param nullishVal\r\n * @param defaultVal\r\n */\r\nexport function nullish<T>(nullishVal: T | undefined | null, defaultVal: T): T {\r\n return nullishVal !== null && nullishVal !== undefined ? nullishVal : defaultVal;\r\n}\r\n\r\n/**\r\n * Clamps a value between a min and max inclusive\r\n */\r\nexport function clamp(val: number, min: number, max: number) {\r\n return Math.min(Math.max(min, val), max);\r\n}\r\n\r\n/**\r\n * Find a random floating point number in range\r\n */\r\nexport function randomInRange(min: number, max: number, random: Random = new Random()): number {\r\n return random ? random.floating(min, max) : min + Math.random() * (max - min);\r\n}\r\n\r\n/**\r\n * Find a random integer in a range\r\n */\r\nexport function randomIntInRange(min: number, max: number, random: Random = new Random()): number {\r\n return random ? random.integer(min, max) : Math.round(randomInRange(min, max));\r\n}\r\n\r\n/**\r\n * Convert an angle to be the equivalent in the range [0, 2PI]\r\n */\r\nexport function canonicalizeAngle(angle: number): number {\r\n let tmpAngle = angle;\r\n if (angle > TwoPI) {\r\n while (tmpAngle > TwoPI) {\r\n tmpAngle -= TwoPI;\r\n }\r\n }\r\n\r\n if (angle < 0) {\r\n while (tmpAngle < 0) {\r\n tmpAngle += TwoPI;\r\n }\r\n }\r\n return tmpAngle;\r\n}\r\n\r\n/**\r\n * Convert radians to degrees\r\n */\r\nexport function toDegrees(radians: number): number {\r\n return (180 / Math.PI) * radians;\r\n}\r\n\r\n/**\r\n * Convert degrees to radians\r\n */\r\nexport function toRadians(degrees: number): number {\r\n return (degrees / 180) * Math.PI;\r\n}\r\n\r\n/**\r\n * Find the screen position of an HTML element\r\n */\r\nexport function getPosition(el: HTMLElement): Vector {\r\n let oLeft: number = 0,\r\n oTop: number = 0;\r\n\r\n const calcOffsetLeft = (parent: HTMLElement) => {\r\n oLeft += parent.offsetLeft;\r\n\r\n if (parent.offsetParent) {\r\n calcOffsetLeft(<HTMLElement>parent.offsetParent);\r\n }\r\n };\r\n const calcOffsetTop = (parent: HTMLElement) => {\r\n oTop += parent.offsetTop;\r\n if (parent.offsetParent) {\r\n calcOffsetTop(<HTMLElement>parent.offsetParent);\r\n }\r\n };\r\n\r\n calcOffsetLeft(el);\r\n calcOffsetTop(el);\r\n\r\n return new Vector(oLeft, oTop);\r\n}\r\n\r\n/**\r\n * Add an item to an array list if it doesn't already exist. Returns true if added, false if not and already exists in the array.\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\nexport function addItemToArray<T>(item: T, array: T[]): boolean {\r\n if (array.indexOf(item) === -1) {\r\n array.push(item);\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Remove an item from an list\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\nexport function removeItemFromArray<T>(item: T, array: T[]): boolean {\r\n let index = -1;\r\n if ((index = array.indexOf(item)) > -1) {\r\n array.splice(index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * See if an array contains something\r\n */\r\nexport function contains(array: Array<any>, obj: any): boolean {\r\n for (let i = 0; i < array.length; i++) {\r\n if (array[i] === obj) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Get the opposit side\r\n * TODO: Move to Side type\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\nexport function getOppositeSide(side: Side) {\r\n if (side === Side.Top) {\r\n return Side.Bottom;\r\n }\r\n if (side === Side.Bottom) {\r\n return Side.Top;\r\n }\r\n if (side === Side.Left) {\r\n return Side.Right;\r\n }\r\n if (side === Side.Right) {\r\n return Side.Left;\r\n }\r\n\r\n return Side.None;\r\n}\r\n\r\n/**\r\n * Returns the side in the direction of the vector supplied\r\n * @param direction Vector to check\r\n * @deprecated\r\n * TODO: Move to Side type\r\n */\r\nexport function getSideFromDirection(direction: Vector) {\r\n const directions = [Vector.Left, Vector.Right, Vector.Up, Vector.Down];\r\n const directionEnum = [Side.Left, Side.Right, Side.Top, Side.Bottom];\r\n\r\n let max = -Number.MAX_VALUE;\r\n let maxIndex = -1;\r\n for (let i = 0; i < directions.length; i++) {\r\n if (directions[i].dot(direction) > max) {\r\n max = directions[i].dot(direction);\r\n maxIndex = i;\r\n }\r\n }\r\n return directionEnum[maxIndex];\r\n}\r\n\r\n/**\r\n * Excalibur's dynamically resizing collection\r\n * @deprecated Will be removed v0.26.0\r\n */\r\nexport class Collection<T> {\r\n /**\r\n * Default collection size\r\n */\r\n public static DefaultSize = 200;\r\n private _internalArray: T[] = null;\r\n private _endPointer: number = 0;\r\n\r\n /**\r\n * @param initialSize Initial size of the internal backing array\r\n */\r\n constructor(initialSize: number = Collection.DefaultSize) {\r\n this._internalArray = new Array<T>(initialSize);\r\n }\r\n\r\n private _resize() {\r\n const newSize = this._internalArray.length * 2;\r\n const newArray = new Array<T>(newSize);\r\n const count = this.count();\r\n for (let i = 0; i < count; i++) {\r\n newArray[i] = this._internalArray[i];\r\n }\r\n\r\n delete this._internalArray;\r\n this._internalArray = newArray;\r\n }\r\n\r\n /**\r\n * Push elements to the end of the collection\r\n */\r\n public push(element: T): T {\r\n if (this._endPointer === this._internalArray.length) {\r\n this._resize();\r\n }\r\n return (this._internalArray[this._endPointer++] = element);\r\n }\r\n\r\n /**\r\n * Removes elements from the end of the collection\r\n */\r\n public pop(): T {\r\n this._endPointer = this._endPointer - 1 < 0 ? 0 : this._endPointer - 1;\r\n return this._internalArray[this._endPointer];\r\n }\r\n\r\n /**\r\n * Returns the count of the collection\r\n */\r\n public count(): number {\r\n return this._endPointer;\r\n }\r\n\r\n /**\r\n * Empties the collection\r\n */\r\n public clear() {\r\n this._endPointer = 0;\r\n }\r\n\r\n /**\r\n * Returns the size of the internal backing array\r\n */\r\n public internalSize(): number {\r\n return this._internalArray.length;\r\n }\r\n\r\n /**\r\n * Returns an element at a specific index\r\n * @param index Index of element to retrieve\r\n */\r\n public elementAt(index: number): T {\r\n if (index >= this.count()) {\r\n //Logger.getInstance().error('Invalid parameter: ' + index);\r\n throw new Error('Invalid index ' + index);\r\n }\r\n return this._internalArray[index];\r\n }\r\n\r\n /**\r\n * Inserts an element at a specific index\r\n * @param index Index to insert the element\r\n * @param value Element to insert\r\n */\r\n public insert(index: number, value: T): T {\r\n if (index >= this.count()) {\r\n this._resize();\r\n }\r\n return (this._internalArray[index] = value);\r\n }\r\n\r\n /**\r\n * Removes an element at a specific index\r\n * @param index Index of element to remove\r\n */\r\n public remove(index: number): T {\r\n const count = this.count();\r\n if (count === 0) {\r\n //Logger.getInstance().error('Invalid parameter: ' + index);\r\n throw new Error('Invalid parameter ' + index);\r\n }\r\n // O(n) Shift\r\n const removed = this._internalArray[index];\r\n for (let i = index; i < count; i++) {\r\n this._internalArray[i] = this._internalArray[i + 1];\r\n }\r\n this._endPointer--;\r\n return removed;\r\n }\r\n\r\n /**\r\n * Removes an element by reference\r\n * @param element Element to retrieve\r\n */\r\n public removeElement(element: T) {\r\n const index = this._internalArray.indexOf(element);\r\n this.remove(index);\r\n }\r\n\r\n /**\r\n * Returns a array representing the collection\r\n */\r\n public toArray(): T[] {\r\n return this._internalArray.slice(0, this._endPointer);\r\n }\r\n\r\n /**\r\n * Iterate over every element in the collection\r\n * @param func Callback to call for each element passing a reference to the element and its index, returned values are ignored\r\n */\r\n public forEach(func: (element: T, index: number) => any) {\r\n let i = 0;\r\n const count = this.count();\r\n for (i; i < count; i++) {\r\n func.call(this, this._internalArray[i], i);\r\n }\r\n }\r\n\r\n /**\r\n * Mutate every element in the collection\r\n * @param func Callback to call for each element passing a reference to the element and its index, any values returned mutate\r\n * the collection\r\n */\r\n public map(func: (element: T, index: number) => any) {\r\n const count = this.count();\r\n for (let i = 0; i < count; i++) {\r\n this._internalArray[i] = func.call(this, this._internalArray[i], i);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Used for exhaustive checks at compile time\r\n */\r\nexport function fail(message: never): never {\r\n throw new Error(message);\r\n}\r\n\r\n/**\r\n * Generate a range of numbers\r\n * For example: range(0, 5) -> [0, 1, 2, 3, 4, 5]\r\n * @param from inclusive\r\n * @param to inclusive\r\n */\r\nexport const range = (from: number, to: number) => Array.from(new Array(to - from + 1), (_x, i) => i + from);\r\n\r\n/**\r\n * Create a promise that resolves after a certain number of milliseconds\r\n * @param milliseconds\r\n */\r\nexport function delay(milliseconds: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve();\r\n }, milliseconds);\r\n });\r\n}\r\n","import { Flags } from '../Flags';\r\nimport { Logger } from './Log';\r\nimport { extend } from './Util';\r\n\r\n/**\r\n * Obsolete decorator options\r\n */\r\nexport interface ObsoleteOptions {\r\n // Optionally specify a custom message\r\n message?: string;\r\n // Optionally indicate that an alternate method to the obsolete one exists\r\n alternateMethod?: string;\r\n // Optional show stack trace, by default off\r\n showStackTrace?: boolean;\r\n}\r\n\r\nexport const maxMessages = 5;\r\nconst obsoleteMessage: { [messageCount: string]: number } = {};\r\nexport const resetObsoleteCounter = () => {\r\n for (const message in obsoleteMessage) {\r\n obsoleteMessage[message] = 0;\r\n }\r\n};\r\n\r\nconst logMessage = (message: string, options: ObsoleteOptions) => {\r\n const suppressObsoleteMessages = Flags.isEnabled('suppress-obsolete-message');\r\n if (obsoleteMessage[message] < maxMessages && !suppressObsoleteMessages) {\r\n Logger.getInstance().warn(message);\r\n\r\n // tslint:disable-next-line: no-console\r\n if (console.trace && options.showStackTrace) {\r\n // tslint:disable-next-line: no-console\r\n console.trace();\r\n }\r\n }\r\n obsoleteMessage[message]++;\r\n};\r\n\r\n/**\r\n * Obsolete decorator for marking Excalibur methods obsolete, you can optionally specify a custom message and/or alternate replacement\r\n * method do the deprecated one. Inspired by https://github.com/jayphelps/core-decorators.js\r\n */\r\nexport function obsolete(options?: ObsoleteOptions): any {\r\n options = extend(\r\n {},\r\n {\r\n message: 'This feature will be removed in future versions of Excalibur.',\r\n alternateMethod: null,\r\n showStackTrack: false\r\n },\r\n options\r\n );\r\n\r\n return function (target: any, property: string, descriptor: PropertyDescriptor): any {\r\n if (\r\n descriptor &&\r\n !(typeof descriptor.value === 'function' || typeof descriptor.get === 'function' || typeof descriptor.set === 'function')\r\n ) {\r\n throw new SyntaxError('Only classes/functions/getters/setters can be marked as obsolete');\r\n }\r\n const methodSignature = `${target.name || ''}${target.name && property ? '.' : ''}${property ? property : ''}`;\r\n\r\n const message =\r\n `${methodSignature} is marked obsolete: ${options.message}` +\r\n (options.alternateMethod ? ` Use ${options.alternateMethod} instead` : '');\r\n\r\n if (!obsoleteMessage[message]) {\r\n obsoleteMessage[message] = 0;\r\n }\r\n\r\n // If descriptor is null it is a class\r\n const method = descriptor ? { ...descriptor } : target;\r\n if (!descriptor) {\r\n // with es2015 classes we need to change our decoration tactic\r\n class DecoratedClass extends method {\r\n constructor(...args: any) {\r\n logMessage(message, options);\r\n super(...args);\r\n }\r\n }\r\n return DecoratedClass;\r\n }\r\n\r\n if (descriptor && descriptor.value) {\r\n method.value = function (this: any) {\r\n logMessage(message, options);\r\n return descriptor.value.apply(this, arguments);\r\n };\r\n return method;\r\n }\r\n\r\n if (descriptor && descriptor.get) {\r\n method.get = function (this: any) {\r\n logMessage(message, options);\r\n return descriptor.get.apply(this, arguments);\r\n };\r\n }\r\n\r\n if (descriptor && descriptor.set) {\r\n method.set = function (this: any) {\r\n logMessage(message, options);\r\n return descriptor.set.apply(this, arguments);\r\n };\r\n }\r\n return method;\r\n };\r\n}\r\n","import { Clonable } from '../Interfaces/Clonable';\r\nimport { obsolete } from '../Util/Decorators';\r\n\r\n/**\r\n * A 2D vector on a plane.\r\n */\r\n\r\nexport class Vector implements Clonable<Vector> {\r\n /**\r\n * A (0, 0) vector\r\n */\r\n public static get Zero() {\r\n return new Vector(0, 0);\r\n }\r\n\r\n /**\r\n * A (1, 1) vector\r\n */\r\n public static get One() {\r\n return new Vector(1, 1);\r\n }\r\n\r\n /**\r\n * A (0.5, 0.5) vector\r\n */\r\n public static get Half() {\r\n return new Vector(0.5, 0.5);\r\n }\r\n\r\n /**\r\n * A unit vector pointing up (0, -1)\r\n */\r\n public static get Up() {\r\n return new Vector(0, -1);\r\n }\r\n\r\n /**\r\n * A unit vector pointing down (0, 1)\r\n */\r\n public static get Down() {\r\n return new Vector(0, 1);\r\n }\r\n\r\n /**\r\n * A unit vector pointing left (-1, 0)\r\n */\r\n public static get Left() {\r\n return new Vector(-1, 0);\r\n }\r\n /**\r\n * A unit vector pointing right (1, 0)\r\n */\r\n public static get Right() {\r\n return new Vector(1, 0);\r\n }\r\n\r\n /**\r\n * Returns a vector of unit length in the direction of the specified angle in Radians.\r\n * @param angle The angle to generate the vector\r\n */\r\n public static fromAngle(angle: number) {\r\n return new Vector(Math.cos(angle), Math.sin(angle));\r\n }\r\n\r\n /**\r\n * Checks if vector is not null, undefined, or if any of its components are NaN or Infinity.\r\n */\r\n public static isValid(vec: Vector) {\r\n if (vec === null || vec === undefined) {\r\n return false;\r\n }\r\n if (isNaN(vec.x) || isNaN(vec.y)) {\r\n return false;\r\n }\r\n\r\n if (vec.x === Infinity || vec.y === Infinity || vec.x === -Infinity || vec.y === -Infinity) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Calculates distance between two Vectors\r\n * @param vec1\r\n * @param vec2\r\n */\r\n public static distance(vec1: Vector, vec2: Vector) {\r\n return Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2));\r\n }\r\n\r\n /**\r\n * @param x X component of the Vector\r\n * @param y Y component of the Vector\r\n */\r\n constructor(x: number, y: number) {\r\n this._x = x;\r\n this._y = y;\r\n }\r\n\r\n protected _x = 0;\r\n /**\r\n * Get the x component of the vector\r\n */\r\n public get x(): number {\r\n return this._x;\r\n }\r\n\r\n /**\r\n * Set the x component, THIS MUTATES the current vector. It is usually better to create a new vector.\r\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\r\n */\r\n public set x(val: number) {\r\n this._x = val;\r\n }\r\n\r\n protected _y = 0;\r\n /**\r\n * Get the y component of the vector\r\n */\r\n public get y(): number {\r\n return this._y;\r\n }\r\n\r\n /**\r\n * Set the y component, THIS MUTATES the current vector. It is usually better to create a new vector.\r\n * @warning **Be very careful setting components on shared vectors, mutating shared vectors can cause hard to find bugs**\r\n */\r\n public set y(val: number) {\r\n this._y = val;\r\n }\r\n\r\n /**\r\n * Sets the x and y components at once, THIS MUTATES the current vector. It is usually better to create a new vector.\r\n *\r\n * @warning **Be very careful using this, mutating vectors can cause hard to find bugs**\r\n */\r\n setTo(x: number, y: number) {\r\n (this.x as number) = x;\r\n (this.y as number) = y;\r\n }\r\n\r\n /**\r\n * Compares this point against another and tests for equality\r\n * @param vector The other point to compare to\r\n * @param tolerance Amount of euclidean distance off we are willing to tolerate\r\n */\r\n public equals(vector: Vector, tolerance: number = 0.001): boolean {\r\n return Math.abs(this.x - vector.x) <= tolerance && Math.abs(this.y - vector.y) <= tolerance;\r\n }\r\n\r\n /**\r\n * The distance to another vector. If no other Vector is specified, this will return the [[magnitude]].\r\n * @param v The other vector. Leave blank to use origin vector.\r\n */\r\n public distance(v?: Vector): number {\r\n if (!v) {\r\n v = Vector.Zero;\r\n }\r\n return Math.sqrt(Math.pow(this.x - v.x, 2) + Math.pow(this.y - v.y, 2));\r\n }\r\n\r\n public squareDistance(v?: Vector): number {\r\n if (!v) {\r\n v = Vector.Zero;\r\n }\r\n return Math.pow(this.x - v.x, 2) + Math.pow(this.y - v.y, 2);\r\n }\r\n\r\n /**\r\n * The magnitude (size) of the Vector\r\n * @deprecated magnitude will be removed in favour of '.size' in version 0.25.0\r\n */\r\n @obsolete({ message: 'will be removed in favour of `.size` in version 0.25.0' })\r\n public magnitude(): number {\r\n return this.distance();\r\n }\r\n\r\n /**\r\n * The size (magnitude) of the Vector\r\n */\r\n public get size(): number {\r\n return this.distance();\r\n }\r\n\r\n /**\r\n * Setting the size mutates the current vector\r\n *\r\n * @warning Can be used to set the size of the vector, **be very careful using this, mutating vectors can cause hard to find bugs**\r\n */\r\n public set size(newLength: number) {\r\n const v = this.normalize().scale(newLength);\r\n this.setTo(v.x, v.y);\r\n }\r\n\r\n /**\r\n * Normalizes a vector to have a magnitude of 1.\r\n */\r\n public normalize(): Vector {\r\n const d = this.distance();\r\n if (d > 0) {\r\n return new Vector(this.x / d, this.y / d);\r\n } else {\r\n return new Vector(0, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the average (midpoint) between the current point and the specified\r\n */\r\n public average(vec: Vector): Vector {\r\n return this.add(vec).scale(0.5);\r\n }\r\n\r\n /**\r\n * Scales a vector's by a factor of size\r\n * @param size The factor to scale the magnitude by\r\n */\r\n public scale(scale: Vector): Vector;\r\n public scale(size: number): Vector;\r\n public scale(sizeOrScale: number | Vector): Vector {\r\n if (sizeOrScale instanceof Vector) {\r\n return new Vector(this.x * sizeOrScale.x, this.y * sizeOrScale.y);\r\n } else {\r\n return new Vector(this.x * sizeOrScale, this.y * sizeOrScale);\r\n }\r\n }\r\n\r\n /**\r\n * Adds one vector to another\r\n * @param v The vector to add\r\n */\r\n public add(v: Vector): Vector {\r\n return new Vector(this.x + v.x, this.y + v.y);\r\n }\r\n\r\n /**\r\n * Subtracts a vector from another, if you subtract vector `B.sub(A)` the resulting vector points from A -> B\r\n * @param v The vector to subtract\r\n */\r\n public sub(v: Vector): Vector {\r\n return new Vector(this.x - v.x, this.y - v.y);\r\n }\r\n\r\n /**\r\n * Adds one vector to this one modifying the original\r\n * @param v The vector to add\r\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\r\n */\r\n public addEqual(v: Vector): Vector {\r\n this.setTo(this.x + v.x, this.y + v.y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Subtracts a vector from this one modifying the original\r\n * @param v The vector to subtract\r\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\r\n */\r\n public subEqual(v: Vector): Vector {\r\n this.setTo(this.x - v.x, this.y - v.y);\r\n return this;\r\n }\r\n\r\n /**\r\n * Scales this vector by a factor of size and modifies the original\r\n * @warning Be very careful using this, mutating vectors can cause hard to find bugs\r\n */\r\n public scaleEqual(size: number): Vector {\r\n this.setTo(this.x * size, this.y * size);\r\n return this;\r\n }\r\n\r\n /**\r\n * Performs a dot product with another vector\r\n * @param v The vector to dot\r\n */\r\n public dot(v: Vector): number {\r\n return this.x * v.x + this.y * v.y;\r\n }\r\n\r\n /**\r\n * Performs a 2D cross product with scalar. 2D cross products with a scalar return a vector.\r\n * @param v The scalar to cross\r\n */\r\n public cross(v: number): Vector;\r\n /**\r\n * Performs a 2D cross product with another vector. 2D cross products return a scalar value not a vector.\r\n * @param v The vector to cross\r\n */\r\n public cross(v: Vector): number;\r\n public cross(v: any): any {\r\n if (v instanceof Vector) {\r\n return this.x * v.y - this.y * v.x;\r\n } else if (typeof v === 'number') {\r\n return new Vector(v * this.y, -v * this.x);\r\n }\r\n }\r\n\r\n static cross(num: number, vec: Vector): Vector {\r\n return new Vector(-num * vec.y, num * vec.x);\r\n }\r\n\r\n /**\r\n * Returns the perpendicular vector to this one\r\n */\r\n public perpendicular(): Vector {\r\n return new Vector(this.y, -this.x);\r\n }\r\n\r\n /**\r\n * Returns the normal vector to this one, same as the perpendicular of length 1\r\n */\r\n public normal(): Vector {\r\n return this.perpendicular().normalize();\r\n }\r\n\r\n /**\r\n * Negate the current vector\r\n */\r\n public negate(): Vector {\r\n return this.scale(-1);\r\n }\r\n\r\n /**\r\n * Returns the angle of this vector.\r\n */\r\n public toAngle(): number {\r\n return Math.atan2(this.y, this.x);\r\n }\r\n\r\n /**\r\n * Rotates the current vector around a point by a certain number of\r\n * degrees in radians\r\n */\r\n public rotate(angle: number, anchor?: Vector): Vector {\r\n if (!anchor) {\r\n anchor = new Vector(0, 0);\r\n }\r\n const sinAngle = Math.sin(angle);\r\n const cosAngle = Math.cos(angle);\r\n const x = cosAngle * (this.x - anchor.x) - sinAngle * (this.y - anchor.y) + anchor.x;\r\n const y = sinAngle * (this.x - anchor.x) + cosAngle * (this.y - anchor.y) + anchor.y;\r\n return new Vector(x, y);\r\n }\r\n\r\n /**\r\n * Creates new vector that has the same values as the previous.\r\n */\r\n public clone(): Vector {\r\n return new Vector(this.x, this.y);\r\n }\r\n\r\n /**\r\n * Returns a string representation of the vector.\r\n */\r\n public toString(fixed?: number): string {\r\n if (fixed) {\r\n return `(${this.x.toFixed(fixed)}, ${this.y.toFixed(fixed)})`;\r\n }\r\n return `(${this.x}, ${this.y})`;\r\n }\r\n}\r\n\r\n/**\r\n * Shorthand for creating new Vectors - returns a new Vector instance with the\r\n * provided X and Y components.\r\n *\r\n * @param x X component of the Vector\r\n * @param y Y component of the Vector\r\n */\r\nexport function vec(x: number, y: number): Vector {\r\n return new Vector(x, y);\r\n}\r\n","import { obsolete } from './Util/Decorators';\r\n\r\n/**\r\n * Provides standard colors (e.g. [[Color.Black]])\r\n * but you can also create custom colors using RGB, HSL, or Hex. Also provides\r\n * useful color operations like [[Color.lighten]], [[Color.darken]], and more.\r\n */\r\nexport class Color {\r\n /**\r\n * Red channel\r\n */\r\n public r: number;\r\n /**\r\n * Green channel\r\n */\r\n public g: number;\r\n /**\r\n * Blue channel\r\n */\r\n public b: number;\r\n /**\r\n * Alpha channel (between 0 and 1)\r\n */\r\n public a: number;\r\n\r\n /**\r\n * Hue\r\n */\r\n public h: number;\r\n /**\r\n * Saturation\r\n */\r\n public s: number;\r\n /**\r\n * Lightness\r\n */\r\n public l: number;\r\n\r\n /**\r\n * Creates a new instance of Color from an r, g, b, a\r\n *\r\n * @param r The red component of color (0-255)\r\n * @param g The green component of color (0-255)\r\n * @param b The blue component of color (0-255)\r\n * @param a The alpha component of color (0-1.0)\r\n */\r\n constructor(r: number, g: number, b: number, a?: number) {\r\n this.r = r;\r\n this.g = g;\r\n this.b = b;\r\n this.a = a != null ? a : 1;\r\n }\r\n\r\n /**\r\n * Creates a new instance of Color from an r, g, b, a\r\n *\r\n * @param r The red component of color (0-255)\r\n * @param g The green component of color (0-255)\r\n * @param b The blue component of color (0-255)\r\n * @param a The alpha component of color (0-1.0)\r\n */\r\n public static fromRGB(r: number, g: number, b: number, a?: number): Color {\r\n return new Color(r, g, b, a);\r\n }\r\n\r\n /**\r\n * Creates a new instance of Color from a rgb string\r\n *\r\n * @param string CSS color string of the form rgba(255, 255, 255, 1) or rgb(255, 255, 255)\r\n */\r\n public static fromRGBString(string: string): Color {\r\n const rgbaRegEx: RegExp = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)/i;\r\n let match = null;\r\n if ((match = string.match(rgbaRegEx))) {\r\n const r = parseInt(match[1], 10);\r\n const g = parseInt(match[2], 10);\r\n const b = parseInt(match[3], 10);\r\n let a = 1;\r\n if (match[4]) {\r\n a = parseFloat(match[4]);\r\n }\r\n return new Color(r, g, b, a);\r\n } else {\r\n throw new Error('Invalid rgb/a string: ' + string);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new instance of Color from a hex string\r\n *\r\n * @param hex CSS color string of the form #ffffff, the alpha component is optional\r\n */\r\n public static fromHex(hex: string): Color {\r\n const hexRegEx: RegExp = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;\r\n let match = null;\r\n if ((match = hex.match(hexRegEx))) {\r\n const r = parseInt(match[1], 16);\r\n const g = parseInt(match[2], 16);\r\n const b = parseInt(match[3], 16);\r\n let a = 1;\r\n if (match[4]) {\r\n a = parseInt(match[4], 16) / 255;\r\n }\r\n return new Color(r, g, b, a);\r\n } else {\r\n throw new Error('Invalid hex string: ' + hex);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new instance of Color from hsla values\r\n *\r\n * @param h Hue is represented [0-1]\r\n * @param s Saturation is represented [0-1]\r\n * @param l Luminance is represented [0-1]\r\n * @param a Alpha is represented [0-1]\r\n */\r\n public static fromHSL(h: number, s: number, l: number, a: number = 1.0): Color {\r\n const temp = new HSLColor(h, s, l, a);\r\n return temp.toRGBA();\r\n }\r\n\r\n /**\r\n * Lightens the current color by a specified amount\r\n *\r\n * @param factor The amount to lighten by [0-1]\r\n */\r\n public lighten(factor: number = 0.1): Color {\r\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\r\n temp.l += (1 - temp.l) * factor;\r\n return temp.toRGBA();\r\n }\r\n\r\n /**\r\n * Darkens the current color by a specified amount\r\n *\r\n * @param factor The amount to darken by [0-1]\r\n */\r\n public darken(factor: number = 0.1): Color {\r\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\r\n temp.l -= temp.l * factor;\r\n return temp.toRGBA();\r\n }\r\n\r\n /**\r\n * Saturates the current color by a specified amount\r\n *\r\n * @param factor The amount to saturate by [0-1]\r\n */\r\n public saturate(factor: number = 0.1): Color {\r\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\r\n temp.s += temp.s * factor;\r\n return temp.toRGBA();\r\n }\r\n\r\n /**\r\n * Desaturates the current color by a specified amount\r\n *\r\n * @param factor The amount to desaturate by [0-1]\r\n */\r\n public desaturate(factor: number = 0.1): Color {\r\n const temp = HSLColor.fromRGBA(this.r, this.g, this.b, this.a);\r\n temp.s -= temp.s * factor;\r\n return temp.toRGBA();\r\n }\r\n\r\n /**\r\n * Multiplies a color by another, results in a darker color\r\n *\r\n * @param color The other color\r\n */\r\n public multiply(color: Color): Color {\r\n const newR = (((color.r / 255) * this.r) / 255) * 255;\r\n const newG = (((color.g / 255) * this.g) / 255) * 255;\r\n const newB = (((color.b / 255) * this.b) / 255) * 255;\r\n const newA = color.a * this.a;\r\n return new Color(newR, newG, newB, newA);\r\n }\r\n\r\n /**\r\n * Multiplies a color by another, results in a darker color\r\n * @param color\r\n * @deprecated Alias for incorrect spelling used in older versions, use multiply instead, will be removed in v0.25.0\r\n */\r\n @obsolete({ message: 'Alias for incorrect spelling used in older versions, use multiply instead, will be removed in v0.25.0' })\r\n public mulitiply(color: Color): Color {\r\n return this.multiply(color);\r\n }\r\n\r\n /**\r\n * Screens a color by another, results in a lighter color\r\n *\r\n * @param color The other color\r\n */\r\n public screen(color: Color): Color {\r\n const color1 = color.invert();\r\n const color2 = color.invert();\r\n return color1.multiply(color2).invert();\r\n }\r\n\r\n /**\r\n * Inverts the current color\r\n */\r\n public invert(): Color {\r\n return new Color(255 - this.r, 255 - this.g, 255 - this.b, 1.0 - this.a);\r\n }\r\n\r\n /**\r\n * Averages the current color with another\r\n *\r\n * @param color The other color\r\n */\r\n public average(color: Color): Color {\r\n const newR = (color.r + this.r) / 2;\r\n const newG = (color.g + this.g) / 2;\r\n const newB = (color.b + this.b) / 2;\r\n const newA = (color.a + this.a) / 2;\r\n return new Color(newR, newG, newB, newA);\r\n }\r\n\r\n public equal(color: Color): boolean {\r\n return this.toString() === color.toString();\r\n }\r\n\r\n /**\r\n * Returns a CSS string representation of a color.\r\n *\r\n * @param format Color representation, accepts: rgb, hsl, or hex\r\n */\r\n public toString(format: 'rgb' | 'hsl' | 'hex' = 'rgb') {\r\n switch (format) {\r\n case 'rgb':\r\n return this.toRGBA();\r\n case 'hsl':\r\n return this.toHSLA();\r\n case 'hex':\r\n return this.toHex();\r\n default:\r\n throw new Error('Invalid Color format');\r\n }\r\n }\r\n\r\n /**\r\n * Returns Hex Value of a color component\r\n * @param c color component\r\n * @see https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb\r\n */\r\n private _componentToHex(c: number) {\r\n const hex = c.toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n }\r\n\r\n /**\r\n * Return Hex representation of a color.\r\n */\r\n public toHex() {\r\n return '#' + this._componentToHex(this.r) + this._componentToHex(this.g) + this._componentToHex(this.b);\r\n }\r\n\r\n /**\r\n * Return RGBA representation of a color.\r\n */\r\n public toRGBA() {\r\n const result = String(this.r.toFixed(0)) + ', ' + String(this.g.toFixed(0)) + ', ' + String(this.b.toFixed(0));\r\n if (this.a !== undefined || this.a !== null) {\r\n return 'rgba(' + result + ', ' + String(this.a) + ')';\r\n }\r\n return 'rgb(' + result + ')';\r\n }\r\n\r\n /**\r\n * Return HSLA representation of a color.\r\n */\r\n public toHSLA() {\r\n return HSLColor.fromRGBA(this.r, this.g, this.b, this.a).toString();\r\n }\r\n\r\n /**\r\n * Returns a CSS string representation of a color.\r\n */\r\n public fillStyle() {\r\n return this.toString();\r\n }\r\n\r\n /**\r\n * Returns a clone of the current color.\r\n */\r\n public clone(): Color {\r\n return new Color(this.r, this.g, this.b, this.a);\r\n }\r\n\r\n /**\r\n * Black (#000000)\r\n */\r\n public static get Black(): Color {\r\n return Color.fromHex('#000000');\r\n }\r\n\r\n /**\r\n * White (#FFFFFF)\r\n */\r\n public static get White(): Color {\r\n return Color.fromHex('#FFFFFF');\r\n }\r\n\r\n /**\r\n * Gray (#808080)\r\n */\r\n public static get Gray(): Color {\r\n return Color.fromHex('#808080');\r\n }\r\n\r\n /**\r\n * Light gray (#D3D3D3)\r\n */\r\n public static get LightGray(): Color {\r\n return Color.fromHex('#D3D3D3');\r\n }\r\n\r\n /**\r\n * Dark gray (#A9A9A9)\r\n */\r\n public static get DarkGray(): Color {\r\n return Color.fromHex('#A9A9A9');\r\n }\r\n\r\n /**\r\n * Yellow (#FFFF00)\r\n */\r\n public static get Yellow(): Color {\r\n return Color.fromHex('#FFFF00');\r\n }\r\n\r\n /**\r\n * Orange (#FFA500)\r\n */\r\n public static get Orange(): Color {\r\n return Color.fromHex('#FFA500');\r\n }\r\n\r\n /**\r\n * Red (#FF0000)\r\n */\r\n public static get Red(): Color {\r\n return Color.fromHex('#FF0000');\r\n }\r\n\r\n /**\r\n * Vermilion (#FF5B31)\r\n */\r\n public static get Vermilion(): Color {\r\n return Color.fromHex('#FF5B31');\r\n }\r\n\r\n /**\r\n * Vermilion (#FF5B31)\r\n * @deprecated Alias for incorrect spelling used in older versions, use multiply instead, will be removed in v0.25.0\r\n */\r\n @obsolete({\r\n message: 'Alias for incorrect spelling used in older versions',\r\n alternateMethod: 'Vermilion'\r\n })\r\n public static get Vermillion(): Color {\r\n return Color.Vermilion;\r\n }\r\n\r\n /**\r\n * Rose (#FF007F)\r\n */\r\n public static get Rose(): Color {\r\n return Color.fromHex('#FF007F');\r\n }\r\n\r\n /**\r\n * Magenta (#FF00FF)\r\n */\r\n public static get Magenta(): Color {\r\n return Color.fromHex('#FF00FF');\r\n }\r\n\r\n /**\r\n * Violet (#7F00FF)\r\n */\r\n public static get Violet(): Color {\r\n return Color.fromHex('#7F00FF');\r\n }\r\n\r\n /**\r\n * Blue (#0000FF)\r\n */\r\n public static get Blue(): Color {\r\n return Color.fromHex('#0000FF');\r\n }\r\n\r\n /**\r\n * Azure (#007FFF)\r\n */\r\n public static get Azure(): Color {\r\n return Color.fromHex('#007FFF');\r\n }\r\n\r\n /**\r\n * Cyan (#00FFFF)\r\n */\r\n public static get Cyan(): Color {\r\n return Color.fromHex('#00FFFF');\r\n }\r\n\r\n /**\r\n * Viridian (#59978F)\r\n */\r\n public static get Viridian(): Color {\r\n return Color.fromHex('#59978F');\r\n }\r\n\r\n /**\r\n * Green (#00FF00)\r\n */\r\n public static get Green(): Color {\r\n return Color.fromHex('#00FF00');\r\n }\r\n\r\n /**\r\n * Chartreuse (#7FFF00)\r\n */\r\n public static get Chartreuse(): Color {\r\n return Color.fromHex('#7FFF00');\r\n }\r\n\r\n /**\r\n * Transparent (#FFFFFF00)\r\n */\r\n public static get Transparent(): Color {\r\n return Color.fromHex('#FFFFFF00');\r\n }\r\n\r\n /**\r\n * ExcaliburBlue (#176BAA)\r\n */\r\n public static get ExcaliburBlue(): Color {\r\n return Color.fromHex('#176BAA');\r\n }\r\n}\r\n\r\n/**\r\n * Internal HSL Color representation\r\n *\r\n * http://en.wikipedia.org/wiki/HSL_and_HSV\r\n * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\r\n */\r\nclass HSLColor {\r\n constructor(public h: number, public s: number, public l: number, public a: number) {}\r\n\r\n public static hue2rgb(p: number, q: number, t: number): number {\r\n if (t < 0) {\r\n t += 1;\r\n }\r\n if (t > 1) {\r\n t -= 1;\r\n }\r\n if (t < 1 / 6) {\r\n return p + (q - p) * 6 * t;\r\n }\r\n if (t < 1 / 2) {\r\n return q;\r\n }\r\n if (t < 2 / 3) {\r\n return p + (q - p) * (2 / 3 - t) * 6;\r\n }\r\n return p;\r\n }\r\n\r\n public static fromRGBA(r: number, g: number, b: number, a: number): HSLColor {\r\n r /= 255;\r\n g /= 255;\r\n b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h, s;\r\n const l = (max + min) / 2;\r\n\r\n if (max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n const d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return new HSLColor(h, s, l, a);\r\n }\r\n\r\n public toRGBA(): Color {\r\n let r: number, g: number, b: number;\r\n\r\n if (this.s === 0) {\r\n r = g = b = this.l; // achromatic\r\n } else {\r\n const q = this.l < 0.5 ? this.l * (1 + this.s) : this.l + this.s - this.l * this.s;\r\n const p = 2 * this.l - q;\r\n r = HSLColor.hue2rgb(p, q, this.h + 1 / 3);\r\n g = HSLColor.hue2rgb(p, q, this.h);\r\n b = HSLColor.hue2rgb(p, q, this.h - 1 / 3);\r\n }\r\n\r\n return new Color(r * 255, g * 255, b * 255, this.a);\r\n }\r\n\r\n public toString(): string {\r\n const h = this.h.toFixed(0),\r\n s = this.s.toFixed(0),\r\n l = this.l.toFixed(0),\r\n a = this.a.toFixed(0);\r\n return `hsla(${h}, ${s}, ${l}, ${a})`;\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\nimport { Ray } from '../Math/ray';\nimport { Color } from '../Color';\nimport { Side } from './Side';\nimport { ExcaliburGraphicsContext } from '../Graphics/Context/ExcaliburGraphicsContext';\nimport { Matrix } from '../Math/matrix';\n\nexport interface BoundingBoxOptions {\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\n/**\n * Axis Aligned collision primitive for Excalibur.\n */\nexport class BoundingBox {\n public top: number;\n public right: number;\n public bottom: number;\n public left: number;\n\n /**\n * Constructor allows passing of either an object with all coordinate components,\n * or the coordinate components passed separately.\n * @param leftOrOptions Either x coordinate of the left edge or an options object\n * containing the four coordinate components.\n * @param top y coordinate of the top edge\n * @param right x coordinate of the right edge\n * @param bottom y coordinate of the bottom edge\n */\n constructor(leftOrOptions: number | BoundingBoxOptions = 0, top: number = 0, right: number = 0, bottom: number = 0) {\n if (typeof leftOrOptions === 'object') {\n this.left = leftOrOptions.left;\n this.top = leftOrOptions.top;\n this.right = leftOrOptions.right;\n this.bottom = leftOrOptions.bottom;\n } else if (typeof leftOrOptions === 'number') {\n this.left = leftOrOptions;\n this.top = top;\n this.right = right;\n this.bottom = bottom;\n }\n }\n\n /**\n * Given bounding box A & B, returns the side relative to A when intersection is performed.\n * @param intersection Intersection vector between 2 bounding boxes\n */\n public static getSideFromIntersection(intersection: Vector): Side {\n if (!intersection) {\n return Side.None;\n }\n if (intersection) {\n if (Math.abs(intersection.x) > Math.abs(intersection.y)) {\n if (intersection.x < 0) {\n return Side.Right;\n }\n return Side.Left;\n } else {\n if (intersection.y < 0) {\n return Side.Bottom;\n }\n return Side.Top;\n }\n }\n return Side.None;\n }\n\n public static fromPoints(points: Vector[]): BoundingBox {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < points.length; i++) {\n if (points[i].x < minX) {\n minX = points[i].x;\n }\n if (points[i].x > maxX) {\n maxX = points[i].x;\n }\n if (points[i].y < minY) {\n minY = points[i].y;\n }\n if (points[i].y > maxY) {\n maxY = points[i].y;\n }\n }\n return new BoundingBox(minX, minY, maxX, maxY);\n }\n\n public static fromDimension(width: number, height: number, anchor: Vector = Vector.Half, pos: Vector = Vector.Zero) {\n return new BoundingBox(\n -width * anchor.x + pos.x,\n -height * anchor.y + pos.y,\n width - width * anchor.x + pos.x,\n height - height * anchor.y + pos.y\n );\n }\n\n /**\n * Returns the calculated width of the bounding box\n */\n public get width() {\n return this.right - this.left;\n }\n\n /**\n * Returns the calculated height of the bounding box\n */\n public get height() {\n return this.bottom - this.top;\n }\n\n /**\n * Return whether the bounding box has zero dimensions in height,width or both\n */\n public hasZeroDimensions() {\n return this.width === 0 || this.height === 0;\n }\n\n /**\n * Returns the center of the bounding box\n */\n public get center(): Vector {\n return new Vector((this.left + this.right) / 2, (this.top + this.bottom) / 2);\n }\n\n public translate(pos: Vector): BoundingBox {\n return new BoundingBox(this.left + pos.x, this.top + pos.y, this.right + pos.x, this.bottom + pos.y);\n }\n\n /**\n * Rotates a bounding box by and angle and around a point, if no point is specified (0, 0) is used by default. The resulting bounding\n * box is also axis-align. This is useful when a new axis-aligned bounding box is needed for rotated geometry.\n */\n public rotate(angle: number, point: Vector = Vector.Zero): BoundingBox {\n const points = this.getPoints().map((p) => p.rotate(angle, point));\n return BoundingBox.fromPoints(points);\n }\n\n public scale(scale: Vector, point: Vector = Vector.Zero): BoundingBox {\n const shifted = this.translate(point);\n return new BoundingBox(shifted.left * scale.x, shifted.top * scale.y, shifted.right * scale.x, shifted.bottom * scale.y);\n }\n\n public transform(matrix: Matrix) {\n const points = this.getPoints().map((p) => matrix.multv(p));\n return BoundingBox.fromPoints(points);\n }\n\n /**\n * Returns the perimeter of the bounding box\n */\n public getPerimeter(): number {\n const wx = this.width;\n const wy = this.height;\n return 2 * (wx + wy);\n }\n\n public getPoints(): Vector[] {\n const results = [];\n results.push(new Vector(this.left, this.top));\n results.push(new Vector(this.right, this.top));\n results.push(new Vector(this.right, this.bottom));\n results.push(new Vector(this.left, this.bottom));\n return results;\n }\n\n /**\n * Determines whether a ray intersects with a bounding box\n */\n public rayCast(ray: Ray, farClipDistance = Infinity): boolean {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tmin = -Infinity;\n let tmax = +Infinity;\n\n const xinv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yinv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n\n const tx1 = (this.left - ray.pos.x) * xinv;\n const tx2 = (this.right - ray.pos.x) * xinv;\n tmin = Math.min(tx1, tx2);\n tmax = Math.max(tx1, tx2);\n\n const ty1 = (this.top - ray.pos.y) * yinv;\n const ty2 = (this.bottom - ray.pos.y) * yinv;\n tmin = Math.max(tmin, Math.min(ty1, ty2));\n tmax = Math.min(tmax, Math.max(ty1, ty2));\n\n return tmax >= Math.max(0, tmin) && tmin < farClipDistance;\n }\n\n public rayCastTime(ray: Ray, farClipDistance = Infinity): number {\n // algorithm from https://tavianator.com/fast-branchless-raybounding-box-intersections/\n let tmin = -Infinity;\n let tmax = +Infinity;\n\n const xinv = ray.dir.x === 0 ? Number.MAX_VALUE : 1 / ray.dir.x;\n const yinv = ray.dir.y === 0 ? Number.MAX_VALUE : 1 / ray.dir.y;\n\n const tx1 = (this.left - ray.pos.x) * xinv;\n const tx2 = (this.right - ray.pos.x) * xinv;\n tmin = Math.min(tx1, tx2);\n tmax = Math.max(tx1, tx2);\n\n const ty1 = (this.top - ray.pos.y) * yinv;\n const ty2 = (this.bottom - ray.pos.y) * yinv;\n tmin = Math.max(tmin, Math.min(ty1, ty2));\n tmax = Math.min(tmax, Math.max(ty1, ty2));\n\n if (tmax >= Math.max(0, tmin) && tmin < farClipDistance) {\n return tmin;\n }\n return -1;\n }\n\n /**\n * Tests whether a point is contained within the bounding box\n * @param p The point to test\n */\n public contains(p: Vector): boolean;\n\n /**\n * Tests whether another bounding box is totally contained in this one\n * @param bb The bounding box to test\n */\n public contains(bb: BoundingBox): boolean;\n public contains(val: any): boolean {\n if (val instanceof Vector) {\n return this.left <= val.x && this.top <= val.y && this.bottom >= val.y && this.right >= val.x;\n } else if (val instanceof BoundingBox) {\n if (this.left < val.left && this.top < val.top && val.bottom < this.bottom && val.right < this.right) {\n return true;\n }\n return false;\n }\n return false;\n }\n\n /**\n * Combines this bounding box and another together returning a new bounding box\n * @param other The bounding box to combine\n */\n public combine(other: BoundingBox): BoundingBox {\n const compositeBB = new BoundingBox(\n Math.min(this.left, other.left),\n Math.min(this.top, other.top),\n Math.max(this.right, other.right),\n Math.max(this.bottom, other.bottom)\n );\n return compositeBB;\n }\n\n public get dimensions(): Vector {\n return new Vector(this.width, this.height);\n }\n\n /**\n * Test wether this bounding box intersects with another returning\n * the intersection vector that can be used to resolve the collision. If there\n * is no intersection null is returned.\n *\n * @param other Other [[BoundingBox]] to test intersection with\n * @returns A Vector in the direction of the current BoundingBox, this <- other\n */\n public intersect(other: BoundingBox): Vector {\n const totalBoundingBox = this.combine(other);\n\n // If the total bounding box is less than or equal the sum of the 2 bounds then there is collision\n if (\n totalBoundingBox.width < other.width + this.width &&\n totalBoundingBox.height < other.height + this.height &&\n !totalBoundingBox.dimensions.equals(other.dimensions) &&\n !totalBoundingBox.dimensions.equals(this.dimensions)\n ) {\n // collision\n let overlapX = 0;\n // right edge is between the other's left and right edge\n /**\n * +-this-+\n * | |\n * | +-other-+\n * +----|-+ |\n * | |\n * +-------+\n * <---\n * ^ overlap\n */\n if (this.right >= other.left && this.right <= other.right) {\n overlapX = other.left - this.right;\n // right edge is past the other's right edge\n /**\n * +-other-+\n * | |\n * | +-this-+\n * +----|--+ |\n * | |\n * +------+\n * --->\n * ^ overlap\n */\n } else {\n overlapX = other.right - this.left;\n }\n\n let overlapY = 0;\n // top edge is between the other's top and bottom edge\n /**\n * +-other-+\n * | |\n * | +-this-+ | <- overlap\n * +----|--+ | |\n * | | \\ /\n * +------+ '\n */\n if (this.top <= other.bottom && this.top >= other.top) {\n overlapY = other.bottom - this.top;\n // top edge is above the other top edge\n /**\n * +-this-+ .\n * | | / \\\n * | +-other-+ | <- overlap\n * +----|-+ | |\n * | |\n * +-------+\n */\n } else {\n overlapY = other.top - this.bottom;\n }\n\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new Vector(overlapX, 0);\n } else {\n return new Vector(0, overlapY);\n }\n // Case of total containment of one bounding box by another\n } else if (totalBoundingBox.dimensions.equals(other.dimensions) || totalBoundingBox.dimensions.equals(this.dimensions)) {\n let overlapX = 0;\n // this is wider than the other\n if (this.width - other.width >= 0) {\n // This right edge is closest to the others right edge\n if (this.right - other.right <= other.left - this.left) {\n overlapX = other.left - this.right;\n // This left edge is closest to the others left edge\n } else {\n overlapX = other.right - this.left;\n }\n // other is wider than this\n } else {\n // This right edge is closest to the others right edge\n if (other.right - this.right <= this.left - other.left) {\n overlapX = this.left - other.right;\n // This left edge is closest to the others left edge\n } else {\n overlapX = this.right - other.left;\n }\n }\n\n let overlapY = 0;\n // this is taller than other\n if (this.height - other.height >= 0) {\n // The bottom edge is closest to the others bottom edge\n if (this.bottom - other.bottom <= other.top - this.top) {\n overlapY = other.top - this.bottom;\n } else {\n overlapY = other.bottom - this.top;\n }\n // other is taller than this\n } else {\n // The bottom edge is closest to the others bottom edge\n if (other.bottom - this.bottom <= this.top - other.top) {\n overlapY = this.top - other.bottom;\n } else {\n overlapY = this.bottom - other.top;\n }\n }\n\n if (Math.abs(overlapX) < Math.abs(overlapY)) {\n return new Vector(overlapX, 0);\n } else {\n return new Vector(0, overlapY);\n }\n } else {\n return null;\n }\n }\n\n /**\n * Test whether the bounding box has intersected with another bounding box, returns the side of the current bb that intersected.\n * @param bb The other actor to test\n */\n public intersectWithSide(bb: BoundingBox): Side {\n const intersect = this.intersect(bb);\n return BoundingBox.getSideFromIntersection(intersect);\n }\n\n /* istanbul ignore next */\n public debugDraw(ctx: CanvasRenderingContext2D, color: Color = Color.Yellow) {\n ctx.strokeStyle = color.toString();\n ctx.strokeRect(this.left, this.top, this.width, this.height);\n }\n\n /**\n * Draw a debug bounding box\n * @param ex\n * @param color\n */\n public draw(ex: ExcaliburGraphicsContext, color: Color = Color.Yellow) {\n ex.debug.drawRect(this.left, this.top, this.width, this.height, { color });\n }\n}\n","import { vec } from '..';\nimport { Vector } from './vector';\nimport { canonicalizeAngle } from '../Util/Util';\n\nexport enum MatrixLocations {\n X = 12,\n Y = 13\n}\n\nconst sign = (val: number) => {\n if (val === 0) {\n return 0;\n }\n return val < 0 ? -1 : 1;\n};\n\n// const multMatch = (a: number, b: number) => {\n// if (sign(a) < 0 && sign(b) < 0) {\n// return -Math.abs(a * b);\n// }\n// return a * b;\n// }\n\n// const epsilon = (val: number) => {\n// if (val * val < .0001) {\n// return 0;\n// }\n// return val;\n// }\n\n/**\n * Excalibur Matrix helper for 4x4 matrices\n *\n * Useful for webgl 4x4 matrices\n */\nexport class Matrix {\n /**\n * 4x4 matrix in column major order\n *\n * | | | | |\n * | ------- | ------- | -------- | |\n * | data[0] | data[4] | data[8] | data[12] |\n * | data[1] | data[5] | data[9] | data[13] |\n * | data[2] | data[6] | data[10] | data[14] |\n * | data[3] | data[7] | data[11] | data[15] |\n *\n */\n public data: Float32Array = new Float32Array(16);\n\n /**\n * Creates an orthographic (flat non-perspective) projection\n * https://en.wikipedia.org/wiki/Orthographic_projection\n * @param left\n * @param right\n * @param bottom\n * @param top\n * @param near\n * @param far\n */\n public static ortho(left: number, right: number, bottom: number, top: number, near: number, far: number): Matrix {\n const mat = new Matrix();\n mat.data[0] = 2 / (right - left);\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n\n mat.data[4] = 0;\n mat.data[5] = 2 / (top - bottom);\n mat.data[6] = 0;\n mat.data[7] = 0;\n\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = -2 / (far - near);\n mat.data[11] = 0;\n\n mat.data[12] = -(right + left) / (right - left);\n mat.data[13] = -(top + bottom) / (top - bottom);\n mat.data[14] = -(far + near) / (far - near);\n mat.data[15] = 1;\n return mat;\n }\n\n /**\n * Creates a new Matrix with the same data as the current 4x4\n */\n public clone(): Matrix {\n const mat = new Matrix();\n mat.data[0] = this.data[0];\n mat.data[1] = this.data[1];\n mat.data[2] = this.data[2];\n mat.data[3] = this.data[3];\n\n mat.data[4] = this.data[4];\n mat.data[5] = this.data[5];\n mat.data[6] = this.data[6];\n mat.data[7] = this.data[7];\n\n mat.data[8] = this.data[8];\n mat.data[9] = this.data[9];\n mat.data[10] = this.data[10];\n mat.data[11] = this.data[11];\n\n mat.data[12] = this.data[12];\n mat.data[13] = this.data[13];\n mat.data[14] = this.data[14];\n mat.data[15] = this.data[15];\n return mat;\n }\n\n /**\n * Creates a new identity matrix (a matrix that when applied does nothing)\n */\n public static identity(): Matrix {\n const mat = new Matrix();\n mat.data[0] = 1;\n mat.data[1] = 0;\n mat.data[2] = 0;\n mat.data[3] = 0;\n\n mat.data[4] = 0;\n mat.data[5] = 1;\n mat.data[6] = 0;\n mat.data[7] = 0;\n\n mat.data[8] = 0;\n mat.data[9] = 0;\n mat.data[10] = 1;\n mat.data[11] = 0;\n\n mat.data[12] = 0;\n mat.data[13] = 0;\n mat.data[14] = 0;\n mat.data[15] = 1;\n return mat;\n }\n\n /**\n * Creates a brand new translation matrix at the specified 3d point\n * @param x\n * @param y\n */\n public static translation(x: number, y: number): Matrix {\n const mat = Matrix.identity();\n mat.data[12] = x;\n mat.data[13] = y;\n return mat;\n }\n\n /**\n * Creates a brand new scaling matrix with the specified scaling factor\n * @param sx\n * @param sy\n */\n public static scale(sx: number, sy: number): Matrix {\n const mat = Matrix.identity();\n mat.data[0] = sx;\n mat.data[5] = sy;\n mat.data[10] = 1;\n mat.data[15] = 1;\n return mat;\n }\n\n /**\n * Creates a brand new rotation matrix with the specified angle\n * @param angleRadians\n */\n public static rotation(angleRadians: number): Matrix {\n const mat = Matrix.identity();\n mat.data[0] = Math.cos(angleRadians);\n mat.data[4] = -Math.sin(angleRadians);\n mat.data[1] = Math.sin(angleRadians);\n mat.data[5] = Math.cos(angleRadians);\n return mat;\n }\n\n /**\n * Multiplies the current matrix by a vector and returns the resulting vector\n * @param other\n */\n multv(other: [number, number]): [number, number];\n multv(other: Vector): Vector;\n multv(other: [number, number] | Vector): [number, number] | Vector {\n const z = 0;\n if (other instanceof Vector) {\n return new Vector(\n other.x * this.data[0] + other.y * this.data[4] + z * this.data[6] + 1 * this.data[12],\n other.x * this.data[1] + other.y * this.data[5] + z * this.data[9] + 1 * this.data[13]\n );\n } else {\n const dest: [number, number] = [\n other[0] * this.data[0] + other[1] * this.data[4] + z * this.data[6] + 1 * this.data[12],\n\n other[0] * this.data[1] + other[1] * this.data[5] + z * this.data[9] + 1 * this.data[13]\n ];\n return dest;\n }\n }\n\n /**\n * Multiplies the current matrix by another and returns the resulting matrix\n * @param other\n */\n multm(other: Matrix): Matrix {\n const dest = new Matrix();\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n\n const b11 = other.data[0];\n const b21 = other.data[1];\n const b31 = other.data[2];\n const b41 = other.data[3];\n\n const b12 = other.data[4];\n const b22 = other.data[5];\n const b32 = other.data[6];\n const b42 = other.data[7];\n\n const b13 = other.data[8];\n const b23 = other.data[9];\n const b33 = other.data[10];\n const b43 = other.data[11];\n\n const b14 = other.data[12];\n const b24 = other.data[13];\n const b34 = other.data[14];\n const b44 = other.data[15];\n\n dest.data[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n dest.data[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n dest.data[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n dest.data[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\n dest.data[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n dest.data[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n dest.data[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n dest.data[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\n dest.data[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n dest.data[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n dest.data[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n dest.data[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\n dest.data[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n dest.data[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n dest.data[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n dest.data[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n const s = this.getScale();\n dest._scaleSignX = sign(s.x) * sign(dest._scaleSignX);\n dest._scaleSignY = sign(s.y) * sign(dest._scaleSignY);\n\n return dest;\n }\n\n /**\n * Applies translation to the current matrix mutating it\n * @param x\n * @param y\n */\n translate(x: number, y: number) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n\n const a13 = this.data[8];\n const a23 = this.data[9];\n const a33 = this.data[10];\n const a43 = this.data[11];\n\n const a14 = this.data[12];\n const a24 = this.data[13];\n const a34 = this.data[14];\n const a44 = this.data[15];\n\n // Doesn't change z\n const z = 0;\n const w = 1;\n this.data[12] = a11 * x + a12 * y + a13 * z + a14 * w;\n this.data[13] = a21 * x + a22 * y + a23 * z + a24 * w;\n this.data[14] = a31 * x + a32 * y + a33 * z + a34 * w;\n this.data[15] = a41 * x + a42 * y + a43 * z + a44 * w;\n\n return this;\n }\n\n public setPosition(x: number, y: number) {\n this.data[12] = x;\n this.data[13] = y;\n }\n\n public getPosition(): Vector {\n return vec(this.data[12], this.data[13]);\n }\n\n /**\n * Applies rotation to the current matrix mutating it\n * @param angle in Radians\n */\n rotate(angle: number) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n\n this.data[0] = cosine * a11 + sine * a12;\n this.data[1] = cosine * a21 + sine * a22;\n this.data[2] = cosine * a31 + sine * a32;\n this.data[3] = cosine * a41 + sine * a42;\n\n this.data[4] = cosine * a12 - sine * a11;\n this.data[5] = cosine * a22 - sine * a21;\n this.data[6] = cosine * a32 - sine * a31;\n this.data[7] = cosine * a42 - sine * a41;\n\n return this;\n }\n\n /**\n * Applies scaling to the current matrix mutating it\n * @param x\n * @param y\n */\n scale(x: number, y: number) {\n const a11 = this.data[0];\n const a21 = this.data[1];\n const a31 = this.data[2];\n const a41 = this.data[3];\n\n const a12 = this.data[4];\n const a22 = this.data[5];\n const a32 = this.data[6];\n const a42 = this.data[7];\n\n this.data[0] = a11 * x;\n this.data[1] = a21 * x;\n this.data[2] = a31 * x;\n this.data[3] = a41 * x;\n\n this.data[4] = a12 * y;\n this.data[5] = a22 * y;\n this.data[6] = a32 * y;\n this.data[7] = a42 * y;\n\n return this;\n }\n\n public setRotation(angle: number) {\n const currentScale = this.getScale();\n const sine = Math.sin(angle);\n const cosine = Math.cos(angle);\n\n this.data[0] = cosine * currentScale.x;\n this.data[1] = sine * currentScale.y;\n this.data[4] = -sine * currentScale.x;\n this.data[5] = cosine * currentScale.y;\n }\n\n public getRotation(): number {\n const angle = Math.atan2(this.data[1] / this.getScaleY(), this.data[0] / this.getScaleX());\n return canonicalizeAngle(angle);\n }\n\n public getScaleX(): number {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const xscale = vec(this.data[0], this.data[4]).size;\n return this._scaleSignX * xscale;\n }\n\n public getScaleY(): number {\n // absolute scale of the matrix (we lose sign so need to add it back)\n const yscale = vec(this.data[1], this.data[5]).size;\n return this._scaleSignY * yscale;\n }\n\n /**\n * Get the scale of the matrix\n */\n public getScale(): Vector {\n return vec(this.getScaleX(), this.getScaleY());\n }\n\n private _scaleSignX = 1;\n public setScaleX(val: number) {\n this._scaleSignX = sign(val);\n // negative scale acts like a 180 rotation, so flip\n const xscale = vec(this.data[0] * this._scaleSignX, this.data[4] * this._scaleSignX).normalize();\n this.data[0] = xscale.x * val;\n this.data[4] = xscale.y * val;\n }\n\n private _scaleSignY = 1;\n public setScaleY(val: number) {\n this._scaleSignY = sign(val);\n // negative scale acts like a 180 rotation, so flip\n const yscale = vec(this.data[1] * this._scaleSignY, this.data[5] * this._scaleSignY).normalize();\n this.data[1] = yscale.x * val;\n this.data[5] = yscale.y * val;\n }\n\n public setScale(scale: Vector) {\n this.setScaleX(scale.x);\n this.setScaleY(scale.y);\n }\n\n /**\n * Determinant of the upper left 2x2 matrix\n */\n public getBasisDeterminant() {\n return this.data[0] * this.data[5] - this.data[1] * this.data[4];\n }\n\n public getAffineInverse(): Matrix {\n // See http://negativeprobability.blogspot.com/2011/11/affine-transformations-and-their.html\n // See https://www.mathsisfun.com/algebra/matrix-inverse.html\n // Since we are actually only doing 2D transformations we can use this hack\n // We don't actually use the 3rd or 4th dimension\n\n const det = this.getBasisDeterminant();\n const inverseDet = 1 / det; // todo zero check\n const a = this.data[0];\n const b = this.data[4];\n const c = this.data[1];\n const d = this.data[5];\n\n const m = Matrix.identity();\n // inverts rotation and scale\n m.data[0] = d * inverseDet;\n m.data[1] = -c * inverseDet;\n m.data[4] = -b * inverseDet;\n m.data[5] = a * inverseDet;\n\n const tx = this.data[12];\n const ty = this.data[13];\n // invert translation\n // transform translation into the matrix basis created by rot/scale\n m.data[12] = -(tx * m.data[0] + ty * m.data[4]);\n m.data[13] = -(tx * m.data[1] + ty * m.data[5]);\n\n return m;\n }\n\n public isIdentity(): boolean {\n return (\n this.data[0] === 1 &&\n this.data[1] === 0 &&\n this.data[2] === 0 &&\n this.data[3] === 0 &&\n this.data[4] === 0 &&\n this.data[5] === 1 &&\n this.data[6] === 0 &&\n this.data[7] === 0 &&\n this.data[8] === 0 &&\n this.data[9] === 0 &&\n this.data[10] === 1 &&\n this.data[11] === 0 &&\n this.data[12] === 0 &&\n this.data[13] === 0 &&\n this.data[14] === 0 &&\n this.data[15] === 1\n );\n }\n\n public toString() {\n return `\n[${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}]\n[${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}]\n[${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}]\n[${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}]\n`;\n }\n}\n","import { Matrix } from '../../Math/matrix';\r\n\r\nexport class TransformStack {\r\n private _transforms: Matrix[] = [];\r\n private _currentTransform: Matrix = Matrix.identity();\r\n\r\n public save(): void {\r\n this._transforms.push(this._currentTransform);\r\n this._currentTransform = this._currentTransform.clone();\r\n }\r\n\r\n public restore(): void {\r\n this._currentTransform = this._transforms.pop();\r\n }\r\n\r\n public translate(x: number, y: number): Matrix {\r\n return this._currentTransform.translate(x, y);\r\n }\r\n\r\n public rotate(angle: number): Matrix {\r\n return this._currentTransform.rotate(angle);\r\n }\r\n\r\n public scale(x: number, y: number): Matrix {\r\n return this._currentTransform.scale(x, y);\r\n }\r\n\r\n public set current(matrix: Matrix) {\r\n this._currentTransform = matrix;\r\n }\r\n\r\n public get current(): Matrix {\r\n return this._currentTransform;\r\n }\r\n}\r\n","import { ExcaliburGraphicsContextState } from './ExcaliburGraphicsContext';\r\n\r\nexport class StateStack {\r\n private _states: ExcaliburGraphicsContextState[] = [];\r\n private _currentState: ExcaliburGraphicsContextState = this._getDefaultState();\r\n\r\n private _getDefaultState() {\r\n return {\r\n opacity: 1\r\n };\r\n }\r\n\r\n private _cloneState() {\r\n return {\r\n opacity: this._currentState.opacity\r\n };\r\n }\r\n\r\n public save(): void {\r\n this._states.push(this._currentState);\r\n this._currentState = this._cloneState();\r\n }\r\n\r\n public restore(): void {\r\n this._currentState = this._states.pop();\r\n }\r\n\r\n public get current(): ExcaliburGraphicsContextState {\r\n return this._currentState;\r\n }\r\n}\r\n","export interface VertexAttributeDefinition {\r\n name: string;\r\n size: number;\r\n glType: number;\r\n normalized: boolean;\r\n location: number;\r\n}\r\n\r\nexport interface UniformDefinition {\r\n name: string;\r\n location: WebGLUniformLocation;\r\n type: string;\r\n data: any;\r\n}\r\n\r\n/**\r\n * Create a shader program for the Excalibur WebGL Graphics Context\r\n */\r\nexport class Shader {\r\n public program: WebGLProgram | null = null;\r\n\r\n public uniforms: { [variableName: string]: UniformDefinition } = {};\r\n public attributes: { [variableName: string]: VertexAttributeDefinition } = {};\r\n public layout: VertexAttributeDefinition[] = [];\r\n\r\n /**\r\n * Create a shader program in excalibur\r\n * @param _gl WebGL graphics context\r\n * @param _vertexSource Vertex shader source as a string\r\n * @param _fragmentSource Fragment shader source as a string\r\n */\r\n constructor(private _gl: WebGLRenderingContext, private _vertexSource: string, private _fragmentSource: string) {\r\n this.compile(_gl);\r\n }\r\n\r\n private _createProgram(gl: WebGLRenderingContext, vertexShader: WebGLShader, fragmentShader: WebGLShader): WebGLProgram {\r\n const program = gl.createProgram();\r\n if (program === null) {\r\n throw Error('Could not create graphics shader program');\r\n }\r\n\r\n // attach the shaders.\r\n gl.attachShader(program, vertexShader);\r\n gl.attachShader(program, fragmentShader);\r\n\r\n // link the program.\r\n gl.linkProgram(program);\r\n\r\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\r\n if (!success) {\r\n throw Error(`Could not link the program: [${gl.getProgramInfoLog(program)}]`);\r\n }\r\n\r\n return program;\r\n }\r\n\r\n private _compileShader(gl: WebGLRenderingContext, source: string, type: number): WebGLShader {\r\n const shader = gl.createShader(type);\r\n if (shader === null) {\r\n throw Error(`Could not build shader: [${source}]`);\r\n }\r\n\r\n gl.shaderSource(shader, source);\r\n gl.compileShader(shader);\r\n\r\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\r\n if (!success) {\r\n throw Error(`Could not compile shader [${gl.getShaderInfoLog(shader)}]`);\r\n }\r\n return shader;\r\n }\r\n\r\n /**\r\n * Compile the current shader against a webgl context\r\n * @param gl WebGL context\r\n */\r\n compile(gl: WebGLRenderingContext): WebGLProgram {\r\n const vertexShader = this._compileShader(gl, this._vertexSource, gl.VERTEX_SHADER);\r\n const fragmentShader = this._compileShader(gl, this._fragmentSource, gl.FRAGMENT_SHADER);\r\n const program = this._createProgram(gl, vertexShader, fragmentShader);\r\n return (this.program = program);\r\n }\r\n\r\n /**\r\n * Add a uniform [[Matrix]] to the shader\r\n * @param name Name of the uniform in the shader source\r\n * @param data (4x4) matrix in column major order\r\n */\r\n public addUniformMatrix(name: string, data: Float32Array) {\r\n if (!data) {\r\n throw Error(`Shader Uniform Matrix '${name}' was set to null or undefined`);\r\n }\r\n const gl = this._gl;\r\n this.uniforms[name] = {\r\n name,\r\n type: 'matrix',\r\n location: gl.getUniformLocation(this.program, name),\r\n data: data\r\n };\r\n }\r\n\r\n /**\r\n * Add a uniform array of numbers to the shader\r\n * @param name Name of the uniform in the shader source\r\n * @param data List of numbers\r\n */\r\n public addUniformIntegerArray(name: string, data: number[]) {\r\n if (!data) {\r\n throw Error(`Shader Uniform Integery Array '${name}' was set to null or undefined`);\r\n }\r\n const gl = this._gl;\r\n this.uniforms[name] = {\r\n name,\r\n type: 'numbers',\r\n location: gl.getUniformLocation(this.program, name),\r\n data: data\r\n };\r\n }\r\n\r\n /**\r\n * Add attributes in the order they appear in the VBO\r\n * @param name Name of the attribute in the shader source\r\n * @param size The size of the attribute in gl.Type units, for example `vec2 a_pos` would be 2 gl.FLOAT\r\n * @param glType The gl.Type of the attribute\r\n */\r\n public addAttribute(name: string, size: number, glType: number, normalized = false) {\r\n const gl = this._gl;\r\n // TODO needs to be compiled first\r\n const location = gl.getAttribLocation(this.program, name);\r\n this.attributes[name] = {\r\n name,\r\n size,\r\n glType,\r\n normalized,\r\n location\r\n };\r\n this.layout.push(this.attributes[name]);\r\n }\r\n\r\n /**\r\n * Number of javascript floats a vertex will take up\r\n */\r\n public get vertexAttributeSize(): number {\r\n let vertexSize = 0;\r\n for (const vert of this.layout) {\r\n vertexSize += vert.size;\r\n }\r\n return vertexSize;\r\n }\r\n\r\n /**\r\n * Total number of bytes that the vertex will take up\r\n */\r\n public get totalVertexSizeBytes(): number {\r\n let vertexSize = 0;\r\n for (const vert of this.layout) {\r\n let typeSize = 1;\r\n switch (vert.glType) {\r\n case this._gl.FLOAT: {\r\n typeSize = 4;\r\n break;\r\n }\r\n default: {\r\n typeSize = 1;\r\n }\r\n }\r\n vertexSize += typeSize * vert.size;\r\n }\r\n\r\n return vertexSize;\r\n }\r\n\r\n /**\r\n * Get a previously defined attribute size in bytes\r\n * @param name\r\n */\r\n public getAttributeSize(name: string) {\r\n let typeSize = 1;\r\n switch (this.attributes[name].glType) {\r\n case this._gl.FLOAT: {\r\n typeSize = 4;\r\n break;\r\n }\r\n default: {\r\n typeSize = 1;\r\n }\r\n }\r\n return typeSize * this.attributes[name].size;\r\n }\r\n\r\n /**\r\n * Sets this shader program as the current in the underlying webgl context\r\n *\r\n * **Must** specify all attributes and uniforms before calling this\r\n */\r\n public use() {\r\n const gl = this._gl;\r\n gl.useProgram(this.program);\r\n let offset = 0;\r\n for (const vert of this.layout) {\r\n gl.vertexAttribPointer(vert.location, vert.size, vert.glType, vert.normalized, this.totalVertexSizeBytes, offset);\r\n gl.enableVertexAttribArray(vert.location);\r\n offset += this.getAttributeSize(vert.name);\r\n }\r\n\r\n for (const key in this.uniforms) {\r\n const uniform = this.uniforms[key];\r\n switch (uniform.type) {\r\n case 'matrix': {\r\n gl.uniformMatrix4fv(uniform.location, false, uniform.data);\r\n break;\r\n }\r\n case 'numbers': {\r\n gl.uniform1iv(uniform.location, uniform.data);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","export default \"attribute vec4 a_position;\\r\\nattribute vec4 a_color;\\r\\n\\r\\nvarying lowp vec4 v_color;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * a_position;\\r\\n\\r\\n // Passthrough the color\\r\\n v_color = a_color;\\r\\n}\";","export default \"precision mediump float;\\r\\n\\r\\n// Color\\r\\nvarying lowp vec4 v_color;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n gl_FragColor = v_color;\\r\\n}\";","import { Pool, Poolable } from '../../Util/Pool';\r\n\r\nexport class BatchCommand<T> implements Poolable {\r\n _pool: Pool<this> = undefined;\r\n public commands: T[] = [];\r\n constructor(public max: number) {}\r\n\r\n isFull() {\r\n if (this.commands.length >= this.max) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n canAdd() {\r\n return !this.isFull();\r\n }\r\n\r\n add(cmd: T) {\r\n this.commands.push(cmd);\r\n }\r\n\r\n dispose() {\r\n this.commands.length = 0;\r\n return this;\r\n }\r\n}\r\n","export class GraphicsDiagnostics {\r\n public static DrawCallCount: number = 0;\r\n public static DrawnImagesCount: number = 0;\r\n public static clear(): void {\r\n GraphicsDiagnostics.DrawCallCount = 0;\r\n GraphicsDiagnostics.DrawnImagesCount = 0;\r\n }\r\n}\r\n","import { Logger } from '..';\r\n\r\nexport interface Poolable {\r\n /**\r\n * Any type that is a member of a an object pool will have a reference to teh pool\r\n * @internal\r\n */\r\n _pool?: Pool<this>;\r\n dispose(): this;\r\n}\r\n\r\nexport class Pool<Type extends Poolable> {\r\n public totalAllocations = 0;\r\n public index = 0;\r\n public objects: Type[] = [];\r\n private _logger = Logger.getInstance();\r\n\r\n constructor(\r\n public builder: (...args: any[]) => Type,\r\n public recycler: (instance: Type, ...args: any[]) => Type,\r\n public maxObjects: number = 100\r\n ) {}\r\n\r\n /**\r\n * Use many instances out of the in the context and return all to the pool.\r\n *\r\n * By returning values out of the contex they will be un-hooked from the pool and are free to be passed to consumers\r\n * @param context\r\n */\r\n using(context: (pool: Pool<Type>) => Type[] | void) {\r\n const result = context(this);\r\n if (result) {\r\n return this.done(...result);\r\n }\r\n return this.done();\r\n }\r\n\r\n /**\r\n * Use a single instance out of th pool and immediately return it to the pool\r\n * @param context\r\n */\r\n borrow(context: (object: Type) => void) {\r\n const object = this.get();\r\n context(object);\r\n this.index--;\r\n }\r\n\r\n /**\r\n * Retrieve a value from the pool, will allocate a new instance if necessary or recycle from the pool\r\n * @param args\r\n */\r\n get(...args: any[]): Type {\r\n if (this.index === this.maxObjects) {\r\n // TODO implement hard or soft cap\r\n this._logger.warn('Max pooled objects reached, possible memory leak? Doubling');\r\n this.maxObjects = this.maxObjects * 2;\r\n // throw new Error('Max pooled objects reached, possible memory leak?');\r\n }\r\n\r\n if (this.objects[this.index]) {\r\n // Pool has an available object already constructed\r\n return this.recycler(this.objects[this.index++], ...args);\r\n } else {\r\n // New allocation\r\n this.totalAllocations++;\r\n const object = (this.objects[this.index++] = this.builder(...args));\r\n object._pool = this;\r\n return object;\r\n }\r\n }\r\n\r\n /**\r\n * Signals we are done with the pool objects for now, Reclaims all objects in the pool.\r\n *\r\n * If a list of pooled objects is passed to done they are un-hooked from the pool and are free\r\n * to be passed to consumers\r\n * @param objects A list of object to separate from the pool\r\n */\r\n done(...objects: Type[]): Type[];\r\n done(): void;\r\n done(...objects: Type[]): Type[] | void {\r\n // All objects in pool now considered \"free\"\r\n this.index = 0;\r\n for (const object of objects) {\r\n const poolIndex = this.objects.indexOf(object);\r\n // Build a new object to take the pool place\r\n this.objects[poolIndex] = (this as any).builder(); // TODO problematic 0-arg only support\r\n this.objects[poolIndex]._pool = this;\r\n this.totalAllocations++;\r\n // Unhook object from the pool\r\n object._pool = undefined;\r\n }\r\n return objects;\r\n }\r\n}\r\n","import { BatchCommand } from './batch';\r\nimport { Shader } from './shader';\r\n// import { Pool, Poolable } from './pool';\r\nimport { GraphicsDiagnostics } from '../GraphicsDiagnostics';\r\nimport { Pool, Poolable } from '../../Util/Pool';\r\n\r\nexport interface Renderer {\r\n render(): void;\r\n}\r\n\r\nexport interface Ctor<T> {\r\n new (): T;\r\n}\r\n\r\nexport interface BatchRendererOptions<T extends Poolable> {\r\n gl: WebGLRenderingContext;\r\n /**\r\n * Draw command constructor\r\n */\r\n command: Ctor<T>;\r\n /**\r\n * Number of vertices that are generated per draw command\r\n */\r\n verticesPerCommand?: number;\r\n /**\r\n * Maximum commands to batch before drawing\r\n */\r\n maxCommandsPerBatch?: number;\r\n /**\r\n * Override the built in command batching mechanism\r\n */\r\n batchFactory?: () => BatchCommand<T>;\r\n}\r\n\r\nexport abstract class BatchRenderer<T extends Poolable> implements Renderer {\r\n priority = 0;\r\n private _gl: WebGLRenderingContext;\r\n private _vertices: Float32Array;\r\n private _verticesPerCommand: number;\r\n private _buffer: WebGLBuffer | null = null;\r\n private _maxCommandsPerBatch: number = 2000;\r\n\r\n public shader: Shader;\r\n\r\n public commands: Pool<T>;\r\n private _batchPool: Pool<BatchCommand<T>>;\r\n private _batches: BatchCommand<T>[] = [];\r\n constructor(options: BatchRendererOptions<T>) {\r\n this._gl = options.gl;\r\n const command = options.command;\r\n this._verticesPerCommand = options?.verticesPerCommand ?? 1;\r\n this._maxCommandsPerBatch = options?.maxCommandsPerBatch ?? this._maxCommandsPerBatch;\r\n const batchFactory = options?.batchFactory ?? (() => new BatchCommand<T>(this._maxCommandsPerBatch));\r\n\r\n this.commands = new Pool<T>(\r\n () => new command(),\r\n (c) => c.dispose(),\r\n this._maxCommandsPerBatch\r\n );\r\n this._batchPool = new Pool<BatchCommand<T>>(batchFactory, (b) => b.dispose(), 100);\r\n }\r\n\r\n /**\r\n * Initialize render, builds shader and initialized webgl buffers\r\n */\r\n public init() {\r\n const gl = this._gl;\r\n this.shader = this.buildShader(gl);\r\n // Initialize VBO\r\n // https://groups.google.com/forum/#!topic/webgl-dev-list/vMNXSNRAg8M\r\n this._vertices = new Float32Array(this.shader.vertexAttributeSize * this._verticesPerCommand * this._maxCommandsPerBatch);\r\n this._buffer = gl.createBuffer();\r\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffer);\r\n gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.DYNAMIC_DRAW);\r\n }\r\n\r\n public get vertexSize(): number {\r\n return this.shader.vertexAttributeSize;\r\n }\r\n\r\n public addCommand(cmd: T) {\r\n if (this._batches.length === 0) {\r\n this._batches.push(this._batchPool.get());\r\n }\r\n\r\n const lastBatch = this._batches[this._batches.length - 1];\r\n if (lastBatch.canAdd()) {\r\n lastBatch.add(cmd);\r\n } else {\r\n const newBatch = this._batchPool.get();\r\n newBatch.add(cmd);\r\n this._batches.push(newBatch);\r\n }\r\n }\r\n\r\n /**\r\n * Construct or return the Shader to be used in this batch renderer\r\n * @param gl\r\n */\r\n abstract buildShader(gl: WebGLRenderingContext): Shader;\r\n\r\n /**\r\n * Implement populating the vertex buffer, return the number of vertices added to the buffer\r\n * @param vertices\r\n * @param batch\r\n */\r\n abstract buildBatchVertices(vertexBuffer: Float32Array, batch: BatchCommand<T>): number;\r\n\r\n /**\r\n * Implement gl draw call to render batch. The vertextBuffer from buildBatchVertices is already bound and the data has been updated.\r\n */\r\n abstract renderBatch(gl: WebGLRenderingContext, batch: BatchCommand<T>, vertexCount: number): void;\r\n\r\n /**\r\n * Build batch geometry, submit to the gpu, and issue draw command to underlying webgl\r\n */\r\n public render(): void {\r\n const gl = this._gl;\r\n gl.bindBuffer(gl.ARRAY_BUFFER, this._buffer);\r\n this.shader.use();\r\n let drawCallCount = 0;\r\n let drawnImagesCount = 0;\r\n for (const batch of this._batches) {\r\n // Build all geometry and ship to GPU\r\n // interleave VBOs https://goharsha.com/lwjgl-tutorial-series/interleaving-buffer-objects/\r\n const vertexCount = this.buildBatchVertices(this._vertices, batch);\r\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._vertices);\r\n\r\n this.renderBatch(gl, batch, vertexCount);\r\n drawnImagesCount += batch.commands.length;\r\n drawCallCount++;\r\n }\r\n this.commands.done();\r\n this._batchPool.done();\r\n this._batches.length = 0;\r\n GraphicsDiagnostics.DrawCallCount += drawCallCount;\r\n GraphicsDiagnostics.DrawnImagesCount += drawnImagesCount;\r\n }\r\n}\r\n","import { Vector } from '../../Math/vector';\r\nimport { Color } from '../../Color';\r\nimport { Shader } from './shader';\r\nimport lineVertexSource from './shaders/line-vertex.glsl';\r\nimport lineFragmentSource from './shaders/line-fragment.glsl';\r\nimport { BatchRenderer } from './renderer';\r\nimport { BatchCommand } from './batch';\r\nimport { WebGLGraphicsContextInfo } from './ExcaliburGraphicsContextWebGL';\r\nimport { Pool, Poolable } from '../../Util/Pool';\r\n\r\nexport class DrawLine implements Poolable {\r\n _pool?: Pool<this>;\r\n public color: Color = Color.Black;\r\n public start: Vector = Vector.Zero;\r\n public end: Vector = Vector.Zero;\r\n public dispose() {\r\n this.color.r = 0;\r\n this.color.g = 0;\r\n this.color.b = 0;\r\n this.color.a = 1;\r\n this.start.setTo(0, 0);\r\n this.end.setTo(0, 0);\r\n return this;\r\n }\r\n}\r\n\r\nexport class LineRenderer extends BatchRenderer<DrawLine> {\r\n constructor(gl: WebGLRenderingContext, private _contextInfo: WebGLGraphicsContextInfo) {\r\n super({ gl, command: DrawLine, verticesPerCommand: 2 });\r\n this.init();\r\n }\r\n\r\n buildShader(gl: WebGLRenderingContext) {\r\n const shader = new Shader(gl, lineVertexSource, lineFragmentSource);\r\n\r\n shader.addAttribute('a_position', 2, gl.FLOAT);\r\n shader.addAttribute('a_color', 4, gl.FLOAT);\r\n shader.addUniformMatrix('u_matrix', this._contextInfo.matrix.data);\r\n return shader;\r\n }\r\n\r\n addLine(start: Vector, end: Vector, color: Color) {\r\n const cmd = this.commands.get();\r\n cmd.start = this._contextInfo.transform.current.multv(start);\r\n cmd.end = this._contextInfo.transform.current.multv(end);\r\n cmd.color.r = color.r;\r\n cmd.color.g = color.g;\r\n cmd.color.b = color.b;\r\n cmd.color.a = cmd.color.a * this._contextInfo.state.current.opacity;\r\n this.addCommand(cmd);\r\n }\r\n\r\n buildBatchVertices(vertexBuffer: Float32Array, batch: BatchCommand<DrawLine>): number {\r\n let index = 0;\r\n for (const command of batch.commands) {\r\n // Start\r\n vertexBuffer[index++] = command.start.x;\r\n vertexBuffer[index++] = command.start.y;\r\n vertexBuffer[index++] = command.color.r / 255;\r\n vertexBuffer[index++] = command.color.g / 255;\r\n vertexBuffer[index++] = command.color.b / 255;\r\n vertexBuffer[index++] = command.color.a;\r\n\r\n // End\r\n vertexBuffer[index++] = command.end.x;\r\n vertexBuffer[index++] = command.end.y;\r\n vertexBuffer[index++] = command.color.r / 255;\r\n vertexBuffer[index++] = command.color.g / 255;\r\n vertexBuffer[index++] = command.color.b / 255;\r\n vertexBuffer[index++] = command.color.a;\r\n }\r\n return index / this.vertexSize;\r\n }\r\n\r\n renderBatch(gl: WebGLRenderingContext, _batch: BatchCommand<DrawLine>, vertexCount: number) {\r\n gl.drawArrays(gl.LINES, 0, vertexCount);\r\n }\r\n}\r\n","export default \"attribute vec4 a_position;\\r\\n\\r\\n// Opacity \\r\\nattribute float a_opacity;\\r\\nvarying float v_opacity;\\r\\n\\r\\nattribute vec4 a_color;\\r\\nvarying vec4 v_color;\\r\\n\\r\\n// UV coordinate\\r\\nattribute vec2 a_texcoord;\\r\\nvarying vec2 v_texcoord;\\r\\n\\r\\n// Texture number\\r\\nattribute lowp float a_textureIndex;\\r\\nvarying lowp float v_textureIndex;\\r\\n\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\n\\r\\nvoid main() {\\r\\n // Set the vertex position using the ortho transform matrix\\r\\n gl_Position = u_matrix * a_position;\\r\\n\\r\\n // Pass through the Opacity to the fragment shader\\r\\n v_opacity = a_opacity;\\r\\n // Pass through the UV coord to the fragment shader\\r\\n v_texcoord = a_texcoord;\\r\\n // Pass through the texture number to the fragment shader\\r\\n v_textureIndex = a_textureIndex;\\r\\n // Pass through the color to the fragment shader\\r\\n v_color = a_color;\\r\\n}\";","export default \"#ifdef GL_OES_standard_derivatives\\r\\n#extension GL_OES_standard_derivatives : enable\\r\\n#endif\\r\\nprecision mediump float;\\r\\n\\r\\n// UV coord\\r\\nvarying vec2 v_texcoord;\\r\\n\\r\\n// Texture index\\r\\nvarying lowp float v_textureIndex;\\r\\n\\r\\n// Color coord to blend with image\\r\\nvarying lowp vec4 v_color;\\r\\n\\r\\n// Opacity\\r\\nvarying float v_opacity;\\r\\n\\r\\nuniform sampler2D u_textures[%%count%%];\\r\\n\\r\\nfloat circle(in vec2 st, in float radius) {\\r\\n vec2 dist = st - vec2(0.5);\\r\\n float r = dot(dist, dist) * 4.0;\\r\\n float delta = fwidth(r);\\r\\n return 1.0 - smoothstep(radius - delta, radius + delta, r);\\r\\n}\\r\\n\\r\\nvoid main() {\\r\\n float r = 0.0, delta = 0.0, alpha = 1.0;\\r\\n // In order to support the most efficient sprite batching, we have multiple\\r\\n // textures loaded into the gpu (usually 8) this picker logic skips over textures\\r\\n // that do not apply to a particular sprite.\\r\\n\\r\\n vec4 color;\\r\\n // -1 If there is no texture to sample we are drawing a solid geometry (rectangles)\\r\\n if (v_textureIndex == -1.0) {\\r\\n color = v_color;\\r\\n color.w = color.w * v_opacity;\\r\\n // -2 If there is no texture we are drawing a circle\\r\\n } else if (v_textureIndex == -2.0) {\\r\\n color = v_color;\\r\\n color.a = color.a * circle(v_texcoord, .95);\\r\\n } else {\\r\\n // GLSL is templated out to pick the right texture and set the vec4 color\\r\\n %%texture_picker%%\\r\\n }\\r\\n color.w = color.w * v_opacity;\\r\\n gl_FragColor = color;\\r\\n}\";","import { Matrix } from '../../Math/matrix';\r\nimport { BoundingBox } from '../../Collision/Index';\r\nimport { Color } from '../../Color';\r\nimport { Pool, Poolable } from '../../Util/Pool';\r\nimport { HTMLImageSource } from './ExcaliburGraphicsContext';\r\nimport { vec, Vector } from '../../Math/vector';\r\n\r\nexport enum DrawCommandType {\r\n Image = 'image',\r\n Line = 'line',\r\n Rectangle = 'rectangle',\r\n Circle = 'circle'\r\n}\r\n\r\nexport class DrawImageCommand implements Poolable {\r\n _pool: Pool<this> = undefined;\r\n\r\n public snapToPixel: boolean = true;\r\n public image: HTMLImageSource;\r\n public color: Color;\r\n public type = DrawCommandType.Image;\r\n public opacity: number = 1;\r\n public width: number = 0;\r\n public height: number = 0;\r\n public dest: [number, number] = [0, 0]; // x, y\r\n public view: [number, number, number, number] = [0, 0, 0, 0]; // sx, sy, sw, sh\r\n private _geom: [number, number][] = [\r\n [0, 0],\r\n [0, 0],\r\n [0, 0],\r\n [0, 0],\r\n [0, 0],\r\n [0, 0]\r\n ];\r\n constructor();\r\n constructor(image: HTMLImageSource, x: number, y: number);\r\n constructor(image: HTMLImageSource, x: number, y: number, width?: number, height?: number);\r\n constructor(\r\n image: HTMLImageSource,\r\n sx: number,\r\n sy: number,\r\n swidth?: number,\r\n sheight?: number,\r\n dx?: number,\r\n dy?: number,\r\n dwidth?: number,\r\n dheight?: number\r\n );\r\n constructor(\r\n image?: HTMLImageSource,\r\n sx?: number,\r\n sy?: number,\r\n swidth?: number,\r\n sheight?: number,\r\n dx?: number,\r\n dy?: number,\r\n dwidth?: number,\r\n dheight?: number\r\n ) {\r\n this.init(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\r\n }\r\n\r\n public init(\r\n image?: HTMLImageSource,\r\n sx?: number,\r\n sy?: number,\r\n swidth?: number,\r\n sheight?: number,\r\n dx?: number,\r\n dy?: number,\r\n dwidth?: number,\r\n dheight?: number\r\n ) {\r\n this.type = DrawCommandType.Image;\r\n this.image = image;\r\n this.width = image?.width || swidth || 0;\r\n this.height = image?.height || sheight || 0;\r\n this.view = [0, 0, swidth ?? image?.width, sheight ?? image?.height];\r\n this.dest = [sx, sy];\r\n // If destination is specified, update view and dest\r\n if (dx !== undefined && dy !== undefined && dwidth !== undefined && dheight !== undefined) {\r\n this.view = [sx, sy, swidth ?? image?.width, sheight ?? image?.height];\r\n this.dest = [dx, dy];\r\n this.width = dwidth;\r\n this.height = dheight;\r\n }\r\n\r\n let index = 0;\r\n this._geom[index++] = [this.dest[0], this.dest[1]];\r\n this._geom[index++] = [this.dest[0], this.dest[1] + this.height];\r\n this._geom[index++] = [this.dest[0] + this.width, this.dest[1]];\r\n this._geom[index++] = [this.dest[0] + this.width, this.dest[1]];\r\n this._geom[index++] = [this.dest[0], this.dest[1] + this.height];\r\n this._geom[index++] = [this.dest[0] + this.width, this.dest[1] + this.height];\r\n if (this.snapToPixel) {\r\n for (const point of this._geom) {\r\n point[0] = ~~point[0];\r\n point[1] = ~~point[1];\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n public initRect(color: Color, start: Vector, width: number, height: number) {\r\n this.type = DrawCommandType.Rectangle;\r\n this.color = color;\r\n this.width = width;\r\n this.height = height;\r\n let index = 0;\r\n this._geom[index++] = [start.x, start.y];\r\n this._geom[index++] = [start.x, start.y + this.height];\r\n this._geom[index++] = [start.x + this.width, start.y];\r\n this._geom[index++] = [start.x + this.width, start.y];\r\n this._geom[index++] = [start.x, start.y + this.height];\r\n this._geom[index++] = [start.x + this.width, start.y + this.height];\r\n\r\n if (this.snapToPixel) {\r\n for (const point of this._geom) {\r\n point[0] = ~~point[0];\r\n point[1] = ~~point[1];\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n public initLine(color: Color, start: Vector, end: Vector, thickness: number) {\r\n this.type = DrawCommandType.Line;\r\n this.color = color;\r\n const dir = end.sub(start).normalize();\r\n const normal = dir.perpendicular();\r\n const halfThick = thickness / 2;\r\n const startTop = normal.scale(halfThick).add(start);\r\n const startBottom = normal.scale(-halfThick).add(start);\r\n const endTop = normal.scale(halfThick).add(end);\r\n const endBottom = normal.scale(-halfThick).add(end);\r\n\r\n /**\r\n * +---------------------^----------------------+\r\n * | | (normal) |\r\n * (startx, starty)------------------>(endx, endy)\r\n * | |\r\n * + -------------------------------------------+\r\n */\r\n\r\n let index = 0;\r\n this._geom[index++] = [startTop.x, startTop.y];\r\n this._geom[index++] = [endTop.x, endTop.y];\r\n this._geom[index++] = [startBottom.x, startBottom.y];\r\n this._geom[index++] = [startBottom.x, startBottom.y];\r\n this._geom[index++] = [endTop.x, endTop.y];\r\n this._geom[index++] = [endBottom.x, endBottom.y];\r\n\r\n if (this.snapToPixel) {\r\n for (const point of this._geom) {\r\n point[0] = ~~point[0];\r\n point[1] = ~~point[1];\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n public initCircle(pos: Vector, radius: number, color: Color) {\r\n this.type = DrawCommandType.Circle;\r\n this.color = color;\r\n const topLeft = pos.add(vec(-radius, -radius));\r\n const topRight = pos.add(vec(radius, -radius));\r\n const bottomRight = pos.add(vec(radius, radius));\r\n const bottomLeft = pos.add(vec(-radius, radius));\r\n let index = 0;\r\n this._geom[index++] = [topLeft.x, topLeft.y];\r\n this._geom[index++] = [topRight.x, topRight.y];\r\n this._geom[index++] = [bottomLeft.x, bottomLeft.y];\r\n this._geom[index++] = [bottomLeft.x, bottomLeft.y];\r\n this._geom[index++] = [topRight.x, topRight.y];\r\n this._geom[index++] = [bottomRight.x, bottomRight.y];\r\n\r\n if (this.snapToPixel) {\r\n for (const point of this._geom) {\r\n point[0] = ~~point[0];\r\n point[1] = ~~point[1];\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n public dispose() {\r\n this.image = null;\r\n this.width = 0;\r\n this.height = 0;\r\n this.view = [0, 0, 0, 0];\r\n this.dest = [0, 0];\r\n\r\n let index = 0;\r\n this._geom[index++] = [this.dest[0], this.dest[1]];\r\n this._geom[index++] = [this.dest[0], this.dest[1] + this.height];\r\n this._geom[index++] = [this.dest[0] + this.width, this.dest[1]];\r\n this._geom[index++] = [this.dest[0] + this.width, this.dest[1]];\r\n this._geom[index++] = [this.dest[0], this.dest[1] + this.height];\r\n this._geom[index++] = [this.dest[0] + this.width, this.dest[1] + this.height];\r\n return this;\r\n }\r\n\r\n // todo weird\r\n applyTransform(transform: Matrix, opacity: number): void {\r\n if (transform) {\r\n for (let i = 0; i < this._geom.length; i++) {\r\n this._geom[i] = transform.multv(this._geom[i]);\r\n if (this.snapToPixel) {\r\n this._geom[i] = [~~this._geom[i][0], ~~this._geom[i][1]];\r\n }\r\n }\r\n }\r\n this.opacity = opacity;\r\n }\r\n\r\n public get geometry() {\r\n return this._geom;\r\n }\r\n}\r\n\r\nexport class DrawRectCommand {\r\n public dest: [number, number] = [0, 0];\r\n public width: number = 0;\r\n public height: number = 0;\r\n constructor(x: number, y: number, width: number, height: number) {\r\n this.dest = [x, y];\r\n this.width = width;\r\n this.height = height;\r\n }\r\n}\r\n\r\nexport class DrawDebugRectCommand {\r\n constructor(public bounds: BoundingBox, public color: Color) {}\r\n}\r\n","/**\r\n * Checks if the current number is a power of two\r\n */\r\nexport function isPowerOfTwo(x: number): boolean {\r\n return (x & (x - 1)) === 0;\r\n}\r\n\r\n/**\r\n * Returns the next highest power of two\r\n */\r\nexport function nextHighestPowerOfTwo(x: number): number {\r\n --x;\r\n for (let i = 1; i < 32; i <<= 1) {\r\n x = x | (x >> i);\r\n }\r\n return x + 1;\r\n}\r\n\r\n/**\r\n * Returns the input number if a power of two, otherwise the next highest power of two\r\n */\r\nexport function ensurePowerOfTwo(x: number): number {\r\n if (!isPowerOfTwo(x)) {\r\n return nextHighestPowerOfTwo(x);\r\n }\r\n return x;\r\n}\r\n","import { HTMLImageSource } from './ExcaliburGraphicsContext';\r\nimport { ensurePowerOfTwo, isPowerOfTwo } from './webgl-util';\r\n\r\n/**\r\n * Manages loading image sources into webgl textures, a unique id is associated with all sources\r\n */\r\nexport class TextureLoader {\r\n private static _POT_CANVAS = document.createElement('canvas');\r\n private static _POT_CTX = TextureLoader._POT_CANVAS.getContext('2d');\r\n\r\n private static _GL: WebGLRenderingContext;\r\n\r\n private static _TEXTURE_MAP = new Map<HTMLImageSource, WebGLTexture>();\r\n\r\n public static registerContext(context: WebGLRenderingContext): void {\r\n TextureLoader._GL = context;\r\n }\r\n\r\n /**\r\n * Get the WebGL Texture from a source image\r\n * @param image\r\n */\r\n public static get(image: HTMLImageSource): WebGLTexture {\r\n return TextureLoader._TEXTURE_MAP.get(image);\r\n }\r\n\r\n /**\r\n * Returns whether a source image has been loaded as a texture\r\n * @param image\r\n */\r\n public static has(image: HTMLImageSource): boolean {\r\n return TextureLoader._TEXTURE_MAP.has(image);\r\n }\r\n\r\n /**\r\n * Loads a graphic into webgl and returns it's texture info, a webgl context must be previously registered\r\n * @param image Source graphic\r\n * @param forceUpdate Optionally force a texture to be reloaded, useful if the source graphic has changed\r\n */\r\n public static load(image: HTMLImageSource, forceUpdate = false): WebGLTexture {\r\n // Ignore loading if webgl is not registered\r\n const gl = TextureLoader._GL;\r\n if (!gl) {\r\n return null;\r\n }\r\n\r\n let tex: WebGLTexture = null;\r\n // If reuse the texture if it's from the same source\r\n if (TextureLoader.has(image)) {\r\n tex = TextureLoader.get(image);\r\n }\r\n\r\n // Update existing webgl texture and return early\r\n if (tex) {\r\n if (forceUpdate) {\r\n gl.bindTexture(gl.TEXTURE_2D, tex);\r\n const source = TextureLoader.toPowerOfTwoImage(image);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\r\n }\r\n return tex;\r\n }\r\n\r\n // No texture exists create a new one\r\n tex = gl.createTexture();\r\n const source = TextureLoader.toPowerOfTwoImage(image);\r\n\r\n gl.bindTexture(gl.TEXTURE_2D, tex);\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n // NEAREST for pixels\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\r\n\r\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\r\n\r\n TextureLoader._TEXTURE_MAP.set(image, tex);\r\n return tex;\r\n }\r\n\r\n /**\r\n * Converts source images into power of two images, WebGL only supports POT images\r\n * https://www.khronos.org/webgl/wiki/WebGL_and_OpenGL_Differences#Non-Power_of_Two_Texture_Support\r\n * @param image\r\n */\r\n public static toPowerOfTwoImage(image: HTMLImageSource): HTMLImageSource {\r\n const potCanvas = TextureLoader._POT_CANVAS;\r\n const potCtx = TextureLoader._POT_CTX;\r\n if (!isPowerOfTwo(image.width) || !isPowerOfTwo(image.height)) {\r\n // Scale up the texture to the next highest power of two dimensions.\r\n\r\n potCanvas.width = ensurePowerOfTwo(image.width);\r\n potCanvas.height = ensurePowerOfTwo(image.height);\r\n potCtx.imageSmoothingEnabled = false;\r\n potCtx.clearRect(0, 0, potCanvas.width, potCanvas.height);\r\n potCtx.drawImage(image, 0, 0, image.width, image.height);\r\n image = potCanvas;\r\n }\r\n return image;\r\n }\r\n}\r\n","import { Shader } from './shader';\r\nimport imageVertexSource from './shaders/image-vertex.glsl';\r\nimport imageFragmentSource from './shaders/image-fragment.glsl';\r\nimport { BatchCommand } from './batch';\r\nimport { DrawCommandType, DrawImageCommand } from './draw-image-command';\r\nimport { Graphic } from '../Graphic';\r\nimport { ensurePowerOfTwo } from './webgl-util';\r\nimport { BatchRenderer } from './renderer';\r\nimport { WebGLGraphicsContextInfo } from './ExcaliburGraphicsContextWebGL';\r\nimport { TextureLoader } from './texture-loader';\r\nimport { HTMLImageSource } from './ExcaliburGraphicsContext';\r\nimport { Color } from '../../Color';\r\nimport { Vector } from '../..';\r\n\r\nexport class BatchImage extends BatchCommand<DrawImageCommand> {\r\n public textures: WebGLTexture[] = [];\r\n public commands: DrawImageCommand[] = [];\r\n private _graphicMap: { [id: string]: Graphic } = {};\r\n\r\n constructor(public maxDraws: number, public maxTextures: number) {\r\n super(maxDraws);\r\n }\r\n\r\n isFull() {\r\n if (this.commands.length >= this.maxDraws) {\r\n return true;\r\n }\r\n if (this.textures.length >= this.maxTextures) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n canAdd() {\r\n if (this.commands.length >= this.maxDraws) {\r\n return false;\r\n }\r\n\r\n if (this.textures.length < this.maxTextures) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _isCommandFull() {\r\n return this.commands.length >= this.maxDraws;\r\n }\r\n\r\n private _isTextureFull() {\r\n return this.textures.length >= this.maxTextures;\r\n }\r\n\r\n private _wouldAddTexture(command: DrawImageCommand) {\r\n return !this._graphicMap[command.image.id];\r\n }\r\n\r\n maybeAdd(command: DrawImageCommand): boolean {\r\n if ((this._isCommandFull() || this._isTextureFull()) && this._wouldAddTexture(command)) {\r\n return false;\r\n }\r\n\r\n this.add(command);\r\n return true;\r\n }\r\n\r\n add(command: DrawImageCommand) {\r\n if (command.type === DrawCommandType.Image) {\r\n const texture = TextureLoader.load(command.image);\r\n if (this.textures.indexOf(texture) === -1) {\r\n this.textures.push(texture);\r\n }\r\n }\r\n\r\n this.commands.push(command);\r\n }\r\n\r\n bindTextures(gl: WebGLRenderingContext) {\r\n // Bind textures in the correct order\r\n for (let i = 0; i < this.maxTextures; i++) {\r\n gl.activeTexture(gl.TEXTURE0 + i);\r\n gl.bindTexture(gl.TEXTURE_2D, this.textures[i] || this.textures[0]);\r\n }\r\n }\r\n\r\n getBatchTextureId(command: DrawImageCommand) {\r\n if (command.image) {\r\n return this.textures.indexOf(TextureLoader.get(command.image));\r\n }\r\n return -1;\r\n }\r\n\r\n dispose() {\r\n this.clear();\r\n return this;\r\n }\r\n\r\n clear() {\r\n this.commands.length = 0;\r\n this.textures.length = 0;\r\n this._graphicMap = {};\r\n }\r\n}\r\n\r\nexport class ImageRenderer extends BatchRenderer<DrawImageCommand> {\r\n constructor(gl: WebGLRenderingContext, private _contextInfo: WebGLGraphicsContextInfo) {\r\n super({\r\n gl,\r\n command: DrawImageCommand,\r\n // 6 verts per quad\r\n verticesPerCommand: 6,\r\n maxCommandsPerBatch: 2000,\r\n batchFactory: () => new BatchImage(2000, gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS))\r\n });\r\n TextureLoader.registerContext(gl);\r\n this.init();\r\n }\r\n\r\n buildShader(gl: WebGLRenderingContext): Shader {\r\n // Initialilze default batch rendering shader\r\n const maxGPUTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\r\n const shader = new Shader(gl, imageVertexSource, this._transformFragmentSource(imageFragmentSource, maxGPUTextures));\r\n shader.addAttribute('a_position', 3, gl.FLOAT);\r\n shader.addAttribute('a_texcoord', 2, gl.FLOAT);\r\n shader.addAttribute('a_textureIndex', 1, gl.FLOAT);\r\n shader.addAttribute('a_opacity', 1, gl.FLOAT);\r\n shader.addAttribute('a_color', 4, gl.FLOAT);\r\n shader.addUniformMatrix('u_matrix', this._contextInfo.matrix.data);\r\n // Initialize texture slots to [0, 1, 2, 3, 4, .... maxGPUTextures]\r\n shader.addUniformIntegerArray(\r\n 'u_textures',\r\n [...Array(maxGPUTextures)].map((_, i) => i)\r\n );\r\n return shader;\r\n }\r\n\r\n private _transformFragmentSource(source: string, maxTextures: number): string {\r\n let newSource = source.replace('%%count%%', maxTextures.toString());\r\n let texturePickerBuilder = '';\r\n for (let i = 0; i < maxTextures; i++) {\r\n if (i === 0) {\r\n texturePickerBuilder += `if (v_textureIndex <= ${i}.5) {\\n`;\r\n } else {\r\n texturePickerBuilder += ` else if (v_textureIndex <= ${i}.5) {\\n`;\r\n }\r\n texturePickerBuilder += ` color = texture2D(u_textures[${i}], v_texcoord);\\n`;\r\n texturePickerBuilder += ` }\\n`;\r\n }\r\n newSource = newSource.replace('%%texture_picker%%', texturePickerBuilder);\r\n return newSource;\r\n }\r\n\r\n public addCircle(pos: Vector, radius: number, color: Color) {\r\n const command = this.commands.get().initCircle(pos, radius, color);\r\n command.applyTransform(this._contextInfo.transform.current, this._contextInfo.state.current.opacity);\r\n this.addCommand(command);\r\n }\r\n\r\n public addRectangle(color: Color, pos: Vector, width: number, height: number) {\r\n const command = this.commands.get().initRect(color, pos, width, height);\r\n command.applyTransform(this._contextInfo.transform.current, this._contextInfo.state.current.opacity);\r\n this.addCommand(command);\r\n }\r\n\r\n public addLine(color: Color, start: Vector, end: Vector, thickness = 1) {\r\n const command = this.commands.get().initLine(color, start, end, thickness);\r\n command.applyTransform(this._contextInfo.transform.current, this._contextInfo.state.current.opacity);\r\n this.addCommand(command);\r\n }\r\n\r\n public addImage(\r\n graphic: HTMLImageSource,\r\n sx: number,\r\n sy: number,\r\n swidth?: number,\r\n sheight?: number,\r\n dx?: number,\r\n dy?: number,\r\n dwidth?: number,\r\n dheight?: number\r\n ) {\r\n const command = this.commands.get().init(graphic, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\r\n command.applyTransform(this._contextInfo.transform.current, this._contextInfo.state.current.opacity);\r\n this.addCommand(command);\r\n }\r\n\r\n public renderBatch(gl: WebGLRenderingContext, batch: BatchImage, vertexCount: number) {\r\n // Bind textures in the correct order\r\n batch.bindTextures(gl);\r\n // draw the quads\r\n gl.drawArrays(gl.TRIANGLES, 0, vertexCount);\r\n }\r\n\r\n buildBatchVertices(vertexBuffer: Float32Array, batch: BatchImage): number {\r\n let vertIndex = 0;\r\n let sx: number = 0;\r\n let sy: number = 0;\r\n let sw: number = 0;\r\n let sh: number = 0;\r\n let potWidth: number = 1;\r\n let potHeight: number = 1;\r\n let textureId = 0;\r\n let commandColor = Color.Transparent;\r\n for (const command of batch.commands) {\r\n sx = command.view[0];\r\n sy = command.view[1];\r\n sw = command.view[2];\r\n sh = command.view[3];\r\n\r\n potWidth = ensurePowerOfTwo(command.image?.width || command.width);\r\n potHeight = ensurePowerOfTwo(command.image?.height || command.height);\r\n\r\n textureId = batch.getBatchTextureId(command);\r\n if (command.type === DrawCommandType.Line || command.type === DrawCommandType.Rectangle) {\r\n textureId = -1; // sentinel for no image rect\r\n commandColor = command.color;\r\n }\r\n if (command.type === DrawCommandType.Circle) {\r\n textureId = -2; // sentinel for circle\r\n commandColor = command.color;\r\n }\r\n\r\n // potential optimization when divding by 2 (bitshift)\r\n // Modifying the images to poweroftwo images warp the UV coordinates\r\n let uvx0 = sx / potWidth;\r\n let uvy0 = sy / potHeight;\r\n let uvx1 = (sx + sw) / potWidth;\r\n let uvy1 = (sy + sh) / potHeight;\r\n if (textureId === -2) {\r\n uvx0 = 0;\r\n uvy0 = 0;\r\n uvx1 = 1;\r\n uvy1 = 1;\r\n }\r\n\r\n // Quad update\r\n // (0, 0, z) z-index doesn't work in batch rendering between batches\r\n vertexBuffer[vertIndex++] = command.geometry[0][0]; // x + 0 * width;\r\n vertexBuffer[vertIndex++] = command.geometry[0][1]; //y + 0 * height;\r\n vertexBuffer[vertIndex++] = 0;\r\n\r\n // UV coords\r\n vertexBuffer[vertIndex++] = uvx0; // 0;\r\n vertexBuffer[vertIndex++] = uvy0; // 0;\r\n // texture id\r\n vertexBuffer[vertIndex++] = textureId;\r\n // opacity\r\n vertexBuffer[vertIndex++] = command.opacity;\r\n // color\r\n vertexBuffer[vertIndex++] = commandColor.r / 255;\r\n vertexBuffer[vertIndex++] = commandColor.g / 255;\r\n vertexBuffer[vertIndex++] = commandColor.b / 255;\r\n vertexBuffer[vertIndex++] = commandColor.a;\r\n\r\n // (0, 1)\r\n vertexBuffer[vertIndex++] = command.geometry[1][0]; // x + 0 * width;\r\n vertexBuffer[vertIndex++] = command.geometry[1][1]; // y + 1 * height;\r\n vertexBuffer[vertIndex++] = 0;\r\n\r\n // UV coords\r\n vertexBuffer[vertIndex++] = uvx0; // 0;\r\n vertexBuffer[vertIndex++] = uvy1; // 1;\r\n // texture id\r\n vertexBuffer[vertIndex++] = textureId;\r\n // opacity\r\n vertexBuffer[vertIndex++] = command.opacity;\r\n // color\r\n vertexBuffer[vertIndex++] = commandColor.r / 255;\r\n vertexBuffer[vertIndex++] = commandColor.g / 255;\r\n vertexBuffer[vertIndex++] = commandColor.b / 255;\r\n vertexBuffer[vertIndex++] = commandColor.a;\r\n\r\n // (1, 0)\r\n vertexBuffer[vertIndex++] = command.geometry[2][0]; // x + 1 * width;\r\n vertexBuffer[vertIndex++] = command.geometry[2][1]; // y + 0 * height;\r\n vertexBuffer[vertIndex++] = 0;\r\n\r\n // UV coords\r\n vertexBuffer[vertIndex++] = uvx1; //1;\r\n vertexBuffer[vertIndex++] = uvy0; //0;\r\n // texture id\r\n vertexBuffer[vertIndex++] = textureId;\r\n // opacity\r\n vertexBuffer[vertIndex++] = command.opacity;\r\n // color\r\n vertexBuffer[vertIndex++] = commandColor.r / 255;\r\n vertexBuffer[vertIndex++] = commandColor.g / 255;\r\n vertexBuffer[vertIndex++] = commandColor.b / 255;\r\n vertexBuffer[vertIndex++] = commandColor.a;\r\n\r\n // (1, 0)\r\n vertexBuffer[vertIndex++] = command.geometry[3][0]; // x + 1 * width;\r\n vertexBuffer[vertIndex++] = command.geometry[3][1]; // y + 0 * height;\r\n vertexBuffer[vertIndex++] = 0;\r\n\r\n // UV coords\r\n vertexBuffer[vertIndex++] = uvx1; //1;\r\n vertexBuffer[vertIndex++] = uvy0; //0;\r\n // texture id\r\n vertexBuffer[vertIndex++] = textureId;\r\n // opacity\r\n vertexBuffer[vertIndex++] = command.opacity;\r\n // color\r\n vertexBuffer[vertIndex++] = commandColor.r / 255;\r\n vertexBuffer[vertIndex++] = commandColor.g / 255;\r\n vertexBuffer[vertIndex++] = commandColor.b / 255;\r\n vertexBuffer[vertIndex++] = commandColor.a;\r\n\r\n // (0, 1)\r\n vertexBuffer[vertIndex++] = command.geometry[4][0]; // x + 0 * width;\r\n vertexBuffer[vertIndex++] = command.geometry[4][1]; // y + 1 * height\r\n vertexBuffer[vertIndex++] = 0;\r\n\r\n // UV coords\r\n vertexBuffer[vertIndex++] = uvx0; // 0;\r\n vertexBuffer[vertIndex++] = uvy1; // 1;\r\n // texture id\r\n vertexBuffer[vertIndex++] = textureId;\r\n // opacity\r\n vertexBuffer[vertIndex++] = command.opacity;\r\n // color\r\n vertexBuffer[vertIndex++] = commandColor.r / 255;\r\n vertexBuffer[vertIndex++] = commandColor.g / 255;\r\n vertexBuffer[vertIndex++] = commandColor.b / 255;\r\n vertexBuffer[vertIndex++] = commandColor.a;\r\n\r\n // (1, 1)\r\n vertexBuffer[vertIndex++] = command.geometry[5][0]; // x + 1 * width;\r\n vertexBuffer[vertIndex++] = command.geometry[5][1]; // y + 1 * height;\r\n vertexBuffer[vertIndex++] = 0;\r\n\r\n // UV coords\r\n vertexBuffer[vertIndex++] = uvx1; // 1;\r\n vertexBuffer[vertIndex++] = uvy1; // 1;\r\n // texture id\r\n vertexBuffer[vertIndex++] = textureId;\r\n // opacity\r\n vertexBuffer[vertIndex++] = command.opacity;\r\n // color\r\n vertexBuffer[vertIndex++] = commandColor.r / 255;\r\n vertexBuffer[vertIndex++] = commandColor.g / 255;\r\n vertexBuffer[vertIndex++] = commandColor.b / 255;\r\n vertexBuffer[vertIndex++] = commandColor.a;\r\n }\r\n\r\n return vertIndex / this.vertexSize;\r\n }\r\n}\r\n","export default \"attribute vec4 a_position;\\r\\nattribute vec4 a_color;\\r\\nattribute float a_size;\\r\\nvarying lowp vec4 v_color;\\r\\nuniform mat4 u_matrix;\\r\\n\\r\\nvoid main() {\\r\\n gl_Position = u_matrix * a_position;\\r\\n gl_PointSize = a_size * 2.0;\\r\\n v_color = a_color;\\r\\n}\";","export default \"#ifdef GL_OES_standard_derivatives\\r\\n#extension GL_OES_standard_derivatives : enable\\r\\n#endif\\r\\n\\r\\nprecision mediump float;\\r\\nvarying lowp vec4 v_color;\\r\\n\\r\\nvoid main() {\\r\\n float r = 0.0, delta = 0.0, alpha = 1.0;\\r\\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\\r\\n r = dot(cxy, cxy);\\r\\n \\r\\n#ifdef GL_OES_standard_derivatives\\r\\n delta = fwidth(r);\\r\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\r\\n#else\\r\\n if (r > 1.0) {\\r\\n discard;\\r\\n }\\r\\n#endif\\r\\n gl_FragColor = vec4(v_color.rgb, v_color.a * alpha);\\r\\n}\";","import { Shader } from './shader';\r\nimport pointVertexSource from './shaders/point-vertex.glsl';\r\nimport pointFragmentSource from './shaders/point-fragment.glsl';\r\nimport { Vector } from '../../Math/vector';\r\nimport { Color } from '../../Color';\r\nimport { BatchRenderer } from './renderer';\r\nimport { BatchCommand } from './batch';\r\nimport { WebGLGraphicsContextInfo } from './ExcaliburGraphicsContextWebGL';\r\nimport { Pool, Poolable } from '../../Util/Pool';\r\n// import { Random } from '../../Math/Index';\r\n\r\nexport class DrawPoint implements Poolable {\r\n _pool?: Pool<this>;\r\n public point: Vector = Vector.Zero;\r\n public color: Color = Color.Black;\r\n public size: number = 1;\r\n public dispose() {\r\n this.point.setTo(0, 0);\r\n this.color.r = 0;\r\n this.color.g = 0;\r\n this.color.b = 0;\r\n this.color.a = 1;\r\n this.size = 1;\r\n return this;\r\n }\r\n}\r\n\r\nexport class PointRenderer extends BatchRenderer<DrawPoint> {\r\n constructor(gl: WebGLRenderingContext, private _contextInfo: WebGLGraphicsContextInfo) {\r\n super({ gl, command: DrawPoint, verticesPerCommand: 1 });\r\n this.init();\r\n }\r\n\r\n buildShader(gl: WebGLRenderingContext): Shader {\r\n gl.getExtension('OES_standard_derivatives');\r\n const shader = new Shader(gl, pointVertexSource, pointFragmentSource);\r\n shader.addAttribute('a_position', 2, gl.FLOAT);\r\n shader.addAttribute('a_color', 4, gl.FLOAT);\r\n shader.addAttribute('a_size', 1, gl.FLOAT);\r\n shader.addUniformMatrix('u_matrix', this._contextInfo.matrix.data);\r\n return shader;\r\n }\r\n\r\n addPoint(point: Vector, color: Color, size: number) {\r\n const cmd = this.commands.get();\r\n cmd.point = this._contextInfo.transform.current.multv(point);\r\n cmd.color.r = color.r;\r\n cmd.color.g = color.g;\r\n cmd.color.b = color.b;\r\n cmd.color.a = color.a * this._contextInfo.state.current.opacity;\r\n cmd.size = size * Math.max(this._contextInfo.transform.current.getScaleX(), this._contextInfo.transform.current.getScaleY());\r\n this.addCommand(cmd);\r\n }\r\n\r\n buildBatchVertices(vertexBuffer: Float32Array, batch: BatchCommand<DrawPoint>): number {\r\n let index = 0;\r\n for (const command of batch.commands) {\r\n vertexBuffer[index++] = command.point.x;\r\n vertexBuffer[index++] = command.point.y;\r\n // normalize to [0, 1] for webgl\r\n vertexBuffer[index++] = command.color.r / 255;\r\n vertexBuffer[index++] = command.color.g / 255;\r\n vertexBuffer[index++] = command.color.b / 255;\r\n vertexBuffer[index++] = command.color.a;\r\n\r\n vertexBuffer[index++] = command.size;\r\n }\r\n return index / this.vertexSize;\r\n }\r\n\r\n renderBatch(gl: WebGLRenderingContext, _batch: BatchCommand<DrawPoint>, vertexCount: number): void {\r\n gl.drawArrays(gl.POINTS, 0, vertexCount);\r\n }\r\n}\r\n","import { Vector, vec } from '../Math/vector';\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\nimport { BoundingBox } from '../Collision/BoundingBox';\n\nexport interface GraphicOptions {\n /**\n * The width of the graphic\n */\n width?: number;\n /**\n * The height of the graphic\n */\n height?: number;\n /**\n * SHould the graphic be flipped horizontally\n */\n flipHorizontal?: boolean;\n /**\n * Should the graphic be flipped vertically\n */\n flipVertical?: boolean;\n /**\n * The rotation of the graphic\n */\n rotation?: number;\n /**\n * The scale of the graphic\n */\n scale?: Vector;\n /**\n * The opacity of the graphic\n */\n opacity?: number;\n /**\n * The origin of the drawing in pixels to use when applying transforms, by default it will be the center of the image\n */\n origin?: Vector;\n}\n\n/**\n * A Graphic is the base Excalibur primitive for something that can be drawn to the [[ExcaliburGraphicsContext]].\n * [[Sprite]], [[Animation]], [[GraphicsGroup]], [[Canvas]], [[Rectangle]], [[Circle]], and [[Polygon]] all derive from the\n * [[Graphic]] abstract class.\n *\n * Implementors of a Graphic must override the abstract [[Graphic._drawImage]] method to render an image to the graphics context. Graphic\n * handles all the position, rotation, and scale transformations in [[Graphic._preDraw]] and [[Graphic._postDraw]]\n */\nexport abstract class Graphic {\n private static _ID: number = 0;\n readonly id = Graphic._ID++;\n\n /**\n * Gets or sets wether to show debug information about the graphic\n */\n public showDebug: boolean = false;\n\n /**\n * Gets or sets the flipHorizontal, which will flip the graphic horizontally (across the y axis)\n */\n public flipHorizontal: boolean = false;\n\n /**\n * Gets or sets the flipVertical, which will flip the graphic vertically (across the x axis)\n */\n public flipVertical: boolean = false;\n\n /**\n * Gets or sets the rotation of the graphic\n */\n public rotation: number = 0;\n\n /**\n * Gets or sets the opacity of the graphic, 0 is transparent, 1 is solid (opaque).\n */\n public opacity: number = 1;\n\n /**\n * Gets or sets the scale of the graphic, this affects the width and\n */\n public scale = Vector.One;\n\n /**\n * Gets or sets the origin of the graphic, if not set the center of the graphic is the origin\n */\n public origin: Vector | null = null;\n\n constructor(options?: GraphicOptions) {\n if (options) {\n this.origin = options.origin ?? this.origin;\n this.flipHorizontal = options.flipHorizontal ?? this.flipHorizontal;\n this.flipVertical = options.flipVertical ?? this.flipVertical;\n this.rotation = options.rotation ?? this.rotation;\n this.opacity = options.opacity ?? this.opacity;\n this.scale = options.scale ?? this.scale;\n }\n }\n\n public cloneGraphicOptions(): GraphicOptions {\n return {\n origin: this.origin ? this.origin.clone() : null,\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n rotation: this.rotation,\n opacity: this.opacity,\n scale: this.scale ? this.scale.clone() : null\n };\n }\n\n private _width: number = 0;\n\n /**\n * Gets or sets the width of the graphic (always positive)\n */\n public get width() {\n return Math.abs(this._width * this.scale.x);\n }\n\n private _height: number = 0;\n\n /**\n * Gets or sets the height of the graphic (always positive)\n */\n public get height() {\n return Math.abs(this._height * this.scale.y);\n }\n\n public set width(value: number) {\n this._width = value;\n }\n\n public set height(value: number) {\n this._height = value;\n }\n\n /**\n * Gets a copy of the bounds in pixels occupied by the graphic on the the screen. This includes scale.\n */\n public get localBounds(): BoundingBox {\n return BoundingBox.fromDimension(this.width, this.height, Vector.Zero);\n }\n\n /**\n * Draw the whole graphic to the context including transform\n * @param ex The excalibur graphics context\n * @param x\n * @param y\n */\n public draw(ex: ExcaliburGraphicsContext, x: number, y: number): void {\n this._preDraw(ex, x, y);\n this._drawImage(ex, 0, 0);\n this._postDraw(ex);\n }\n\n /**\n * Meant to be overriden by the graphic implementation to draw the underlying image (HTMLCanvasElement or HTMLImageElement)\n * to the graphics context without transform. Transformations like position, rotation, and scale are handled by [[Graphic._preDraw]]\n * and [[Graphic._postDraw]]\n * @param ex The excalibur graphics context\n * @param x\n * @param y\n */\n protected abstract _drawImage(ex: ExcaliburGraphicsContext, x: number, y: number): void;\n\n /**\n * Apply affine transformations to the graphics context to manipulate the graphic before [[Graphic._drawImage]]\n * @param ex\n * @param x\n * @param y\n */\n protected _preDraw(ex: ExcaliburGraphicsContext, x: number, y: number): void {\n ex.save();\n ex.translate(x, y);\n ex.scale(Math.abs(this.scale.x), Math.abs(this.scale.y));\n this._rotate(ex);\n this._flip(ex);\n // it is important to multiply alphas so graphics respect the current context\n ex.opacity = ex.opacity * this.opacity;\n }\n\n protected _rotate(ex: ExcaliburGraphicsContext) {\n const scaleDirX = this.scale.x > 0 ? 1 : -1;\n const scaleDirY = this.scale.y > 0 ? 1 : -1;\n const origin = this.origin ?? vec(this.width / 2, this.height / 2);\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n // This is for handling direction changes 1 or -1, that way we don't have mismatched translates()\n ex.scale(scaleDirX, scaleDirY);\n ex.translate(-origin.x, -origin.y);\n }\n\n protected _flip(ex: ExcaliburGraphicsContext) {\n if (this.flipHorizontal) {\n ex.translate(this.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n\n if (this.flipVertical) {\n ex.translate(0, this.height / this.scale.y);\n ex.scale(1, -1);\n }\n }\n\n /**\n * Apply any addtional work after [[Graphic._drawImage]] and restore the context state.\n * @param ex\n */\n protected _postDraw(ex: ExcaliburGraphicsContext): void {\n if (this.showDebug) {\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n\n /**\n * Returns a new instance of the graphic that has the same properties\n */\n abstract clone(): Graphic;\n}\n","/**\r\n * Watch an object with a proxy, only fires if property value is different\r\n */\r\nexport function watch<T extends object>(type: T, change: (type: T) => any): T {\r\n if (!type) {\r\n return type;\r\n }\r\n if ((type as any).__isProxy === undefined) {\r\n // expando hack to mark a proxy\r\n return new Proxy(type, {\r\n set: (obj, prop, value) => {\r\n // The default behavior to store the value\r\n if ((obj as any)[prop] !== value) {\r\n (obj as any)[prop] = value;\r\n // Avoid watching private junk\r\n if (typeof prop === 'string') {\r\n if (prop[0] !== '_') {\r\n change(obj);\r\n }\r\n }\r\n }\r\n // Indicate success\r\n return true;\r\n },\r\n get: (obj, prop) => {\r\n if (prop !== '__isProxy') {\r\n return (obj as any)[prop];\r\n }\r\n return true;\r\n }\r\n });\r\n }\r\n return type;\r\n}\r\n\r\n/**\r\n * Watch an object with a proxy, fires change on any property value change\r\n */\r\nexport function watchAny<T extends object>(type: T, change: (type: T) => any): T {\r\n if (!type) {\r\n return type;\r\n }\r\n if ((type as any).__isProxy === undefined) {\r\n // expando hack to mark a proxy\r\n return new Proxy(type, {\r\n set: (obj, prop, value) => {\r\n // The default behavior to store the value\r\n (obj as any)[prop] = value;\r\n // Avoid watching private junk\r\n if (typeof prop === 'string') {\r\n if (prop[0] !== '_') {\r\n change(obj);\r\n }\r\n }\r\n\r\n // Indicate success\r\n return true;\r\n },\r\n get: (obj, prop) => {\r\n if (prop !== '__isProxy') {\r\n return (obj as any)[prop];\r\n }\r\n return true;\r\n }\r\n });\r\n }\r\n return type;\r\n}\r\n","import { Graphic, GraphicOptions } from './Graphic';\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\nimport { Color } from '../Color';\nimport { ensurePowerOfTwo } from './Context/webgl-util';\nimport { Vector } from '../Math/vector';\nimport { BoundingBox } from '../Collision/BoundingBox';\nimport { watch } from '../Util/Watch';\nimport { TextureLoader } from './Context/texture-loader';\n\nexport interface RasterOptions {\n smoothing?: boolean;\n color?: Color;\n strokeColor?: Color;\n lineWidth?: number;\n lineDash?: number[];\n padding?: number;\n}\n\n/**\n * A Raster is a Graphic that needs to be first painted to a HTMLCanvasElement before it can be drawn to the\n * [[ExcaliburGraphicsContext]]. This is useful for generating custom images using the 2D canvas api.\n *\n * Implementors must implemenet the [[Raster.execute]] method to rasterize their drawing.\n */\nexport abstract class Raster extends Graphic {\n public _bitmap: HTMLCanvasElement;\n protected _ctx: CanvasRenderingContext2D;\n private _dirty: boolean = true;\n\n constructor(options?: GraphicOptions & RasterOptions) {\n super(options);\n if (options) {\n this.color = options.color ?? Color.Black;\n this.strokeColor = options?.strokeColor;\n this.smoothing = options.smoothing ?? this.smoothing;\n this.lineWidth = options.lineWidth ?? this.lineWidth;\n this.lineDash = options.lineDash ?? this.lineDash;\n this.padding = options.padding ?? this.padding;\n }\n\n this._bitmap = document.createElement('canvas');\n // get the default canvas width/height as a fallback\n const bitmapWidth = options?.width ?? this._bitmap.width;\n const bitmapHeight = options?.height ?? this._bitmap.height;\n // Rasters use power of two images as an optimization for webgl\n this.width = ensurePowerOfTwo(bitmapWidth);\n this.height = ensurePowerOfTwo(bitmapHeight);\n const maybeCtx = this._bitmap.getContext('2d');\n if (!maybeCtx) {\n /* istanbul ignore next */\n throw new Error('Browser does not support 2d canvas drawing, cannot create Raster graphic');\n } else {\n this._ctx = maybeCtx;\n }\n }\n\n public cloneRasterOptions(): RasterOptions {\n return {\n color: this.color ? this.color.clone() : null,\n strokeColor: this.strokeColor ? this.strokeColor.clone() : null,\n smoothing: this.smoothing,\n lineWidth: this.lineWidth,\n lineDash: this.lineDash,\n padding: this.padding\n };\n }\n\n /**\n * Gets whether the graphic is dirty, this means there are changes that haven't been re-rasterized\n */\n public get dirty() {\n return this._dirty;\n }\n\n /**\n * Flags the graphic as dirty, meaning it must be re-rasterized before draw.\n * This should be called any time the graphics state changes such that it affects the outputed drawing\n */\n public flagDirty() {\n this._dirty = true;\n }\n\n private _originalWidth: number;\n /**\n * Gets or sets the current width of the Raster graphic. Setting the width will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding`s set will be factored into the width\n */\n public get width() {\n return this._getTotalWidth();\n }\n public set width(value: number) {\n this._bitmap.width = value;\n this._originalWidth = value;\n this.flagDirty();\n }\n\n private _originalHeight: number;\n /**\n * Gets or sets the current height of the Raster graphic. Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n *\n * Any `padding` set will be factored into the height\n */\n public get height() {\n return this._getTotalHeight();\n }\n\n public set height(value: number) {\n this._bitmap.height = value;\n this._originalHeight = value;\n this.flagDirty();\n }\n\n private _getTotalWidth() {\n return (this._originalWidth ?? this._bitmap.width) + this.padding * 2;\n }\n\n private _getTotalHeight() {\n return (this._originalHeight ?? this._bitmap.height) + this.padding * 2;\n }\n\n /**\n * Returns the local bounds of the Raster including the padding\n */\n public get localBounds() {\n return BoundingBox.fromDimension(this._getTotalWidth() * this.scale.x, this._getTotalHeight() * this.scale.y, Vector.Zero);\n }\n\n private _smoothing: boolean = false;\n /**\n * Gets or sets the smoothing (anti-aliasing of the graphic). Setting the height will cause the raster\n * to be flagged dirty causing a re-raster on the next draw.\n */\n public get smoothing() {\n return this._smoothing;\n }\n public set smoothing(value: boolean) {\n this._smoothing = value;\n this.flagDirty();\n }\n\n private _color: Color = watch(Color.Black, () => this.flagDirty());\n /**\n * Gets or sets the fillStyle of the Raster graphic. Setting the fillStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n public get color() {\n return this._color;\n }\n public set color(value) {\n if (!this._color?.equal(value)) {\n this.flagDirty();\n }\n this._color = watch(value, () => this.flagDirty());\n }\n\n private _strokeColor: Color;\n /**\n * Gets or sets the strokeStyle of the Raster graphic. Setting the strokeStyle will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n public get strokeColor() {\n return this._strokeColor;\n }\n public set strokeColor(value) {\n if (!this._strokeColor?.equal(value)) {\n this.flagDirty();\n }\n this._strokeColor = watch(value, () => this.flagDirty());\n }\n\n private _lineWidth: number = 1;\n /**\n * Gets or sets the line width of the Raster graphic. Setting the lineWidth will cause the raster to be\n * flagged dirty causing a re-raster on the next draw.\n */\n public get lineWidth() {\n return this._lineWidth;\n }\n public set lineWidth(value) {\n this._lineWidth = value;\n this.flagDirty();\n }\n\n private _lineDash: number[] = [];\n public get lineDash() {\n return this._lineDash;\n }\n\n public set lineDash(value) {\n this._lineDash = value;\n this.flagDirty();\n }\n\n private _padding: number = 0;\n public get padding() {\n return this._padding;\n }\n\n public set padding(value: number) {\n this._padding = value;\n this.flagDirty();\n }\n\n /**\n * Rasterize the graphic to a bitmap making it usuable as in excalibur. Rasterize is called automatically if\n * the graphic is [[Raster.dirty]] on the next [[Graphic.draw]] call\n */\n public rasterize(): void {\n this._dirty = false;\n this._ctx.clearRect(0, 0, this._getTotalWidth(), this._getTotalHeight());\n this._ctx.save();\n this._applyRasterProperites(this._ctx);\n this.execute(this._ctx);\n this._ctx.restore();\n // The webgl texture needs to be updated if it exists after a raster cycle\n TextureLoader.load(this._bitmap, true);\n }\n\n protected _applyRasterProperites(ctx: CanvasRenderingContext2D) {\n this._bitmap.width = this._getTotalWidth();\n this._bitmap.height = this._getTotalHeight();\n ctx.translate(this.padding, this.padding);\n ctx.imageSmoothingEnabled = this.smoothing;\n ctx.lineWidth = this.lineWidth;\n ctx.setLineDash(this.lineDash ?? ctx.getLineDash());\n ctx.strokeStyle = this.strokeColor?.toString();\n ctx.fillStyle = this.color?.toString();\n }\n\n protected _drawImage(ex: ExcaliburGraphicsContext, x: number, y: number) {\n if (this._dirty) {\n this.rasterize();\n }\n\n ex.drawImage(this._bitmap, x, y);\n }\n\n /**\n * Executes drawing implemenation of the graphic, this is where the specific drawing code for the graphic\n * should be implemented. Once `rasterize()` the graphic can be drawn to the [[ExcaliburGraphicsContext]] via `draw(...)`\n * @param ctx Canvas to draw the graphic to\n */\n abstract execute(ctx: CanvasRenderingContext2D): void;\n}\n","import { GraphicOptions } from './Graphic';\r\nimport { Raster, RasterOptions } from './Raster';\r\n\r\nexport interface CanvasOptions {\r\n draw?: (ctx: CanvasRenderingContext2D) => void;\r\n cache?: boolean;\r\n}\r\n\r\n/**\r\n * A canvas [[Graphic]] to provide an adapter between the 2D Canvas API and the [[ExcaliburGraphicsContext]].\r\n *\r\n * The [[Canvas]] works by re-rastering a draw handler to a HTMLCanvasElement for every draw which is then passed\r\n * to the [[ExcaliburGraphicsContext]] implementation as a rendered image.\r\n *\r\n * **Low performance API**\r\n */\r\nexport class Canvas extends Raster {\r\n /**\r\n * Return the 2D graphics context of this canvas\r\n */\r\n public get ctx() {\r\n return this._ctx;\r\n }\r\n\r\n constructor(private _options: GraphicOptions & RasterOptions & CanvasOptions) {\r\n super(_options);\r\n }\r\n\r\n public clone(): Canvas {\r\n return new Canvas({\r\n ...this._options,\r\n ...this.cloneGraphicOptions(),\r\n ...this.cloneRasterOptions()\r\n });\r\n }\r\n\r\n execute(ctx: CanvasRenderingContext2D): void {\r\n if (this._options?.draw) {\r\n this._options?.draw(ctx);\r\n }\r\n if (!this._options.cache) {\r\n this.flagDirty();\r\n }\r\n }\r\n}\r\n","import { Scene } from './Scene';\nimport { Vector } from './Math/vector';\nimport { Actor } from './Actor';\nimport { Trigger } from './Trigger';\nimport { FrameStats } from './Debug';\nimport { Engine } from './Engine';\nimport { TileMap } from './TileMap';\nimport { Side } from './Collision/Side';\nimport * as Input from './Input/Index';\nimport { CollisionContact } from './Collision/Detection/CollisionContact';\nimport { Collider } from './Collision/Colliders/Collider';\nimport { Entity } from './EntityComponentSystem/Entity';\nimport { OnInitialize, OnPreUpdate, OnPostUpdate } from './Interfaces/LifecycleEvents';\nimport { BodyComponent } from './Collision/BodyComponent';\n\nexport enum EventTypes {\n Kill = 'kill',\n PreKill = 'prekill',\n PostKill = 'postkill',\n\n PreDraw = 'predraw',\n PostDraw = 'postdraw',\n\n PreDebugDraw = 'predebugdraw',\n PostDebugDraw = 'postdebugdraw',\n\n PreUpdate = 'preupdate',\n PostUpdate = 'postupdate',\n\n PreFrame = 'preframe',\n PostFrame = 'postframe',\n\n PreCollision = 'precollision',\n CollisionStart = 'collisionstart',\n CollisionEnd = 'collisionend',\n PostCollision = 'postcollision',\n\n Initialize = 'initialize',\n Activate = 'activate',\n Deactivate = 'deactivate',\n\n ExitViewport = 'exitviewport',\n EnterViewport = 'enterviewport',\n\n ExitTrigger = 'exit',\n EnterTrigger = 'enter',\n\n Connect = 'connect',\n Disconnect = 'disconnect',\n Button = 'button',\n Axis = 'axis',\n\n Subscribe = 'subscribe',\n Unsubscribe = 'unsubscribe',\n\n Visible = 'visible',\n Hidden = 'hidden',\n Start = 'start',\n Stop = 'stop',\n\n PointerUp = 'pointerup',\n PointerDown = 'pointerdown',\n PointerMove = 'pointermove',\n PointerEnter = 'pointerenter',\n PointerLeave = 'pointerleave',\n PointerCancel = 'pointercancel',\n PointerWheel = 'pointerwheel',\n\n Up = 'up',\n Down = 'down',\n Move = 'move',\n Enter = 'enter',\n Leave = 'leave',\n Cancel = 'cancel',\n Wheel = 'wheel',\n\n Press = 'press',\n Release = 'release',\n Hold = 'hold',\n\n PointerDragStart = 'pointerdragstart',\n PointerDragEnd = 'pointerdragend',\n PointerDragEnter = 'pointerdragenter',\n PointerDragLeave = 'pointerdragleave',\n PointerDragMove = 'pointerdragmove'\n}\n\n/* istanbul ignore next */\n/* compiler only: these are internal to lib */\nexport type kill = 'kill';\nexport type prekill = 'prekill';\nexport type postkill = 'postkill';\n\nexport type predraw = 'predraw';\nexport type postdraw = 'postdraw';\n\nexport type predebugdraw = 'predebugdraw';\nexport type postdebugdraw = 'postdebugdraw';\n\nexport type preupdate = 'preupdate';\nexport type postupdate = 'postupdate';\n\nexport type preframe = 'preframe';\nexport type postframe = 'postframe';\n\nexport type precollision = 'precollision';\nexport type collisionstart = 'collisionstart';\nexport type collisionend = 'collisionend';\nexport type postcollision = 'postcollision';\n\nexport type initialize = 'initialize';\nexport type activate = 'activate';\nexport type deactivate = 'deactivate';\n\nexport type exitviewport = 'exitviewport';\nexport type enterviewport = 'enterviewport';\n\nexport type exittrigger = 'exit';\nexport type entertrigger = 'enter';\n\nexport type connect = 'connect';\nexport type disconnect = 'disconnect';\nexport type button = 'button';\nexport type axis = 'axis';\n\nexport type subscribe = 'subscribe';\nexport type unsubscribe = 'unsubscribe';\n\nexport type visible = 'visible';\nexport type hidden = 'hidden';\nexport type start = 'start';\nexport type stop = 'stop';\n\nexport type pointerup = 'pointerup';\nexport type pointerdown = 'pointerdown';\nexport type pointermove = 'pointermove';\nexport type pointerenter = 'pointerenter';\nexport type pointerleave = 'pointerleave';\nexport type pointercancel = 'pointercancel';\nexport type pointerwheel = 'pointerwheel';\n\nexport type up = 'up';\nexport type down = 'down';\nexport type move = 'move';\nexport type enter = 'enter';\nexport type leave = 'leave';\nexport type cancel = 'cancel';\nexport type wheel = 'wheel';\n\nexport type press = 'press';\nexport type release = 'release';\nexport type hold = 'hold';\n\nexport type pointerdragstart = 'pointerdragstart';\nexport type pointerdragend = 'pointerdragend';\nexport type pointerdragenter = 'pointerdragenter';\nexport type pointerdragleave = 'pointerdragleave';\nexport type pointerdragmove = 'pointerdragmove';\n\n/**\n * Base event type in Excalibur that all other event types derive from. Not all event types are thrown on all Excalibur game objects,\n * some events are unique to a type, others are not.\n *\n */\nexport class GameEvent<T, U = T> {\n /**\n * Target object for this event.\n */\n public target: T;\n\n /**\n * Other target object for this event\n */\n public other: U | null;\n\n /**\n * If set to false, prevents event from propagating to other actors. If true it will be propagated\n * to all actors that apply.\n */\n public get bubbles(): boolean {\n return this._bubbles;\n }\n\n public set bubbles(value: boolean) {\n this._bubbles = value;\n }\n\n private _bubbles: boolean = true;\n /**\n * Prevents event from bubbling\n */\n public stopPropagation() {\n this.bubbles = false;\n }\n}\n\n/**\n * The 'kill' event is emitted on actors when it is killed. The target is the actor that was killed.\n */\nexport class KillEvent extends GameEvent<Actor> {\n constructor(public target: Actor) {\n super();\n }\n}\n\n/**\n * The 'prekill' event is emitted directly before an actor is killed.\n */\nexport class PreKillEvent extends GameEvent<Actor> {\n constructor(public target: Actor) {\n super();\n }\n}\n\n/**\n * The 'postkill' event is emitted directly after the actor is killed.\n */\nexport class PostKillEvent extends GameEvent<Actor> {\n constructor(public target: Actor) {\n super();\n }\n}\n\n/**\n * The 'start' event is emitted on engine when has started and is ready for interaction.\n */\nexport class GameStartEvent extends GameEvent<Engine> {\n constructor(public target: Engine) {\n super();\n }\n}\n\n/**\n * The 'stop' event is emitted on engine when has been stopped and will no longer take input, update or draw.\n */\nexport class GameStopEvent extends GameEvent<Engine> {\n constructor(public target: Engine) {\n super();\n }\n}\n\n/**\n * The 'predraw' event is emitted on actors, scenes, and engine before drawing starts. Actors' predraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nexport class PreDrawEvent extends GameEvent<Entity | Scene | Engine | TileMap> {\n constructor(public ctx: CanvasRenderingContext2D, public delta: number, public target: Entity | Scene | Engine | TileMap) {\n super();\n }\n}\n\n/**\n * The 'postdraw' event is emitted on actors, scenes, and engine after drawing finishes. Actors' postdraw happens inside their graphics\n * transform so that all drawing takes place with the actor as the origin.\n *\n */\nexport class PostDrawEvent extends GameEvent<Entity | Scene | Engine | TileMap> {\n constructor(public ctx: CanvasRenderingContext2D, public delta: number, public target: Entity | Scene | Engine | TileMap) {\n super();\n }\n}\n\n/**\n * The 'predebugdraw' event is emitted on actors, scenes, and engine before debug drawing starts.\n */\nexport class PreDebugDrawEvent extends GameEvent<Entity | Actor | Scene | Engine> {\n constructor(public ctx: CanvasRenderingContext2D, public target: Entity | Actor | Scene | Engine) {\n super();\n }\n}\n\n/**\n * The 'postdebugdraw' event is emitted on actors, scenes, and engine after debug drawing starts.\n */\nexport class PostDebugDrawEvent extends GameEvent<Entity | Actor | Scene | Engine> {\n constructor(public ctx: CanvasRenderingContext2D, public target: Entity | Actor | Scene | Engine) {\n super();\n }\n}\n\n/**\n * The 'preupdate' event is emitted on actors, scenes, camera, and engine before the update starts.\n */\nexport class PreUpdateEvent<T extends OnPreUpdate = Entity> extends GameEvent<T> {\n constructor(public engine: Engine, public delta: number, public target: T) {\n super();\n }\n}\n\n/**\n * The 'postupdate' event is emitted on actors, scenes, camera, and engine after the update ends.\n */\nexport class PostUpdateEvent<T extends OnPostUpdate = Entity> extends GameEvent<T> {\n constructor(public engine: Engine, public delta: number, public target: T) {\n super();\n }\n}\n\n/**\n * The 'preframe' event is emitted on the engine, before the frame begins.\n */\nexport class PreFrameEvent extends GameEvent<Engine> {\n constructor(public engine: Engine, public prevStats: FrameStats) {\n super();\n this.target = engine;\n }\n}\n\n/**\n * The 'postframe' event is emitted on the engine, after a frame ends.\n */\nexport class PostFrameEvent extends GameEvent<Engine> {\n constructor(public engine: Engine, public stats: FrameStats) {\n super();\n this.target = engine;\n }\n}\n\n/**\n * Event received when a gamepad is connected to Excalibur. [[Gamepads]] receives this event.\n */\nexport class GamepadConnectEvent extends GameEvent<Input.Gamepad> {\n constructor(public index: number, public gamepad: Input.Gamepad) {\n super();\n this.target = gamepad;\n }\n}\n\n/**\n * Event received when a gamepad is disconnected from Excalibur. [[Gamepads]] receives this event.\n */\nexport class GamepadDisconnectEvent extends GameEvent<Input.Gamepad> {\n constructor(public index: number, public gamepad: Input.Gamepad) {\n super();\n this.target = gamepad;\n }\n}\n\n/**\n * Gamepad button event. See [[Gamepads]] for information on responding to controller input. [[Gamepad]] instances receive this event;\n */\nexport class GamepadButtonEvent extends GameEvent<Input.Gamepad> {\n /**\n * @param button The Gamepad button\n * @param value A numeric value between 0 and 1\n */\n constructor(public button: Input.Buttons, public value: number, public target: Input.Gamepad) {\n super();\n }\n}\n\n/**\n * Gamepad axis event. See [[Gamepads]] for information on responding to controller input. [[Gamepad]] instances receive this event;\n */\nexport class GamepadAxisEvent extends GameEvent<Input.Gamepad> {\n /**\n * @param axis The Gamepad axis\n * @param value A numeric value between -1 and 1\n */\n constructor(public axis: Input.Axes, public value: number, public target: Input.Gamepad) {\n super();\n }\n}\n\n/**\n * Subscribe event thrown when handlers for events other than subscribe are added. Meta event that is received by\n * [[EventDispatcher|event dispatchers]].\n */\nexport class SubscribeEvent<T> extends GameEvent<T> {\n constructor(public topic: string, public handler: (event: GameEvent<T>) => void) {\n super();\n }\n}\n\n/**\n * Unsubscribe event thrown when handlers for events other than unsubscribe are removed. Meta event that is received by\n * [[EventDispatcher|event dispatchers]].\n */\nexport class UnsubscribeEvent<T> extends GameEvent<T> {\n constructor(public topic: string, public handler: (event: GameEvent<T>) => void) {\n super();\n }\n}\n\n/**\n * Event received by the [[Engine]] when the browser window is visible on a screen.\n */\nexport class VisibleEvent extends GameEvent<Engine> {\n constructor(public target: Engine) {\n super();\n }\n}\n\n/**\n * Event received by the [[Engine]] when the browser window is hidden from all screens.\n */\nexport class HiddenEvent extends GameEvent<Engine> {\n constructor(public target: Engine) {\n super();\n }\n}\n\n/**\n * Event thrown on an [[Actor|actor]] when a collision will occur this frame if it resolves\n */\nexport class PreCollisionEvent<T extends BodyComponent | Collider | Entity = Actor> extends GameEvent<T> {\n /**\n * @param actor The actor the event was thrown on\n * @param other The actor that will collided with the current actor\n * @param side The side that will be collided with the current actor\n * @param intersection Intersection vector\n */\n constructor(actor: T, public other: T, public side: Side, public intersection: Vector) {\n super();\n this.target = actor;\n }\n}\n\n/**\n * Event thrown on an [[Actor|actor]] when a collision has been resolved (body reacted) this frame\n */\nexport class PostCollisionEvent<T extends Collider | Entity = Actor> extends GameEvent<T> {\n /**\n * @param actor The actor the event was thrown on\n * @param other The actor that did collide with the current actor\n * @param side The side that did collide with the current actor\n * @param intersection Intersection vector\n */\n constructor(actor: T, public other: T, public side: Side, public intersection: Vector) {\n super();\n this.target = actor;\n }\n\n public get actor() {\n return this.target;\n }\n\n public set actor(actor: T) {\n this.target = actor;\n }\n}\n\nexport class ContactStartEvent<T> {\n constructor(public target: T, public other: T, public contact: CollisionContact) {}\n}\n\nexport class ContactEndEvent<T> {\n constructor(public target: T, public other: T) {}\n}\n\nexport class CollisionPreSolveEvent<T> {\n constructor(public target: T, public other: T, public side: Side, public intersection: Vector, public contact: CollisionContact) {}\n}\n\nexport class CollisionPostSolveEvent<T> {\n constructor(public target: T, public other: T, public side: Side, public intersection: Vector, public contact: CollisionContact) {}\n}\n\n/**\n * Event thrown the first time an [[Actor|actor]] collides with another, after an actor is in contact normal collision events are fired.\n */\nexport class CollisionStartEvent<T extends BodyComponent | Collider | Entity = Actor> extends GameEvent<T> {\n /**\n *\n * @param actor\n * @param other\n * @param contact\n */\n constructor(actor: T, public other: T, public contact: CollisionContact) {\n super();\n this.target = actor;\n }\n\n public get actor() {\n return this.target;\n }\n\n public set actor(actor: T) {\n this.target = actor;\n }\n}\n\n/**\n * Event thrown when the [[Actor|actor]] is no longer colliding with another\n */\nexport class CollisionEndEvent<T extends BodyComponent | Collider | Entity = Actor> extends GameEvent<T> {\n /**\n *\n */\n constructor(actor: T, public other: T) {\n super();\n this.target = actor;\n }\n\n public get actor() {\n return this.target;\n }\n\n public set actor(actor: T) {\n this.target = actor;\n }\n}\n\n/**\n * Event thrown on an [[Actor]] and a [[Scene]] only once before the first update call\n */\nexport class InitializeEvent<T extends OnInitialize = Entity> extends GameEvent<T> {\n /**\n * @param engine The reference to the current engine\n */\n constructor(public engine: Engine, public target: T) {\n super();\n }\n}\n\n/**\n * Event thrown on a [[Scene]] on activation\n */\nexport class ActivateEvent extends GameEvent<Scene> {\n /**\n * @param oldScene The reference to the old scene\n */\n constructor(public oldScene: Scene, public target: Scene) {\n super();\n }\n}\n\n/**\n * Event thrown on a [[Scene]] on deactivation\n */\nexport class DeactivateEvent extends GameEvent<Scene> {\n /**\n * @param newScene The reference to the new scene\n */\n constructor(public newScene: Scene, public target: Scene) {\n super();\n }\n}\n\n/**\n * Event thrown on an [[Actor]] when it completely leaves the screen.\n */\nexport class ExitViewPortEvent extends GameEvent<Entity> {\n constructor(public target: Entity) {\n super();\n }\n}\n\n/**\n * Event thrown on an [[Actor]] when it completely leaves the screen.\n */\nexport class EnterViewPortEvent extends GameEvent<Entity> {\n constructor(public target: Entity) {\n super();\n }\n}\n\nexport class EnterTriggerEvent extends GameEvent<Actor> {\n constructor(public target: Trigger, public actor: Actor) {\n super();\n }\n}\n\nexport class ExitTriggerEvent extends GameEvent<Actor> {\n constructor(public target: Trigger, public actor: Actor) {\n super();\n }\n}\n","import { GameEvent, SubscribeEvent, UnsubscribeEvent } from './Events';\r\nimport { Eventable } from './Interfaces/Evented';\r\n\r\nexport class EventDispatcher<T = any> implements Eventable {\r\n private _handlers: { [key: string]: { (event: GameEvent<T>): void }[] } = {};\r\n private _wiredEventDispatchers: Eventable[] = [];\r\n\r\n private _target: T;\r\n\r\n /**\r\n * @param target The object that will be the recipient of events from this event dispatcher\r\n */\r\n constructor(target: T) {\r\n this._target = target;\r\n }\r\n\r\n /**\r\n * Clears any existing handlers or wired event dispatchers on this event dispatcher\r\n */\r\n public clear() {\r\n this._handlers = {};\r\n this._wiredEventDispatchers = [];\r\n }\r\n\r\n /**\r\n * Emits an event for target\r\n * @param eventName The name of the event to publish\r\n * @param event Optionally pass an event data object to the handler\r\n */\r\n public emit(eventName: string, event: GameEvent<T>) {\r\n if (!eventName) {\r\n // key not mapped\r\n return;\r\n }\r\n eventName = eventName.toLowerCase();\r\n const target = this._target;\r\n if (!event) {\r\n event = new GameEvent();\r\n }\r\n try {\r\n if (!event.target) {\r\n event.target = target;\r\n }\r\n } catch {\r\n // pass\r\n }\r\n let i: number, len: number;\r\n\r\n if (this._handlers[eventName]) {\r\n i = 0;\r\n len = this._handlers[eventName].length;\r\n\r\n for (i; i < len; i++) {\r\n this._handlers[eventName][i].call(target, event);\r\n }\r\n }\r\n\r\n i = 0;\r\n len = this._wiredEventDispatchers.length;\r\n\r\n for (i; i < len; i++) {\r\n this._wiredEventDispatchers[i].emit(eventName, event);\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe an event handler to a particular event name, multiple handlers per event name are allowed.\r\n * @param eventName The name of the event to subscribe to\r\n * @param handler The handler callback to fire on this event\r\n */\r\n public on(eventName: string, handler: (event: GameEvent<T>) => void) {\r\n eventName = eventName.toLowerCase();\r\n if (!this._handlers[eventName]) {\r\n this._handlers[eventName] = [];\r\n }\r\n this._handlers[eventName].push(handler);\r\n\r\n // meta event handlers\r\n if (eventName !== 'unsubscribe' && eventName !== 'subscribe') {\r\n this.emit('subscribe', new SubscribeEvent(eventName, handler));\r\n }\r\n }\r\n\r\n /**\r\n * Unsubscribe an event handler(s) from an event. If a specific handler\r\n * is specified for an event, only that handler will be unsubscribed.\r\n * Otherwise all handlers will be unsubscribed for that event.\r\n *\r\n * @param eventName The name of the event to unsubscribe\r\n * @param handler Optionally the specific handler to unsubscribe\r\n */\r\n public off(eventName: string, handler?: (event: GameEvent<T>) => void) {\r\n eventName = eventName.toLowerCase();\r\n const eventHandlers = this._handlers[eventName];\r\n\r\n if (eventHandlers) {\r\n // if no explicit handler is give with the event name clear all handlers\r\n if (!handler) {\r\n this._handlers[eventName].length = 0;\r\n } else {\r\n const index = eventHandlers.indexOf(handler);\r\n this._handlers[eventName].splice(index, 1);\r\n }\r\n }\r\n // meta event handlers\r\n if (eventName !== 'unsubscribe' && eventName !== 'subscribe') {\r\n this.emit('unsubscribe', new UnsubscribeEvent(eventName, handler));\r\n }\r\n }\r\n\r\n /**\r\n * Once listens to an event one time, then unsubscribes from that event\r\n *\r\n * @param eventName The name of the event to subscribe to once\r\n * @param handler The handler of the event that will be auto unsubscribed\r\n */\r\n public once(eventName: string, handler: (event: GameEvent<T>) => void) {\r\n const metaHandler = (event: GameEvent<T>) => {\r\n const ev = event || new GameEvent();\r\n try {\r\n ev.target = ev.target || this._target;\r\n } catch {\r\n // pass\r\n }\r\n\r\n this.off(eventName, handler);\r\n handler.call(ev.target, ev);\r\n };\r\n\r\n this.on(eventName, metaHandler);\r\n }\r\n\r\n /**\r\n * Wires this event dispatcher to also receive events from another\r\n */\r\n public wire(eventDispatcher: EventDispatcher): void {\r\n eventDispatcher._wiredEventDispatchers.push(this);\r\n }\r\n\r\n /**\r\n * Unwires this event dispatcher from another\r\n */\r\n public unwire(eventDispatcher: EventDispatcher): void {\r\n const index = eventDispatcher._wiredEventDispatchers.indexOf(this);\r\n if (index > -1) {\r\n eventDispatcher._wiredEventDispatchers.splice(index, 1);\r\n }\r\n }\r\n}\r\n","import { Loadable } from '../Interfaces/Loadable';\r\nimport { Logger } from '../Util/Log';\r\nimport { EventDispatcher } from '../EventDispatcher';\r\n\r\n/**\r\n * The [[Resource]] type allows games built in Excalibur to load generic resources.\r\n * For any type of remote resource it is recommended to use [[Resource]] for preloading.\r\n */\r\nexport class Resource<T> implements Loadable<T> {\r\n public data: T = null;\r\n public logger: Logger = Logger.getInstance();\r\n public events: EventDispatcher = new EventDispatcher(this);\r\n\r\n /**\r\n * @param path Path to the remote resource\r\n * @param responseType The type to expect as a response: \"\" | \"arraybuffer\" | \"blob\" | \"document\" | \"json\" | \"text\";\r\n * @param bustCache Whether or not to cache-bust requests\r\n */\r\n constructor(\r\n public path: string,\r\n public responseType: '' | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text',\r\n public bustCache: boolean = true\r\n ) {}\r\n\r\n /**\r\n * Returns true if the Resource is completely loaded and is ready\r\n * to be drawn.\r\n */\r\n public isLoaded(): boolean {\r\n return this.data !== null;\r\n }\r\n\r\n\r\n private _cacheBust(uri: string): string {\r\n const query: RegExp = /\\?\\w*=\\w*/;\r\n if (query.test(uri)) {\r\n uri += '&__=' + Date.now();\r\n } else {\r\n uri += '?__=' + Date.now();\r\n }\r\n return uri;\r\n }\r\n /**\r\n * Begin loading the resource and returns a promise to be resolved on completion\r\n */\r\n public load(): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n // Exit early if we already have data\r\n if (this.data !== null) {\r\n this.logger.debug('Already have data for resource', this.path);\r\n this.events.emit('complete', this.data as any);\r\n resolve(this.data);\r\n return;\r\n }\r\n\r\n const request = new XMLHttpRequest();\r\n request.open('GET', this.bustCache ? this._cacheBust(this.path) : this.path, true);\r\n request.responseType = this.responseType;\r\n request.addEventListener('loadstart', (e) => this.events.emit('loadstart', e as any));\r\n request.addEventListener('progress', (e) => this.events.emit('progress', e as any));\r\n request.addEventListener('error', (e) => this.events.emit('error', e as any));\r\n request.addEventListener('load', (e) => this.events.emit('load', e as any));\r\n request.addEventListener('load', () => {\r\n // XHR on file:// success status is 0, such as with PhantomJS\r\n if (request.status !== 0 && request.status !== 200) {\r\n this.logger.error('Failed to load resource ', this.path, ' server responded with error code', request.status);\r\n this.events.emit('error', request.response);\r\n reject(new Error(request.statusText));\r\n return;\r\n }\r\n\r\n this.data = request.response;\r\n this.events.emit('complete', this.data as any);\r\n this.logger.debug('Completed loading resource', this.path);\r\n resolve(this.data);\r\n });\r\n request.send();\r\n });\r\n }\r\n}\r\n","/**\r\n * @module\r\n * @deprecated\r\n * These effects can be applied to any bitmap image but are mainly used\r\n * for [[Sprite]] effects or [[Animation]] effects.\r\n */\r\n\r\n/**\r\n * @typedoc\r\n */\r\n\r\nimport { obsolete } from '../Util/Decorators';\r\nimport { Color } from '../Color';\r\n\r\n/**\r\n * The interface that all sprite effects must implement\r\n * @deprecated SpriteEffect will be removed in v0.26.0\r\n */\r\nexport interface SpriteEffect {\r\n /**\r\n * Should update individual pixels values\r\n * @param x The pixel's x coordinate\r\n * @param y The pixel's y coordinate\r\n * @param imageData The sprite's raw pixel data\r\n */\r\n updatePixel(x: number, y: number, imageData: ImageData): void;\r\n}\r\n\r\n/**\r\n * Applies the \"Grayscale\" effect to a sprite, removing color information.\r\n * @deprecated [[Grayscale]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Grayscale will be removed in v0.26.0'\r\n})\r\nexport class Grayscale implements SpriteEffect {\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n const avg = (pixel[firstPixel + 0] + pixel[firstPixel + 1] + pixel[firstPixel + 2]) / 3;\r\n pixel[firstPixel + 0] = avg;\r\n pixel[firstPixel + 1] = avg;\r\n pixel[firstPixel + 2] = avg;\r\n }\r\n}\r\n\r\n/**\r\n * Applies the \"Invert\" effect to a sprite, inverting the pixel colors.\r\n * @deprecated [[Invert]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Invert will be removed in v0.26.0'\r\n})\r\nexport class Invert implements SpriteEffect {\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n pixel[firstPixel + 0] = 255 - pixel[firstPixel + 0];\r\n pixel[firstPixel + 1] = 255 - pixel[firstPixel + 1];\r\n pixel[firstPixel + 2] = 255 - pixel[firstPixel + 2];\r\n }\r\n}\r\n\r\n/**\r\n * Applies the \"Opacity\" effect to a sprite, setting the alpha of all pixels to a given value.\r\n * @deprecated [[Opacity]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Opacity will be removed in v0.26.0'\r\n})\r\nexport class Opacity implements SpriteEffect {\r\n /**\r\n * @param opacity The new opacity of the sprite from 0-1.0\r\n */\r\n constructor(public opacity: number) {}\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n if (pixel[firstPixel + 3] !== 0) {\r\n pixel[firstPixel + 3] = Math.round(this.opacity * pixel[firstPixel + 3]);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Applies the \"Colorize\" effect to a sprite, changing the color channels of all the pixels to an\r\n * average of the original color and the provided color\r\n * @deprecated [[Colorize]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Colorize will be removed in v0.26.0'\r\n})\r\nexport class Colorize implements SpriteEffect {\r\n /**\r\n * @param color The color to apply to the sprite\r\n */\r\n constructor(public color: Color) {}\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n if (pixel[firstPixel + 3] !== 0) {\r\n pixel[firstPixel + 0] = (pixel[firstPixel + 0] + this.color.r) / 2;\r\n pixel[firstPixel + 1] = (pixel[firstPixel + 1] + this.color.g) / 2;\r\n pixel[firstPixel + 2] = (pixel[firstPixel + 2] + this.color.b) / 2;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Applies the \"Lighten\" effect to a sprite, changes the lightness of the color according to HSL\r\n * @deprecated [[Lighten]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Lighten will be removed in v0.26.0'\r\n})\r\nexport class Lighten implements SpriteEffect {\r\n /**\r\n * @param factor The factor of the effect between 0-1\r\n */\r\n constructor(public factor: number = 0.1) {}\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n const color = Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).lighten(\r\n this.factor\r\n );\r\n pixel[firstPixel + 0] = color.r;\r\n pixel[firstPixel + 1] = color.g;\r\n pixel[firstPixel + 2] = color.b;\r\n pixel[firstPixel + 3] = color.a;\r\n }\r\n}\r\n\r\n/**\r\n * Applies the \"Darken\" effect to a sprite, changes the darkness of the color according to HSL\r\n * @deprecated [[Darken]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Darken will be removed v0.26.0'\r\n})\r\nexport class Darken implements SpriteEffect {\r\n /**\r\n * @param factor The factor of the effect between 0-1\r\n */\r\n constructor(public factor: number = 0.1) {}\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n const color = Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).darken(\r\n this.factor\r\n );\r\n pixel[firstPixel + 0] = color.r;\r\n pixel[firstPixel + 1] = color.g;\r\n pixel[firstPixel + 2] = color.b;\r\n pixel[firstPixel + 3] = color.a;\r\n }\r\n}\r\n\r\n/**\r\n * Applies the \"Saturate\" effect to a sprite, saturates the color according to HSL\r\n * @deprecated [[Saturate]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Saturate will be removed in v0.26.0'\r\n})\r\nexport class Saturate implements SpriteEffect {\r\n /**\r\n * @param factor The factor of the effect between 0-1\r\n */\r\n constructor(public factor: number = 0.1) {}\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n const color = Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).saturate(\r\n this.factor\r\n );\r\n pixel[firstPixel + 0] = color.r;\r\n pixel[firstPixel + 1] = color.g;\r\n pixel[firstPixel + 2] = color.b;\r\n pixel[firstPixel + 3] = color.a;\r\n }\r\n}\r\n\r\n/**\r\n * Applies the \"Desaturate\" effect to a sprite, desaturates the color according to HSL\r\n * @deprecated [[Desaturate]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Desaturate will be removed in v0.26.0'\r\n})\r\nexport class Desaturate implements SpriteEffect {\r\n /**\r\n * @param factor The factor of the effect between 0-1\r\n */\r\n constructor(public factor: number = 0.1) {}\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n const color = Color.fromRGB(pixel[firstPixel + 0], pixel[firstPixel + 1], pixel[firstPixel + 2], pixel[firstPixel + 3]).desaturate(\r\n this.factor\r\n );\r\n pixel[firstPixel + 0] = color.r;\r\n pixel[firstPixel + 1] = color.g;\r\n pixel[firstPixel + 2] = color.b;\r\n pixel[firstPixel + 3] = color.a;\r\n }\r\n}\r\n\r\n/**\r\n * Applies the \"Fill\" effect to a sprite, changing the color channels of all non-transparent pixels to match\r\n * a given color\r\n * @deprecated [[Fill]] will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'Fill will be removed in v0.26.0'\r\n})\r\nexport class Fill implements SpriteEffect {\r\n /**\r\n * @param color The color to apply to the sprite\r\n */\r\n constructor(public color: Color) {}\r\n updatePixel(x: number, y: number, imageData: ImageData): void {\r\n const firstPixel = (x + y * imageData.width) * 4;\r\n const pixel = imageData.data;\r\n if (pixel[firstPixel + 3] !== 0) {\r\n pixel[firstPixel + 0] = this.color.r;\r\n pixel[firstPixel + 1] = this.color.g;\r\n pixel[firstPixel + 2] = this.color.b;\r\n }\r\n }\r\n}\r\n","import { Resource } from '../Resources/Resource';\r\nimport { Sprite } from './Sprite';\r\nimport { Loadable } from '../Interfaces/Index';\r\n/**\r\n * The [[Texture]] object allows games built in Excalibur to load image resources.\r\n * [[Texture]] is an [[Loadable]] which means it can be passed to a [[Loader]]\r\n * to pre-load before starting a level or game.\r\n * @deprecated\r\n */\r\nexport class Texture implements Loadable<HTMLImageElement> {\r\n private _resource: Resource<Blob>;\r\n /**\r\n * The width of the texture in pixels\r\n */\r\n public width: number;\r\n\r\n /**\r\n * The height of the texture in pixels\r\n */\r\n public height: number;\r\n\r\n private _sprite: Sprite = null;\r\n\r\n /**\r\n * Populated once loading is complete\r\n */\r\n public data: HTMLImageElement;\r\n public get image() {\r\n return this.data;\r\n }\r\n\r\n private _loadedResolve: (image: HTMLImageElement) => any;\r\n public loaded = new Promise<HTMLImageElement>(resolve => {\r\n this._loadedResolve = resolve;\r\n });\r\n\r\n /**\r\n * @param path Path to the image resource or a base64 string representing an image \"data:image/png;base64,iVB...\"\r\n * @param bustCache Optionally load texture with cache busting\r\n */\r\n constructor(public path: string, public bustCache = true) {\r\n this._resource = new Resource(path, 'blob', bustCache);\r\n this._sprite = new Sprite(this, 0, 0, 0, 0);\r\n }\r\n\r\n /**\r\n * Returns true if the Texture is completely loaded and is ready\r\n * to be drawn.\r\n */\r\n public isLoaded(): boolean {\r\n return !!this.data;\r\n }\r\n\r\n /**\r\n * Begins loading the texture and returns a promise to be resolved on completion\r\n */\r\n public async load(): Promise<HTMLImageElement> {\r\n try {\r\n // Load base64 or blob if needed\r\n let url: string;\r\n if (!this.path.includes('data:image/')) {\r\n const blob = await this._resource.load();\r\n url = URL.createObjectURL(blob);\r\n } else {\r\n url = this.path;\r\n }\r\n\r\n // Decode the image\r\n const image = new Image();\r\n image.src = url;\r\n await image.decode();\r\n\r\n // Set results\r\n this.data = image;\r\n this.width = this._sprite.width = image.naturalWidth;\r\n this.height = this._sprite.height = image.naturalHeight;\r\n this._sprite = new Sprite(this, 0, 0, this.width, this.height);\r\n } catch {\r\n await Promise.reject('Error loading texture');\r\n }\r\n // todo emit complete\r\n this._loadedResolve(this.data);\r\n return this.data;\r\n }\r\n\r\n public asSprite(): Sprite {\r\n return this._sprite;\r\n }\r\n}\r\n","export type Constructor<T> = {\r\n new (...args: any[]): T;\r\n};\r\n/**\r\n * Configurable helper extends base type and makes all properties available as option bag arguments\r\n * @internal\r\n * @param base\r\n */\r\nexport function Configurable<T extends Constructor<{}>>(base: T): T {\r\n return class extends base {\r\n public assign(props: Partial<T>) {\r\n //set the value of every property that was passed in,\r\n //if the constructor previously set this value, it will be overridden here\r\n for (const k in props) {\r\n // eslint-disable-next-line\r\n if (typeof (<any>this)[k] !== 'function') {\r\n // eslint-disable-next-line\r\n (<any>this)[k] = (<any>props)[k];\r\n }\r\n }\r\n }\r\n\r\n constructor(...args: any[]) {\r\n super(...args);\r\n //get the number of arguments that aren't undefined. TS passes a value to all parameters\r\n //of whatever ctor is the implementation, so args.length doesn't work here.\r\n const size = args.filter(function(value) {\r\n return value !== undefined;\r\n }).length;\r\n if (size === 1 && args[0] && typeof args[0] === 'object' && !(args[0] instanceof Array)) {\r\n this.assign(args[0]);\r\n }\r\n }\r\n };\r\n}\r\n","import * as Effects from './SpriteEffects';\r\nimport { Color } from '../Color';\r\n\r\nimport { Drawable, DrawOptions } from '../Interfaces/Drawable';\r\nimport { Texture } from './Texture';\r\nimport { Vector } from '../Math/vector';\r\nimport { Logger } from '../Util/Log';\r\nimport { clamp } from '../Util/Util';\r\nimport { Configurable } from '../Configurable';\r\nimport { obsolete } from '../Util/Decorators';\r\n\r\n/**\r\n * @hidden\r\n * @deprecated Use [[Sprite]]\r\n */\r\nexport class SpriteImpl implements Drawable {\r\n public texture: Texture;\r\n\r\n public x: number = 0;\r\n public y: number = 0;\r\n\r\n public get drawWidth(): number {\r\n return Math.abs(this.width * this.scale.x);\r\n }\r\n\r\n public get drawHeight(): number {\r\n return Math.abs(this.height * this.scale.y);\r\n }\r\n\r\n public rotation: number = 0.0;\r\n public anchor: Vector = Vector.Half;\r\n public offset: Vector = Vector.Zero;\r\n public scale: Vector = Vector.One;\r\n /**\r\n * Default: false, should the sprite be drawn around the anchor or from the top left.\r\n * Sprite rotations/scaling still happen around the anchor regardless of this setting.\r\n */\r\n public drawAroundAnchor = false;\r\n\r\n public logger: Logger = Logger.getInstance();\r\n\r\n /**\r\n * Draws the sprite flipped vertically\r\n */\r\n public flipVertical: boolean = false;\r\n\r\n /**\r\n * Draws the sprite flipped horizontally\r\n */\r\n public flipHorizontal: boolean = false;\r\n\r\n public effects: Effects.SpriteEffect[] = [];\r\n\r\n public width: number = 0;\r\n public height: number = 0;\r\n\r\n private _spriteCanvas: HTMLCanvasElement = null;\r\n private _spriteCtx: CanvasRenderingContext2D = null;\r\n private _pixelData: ImageData = null;\r\n private _pixelsLoaded: boolean = false;\r\n private _dirtyEffect: boolean = true;\r\n\r\n /**\r\n * @param imageOrConfig The backing image texture to build the Sprite, or Sprite option bag\r\n * @param x The x position of the sprite\r\n * @param y The y position of the sprite\r\n * @param width The width of the sprite in pixels\r\n * @param height The height of the sprite in pixels\r\n */\r\n constructor(imageOrConfig: Texture | SpriteArgs, x: number, y: number, width: number, height: number) {\r\n let image = imageOrConfig;\r\n if (imageOrConfig && !(imageOrConfig instanceof Texture)) {\r\n x = imageOrConfig.x | 0;\r\n y = imageOrConfig.y | 0;\r\n width = imageOrConfig.width | 0;\r\n height = imageOrConfig.height | 0;\r\n image = imageOrConfig.image;\r\n if (!image) {\r\n const message = 'An image texture is required to construct a sprite';\r\n throw new Error(message);\r\n }\r\n }\r\n\r\n this.x = x || 0;\r\n this.y = y || 0;\r\n\r\n this.texture = image as Texture;\r\n this._spriteCanvas = document.createElement('canvas');\r\n this._spriteCanvas.width = width;\r\n this._spriteCanvas.height = height;\r\n this._spriteCtx = this._spriteCanvas.getContext('2d');\r\n this._initPixelsFromTexture();\r\n\r\n this.width = width;\r\n this.height = height;\r\n }\r\n\r\n private async _initPixelsFromTexture() {\r\n try {\r\n const image = await this.texture.loaded;\r\n this.width = this.width || image.naturalWidth;\r\n this.height = this.height || image.naturalHeight;\r\n this._spriteCanvas.width = this._spriteCanvas.width || image.naturalWidth;\r\n this._spriteCanvas.height = this._spriteCanvas.height || image.naturalHeight;\r\n this._loadPixels();\r\n this._dirtyEffect = true;\r\n } catch (e) {\r\n this.logger.error('Error loading texture ', this.texture.path, e);\r\n }\r\n }\r\n\r\n private _loadPixels() {\r\n if (this.texture.isLoaded() && !this._pixelsLoaded) {\r\n const naturalWidth = this.texture.image.naturalWidth || 0;\r\n const naturalHeight = this.texture.image.naturalHeight || 0;\r\n\r\n if (this.width > naturalWidth) {\r\n this.logger.warn(`The sprite width ${this.width} exceeds the width \r\n ${naturalWidth} of the backing texture ${this.texture.path}`);\r\n }\r\n\r\n if (this.width <= 0 || naturalWidth <= 0) {\r\n throw new Error(`The width of a sprite cannot be 0 or negative, sprite width: ${this.width}, original width: ${naturalWidth}`);\r\n }\r\n\r\n if (this.height > naturalHeight) {\r\n this.logger.warn(`The sprite height ${this.height} exceeds the height \r\n ${naturalHeight} of the backing texture ${this.texture.path}`);\r\n }\r\n\r\n if (this.height <= 0 || naturalHeight <= 0) {\r\n throw new Error(`The height of a sprite cannot be 0 or negative, sprite height: ${this.height}, original height: ${naturalHeight}`);\r\n }\r\n\r\n this._flushTexture();\r\n\r\n this._pixelsLoaded = true;\r\n }\r\n }\r\n\r\n private _flushTexture() {\r\n const naturalWidth = this.texture.image.naturalWidth || 0;\r\n const naturalHeight = this.texture.image.naturalHeight || 0;\r\n\r\n this._spriteCtx.clearRect(0, 0, this.width, this.height);\r\n this._spriteCtx.drawImage(\r\n this.texture.image,\r\n clamp(this.x, 0, naturalWidth),\r\n clamp(this.y, 0, naturalHeight),\r\n clamp(this.width, 0, naturalWidth),\r\n clamp(this.height, 0, naturalHeight),\r\n 0,\r\n 0,\r\n this.width,\r\n this.height\r\n );\r\n }\r\n\r\n private _opacity: number = 1;\r\n /**\r\n * Applies the [[Opacity]] effect to a sprite, setting the alpha of all pixels to a given value\r\n */\r\n public opacity(value: number) {\r\n this._opacity = value;\r\n }\r\n\r\n /**\r\n * Applies the [[Grayscale]] effect to a sprite, removing color information.\r\n */\r\n public grayscale() {\r\n this.addEffect(new Effects.Grayscale());\r\n }\r\n\r\n /**\r\n * Applies the [[Invert]] effect to a sprite, inverting the pixel colors.\r\n */\r\n public invert() {\r\n this.addEffect(new Effects.Invert());\r\n }\r\n\r\n /**\r\n * Applies the [[Fill]] effect to a sprite, changing the color channels of all non-transparent pixels to match a given color\r\n */\r\n public fill(color: Color) {\r\n this.addEffect(new Effects.Fill(color));\r\n }\r\n\r\n /**\r\n * Applies the [[Colorize]] effect to a sprite, changing the color channels of all pixels to be the average of the original color\r\n * and the provided color.\r\n */\r\n public colorize(color: Color) {\r\n this.addEffect(new Effects.Colorize(color));\r\n }\r\n\r\n /**\r\n * Applies the [[Lighten]] effect to a sprite, changes the lightness of the color according to HSL\r\n */\r\n public lighten(factor: number = 0.1) {\r\n this.addEffect(new Effects.Lighten(factor));\r\n }\r\n\r\n /**\r\n * Applies the [[Darken]] effect to a sprite, changes the darkness of the color according to HSL\r\n */\r\n public darken(factor: number = 0.1) {\r\n this.addEffect(new Effects.Darken(factor));\r\n }\r\n\r\n /**\r\n * Applies the [[Saturate]] effect to a sprite, saturates the color according to HSL\r\n */\r\n public saturate(factor: number = 0.1) {\r\n this.addEffect(new Effects.Saturate(factor));\r\n }\r\n\r\n /**\r\n * Applies the [[Desaturate]] effect to a sprite, desaturates the color according to HSL\r\n */\r\n public desaturate(factor: number = 0.1) {\r\n this.addEffect(new Effects.Desaturate(factor));\r\n }\r\n\r\n /**\r\n * Adds a new [[SpriteEffect]] to this drawing.\r\n * @param effect Effect to add to the this drawing\r\n */\r\n public addEffect(effect: Effects.SpriteEffect) {\r\n this.effects.push(effect);\r\n // We must check if the texture and the backing sprite pixels are loaded as well before\r\n // an effect can be applied\r\n if (!this.texture.isLoaded() || !this._pixelsLoaded) {\r\n this._dirtyEffect = true;\r\n } else {\r\n this._applyEffects();\r\n }\r\n }\r\n\r\n /**\r\n * Removes a [[SpriteEffect]] from this sprite.\r\n * @param effect Effect to remove from this sprite\r\n */\r\n public removeEffect(effect: Effects.SpriteEffect): void;\r\n\r\n /**\r\n * Removes an effect given the index from this sprite.\r\n * @param index Index of the effect to remove from this sprite\r\n */\r\n public removeEffect(index: number): void;\r\n public removeEffect(param: any) {\r\n let indexToRemove = -1;\r\n if (typeof param === 'number') {\r\n indexToRemove = param;\r\n } else {\r\n indexToRemove = this.effects.indexOf(param);\r\n }\r\n\r\n // bounds check\r\n if (indexToRemove < 0 || indexToRemove >= this.effects.length) {\r\n return;\r\n }\r\n\r\n this.effects.splice(indexToRemove, 1);\r\n\r\n // We must check if the texture and the backing sprite pixels are loaded as well before\r\n // an effect can be applied\r\n if (!this.texture.isLoaded() || !this._pixelsLoaded) {\r\n this._dirtyEffect = true;\r\n } else {\r\n this._applyEffects();\r\n }\r\n }\r\n\r\n private _applyEffects() {\r\n this._flushTexture();\r\n\r\n if (this.effects.length > 0) {\r\n this._pixelData = this._spriteCtx.getImageData(0, 0, this.width, this.height);\r\n\r\n const len = this.effects.length;\r\n for (let i = 0; i < len; i++) {\r\n for (let y = 0; y < this.height; y++) {\r\n for (let x = 0; x < this.width; x++) {\r\n this.effects[i].updatePixel(x, y, this._pixelData);\r\n }\r\n }\r\n }\r\n this._spriteCtx.clearRect(0, 0, this.width, this.height);\r\n this._spriteCtx.putImageData(this._pixelData, 0, 0);\r\n }\r\n\r\n this._dirtyEffect = false;\r\n }\r\n\r\n /**\r\n * Clears all effects from the drawing and return it to its original state.\r\n */\r\n public clearEffects() {\r\n this.effects.length = 0;\r\n this._applyEffects();\r\n }\r\n\r\n /**\r\n * Resets the internal state of the drawing (if any)\r\n */\r\n public reset() {\r\n // do nothing\r\n }\r\n\r\n public debugDraw(ctx: CanvasRenderingContext2D, x: number, y: number) {\r\n ctx.save();\r\n ctx.translate(x, y);\r\n ctx.rotate(this.rotation);\r\n const xpoint = this.drawWidth * this.anchor.x;\r\n const ypoint = this.drawHeight * this.anchor.y;\r\n\r\n ctx.strokeStyle = Color.Black.toString();\r\n ctx.strokeRect(-xpoint, -ypoint, this.drawWidth, this.drawHeight);\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * Draws the sprite appropriately to the 2D rendering context, at an x and y coordinate.\r\n * @param ctx The 2D rendering context\r\n * @param x The x coordinate of where to draw\r\n * @param y The y coordinate of where to draw\r\n */\r\n public draw(ctx: CanvasRenderingContext2D, x: number, y: number): void;\r\n /**\r\n * Draws the sprite with custom options to override internals without mutating them.\r\n * @param options\r\n */\r\n public draw(options: DrawOptions): void;\r\n public draw(ctxOrOptions: CanvasRenderingContext2D | DrawOptions, x?: number, y?: number): void {\r\n if (ctxOrOptions instanceof CanvasRenderingContext2D) {\r\n this._drawWithOptions({ ctx: ctxOrOptions, x, y });\r\n } else {\r\n this._drawWithOptions(ctxOrOptions);\r\n }\r\n }\r\n\r\n private _drawWithOptions(options: DrawOptions) {\r\n const { ctx, x, y, rotation, drawWidth, drawHeight, anchor, offset, opacity, flipHorizontal, flipVertical } = {\r\n ...options,\r\n rotation: options.rotation ?? this.rotation,\r\n drawWidth: options.drawWidth ?? this.width,\r\n drawHeight: options.drawHeight ?? this.height,\r\n flipHorizontal: options.flipHorizontal ?? this.flipHorizontal,\r\n flipVertical: options.flipVertical ?? this.flipVertical,\r\n anchor: options.anchor ?? this.anchor,\r\n offset: options.offset ?? this.offset,\r\n opacity: (options.opacity ?? 1) * (this._opacity ?? 1)\r\n };\r\n\r\n if (this._dirtyEffect) {\r\n this._applyEffects();\r\n }\r\n // calculating current dimensions\r\n const anchorX = drawWidth * anchor.x + offset.x;\r\n const anchorY = drawHeight * anchor.y + offset.y;\r\n const scaleDirX = this.scale.x > 0 ? 1 : -1;\r\n const scaleDirY = this.scale.y > 0 ? 1 : -1;\r\n\r\n ctx.save();\r\n // Move the draw point of origin\r\n ctx.translate(x, y);\r\n\r\n // Rotate and scale around anchor point\r\n // This requires a bit of explaination, scale coordinates first positive flipping or rotating\r\n ctx.scale(Math.abs(this.scale.x), Math.abs(this.scale.y));\r\n\r\n if (this.drawAroundAnchor) {\r\n // In the case where you want the anchor to match with the point of draw\r\n // Otherwise sprites are always drawn from top-left\r\n ctx.translate(-anchorX, -anchorY);\r\n }\r\n\r\n ctx.translate(anchorX, anchorY);\r\n ctx.rotate(rotation);\r\n // This is for handling direction changes 1 or -1, that way we don't have mismatched translates()\r\n ctx.scale(scaleDirX, scaleDirY);\r\n ctx.translate(-anchorX, -anchorY);\r\n\r\n if (flipHorizontal) {\r\n ctx.translate(drawWidth, 0);\r\n ctx.scale(-1, 1);\r\n }\r\n\r\n if (flipVertical) {\r\n ctx.translate(0, drawHeight);\r\n ctx.scale(1, -1);\r\n }\r\n const oldAlpha = ctx.globalAlpha;\r\n ctx.globalAlpha = opacity;\r\n // Context is already rotated and scaled\r\n ctx.drawImage(\r\n this._spriteCanvas,\r\n 0,\r\n 0,\r\n this.width,\r\n this.height, // source\r\n 0,\r\n 0,\r\n this.width,\r\n this.height\r\n ); // dest\r\n ctx.globalAlpha = oldAlpha;\r\n ctx.restore();\r\n }\r\n\r\n /**\r\n * Produces a copy of the current sprite\r\n */\r\n public clone(): SpriteImpl {\r\n const result = new Sprite(this.texture, this.x, this.y, this.width, this.height);\r\n result.anchor = this.anchor.clone();\r\n result.scale = this.scale.clone();\r\n result.rotation = this.rotation;\r\n result.flipHorizontal = this.flipHorizontal;\r\n result.flipVertical = this.flipVertical;\r\n\r\n const len = this.effects.length;\r\n for (let i = 0; i < len; i++) {\r\n result.addEffect(this.effects[i]);\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * @deprecated Use [[Sprite]]\r\n */\r\nexport interface SpriteArgs extends Partial<SpriteImpl> {\r\n image?: Texture;\r\n x?: number;\r\n width?: number;\r\n height?: number;\r\n rotation?: number;\r\n anchor?: Vector;\r\n scale?: Vector;\r\n flipVertical?: boolean;\r\n flipHorizontal?: boolean;\r\n}\r\n\r\n/**\r\n * A [[LegacyDrawing.Sprite]] is one of the main drawing primitives. It is responsible for drawing\r\n * images or parts of images from a [[LegacyDrawing.Texture]] resource to the screen.\r\n * @deprecated Use [[Sprite]]\r\n */\r\n@obsolete({\r\n message: 'Label.clearTextShadow will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.shadow'\r\n})\r\nexport class Sprite extends Configurable(SpriteImpl) {\r\n constructor(config: SpriteArgs);\r\n constructor(image: Texture, x: number, y: number, width: number, height: number);\r\n constructor(imageOrConfig: Texture | SpriteArgs, x?: number, y?: number, width?: number, height?: number) {\r\n super(imageOrConfig, x, y, width, height);\r\n }\r\n}\r\n","import { Graphic, GraphicOptions } from './Graphic';\r\nimport { ImageSource } from './ImageSource';\r\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\r\n\r\nimport { Sprite as LegacySprite } from '../Drawing/Sprite';\r\nimport { Texture } from '../Drawing/Texture';\r\n\r\nexport type SourceView = { x: number; y: number; width: number; height: number };\r\nexport type DestinationSize = { width: number; height: number };\r\n\r\nexport interface SpriteOptions {\r\n /**\r\n * Image to create a sprite from\r\n */\r\n image: ImageSource;\r\n /**\r\n * By default the source is the entire dimension of the [[ImageSource]]\r\n */\r\n sourceView?: { x: number; y: number; width: number; height: number };\r\n /**\r\n * By default the size of the final sprite is the size of the [[ImageSource]]\r\n */\r\n destSize?: { width: number; height: number };\r\n}\r\n\r\nexport class Sprite extends Graphic {\r\n public image: ImageSource;\r\n public sourceView: SourceView;\r\n public destSize: DestinationSize;\r\n\r\n public static from(image: ImageSource): Sprite {\r\n return new Sprite({\r\n image: image\r\n });\r\n }\r\n\r\n constructor(options: GraphicOptions & SpriteOptions) {\r\n super(options);\r\n this.image = options.image;\r\n const { width, height } = options;\r\n this.sourceView = options.sourceView ?? { x: 0, y: 0, width: width ?? 0, height: height ?? 0 };\r\n this.destSize = options.destSize ?? { width: width ?? 0, height: height ?? 0 };\r\n this._updateSpriteDimensions();\r\n this.image.ready.then(() => {\r\n this._updateSpriteDimensions();\r\n });\r\n }\r\n\r\n private _updateSpriteDimensions() {\r\n const { width: nativeWidth, height: nativeHeight } = this.image;\r\n // This code uses || to avoid 0's\r\n // If the source is not specified, use the native dimension\r\n this.sourceView.width = this.sourceView?.width || nativeWidth;\r\n this.sourceView.height = this.sourceView?.height || nativeHeight;\r\n\r\n // If the destination is not specified, use the source if specified, then native\r\n this.destSize.width = this.destSize?.width || this.sourceView?.width || nativeWidth;\r\n this.destSize.height = this.destSize?.height || this.sourceView?.height || nativeHeight;\r\n\r\n this.width = Math.ceil(this.destSize.width);\r\n this.height = Math.ceil(this.destSize.height);\r\n }\r\n\r\n protected _preDraw(ex: ExcaliburGraphicsContext, x: number, y: number): void {\r\n if (this.image.isLoaded()) {\r\n this._updateSpriteDimensions();\r\n }\r\n super._preDraw(ex, x, y);\r\n }\r\n\r\n public _drawImage(ex: ExcaliburGraphicsContext, x: number, y: number): void {\r\n if (this.image.isLoaded()) {\r\n this._updateSpriteDimensions();\r\n ex.drawImage(\r\n this.image.image,\r\n this.sourceView.x,\r\n this.sourceView.y,\r\n this.sourceView.width,\r\n this.sourceView.height,\r\n x,\r\n y,\r\n this.destSize.width,\r\n this.destSize.height\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Create a ImageSource from legacy texture\r\n * @param sprite\r\n */\r\n public static fromLegacySprite(sprite: LegacySprite): Sprite {\r\n const tex = sprite.texture;\r\n const image = ImageSource.fromLegacyTexture(tex);\r\n return new Sprite({\r\n image,\r\n sourceView: {\r\n x: sprite.x,\r\n y: sprite.y,\r\n width: sprite.width,\r\n height: sprite.height\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Converts a sprite to a Legacy sprite\r\n * @deprecated\r\n * @param sprite\r\n * @returns LegacyDrawing.Sprite\r\n */\r\n public static toLegacySprite(sprite: Sprite): LegacySprite {\r\n const image = sprite.image;\r\n const tex = new Texture(image.path);\r\n tex.data = image.image;\r\n\r\n return new LegacySprite(tex, sprite.sourceView.x, sprite.sourceView.y, sprite.sourceView.width, sprite.sourceView.height);\r\n }\r\n\r\n public clone(): Sprite {\r\n return new Sprite({\r\n image: this.image,\r\n sourceView: { ...this.sourceView },\r\n destSize: { ...this.destSize },\r\n ...this.cloneGraphicOptions()\r\n });\r\n }\r\n}\r\n","import { Resource } from '../Resources/Resource';\r\nimport { Texture } from '../Drawing/Texture';\r\nimport { Sprite } from './Sprite';\r\nimport { Loadable } from '../Interfaces/Index';\r\nimport { Logger } from '../Util/Log';\r\n\r\nexport class ImageSource implements Loadable<HTMLImageElement> {\r\n private _logger = Logger.getInstance();\r\n private _resource: Resource<Blob>;\r\n\r\n /**\r\n * The original size of the source image in pixels\r\n */\r\n public get width() {\r\n return this.image.naturalWidth;\r\n }\r\n\r\n /**\r\n * The original height of the source image in pixels\r\n */\r\n public get height() {\r\n return this.image.naturalHeight;\r\n }\r\n\r\n /**\r\n * Returns true if the Texture is completely loaded and is ready\r\n * to be drawn.\r\n */\r\n public isLoaded(): boolean {\r\n return !!this.data.src;\r\n }\r\n\r\n /**\r\n * Access to the underlying html image elmeent\r\n */\r\n public data: HTMLImageElement = new Image();\r\n public get image(): HTMLImageElement {\r\n return this.data;\r\n }\r\n\r\n /**\r\n * Promise the resolves when the image is loaded and ready for use, does not initiate loading\r\n */\r\n public ready: Promise<HTMLImageElement>;\r\n private _loadedResolve: (value?: HTMLImageElement | PromiseLike<HTMLImageElement>) => void;\r\n\r\n /**\r\n * The path to the image, can also be a data url like 'data:image/'\r\n * @param path\r\n */\r\n constructor(public readonly path: string, bustCache: boolean = false) {\r\n this._resource = new Resource(path, 'blob', bustCache);\r\n if (path.endsWith('.svg') || path.endsWith('.gif')) {\r\n this._logger.warn(`Image type is not fully supported, you may have mixed results ${path}. Fully supported: jpg, bmp, and png`);\r\n }\r\n this.ready = new Promise<HTMLImageElement>((resolve) => {\r\n this._loadedResolve = resolve;\r\n });\r\n }\r\n\r\n /**\r\n * Begins loading the image and returns a promise that resolves when the image is loaded\r\n */\r\n async load(): Promise<HTMLImageElement> {\r\n if (this.isLoaded()) {\r\n return this.data;\r\n }\r\n try {\r\n // Load base64 or blob if needed\r\n let url: string;\r\n if (!this.path.includes('data:image/')) {\r\n const blob = await this._resource.load();\r\n url = URL.createObjectURL(blob);\r\n } else {\r\n url = this.path;\r\n }\r\n\r\n // Decode the image\r\n const image = new Image();\r\n image.src = url;\r\n await image.decode();\r\n\r\n // Set results\r\n this.data = image;\r\n } catch (error) {\r\n throw `Error loading ImageSource from path '${this.path}' with error [${error.message}]`;\r\n }\r\n // todo emit complete\r\n this._loadedResolve(this.data);\r\n return this.data;\r\n }\r\n\r\n /**\r\n * Build a sprite from this ImageSource\r\n */\r\n public toSprite(): Sprite {\r\n return Sprite.from(this);\r\n }\r\n\r\n /**\r\n * Create a ImageSource from legacy texture\r\n * @param tex\r\n */\r\n public static fromLegacyTexture(tex: Texture): ImageSource {\r\n const image = new ImageSource(tex.path);\r\n if (tex.isLoaded()) {\r\n image.data = tex.data;\r\n } else {\r\n tex.loaded.then(() => {\r\n image.data = tex.data;\r\n });\r\n }\r\n return image;\r\n }\r\n\r\n /**\r\n * Unload images from memory\r\n */\r\n unload(): void {\r\n this.data = new Image();\r\n }\r\n}\r\n","import { Sprite } from './Sprite';\r\nimport * as Effects from './SpriteEffects';\r\nimport { Color } from '../Color';\r\n\r\nimport { Drawable, DrawOptions } from '../Interfaces/Drawable';\r\nimport { Vector } from '../Math/vector';\r\nimport { Engine } from '../Engine';\r\nimport * as Util from '../Util/Util';\r\nimport { Configurable } from '../Configurable';\r\nimport { obsolete } from '../Util/Decorators';\r\n\r\n/**\r\n * @deprecated Use [[HasTick]]\r\n */\r\nexport interface HasTick {\r\n /**\r\n *\r\n * @param elapsedMilliseconds The amount of real world time in milliseconds that has elapsed that must be updated in the animation\r\n */\r\n tick(elapsedMilliseconds: number, idempotencyToken?: number): void;\r\n}\r\n\r\n/**\r\n * @hidden\r\n * @deprecated Use [[Animation]]\r\n */\r\nexport class AnimationImpl implements Drawable, HasTick {\r\n /**\r\n * The sprite frames to play, in order. See [[SpriteSheet.getAnimationForAll]] to quickly\r\n * generate an [[Animation]].\r\n */\r\n public sprites: Sprite[] = [];\r\n\r\n /**\r\n * Duration to show each frame (in milliseconds)\r\n */\r\n public speed: number;\r\n\r\n /**\r\n * Current frame index being shown\r\n */\r\n public currentFrame: number = 0;\r\n\r\n private _timeLeftInFrame: number = 0;\r\n private _idempotencyToken: number = -1;\r\n\r\n public anchor: Vector = Vector.Zero;\r\n public rotation: number = 0.0;\r\n public scale: Vector = Vector.One;\r\n\r\n /**\r\n * Indicates whether the animation should loop after it is completed\r\n */\r\n public loop: boolean = true;\r\n\r\n /**\r\n * Indicates the frame index the animation should freeze on for a non-looping\r\n * animation. By default it is the last frame.\r\n */\r\n public freezeFrame: number = -1;\r\n\r\n private _engine: Engine;\r\n\r\n /**\r\n * Flip each frame vertically. Sets [[Sprite.flipVertical]].\r\n */\r\n public flipVertical: boolean = false;\r\n\r\n /**\r\n * Flip each frame horizontally. Sets [[Sprite.flipHorizontal]].\r\n */\r\n public flipHorizontal: boolean = false;\r\n\r\n public drawWidth: number = 0;\r\n public drawHeight: number = 0;\r\n public width: number = 0;\r\n public height: number = 0;\r\n\r\n private _opacity = 1;\r\n\r\n /**\r\n * Typically you will use a [[SpriteSheet]] to generate an [[Animation]].\r\n *\r\n * @param engineOrConfig Reference to the current game engine\r\n * @param sprites An array of sprites to create the frames for the animation\r\n * @param speed The number in milliseconds to display each frame in the animation\r\n * @param loop Indicates whether the animation should loop after it is completed\r\n */\r\n constructor(engineOrConfig: Engine | AnimationArgs, sprites: Sprite[], speed: number, loop?: boolean) {\r\n let engine = engineOrConfig;\r\n if (engineOrConfig && !(engineOrConfig instanceof Engine)) {\r\n const config = engineOrConfig;\r\n engine = config.engine;\r\n sprites = config.sprites;\r\n speed = config.speed;\r\n loop = config.loop;\r\n }\r\n\r\n this.sprites = sprites;\r\n this.speed = speed;\r\n this._engine = <Engine>engine;\r\n this._timeLeftInFrame = this.speed;\r\n\r\n if (loop != null) {\r\n this.loop = loop;\r\n }\r\n\r\n if (sprites && sprites[0]) {\r\n this.drawHeight = sprites[0] ? sprites[0].drawHeight : 0;\r\n this.drawWidth = sprites[0] ? sprites[0].drawWidth : 0;\r\n\r\n this.width = sprites[0] ? sprites[0].width : 0;\r\n this.height = sprites[0] ? sprites[0].height : 0;\r\n\r\n this.freezeFrame = sprites.length - 1;\r\n }\r\n }\r\n\r\n /**\r\n * Applies the opacity effect to a sprite, setting the alpha of all pixels to a given value\r\n */\r\n public opacity(value: number) {\r\n this._opacity = value;\r\n }\r\n\r\n /**\r\n * Applies the grayscale effect to a sprite, removing color information.\r\n */\r\n public grayscale() {\r\n this.addEffect(new Effects.Grayscale());\r\n }\r\n\r\n /**\r\n * Applies the invert effect to a sprite, inverting the pixel colors.\r\n */\r\n public invert() {\r\n this.addEffect(new Effects.Invert());\r\n }\r\n\r\n /**\r\n * Applies the fill effect to a sprite, changing the color channels of all non-transparent pixels to match a given color\r\n */\r\n public fill(color: Color) {\r\n this.addEffect(new Effects.Fill(color));\r\n }\r\n\r\n /**\r\n * Applies the colorize effect to a sprite, changing the color channels of all pixels to be the average of the original color and the\r\n * provided color.\r\n */\r\n public colorize(color: Color) {\r\n this.addEffect(new Effects.Colorize(color));\r\n }\r\n\r\n /**\r\n * Applies the lighten effect to a sprite, changes the lightness of the color according to hsl\r\n */\r\n public lighten(factor: number = 0.1) {\r\n this.addEffect(new Effects.Lighten(factor));\r\n }\r\n\r\n /**\r\n * Applies the darken effect to a sprite, changes the darkness of the color according to hsl\r\n */\r\n public darken(factor: number = 0.1) {\r\n this.addEffect(new Effects.Darken(factor));\r\n }\r\n\r\n /**\r\n * Applies the saturate effect to a sprite, saturates the color according to hsl\r\n */\r\n public saturate(factor: number = 0.1) {\r\n this.addEffect(new Effects.Saturate(factor));\r\n }\r\n\r\n /**\r\n * Applies the desaturate effect to a sprite, desaturates the color according to hsl\r\n */\r\n public desaturate(factor: number = 0.1) {\r\n this.addEffect(new Effects.Desaturate(factor));\r\n }\r\n\r\n /**\r\n * Add a [[SpriteEffect]] manually\r\n */\r\n public addEffect(effect: Effects.SpriteEffect) {\r\n for (const i in this.sprites) {\r\n this.sprites[i].addEffect(effect);\r\n }\r\n }\r\n\r\n /**\r\n * Removes an [[SpriteEffect]] from this animation.\r\n * @param effect Effect to remove from this animation\r\n */\r\n public removeEffect(effect: Effects.SpriteEffect): void;\r\n\r\n /**\r\n * Removes an effect given the index from this animation.\r\n * @param index Index of the effect to remove from this animation\r\n */\r\n public removeEffect(index: number): void;\r\n public removeEffect(param: any) {\r\n for (const i in this.sprites) {\r\n this.sprites[i].removeEffect(param);\r\n }\r\n }\r\n\r\n /**\r\n * Clear all sprite effects\r\n */\r\n public clearEffects() {\r\n for (const i in this.sprites) {\r\n this.sprites[i].clearEffects();\r\n }\r\n }\r\n\r\n private _setAnchor(point: Vector) {\r\n //if (!this.anchor.equals(point)) {\r\n for (const i in this.sprites) {\r\n this.sprites[i].anchor.setTo(point.x, point.y);\r\n }\r\n //}\r\n }\r\n\r\n private _setRotation(radians: number) {\r\n //if (this.rotation !== radians) {\r\n for (const i in this.sprites) {\r\n this.sprites[i].rotation = radians;\r\n }\r\n //}\r\n }\r\n\r\n private _setScale(scale: Vector) {\r\n //if (!this.scale.equals(scale)) {\r\n for (const i in this.sprites) {\r\n this.sprites[i].scale = scale;\r\n }\r\n //}\r\n }\r\n\r\n /**\r\n * Resets the animation to first frame.\r\n */\r\n public reset() {\r\n this.currentFrame = 0;\r\n }\r\n\r\n /**\r\n * Indicates whether the animation is complete, animations that loop are never complete.\r\n */\r\n public isDone() {\r\n return !this.loop && this.currentFrame >= this.sprites.length;\r\n }\r\n\r\n /**\r\n * Not meant to be called by game developers. Ticks the animation forward internally and\r\n * calculates whether to change to the frame.\r\n * @internal\r\n */\r\n public tick(elapsed: number, idempotencyToken?: number) {\r\n if (this._idempotencyToken === idempotencyToken) {\r\n return;\r\n }\r\n this._idempotencyToken = idempotencyToken;\r\n this._timeLeftInFrame -= elapsed;\r\n if (this._timeLeftInFrame <= 0) {\r\n this.currentFrame = this.loop ? (this.currentFrame + 1) % this.sprites.length : this.currentFrame + 1;\r\n this._timeLeftInFrame = this.speed;\r\n }\r\n\r\n this._updateValues();\r\n const current = this.sprites[this.currentFrame];\r\n if (current) {\r\n this.width = current.width;\r\n this.height = current.height;\r\n this.drawWidth = current.drawWidth;\r\n this.drawHeight = current.drawHeight;\r\n }\r\n }\r\n\r\n private _updateValues(): void {\r\n this._setAnchor(this.anchor);\r\n this._setRotation(this.rotation);\r\n this._setScale(this.scale);\r\n }\r\n\r\n /**\r\n * Skips ahead a specified number of frames in the animation\r\n * @param frames Frames to skip ahead\r\n */\r\n public skip(frames: number) {\r\n this.currentFrame = (this.currentFrame + frames) % this.sprites.length;\r\n }\r\n\r\n /**\r\n * Draws the animation appropriately to the 2D rendering context, at an x and y coordinate.\r\n * @param ctx The 2D rendering context\r\n * @param x The x coordinate of where to draw\r\n * @param y The y coordinate of where to draw\r\n */\r\n public draw(ctx: CanvasRenderingContext2D, x: number, y: number): void;\r\n /**\r\n * Draws the animation with custom options to override internals without mutating them.\r\n * @param options\r\n */\r\n public draw(options: DrawOptions): void;\r\n public draw(ctxOrOptions: CanvasRenderingContext2D | DrawOptions, x?: number, y?: number) {\r\n if (ctxOrOptions instanceof CanvasRenderingContext2D) {\r\n this._drawWithOptions({ ctx: ctxOrOptions, x, y });\r\n } else {\r\n this._drawWithOptions(ctxOrOptions);\r\n }\r\n }\r\n\r\n private _drawWithOptions(options: DrawOptions) {\r\n const animOptions = {\r\n ...options,\r\n rotation: options.rotation ?? this.rotation,\r\n drawWidth: options.drawWidth ?? this.drawWidth,\r\n drawHeight: options.drawHeight ?? this.drawHeight,\r\n flipHorizontal: options.flipHorizontal ?? this.flipHorizontal,\r\n flipVertical: options.flipVertical ?? this.flipVertical,\r\n anchor: options.anchor ?? this.anchor,\r\n opacity: (options.opacity ?? 1) * (this._opacity ?? 1)\r\n };\r\n\r\n this._updateValues();\r\n let currSprite: Sprite;\r\n if (this.currentFrame < this.sprites.length) {\r\n currSprite = this.sprites[this.currentFrame];\r\n currSprite.draw(animOptions);\r\n }\r\n\r\n if (this.freezeFrame !== -1 && this.currentFrame >= this.sprites.length) {\r\n currSprite = this.sprites[Util.clamp(this.freezeFrame, 0, this.sprites.length - 1)];\r\n currSprite.draw(animOptions);\r\n }\r\n\r\n // add the calculated width\r\n if (currSprite) {\r\n this.drawWidth = currSprite.drawWidth;\r\n this.drawHeight = currSprite.drawHeight;\r\n }\r\n }\r\n\r\n /**\r\n * Plays an animation at an arbitrary location in the game.\r\n * @param x The x position in the game to play\r\n * @param y The y position in the game to play\r\n */\r\n public play(x: number, y: number) {\r\n this.reset();\r\n this._engine.playAnimation(this, x, y);\r\n }\r\n}\r\n\r\n/**\r\n * @deprecated Use [[Animation]]\r\n */\r\nexport interface AnimationArgs extends Partial<AnimationImpl> {\r\n engine: Engine;\r\n sprites: Sprite[];\r\n speed: number;\r\n loop?: boolean;\r\n anchor?: Vector;\r\n rotation?: number;\r\n scale?: Vector;\r\n flipVertical?: boolean;\r\n flipHorizontal?: boolean;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\n/**\r\n * Animations allow you to display a series of images one after another,\r\n * creating the illusion of change. Generally these images will come from a [[SpriteSheet]] source.\r\n * @deprecated Use [[Animation]]\r\n */\r\n@obsolete({\r\n message: 'Animation will be removed in v0.26.0',\r\n alternateMethod: 'Use Graphics.Animation'\r\n})\r\nexport class Animation extends Configurable(AnimationImpl) {\r\n constructor(config: AnimationArgs);\r\n constructor(engine: Engine, images: Sprite[], speed: number, loop?: boolean);\r\n constructor(engineOrConfig: Engine | AnimationArgs, images?: Sprite[], speed?: number, loop?: boolean) {\r\n super(engineOrConfig, images, speed, loop);\r\n }\r\n}\r\n","import { Color } from '../Color';\nimport { Vector } from '../Math/vector';\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\n\n/**\n * Enum representing the different font size units\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-size\n */\nexport enum FontUnit {\n /**\n * Em is a scalable unit, 1 em is equal to the current font size of the current element, parent elements can effect em values\n */\n Em = 'em',\n /**\n * Rem is similar to the Em, it is a scalable unit. 1 rem is equal to the font size of the root element\n */\n Rem = 'rem',\n /**\n * Pixel is a unit of length in screen pixels\n */\n Px = 'px',\n /**\n * Point is a physical unit length (1/72 of an inch)\n */\n Pt = 'pt',\n /**\n * Percent is a scalable unit similar to Em, the only difference is the Em units scale faster when Text-Size stuff\n */\n Percent = '%'\n}\n\n/**\n * Enum representing the different horizontal text alignments\n */\nexport enum TextAlign {\n /**\n * The text is left-aligned.\n */\n Left = 'left',\n /**\n * The text is right-aligned.\n */\n Right = 'right',\n /**\n * The text is centered.\n */\n Center = 'center',\n /**\n * The text is aligned at the normal start of the line (left-aligned for left-to-right locales,\n * right-aligned for right-to-left locales).\n */\n Start = 'start',\n /**\n * The text is aligned at the normal end of the line (right-aligned for left-to-right locales,\n * left-aligned for right-to-left locales).\n */\n End = 'end'\n}\n\n/**\n * Enum representing the different baseline text alignments\n */\nexport enum BaseAlign {\n /**\n * The text baseline is the top of the em square.\n */\n Top = 'top',\n /**\n * The text baseline is the hanging baseline. Currently unsupported; this will act like\n * alphabetic.\n */\n Hanging = 'hanging',\n /**\n * The text baseline is the middle of the em square.\n */\n Middle = 'middle',\n /**\n * The text baseline is the normal alphabetic baseline.\n */\n Alphabetic = 'alphabetic',\n /**\n * The text baseline is the ideographic baseline; this is the bottom of\n * the body of the characters, if the main body of characters protrudes\n * beneath the alphabetic baseline. Currently unsupported; this will\n * act like alphabetic.\n */\n Ideographic = 'ideographic',\n /**\n * The text baseline is the bottom of the bounding box. This differs\n * from the ideographic baseline in that the ideographic baseline\n * doesn't consider descenders.\n */\n Bottom = 'bottom'\n}\n\n/**\n * Enum representing the different possible font styles\n */\nexport enum FontStyle {\n Normal = 'normal',\n Italic = 'italic',\n Oblique = 'oblique'\n}\n\nexport enum Direction {\n LeftToRight = 'ltr',\n RightToLeft = 'rtl'\n}\n\nexport interface FontOptions {\n size?: number;\n unit?: FontUnit;\n lineHeight?: number;\n family?: string;\n style?: FontStyle;\n bold?: boolean;\n textAlign?: TextAlign;\n baseAlign?: BaseAlign;\n direction?: Direction;\n quality?: number;\n shadow?: {\n blur?: number;\n offset?: Vector;\n color?: Color;\n };\n}\n\nexport interface FontRenderer {\n render(ex: ExcaliburGraphicsContext, text: string, x: number, y: number): void;\n}\n","import { Sprite, SpriteArgs } from './Sprite';\nimport { Animation } from './Animation';\nimport { Color } from '../Color';\nimport * as Effects from './SpriteEffects';\n\nimport { Texture } from './Texture';\nimport { Engine } from '../Engine';\nimport { Logger } from '../Util/Log';\nimport { BaseAlign, TextAlign } from '../Graphics/FontCommon';\nimport { obsolete } from '../Util/Decorators';\nimport { vec } from '../Math/vector';\n\nexport interface SpriteSheetArgs {\n image: Texture;\n sprites?: Sprite[];\n spWidth: number;\n spHeight: number;\n rows: number;\n columns: number;\n spacing?: number | SpriteSheetSpacingDimensions;\n}\n\nexport interface SpriteSheetSpacingDimensions {\n top?: number;\n left?: number;\n margin?: number;\n}\n\n/**\n * Sprite sheets are a useful mechanism for slicing up image resources into\n * separate sprites or for generating in game animations. [[Sprite|Sprites]] are organized\n * in row major order in the [[SpriteSheet]].\n * @deprecated Will be removed in v0.26.0\n */\nexport class SpriteSheet {\n private _sprites: Sprite[] = [];\n private _image: Texture | null = null;\n private _columns: number = 0;\n private _rows: number = 0;\n private _spWidth: number = 0;\n private _spHeight: number = 0;\n private _spacing: number | SpriteSheetSpacingDimensions = 0;\n\n /**\n * @param config The configuration of the SpriteSheet\n */\n constructor(config: SpriteSheetArgs);\n\n /**\n * @param sprites The backing sprite array to use, if already available\n */\n constructor(sprites: Sprite[]);\n\n /**\n * @param image The backing image texture to build the SpriteSheet\n * @param columns The number of columns in the image texture\n * @param rows The number of rows in the image texture\n * @param spWidth The width of each individual sprite in pixels\n * @param spHeight The height of each individual sprite in pixels\n * @param spacing The spacing between every sprite in a spritesheet\n */\n constructor(\n image: Texture,\n columns: number,\n rows: number,\n spWidth: number,\n spHeight: number,\n spacing?: number | SpriteSheetSpacingDimensions\n );\n\n /**\n * @param imageOrConfigOrSprites The backing image texture to build the SpriteSheet, option bag, or sprite list\n * @param columns The number of columns in the image texture\n * @param rows The number of rows in the image texture\n * @param spWidth The width of each individual sprite in pixels\n * @param spHeight The height of each individual sprite in pixels\n * @param spacing The spacing between every sprite in a spritesheet\n */\n constructor(\n imageOrConfigOrSprites: Texture | SpriteSheetArgs | Sprite[],\n columns?: number,\n rows?: number,\n spWidth?: number,\n spHeight?: number,\n spacing?: number | SpriteSheetSpacingDimensions\n ) {\n let loadFromImage: boolean = false;\n if (imageOrConfigOrSprites instanceof Array) {\n this._sprites = imageOrConfigOrSprites;\n } else {\n if (imageOrConfigOrSprites && !(imageOrConfigOrSprites instanceof Texture)) {\n this._columns = imageOrConfigOrSprites.columns;\n this._rows = imageOrConfigOrSprites.rows;\n this._spWidth = imageOrConfigOrSprites.spWidth;\n this._spHeight = imageOrConfigOrSprites.spHeight;\n this._image = imageOrConfigOrSprites.image;\n this._spacing = imageOrConfigOrSprites.spacing || 0;\n } else {\n this._image = <Texture>imageOrConfigOrSprites;\n this._columns = columns;\n this._rows = rows;\n this._spWidth = spWidth;\n this._spHeight = spHeight;\n this._spacing = spacing || 0;\n }\n this._sprites = new Array(this._columns * this._rows);\n loadFromImage = true;\n }\n\n // Inspect actual image dimensions with preloading\n if (this.image instanceof Texture) {\n let isWidthError: boolean = false;\n let isHeightError: boolean = false;\n if (this.image.isLoaded()) {\n isWidthError = this.spWidth * this.columns > this.image.image.naturalWidth;\n isHeightError = this.spHeight * this.rows > this.image.image.naturalHeight;\n if (isWidthError) {\n throw new RangeError(\n `SpriteSheet specified is wider, ` +\n `${this.columns} cols x ${this.spWidth} pixels > ${this.image.image.naturalWidth} ` +\n `pixels than image width`\n );\n }\n if (isHeightError) {\n throw new RangeError(\n `SpriteSheet specified is taller, ` +\n `${this.rows} rows x ${this.spHeight} pixels > ${this.image.image.naturalHeight} ` +\n `pixels than image height`\n );\n }\n }\n }\n\n if (loadFromImage) {\n const spacing = this.getSpacingDimensions();\n\n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.columns; col++) {\n this._sprites[col + row * this.columns] = new Sprite(\n this.image,\n col * this.spWidth + spacing.margin * col + spacing.left,\n row * this.spHeight + spacing.margin * row + spacing.top,\n this.spWidth,\n this.spHeight\n );\n }\n }\n }\n }\n\n /**\n * Gets the raw spacing dimensions for the sprites in the sheet, which can be a fixed number or custom dimensions.\n */\n public get spacing() {\n return this._spacing;\n }\n\n /**\n * Get a copy of the backing sprite array\n */\n public get sprites() {\n return [...this._sprites];\n }\n\n /**\n * The backing texture used for the sprite sheet\n */\n public get image() {\n return this._image;\n }\n\n /**\n * The number of columns in the sheet\n */\n public get columns() {\n return this._columns;\n }\n\n /**\n * The number of rows in the sheet\n */\n public get rows() {\n return this._rows;\n }\n\n /**\n * The width of the individual sprites\n */\n public get spWidth() {\n return this._spWidth;\n }\n\n /**\n * The height of the individual sprites\n */\n public get spHeight() {\n return this._spHeight;\n }\n\n /**\n * Gets the calculated spacing dimensions based on whether spacing\n * is a fixed number or has different values for each dimension\n */\n public getSpacingDimensions(): SpriteSheetSpacingDimensions {\n if (typeof this.spacing === 'number') {\n return {\n left: this.spacing,\n top: this.spacing,\n margin: this.spacing\n };\n } else {\n return {\n left: this.spacing.left ?? 0,\n top: this.spacing.top ?? 0,\n margin: this.spacing.margin ?? 0\n };\n }\n }\n\n /**\n * Create an animation from the this SpriteSheet by listing out the\n * sprite indices. Sprites are organized in row major order in the SpriteSheet.\n * @param engine Reference to the current game [[Engine]]\n * @param indices An array of sprite indices to use in the animation\n * @param speed The number in milliseconds to display each frame in the animation\n */\n public getAnimationByIndices(engine: Engine, indices: number[], speed: number) {\n let images: Sprite[] = indices.map((index) => {\n return this.sprites[index];\n });\n\n images = images.map(function (i) {\n return i.clone();\n });\n return new Animation(engine, images, speed);\n }\n\n /**\n * Create an animation from the this SpriteSheet by specifying the range of\n * images with the beginning (inclusive) and ending (exclusive) index\n * For example `getAnimationBetween(engine, 0, 5, 200)` returns an animation with 5 frames.\n * @param engine Reference to the current game Engine\n * @param beginIndex The index to start taking frames (inclusive)\n * @param endIndex The index to stop taking frames (exclusive)\n * @param speed The number in milliseconds to display each frame in the animation\n */\n public getAnimationBetween(engine: Engine, beginIndex: number, endIndex: number, speed: number) {\n let images = this.sprites.slice(beginIndex, endIndex);\n images = images.map(function (i) {\n return i.clone();\n });\n return new Animation(engine, images, speed);\n }\n\n /**\n * Treat the entire SpriteSheet as one animation, organizing the frames in\n * row major order.\n * @param engine Reference to the current game [[Engine]]\n * @param speed The number in milliseconds to display each frame the animation\n */\n public getAnimationForAll(engine: Engine, speed: number) {\n const sprites = this.sprites.map(function (i) {\n return i.clone();\n });\n return new Animation(engine, sprites, speed);\n }\n\n /**\n * Retrieve a specific sprite from the SpriteSheet by its index. Sprites are organized\n * in row major order in the SpriteSheet.\n * @param index The index of the sprite\n */\n public getSprite(index: number): Sprite {\n if (index >= 0 && index < this.sprites.length) {\n return this.sprites[index];\n } else {\n throw new Error('Invalid index: ' + index);\n }\n }\n\n /**\n * Get an animation with bespoke sprite coordinates. This is useful if the SpriteSheet is\n * packed and not a uniform width or height. The resulting [[Animation]] will have the height and width of the\n * largest dimension (width, height) from among the sprite coordinates\n * @param engine\n * @param spriteCoordinates\n * @param speed\n */\n public getAnimationByCoords(engine: Engine, spriteCoordinates: SpriteArgs[], speed: number): Animation {\n let maxWidth: number = 0;\n let maxHeight: number = 0;\n const sprites: Sprite[] = new Array(spriteCoordinates.length);\n for (let i = 0; i < spriteCoordinates.length; i++) {\n const coord = spriteCoordinates[i];\n // no need to pass image again if using a spritesheet\n coord.image = coord.image || this.image;\n maxWidth = Math.max(maxWidth, coord.drawWidth);\n maxHeight = Math.max(maxHeight, coord.drawHeight);\n sprites[i] = new Sprite(coord);\n }\n\n const anim = new Animation(engine, sprites, speed);\n\n anim.drawWidth = maxWidth;\n anim.drawHeight = maxHeight;\n return anim;\n }\n}\n\n/**\n * Specify various font attributes for sprite fonts\n */\nexport interface SpriteFontOptions {\n color?: Color;\n opacity?: number;\n fontSize?: number;\n letterSpacing?: number;\n textAlign?: TextAlign;\n baseAlign?: BaseAlign;\n maxWidth?: number;\n}\n\nexport interface SpriteFontArgs extends SpriteSheetArgs {\n alphabet: string;\n caseInsensitive: boolean;\n}\n\n/**\n * Sprite fonts are a used in conjunction with a [[Label]] to specify\n * a particular bitmap as a font. Note that some font features are not\n * supported by Sprite fonts.\n * @deprecated Will be removed into v0.26.0\n */\n@obsolete({\n message: 'SpriteSheet will be removed in v0.26.0',\n alternateMethod: 'Use Graphics.SpriteSheet'\n})\nexport class SpriteFont extends SpriteSheet {\n private _currentColor: Color = Color.Black;\n private _currentOpacity: Number = 1.0;\n private _spriteRecord: Record<string, Sprite> = {};\n\n // text shadow\n private _textShadowOn: boolean = false;\n private _textShadowDirty: boolean = true;\n private _textShadowColor: Color = Color.Black;\n private _textShadowSprites: { [key: string]: Sprite } = {};\n private _shadowOffsetX: number = 5;\n private _shadowOffsetY: number = 5;\n public readonly alphabet: string;\n public readonly caseInsensitive: boolean;\n\n constructor(config: SpriteFontArgs);\n\n constructor(\n image: Texture,\n alphabet: string,\n caseInsensitive: boolean,\n columns: number,\n rows: number,\n spWidth: number,\n spHeight: number,\n spacing?: number | SpriteSheetSpacingDimensions\n );\n\n /**\n * @param imageOrConfig The backing image texture to build the SpriteFont or the sprite font option bag\n * @param alphabet A string representing all the characters in the image, in row major order.\n * @param caseInsensitive Indicate whether this font takes case into account\n * @param columns The number of columns of characters in the image\n * @param rows The number of rows of characters in the image\n * @param spWidth The width of each character in pixels\n * @param spHeight The height of each character in pixels\n */\n constructor(\n imageOrConfig: Texture | SpriteFontArgs,\n alphabet?: string,\n caseInsensitive?: boolean,\n columns?: number,\n rows?: number,\n spWidth?: number,\n spHeight?: number,\n spacing?: number | SpriteSheetSpacingDimensions\n ) {\n super(\n imageOrConfig instanceof Texture\n ? {\n image: imageOrConfig,\n spWidth: spWidth,\n spHeight: spHeight,\n rows: rows,\n columns: columns,\n spacing: spacing || 0\n }\n : imageOrConfig\n );\n\n if (imageOrConfig && !(imageOrConfig instanceof Texture)) {\n alphabet = imageOrConfig.alphabet;\n caseInsensitive = imageOrConfig.caseInsensitive;\n }\n\n this.alphabet = alphabet;\n this.caseInsensitive = caseInsensitive;\n this._spriteRecord = this.getTextSprites();\n }\n\n /**\n * Returns a dictionary that maps each character in the alphabet to the appropriate [[Sprite]].\n */\n public getTextSprites(): { [key: string]: Sprite } {\n const lookup: { [key: string]: Sprite } = {};\n for (let i = 0; i < this.alphabet.length; i++) {\n let char = this.alphabet[i];\n if (this.caseInsensitive) {\n char = char.toLowerCase();\n }\n lookup[char] = this.sprites[i].clone();\n }\n return lookup;\n }\n\n /**\n * Sets the text shadow for sprite fonts\n * @param offsetX The x offset in pixels to place the shadow\n * @param offsetY The y offset in pixels to place the shadow\n * @param shadowColor The color of the text shadow\n */\n public setTextShadow(offsetX: number, offsetY: number, shadowColor: Color) {\n this._textShadowOn = true;\n this._shadowOffsetX = offsetX;\n this._shadowOffsetY = offsetY;\n this._textShadowColor = shadowColor.clone();\n this._textShadowDirty = true;\n for (const character in this._spriteRecord) {\n this._textShadowSprites[character] = this._spriteRecord[character].clone();\n }\n }\n\n /**\n * Toggles text shadows on or off\n */\n public useTextShadow(on: boolean) {\n this._textShadowOn = on;\n if (on) {\n this.setTextShadow(5, 5, this._textShadowColor);\n }\n }\n\n /**\n * Draws the current sprite font\n */\n public draw(ctx: CanvasRenderingContext2D, text: string, x: number, y: number, options: SpriteFontOptions) {\n options = this._parseOptions(options);\n\n if (this._currentColor.toString() !== options.color.toString() || this._currentOpacity !== options.opacity) {\n this._currentOpacity = options.opacity;\n this._currentColor = options.color;\n for (const char in this._spriteRecord) {\n this._spriteRecord[char].clearEffects();\n this._spriteRecord[char].fill(options.color);\n this._spriteRecord[char].opacity(options.opacity);\n }\n }\n\n if (this._textShadowOn && this._textShadowDirty && this._textShadowColor) {\n for (const characterShadow in this._textShadowSprites) {\n this._textShadowSprites[characterShadow].clearEffects();\n this._textShadowSprites[characterShadow].addEffect(new Effects.Fill(this._textShadowColor.clone()));\n }\n this._textShadowDirty = false;\n }\n\n // find the current length of text in pixels\n const sprite = this.sprites[0];\n\n // find the current height fo the text in pixels\n const height = sprite.height;\n\n // calculate appropriate scale for font size\n const scale = options.fontSize / height;\n\n const length = text.length * sprite.width * scale + text.length * options.letterSpacing;\n\n let currX = x;\n if (options.textAlign === TextAlign.Left || options.textAlign === TextAlign.Start) {\n currX = x;\n } else if (options.textAlign === TextAlign.Right || options.textAlign === TextAlign.End) {\n currX = x - length;\n } else if (options.textAlign === TextAlign.Center) {\n currX = x - length / 2;\n }\n\n let currY = y - height * scale;\n if (options.baseAlign === BaseAlign.Top || options.baseAlign === BaseAlign.Hanging) {\n currY = y;\n } else if (\n options.baseAlign === BaseAlign.Ideographic ||\n options.baseAlign === BaseAlign.Bottom ||\n options.baseAlign === BaseAlign.Alphabetic\n ) {\n currY = y - height * scale;\n } else if (options.baseAlign === BaseAlign.Middle) {\n currY = y - (height * scale) / 2;\n }\n\n for (let i = 0; i < text.length; i++) {\n let character = text[i];\n if (this.caseInsensitive) {\n character = character.toLowerCase();\n }\n try {\n // if text shadow\n if (this._textShadowOn) {\n this._textShadowSprites[character].drawAroundAnchor = false;\n this._textShadowSprites[character].scale = vec(scale, scale);\n this._textShadowSprites[character].draw(ctx, currX + this._shadowOffsetX, currY + this._shadowOffsetY);\n }\n\n const charSprite = this._spriteRecord[character];\n charSprite.drawAroundAnchor = false;\n charSprite.scale = vec(scale, scale);\n charSprite.draw(ctx, currX, currY);\n currX += charSprite.drawWidth + options.letterSpacing;\n } catch (e) {\n Logger.getInstance().error(`SpriteFont Error drawing char ${character}`);\n }\n }\n }\n\n private _parseOptions(options: SpriteFontOptions): SpriteFontOptions {\n return {\n fontSize: options.fontSize || 10,\n letterSpacing: options.letterSpacing || 0,\n color: options.color || Color.Black,\n textAlign: typeof options.textAlign === undefined ? TextAlign.Left : options.textAlign,\n baseAlign: typeof options.baseAlign === undefined ? BaseAlign.Bottom : options.baseAlign,\n maxWidth: options.maxWidth || -1,\n opacity: options.opacity || 0\n };\n }\n}\n","import { ImageSource } from './ImageSource';\r\nimport { Sprite } from './Sprite';\r\nimport { SpriteSheet as LegacySpriteSheet } from '../Drawing/SpriteSheet';\r\nimport { Logger } from '..';\r\n\r\n\r\n/**\r\n * Specify sprite sheet spacing options, useful if your sprites are not tightly packed\r\n * and have space between them.\r\n */\r\nexport interface SpriteSheetSpacingDimensions {\r\n /**\r\n * The starting point to offset and start slicing the sprite sheet from the top left of the image.\r\n * Default is (0, 0)\r\n */\r\n originOffset?: { x?: number, y?: number };\r\n\r\n /**\r\n * The margin between sprites.\r\n * Default is (0, 0)\r\n */\r\n margin?: {x?: number, y?: number};\r\n}\r\n\r\n/**\r\n * Sprite sheet options for slicing up images\r\n */\r\nexport interface SpriteSheetGridOptions {\r\n /**\r\n * Source image to use for each sprite\r\n */\r\n image: ImageSource;\r\n /**\r\n * Grid definition for the sprite sheet\r\n */\r\n grid: {\r\n /**\r\n * Number of rows in the sprite sheet\r\n */\r\n rows: number;\r\n /**\r\n * Number of columns in the sprite sheet\r\n */\r\n columns: number;\r\n /**\r\n * Width of each individual sprite\r\n */\r\n spriteWidth: number;\r\n /**\r\n * Height of each individual sprite\r\n */\r\n spriteHeight: number;\r\n };\r\n /**\r\n * Optionally specifiy any spacing information between sprites\r\n */\r\n spacing?: SpriteSheetSpacingDimensions;\r\n}\r\n\r\nexport interface SpriteSheetOptions {\r\n /**\r\n * Source sprites for the sprite sheet\r\n */\r\n sprites: Sprite[];\r\n /**\r\n * Optionally specify the number of rows in a sprite sheet (default 1 row)\r\n */\r\n rows?: number;\r\n /**\r\n * Optionally specify the number of columns in a sprite sheet (default sprites.length)\r\n */\r\n columns?: number;\r\n}\r\n\r\n/**\r\n * Represents a collection of sprites from a source image with some organization in a grid\r\n */\r\nexport class SpriteSheet {\r\n private _logger = Logger.getInstance();\r\n public readonly sprites: Sprite[] = [];\r\n public readonly rows: number;\r\n public readonly columns: number;\r\n\r\n /**\r\n * Build a new sprite sheet from a list of sprites\r\n *\r\n * Use [[SpriteSheet.fromImageSource]] to create a SpriteSheet from an [[ImageSource]] organized in a grid\r\n * @param options\r\n */\r\n constructor(options: SpriteSheetOptions) {\r\n const { sprites, rows, columns } = options;\r\n this.sprites = sprites;\r\n this.rows = rows ?? 1;\r\n this.columns = columns ?? this.sprites.length;\r\n }\r\n\r\n /**\r\n * Find a sprite by their x/y position in the SpriteSheet, for example `getSprite(0, 0)` is the [[Sprite]] in the top-left\r\n * @param x\r\n * @param y\r\n */\r\n public getSprite(x: number, y: number): Sprite | null {\r\n if (x >= this.columns || x < 0) {\r\n this._logger.warn(`No sprite exists in the SpriteSheet at (${x}, ${y}), x: ${x} should be between 0 and ${this.columns - 1}`);\r\n return null;\r\n }\r\n if (y >= this.rows || y < 0) {\r\n this._logger.warn(`No sprite exists in the SpriteSheet at (${x}, ${y}), y: ${y} should be between 0 and ${this.rows - 1}`);\r\n return null;\r\n }\r\n const spriteIndex = x + y * this.columns;\r\n return this.sprites[spriteIndex];\r\n }\r\n\r\n /**\r\n * To a graphics sprite sheet from a legacy sprite sheet\r\n */\r\n public static fromLegacySpriteSheet(legacySpriteSheet: LegacySpriteSheet): SpriteSheet {\r\n const sprites = legacySpriteSheet.sprites.map(oldSprite => Sprite.fromLegacySprite(oldSprite));\r\n return new SpriteSheet({\r\n sprites\r\n });\r\n }\r\n\r\n /**\r\n * @deprecated\r\n * @param spriteSheet\r\n * @returns\r\n */\r\n public static toLegacySpriteSheet(spriteSheet: SpriteSheet): LegacySpriteSheet {\r\n const sprites = spriteSheet.sprites.map(sprite => Sprite.toLegacySprite(sprite));\r\n return new LegacySpriteSheet(sprites);\r\n }\r\n\r\n /**\r\n * Create a SpriteSheet from an [[ImageSource]] organized in a grid\r\n *\r\n * Example:\r\n * ```\r\n * const spriteSheet = SpriteSheet.fromImageSource({\r\n * image: imageSource,\r\n * grid: {\r\n * rows: 5,\r\n * columns: 2,\r\n * spriteWidth: 32, // pixels\r\n * spriteHeight: 32 // pixels\r\n * },\r\n * // Optionally specify spacing\r\n * spacing: {\r\n * // pixels from the top left to start the sprite parsing\r\n * originOffset: {\r\n * x: 5,\r\n * y: 5\r\n * },\r\n * // pixels between each sprite while parsing\r\n * margin: {\r\n * x: 1,\r\n * y: 1\r\n * }\r\n * }\r\n * })\r\n * ```\r\n *\r\n * @param options\r\n */\r\n public static fromImageSource(options: SpriteSheetGridOptions): SpriteSheet {\r\n const sprites: Sprite[] = [];\r\n options.spacing = options.spacing ?? {};\r\n const {\r\n image,\r\n grid: { rows, columns: cols, spriteWidth, spriteHeight },\r\n spacing: { originOffset, margin }\r\n } = options;\r\n const offsetDefaults = { x: 0, y: 0, ...originOffset};\r\n const marginDefaults = { x: 0, y: 0, ...margin};\r\n for (let x = 0; x < cols; x++) {\r\n for (let y = 0; y < rows; y++) {\r\n sprites[x + y * cols] = new Sprite({\r\n image: image,\r\n sourceView: {\r\n x: x * spriteWidth + marginDefaults.x * x + offsetDefaults.x,\r\n y: y * spriteHeight + marginDefaults.y * y + offsetDefaults.y,\r\n width: spriteWidth,\r\n height: spriteHeight\r\n },\r\n destSize: { height: spriteHeight, width: spriteWidth }\r\n });\r\n }\r\n }\r\n return new SpriteSheet({\r\n sprites: sprites,\r\n rows: rows,\r\n columns: cols\r\n });\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\nimport { SpriteFont as LegacySpriteFont } from '../Drawing/Index';\nimport { Logger } from '../Util/Log';\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\nimport { FontRenderer } from './FontCommon';\nimport { Graphic, GraphicOptions } from './Graphic';\nimport { Sprite } from './Sprite';\nimport { SpriteSheet } from './SpriteSheet';\n\nexport interface SpriteFontOptions {\n /**\n * Alphabet string in spritsheet order (default is row column order)\n * example: 'abcdefghijklmnopqrstuvwxyz'\n */\n alphabet: string;\n /**\n * [[SpriteSheet]] to source character sprites from\n */\n spriteSheet: SpriteSheet;\n /**\n * Optionally ignore case in the supplied text;\n */\n caseInsensitive?: boolean;\n /**\n * Optionally adjust the spacing between character sprites\n */\n spacing?: number;\n /**\n * Optionally specify a \"shadow\"\n */\n shadow?: { offset: Vector };\n}\n\nexport class SpriteFont extends Graphic implements FontRenderer {\n private _text = '';\n private _dirty = true;\n public alphabet: string = '';\n public spriteSheet: SpriteSheet;\n\n public shadow: { offset: Vector } = null;\n public caseInsensitive = false;\n public spacing: number = 0;\n\n private _logger = Logger.getInstance();\n\n static fromLegacySpriteFont(spriteFont: LegacySpriteFont): SpriteFont {\n const sprites = spriteFont.sprites.map(Sprite.fromLegacySprite);\n return new SpriteFont({\n alphabet: spriteFont.alphabet,\n spacing: 0,\n caseInsensitive: spriteFont.caseInsensitive,\n spriteSheet: new SpriteSheet({\n sprites\n })\n });\n }\n\n constructor(options: SpriteFontOptions & GraphicOptions) {\n super(options);\n const { alphabet, spriteSheet, caseInsensitive, spacing, shadow } = options;\n this.alphabet = alphabet;\n this.spriteSheet = spriteSheet;\n this.caseInsensitive = caseInsensitive ?? this.caseInsensitive;\n this.spacing = spacing ?? this.spacing;\n this.shadow = shadow ?? this.shadow;\n\n this.spriteSheet.sprites[0].image.ready.then(() => {\n this._updateDimensions();\n });\n }\n\n private _sprites: Sprite[] = [];\n private _getCharacterSprites(text: string): Sprite[] {\n if (!this._dirty) {\n return this._sprites;\n }\n\n const results: Sprite[] = [];\n // handle case insenstive\n const textToRender = this.caseInsensitive ? text.toLocaleLowerCase() : text;\n const alphabet = this.caseInsensitive ? this.alphabet.toLocaleLowerCase() : this.alphabet;\n\n // for each letter in text\n for (let letterIndex = 0; letterIndex < textToRender.length; letterIndex++) {\n // find the sprite index in alphabet , if there is an error pick the first\n const letter = textToRender[letterIndex];\n let spriteIndex = alphabet.indexOf(letter);\n if (spriteIndex === -1) {\n spriteIndex = 0;\n this._logger.warn(`SpriteFont - Cannot find letter '${letter}' in configured alphabet '${alphabet}'`);\n }\n\n const letterSprite = this.spriteSheet.sprites[spriteIndex];\n if (letterSprite) {\n results.push(letterSprite);\n } else {\n this._logger.warn(`SpriteFont - Cannot find sprite for '${letter}' at index '${spriteIndex}' in configured SpriteSheet`);\n }\n }\n this._dirty = false;\n return (this._sprites = results);\n }\n\n private _updateDimensions() {\n const sprites = this._getCharacterSprites(this._text);\n let width = 0;\n let height = 0;\n for (const sprite of sprites) {\n width += sprite.width + this.spacing;\n height = Math.max(height, sprite.height);\n }\n this.width = width;\n this.height = height;\n }\n\n public updateText(text: string) {\n if (this._text !== text) {\n this._dirty = true;\n this._text = text;\n this._updateDimensions();\n }\n }\n\n protected _preDraw(ex: ExcaliburGraphicsContext, x: number, y: number): void {\n this._updateDimensions();\n super._preDraw(ex, x, y);\n }\n\n protected _drawImage(ex: ExcaliburGraphicsContext, x: number, y: number): void {\n let cursor = 0;\n for (const sprite of this._getCharacterSprites(this._text)) {\n // draw it in the right spot and increase the cursor by sprite width\n sprite.draw(ex, x + cursor, y);\n cursor += sprite.width + this.spacing;\n }\n }\n\n render(ex: ExcaliburGraphicsContext, text: string, x: number, y: number) {\n if (this._text !== text) {\n this._dirty = true;\n this._text = text;\n }\n\n if (this.shadow) {\n ex.save();\n ex.translate(this.shadow.offset.x, this.shadow.offset.y);\n this.draw(ex, x, y);\n ex.restore();\n }\n\n this.draw(ex, x, y);\n }\n\n clone(): SpriteFont {\n return new SpriteFont({\n alphabet: this.alphabet,\n spriteSheet: this.spriteSheet,\n spacing: this.spacing\n });\n }\n}\n","export default \"data:image/png;base64,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\"","import { ExcaliburGraphicsContext, ImageSource, SpriteFont, SpriteSheet } from '..';\r\nimport { Vector } from '../..';\r\nimport debugFont from './debug-font.png';\r\n\r\n/**\r\n * Internal debugtext helper\r\n */\r\nexport class DebugText {\r\n constructor() {\r\n this.load();\r\n }\r\n\r\n /**\r\n * base64 font\r\n */\r\n public readonly fontSheet = debugFont;\r\n public size: number = 16;\r\n private _imageSource: ImageSource;\r\n private _spriteSheet: SpriteSheet;\r\n private _spriteFont: SpriteFont;\r\n public load() {\r\n this._imageSource = new ImageSource(this.fontSheet);\r\n return this._imageSource.load().then(() => {\r\n this._spriteSheet = SpriteSheet.fromImageSource({\r\n image: this._imageSource,\r\n grid: {\r\n rows: 3,\r\n columns: 16,\r\n spriteWidth: 16,\r\n spriteHeight: 16\r\n }\r\n });\r\n this._spriteFont = new SpriteFont({\r\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!\\'&.\"?-()+ ',\r\n caseInsensitive: true,\r\n spriteSheet: this._spriteSheet,\r\n spacing: -6\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Writes debug text using the built in sprint font\r\n * @param ctx\r\n * @param text\r\n * @param pos\r\n */\r\n public write(ctx: ExcaliburGraphicsContext, text: string, pos: Vector) {\r\n if (this._imageSource.isLoaded()) {\r\n this._spriteFont.render(ctx, text, pos.x, pos.y);\r\n }\r\n }\r\n}\r\n","import {\r\n ExcaliburGraphicsContext,\r\n LineGraphicsOptions,\r\n RectGraphicsOptions,\r\n PointGraphicsOptions,\r\n ExcaliburGraphicsContextOptions,\r\n DebugDraw,\r\n HTMLImageSource\r\n} from './ExcaliburGraphicsContext';\r\n\r\nimport { Matrix } from '../../Math/matrix';\r\nimport { TransformStack } from './transform-stack';\r\nimport { Vector, vec } from '../../Math/vector';\r\nimport { Color } from '../../Color';\r\nimport { StateStack } from './state-stack';\r\nimport { Logger } from '../../Util/Log';\r\nimport { LineRenderer } from './line-renderer';\r\nimport { ImageRenderer } from './image-renderer';\r\nimport { PointRenderer } from './point-renderer';\r\nimport { Canvas } from '../Canvas';\r\nimport { GraphicsDiagnostics } from '../GraphicsDiagnostics';\r\nimport { DebugText } from './debug-text';\r\nimport { ScreenDimension } from '../../Screen';\r\n\r\nclass ExcaliburGraphicsContextWebGLDebug implements DebugDraw {\r\n private _debugText = new DebugText();\r\n constructor(private _webglCtx: ExcaliburGraphicsContextWebGL) {}\r\n\r\n /**\r\n * Draw a debugging rectangle to the context\r\n * @param x\r\n * @param y\r\n * @param width\r\n * @param height\r\n */\r\n drawRect(x: number, y: number, width: number, height: number, rectOptions: RectGraphicsOptions = { color: Color.Black }): void {\r\n this.drawLine(vec(x, y), vec(x + width, y), { ...rectOptions });\r\n this.drawLine(vec(x + width, y), vec(x + width, y + height), { ...rectOptions });\r\n this.drawLine(vec(x + width, y + height), vec(x, y + height), { ...rectOptions });\r\n this.drawLine(vec(x, y + height), vec(x, y), { ...rectOptions });\r\n }\r\n\r\n /**\r\n * Draw a debugging line to the context\r\n * @param start\r\n * @param end\r\n * @param lineOptions\r\n */\r\n drawLine(start: Vector, end: Vector, lineOptions: LineGraphicsOptions = { color: Color.Black }): void {\r\n this._webglCtx.__lineRenderer.addLine(start, end, lineOptions.color);\r\n }\r\n\r\n /**\r\n * Draw a debugging point to the context\r\n * @param point\r\n * @param pointOptions\r\n */\r\n drawPoint(point: Vector, pointOptions: PointGraphicsOptions = { color: Color.Black, size: 5 }): void {\r\n this._webglCtx.__pointRenderer.addPoint(point, pointOptions.color, pointOptions.size);\r\n }\r\n\r\n drawText(text: string, pos: Vector) {\r\n this._debugText.write(this._webglCtx, text, pos);\r\n }\r\n}\r\n\r\nexport interface WebGLGraphicsContextInfo {\r\n transform: TransformStack;\r\n state: StateStack;\r\n matrix: Matrix;\r\n}\r\n\r\nexport class ExcaliburGraphicsContextWebGL implements ExcaliburGraphicsContext {\r\n /**\r\n * Meant for internal use only. Access the internal context at your own risk and no guarantees this will exist in the future.\r\n * @internal\r\n */\r\n public __gl: WebGLRenderingContext;\r\n\r\n /**\r\n * Holds the 2d context shim\r\n */\r\n private _canvas: Canvas; // Configure z for shim?\r\n /**\r\n * Meant for internal use only. Access the internal context at your own risk and no guarantees this will exist in the future.\r\n * @internal\r\n */\r\n public __ctx: CanvasRenderingContext2D;\r\n\r\n private _transform = new TransformStack();\r\n private _state = new StateStack();\r\n private _ortho!: Matrix;\r\n\r\n /**\r\n * Meant for internal use only. Access the internal context at your own risk and no guarantees this will exist in the future.\r\n * @internal\r\n */\r\n public __pointRenderer: PointRenderer;\r\n\r\n /**\r\n * Meant for internal use only. Access the internal context at your own risk and no guarantees this will exist in the future.\r\n * @internal\r\n */\r\n public __lineRenderer: LineRenderer;\r\n\r\n /**\r\n * Meant for internal use only. Access the internal context at your own risk and no guarantees this will exist in the future.\r\n * @internal\r\n */\r\n public __imageRenderer: ImageRenderer;\r\n\r\n public snapToPixel: boolean = true;\r\n\r\n public smoothing: boolean = false;\r\n\r\n public backgroundColor: Color = Color.ExcaliburBlue;\r\n\r\n public get opacity(): number {\r\n return this._state.current.opacity;\r\n }\r\n\r\n public set opacity(value: number) {\r\n this._state.current.opacity = value;\r\n }\r\n\r\n public get width() {\r\n return this.__gl.canvas.width;\r\n }\r\n\r\n public get height() {\r\n return this.__gl.canvas.height;\r\n }\r\n\r\n /**\r\n * Checks the underlying webgl implementation if the requested internal resolution is supported\r\n * @param dim\r\n */\r\n public checkIfResolutionSupported(dim: ScreenDimension): boolean {\r\n // Slight hack based on this thread https://groups.google.com/g/webgl-dev-list/c/AHONvz3oQTo\r\n const gl = this.__gl;\r\n // If any dimension is greater than max texture size (divide by 4 bytes per pixel)\r\n const maxDim = gl.getParameter(gl.MAX_TEXTURE_SIZE) / 4;\r\n let supported = true;\r\n if (dim.width > maxDim ||dim.height > maxDim) {\r\n supported = false;\r\n }\r\n return supported;\r\n }\r\n\r\n constructor(options: ExcaliburGraphicsContextOptions) {\r\n const { canvasElement, enableTransparency, smoothing, snapToPixel, backgroundColor } = options;\r\n this.__gl = canvasElement.getContext('webgl', {\r\n antialias: smoothing ?? this.smoothing,\r\n premultipliedAlpha: false,\r\n alpha: enableTransparency ?? true,\r\n depth: true,\r\n powerPreference: 'high-performance'\r\n });\r\n this.snapToPixel = snapToPixel ?? this.snapToPixel;\r\n this.smoothing = smoothing ?? this.smoothing;\r\n this.backgroundColor = backgroundColor ?? this.backgroundColor;\r\n this._init();\r\n }\r\n\r\n private _init() {\r\n const gl = this.__gl;\r\n // Setup viewport and view matrix\r\n this._ortho = Matrix.ortho(0, gl.canvas.width, gl.canvas.height, 0, 400, -400);\r\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\r\n\r\n // Clear background\r\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\r\n gl.clear(gl.COLOR_BUFFER_BIT);\r\n\r\n // Enable alpha blending\r\n gl.enable(gl.BLEND);\r\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\r\n\r\n this.__pointRenderer = new PointRenderer(gl, { matrix: this._ortho, transform: this._transform, state: this._state });\r\n this.__lineRenderer = new LineRenderer(gl, { matrix: this._ortho, transform: this._transform, state: this._state });\r\n this.__imageRenderer = new ImageRenderer(gl, { matrix: this._ortho, transform: this._transform, state: this._state });\r\n\r\n // 2D ctx shim\r\n this._canvas = new Canvas({\r\n width: gl.canvas.width,\r\n height: gl.canvas.height\r\n });\r\n this.__ctx = this._canvas.ctx;\r\n }\r\n\r\n public resetTransform(): void {\r\n this._transform.current = Matrix.identity();\r\n }\r\n\r\n public updateViewport(): void {\r\n const gl = this.__gl;\r\n this._ortho = this._ortho = Matrix.ortho(0, gl.canvas.width, gl.canvas.height, 0, 400, -400);\r\n this.__pointRenderer.shader.addUniformMatrix('u_matrix', this._ortho.data);\r\n this.__lineRenderer.shader.addUniformMatrix('u_matrix', this._ortho.data);\r\n this.__imageRenderer.shader.addUniformMatrix('u_matrix', this._ortho.data);\r\n\r\n // 2D ctx shim\r\n this._canvas.width = gl.canvas.width;\r\n this._canvas.height = gl.canvas.height;\r\n }\r\n\r\n drawImage(image: HTMLImageSource, x: number, y: number): void;\r\n drawImage(image: HTMLImageSource, x: number, y: number, width: number, height: number): void;\r\n drawImage(\r\n image: HTMLImageSource,\r\n sx: number,\r\n sy: number,\r\n swidth?: number,\r\n sheight?: number,\r\n dx?: number,\r\n dy?: number,\r\n dwidth?: number,\r\n dheight?: number\r\n ): void;\r\n drawImage(\r\n image: HTMLImageSource,\r\n sx: number,\r\n sy: number,\r\n swidth?: number,\r\n sheight?: number,\r\n dx?: number,\r\n dy?: number,\r\n dwidth?: number,\r\n dheight?: number\r\n ): void {\r\n if (swidth === 0 || sheight === 0) {\r\n return; // zero dimension dest exit early\r\n } else if (dwidth === 0 || dheight === 0) {\r\n return; // zero dimension dest exit early\r\n } else if (image.width === 0 || image.height === 0) {\r\n return; // zero dimension source exit early\r\n }\r\n\r\n if (!image) {\r\n Logger.getInstance().warn('Cannot draw a null or undefined image');\r\n // tslint:disable-next-line: no-console\r\n if (console.trace) {\r\n // tslint:disable-next-line: no-console\r\n console.trace();\r\n }\r\n return;\r\n }\r\n this.__imageRenderer.addImage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight);\r\n }\r\n\r\n public drawLine(start: Vector, end: Vector, color: Color, thickness = 1) {\r\n this.__imageRenderer.addLine(color, start, end, thickness);\r\n }\r\n\r\n public drawRectangle(pos: Vector, width: number, height: number, color: Color) {\r\n this.__imageRenderer.addRectangle(color, pos, width, height);\r\n }\r\n\r\n public drawCircle(pos: Vector, radius: number, color: Color) {\r\n this.__imageRenderer.addCircle(pos, radius, color);\r\n }\r\n\r\n debug = new ExcaliburGraphicsContextWebGLDebug(this);\r\n\r\n public save(): void {\r\n this._transform.save();\r\n this._state.save();\r\n }\r\n\r\n public restore(): void {\r\n this._transform.restore();\r\n this._state.restore();\r\n }\r\n\r\n public translate(x: number, y: number): void {\r\n this._transform.translate(this.snapToPixel ? ~~x : x, this.snapToPixel ? ~~y : y);\r\n }\r\n\r\n public rotate(angle: number): void {\r\n this._transform.rotate(angle);\r\n }\r\n\r\n public scale(x: number, y: number): void {\r\n this._transform.scale(x, y);\r\n }\r\n\r\n public transform(matrix: Matrix) {\r\n this._transform.current = matrix;\r\n }\r\n\r\n clear() {\r\n const gl = this.__gl;\r\n gl.clearColor(this.backgroundColor.r / 255, this.backgroundColor.g / 255, this.backgroundColor.b / 255, this.backgroundColor.a);\r\n // Clear the context with the newly set color. This is\r\n // the function call that actually does the drawing.\r\n gl.clear(gl.COLOR_BUFFER_BIT);\r\n GraphicsDiagnostics.clear();\r\n }\r\n\r\n /**\r\n * Flushes all batched rendering to the screen\r\n */\r\n flush() {\r\n const gl = this.__gl;\r\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\r\n\r\n this.__imageRenderer.render();\r\n this.__lineRenderer.render();\r\n this.__pointRenderer.render();\r\n }\r\n}\r\n","import { Vector, vec } from './Math/vector';\r\nimport { Logger } from './Util/Log';\r\nimport { Camera } from './Camera';\r\nimport { BrowserEvents } from './Util/Browser';\r\nimport { BoundingBox } from './Collision/Index';\r\nimport { ExcaliburGraphicsContext } from './Graphics/Context/ExcaliburGraphicsContext';\r\nimport { getPosition } from './Util/Util';\r\nimport { ExcaliburGraphicsContextWebGL } from './Graphics/Context/ExcaliburGraphicsContextWebGL';\r\n\r\n/**\r\n * Enum representing the different display modes available to Excalibur.\r\n */\r\nexport enum DisplayMode {\r\n /**\r\n * Default, use a specified resolution for the game. Like 800x600 pixels for example.\r\n */\r\n Fixed = 'Fixed',\r\n\r\n /**\r\n * Fit to screen using as much space as possible while maintaining aspect ratio and resolution.\r\n * This is not the same as [[Screen.goFullScreen]] but behaves in a similar way maintaining aspect ratio.\r\n *\r\n * You may want to center your game here is an example\r\n * ```html\r\n * <!-- html -->\r\n * <body>\r\n * <main>\r\n * <canvas id=\"game\"></canvas>\r\n * </main>\r\n * </body>\r\n * ```\r\n *\r\n * ```css\r\n * // css\r\n * main {\r\n * display: flex;\r\n * align-items: center;\r\n * justify-content: center;\r\n * height: 100%;\r\n * width: 100%;\r\n * }\r\n * ```\r\n *\r\n */\r\n FitScreen = 'FitScreen',\r\n\r\n /**\r\n * Fill the entire screen's css width/height for the game resolution dynamically. This means the resolution of the game will\r\n * change dynamically as the window is resized. This is not the same as [[Screen.goFullScreen]]\r\n */\r\n FillScreen = 'FillScreen',\r\n\r\n /**\r\n * Fit to parent element width/height using as much space as possible while maintaining aspect ratio and resolution.\r\n */\r\n FitContainer = 'FitContainer',\r\n\r\n /**\r\n * Use the parent DOM container's css width/height for the game resolution dynamically\r\n */\r\n FillContainer = 'FillContainer',\r\n\r\n /**\r\n * Allow the game to be positioned with the [[EngineOptions.position]] option\r\n * @deprecated Use CSS to position the game canvas, will be removed in v0.26.0\r\n */\r\n Position = 'Position'\r\n}\r\n\r\n/**\r\n * Convenience class for quick resolutions\r\n * Mostly sourced from https://emulation.gametechwiki.com/index.php/Resolution\r\n */\r\nexport class Resolution {\r\n /* istanbul ignore next */\r\n public static get SVGA(): ScreenDimension {\r\n return { width: 800, height: 600 };\r\n }\r\n\r\n /* istanbul ignore next */\r\n public static get Standard(): ScreenDimension {\r\n return { width: 1920, height: 1080 };\r\n }\r\n\r\n /* istanbul ignore next */\r\n public static get Atari2600(): ScreenDimension {\r\n return { width: 160, height: 192 };\r\n }\r\n\r\n /* istanbul ignore next */\r\n public static get GameBoy(): ScreenDimension {\r\n return { width: 160, height: 144 };\r\n }\r\n\r\n /* istanbul ignore next */\r\n public static get GameBoyAdvance(): ScreenDimension {\r\n return { width: 240, height: 160 };\r\n }\r\n\r\n /* istanbul ignore next */\r\n public static get NintendoDS(): ScreenDimension {\r\n return { width: 256, height: 192 };\r\n }\r\n\r\n /* istanbul ignore next */\r\n public static get NES(): ScreenDimension {\r\n return { width: 256, height: 224 };\r\n }\r\n\r\n /* istanbul ignore next */\r\n public static get SNES(): ScreenDimension {\r\n return { width: 256, height: 244 };\r\n }\r\n}\r\n\r\n/**\r\n * Interface describing the absolute CSS position of the game window. For use when [[DisplayMode.Position]]\r\n * is specified and when the user wants to define exact pixel spacing of the window.\r\n * When a number is given, the value is interpreted as pixels\r\n */\r\nexport interface AbsolutePosition {\r\n top?: number | string;\r\n left?: number | string;\r\n right?: number | string;\r\n bottom?: number | string;\r\n}\r\n\r\nexport type CanvasPosition = string | AbsolutePosition;\r\n\r\nexport interface ScreenDimension {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface ScreenOptions {\r\n /**\r\n * Canvas element to build a screen on\r\n */\r\n canvas: HTMLCanvasElement;\r\n /**\r\n * Graphics context for the screen\r\n */\r\n context: ExcaliburGraphicsContext;\r\n\r\n /**\r\n * Browser abstraction\r\n */\r\n browser: BrowserEvents;\r\n /**\r\n * Optionally set antialiasing, defaults to true. If set to true, images will be smoothed\r\n */\r\n antialiasing?: boolean;\r\n /**\r\n * Optionally override the pixel ratio to use for the screen, otherwise calculated automatically from the browser\r\n */\r\n pixelRatio?: number;\r\n /**\r\n * Optionally specify the actual pixel resolution in width/height pixels (also known as logical resolution), by default the\r\n * resolution will be the same as the viewport. Resolution will be overridden by [[DisplayMode.FillContainer]] and\r\n * [[DisplayMode.FillScreen]].\r\n */\r\n resolution?: ScreenDimension;\r\n /**\r\n * Visual viewport size in css pixel, if resolution is not specified it will be the same as the viewport\r\n */\r\n viewport: ScreenDimension;\r\n /**\r\n * Set the display mode of the screen, by default DisplayMode.Fixed.\r\n */\r\n displayMode?: DisplayMode;\r\n /**\r\n * Specify how the game window is to be positioned when the [[DisplayMode.Position]] is chosen. This option MUST be specified\r\n * if the DisplayMode is set as [[DisplayMode.Position]]. The position can be either a string or an [[AbsolutePosition]].\r\n * String must be in the format of css style background-position. The vertical position must precede the horizontal position in strings.\r\n *\r\n * Valid String examples: \"top left\", \"top\", \"bottom\", \"middle\", \"middle center\", \"bottom right\"\r\n * Valid [[AbsolutePosition]] examples: `{top: 5, right: 10%}`, `{bottom: 49em, left: 10px}`, `{left: 10, bottom: 40}`\r\n */\r\n position?: CanvasPosition;\r\n}\r\n\r\n/**\r\n * The Screen handles all aspects of interacting with the screen for Excalibur.\r\n */\r\nexport class Screen {\r\n private _canvas: HTMLCanvasElement;\r\n private _ctx: ExcaliburGraphicsContext;\r\n private _antialiasing: boolean = true;\r\n private _browser: BrowserEvents;\r\n private _camera: Camera;\r\n private _resolution: ScreenDimension;\r\n private _resolutionStack: ScreenDimension[] = [];\r\n private _viewport: ScreenDimension;\r\n private _viewportStack: ScreenDimension[] = [];\r\n private _pixelRatioOverride: number | null = null;\r\n private _position: CanvasPosition;\r\n private _displayMode: DisplayMode;\r\n private _isFullScreen = false;\r\n private _mediaQueryList: MediaQueryList;\r\n private _isDisposed = false;\r\n private _logger = Logger.getInstance();\r\n private _resizeObserver: ResizeObserver;\r\n\r\n constructor(options: ScreenOptions) {\r\n this.viewport = options.viewport;\r\n this.resolution = options.resolution ?? { ...this.viewport };\r\n this._displayMode = options.displayMode ?? DisplayMode.Fixed;\r\n this._canvas = options.canvas;\r\n this._ctx = options.context;\r\n this._antialiasing = options.antialiasing ?? this._antialiasing;\r\n this._browser = options.browser;\r\n this._position = options.position;\r\n this._pixelRatioOverride = options.pixelRatio;\r\n this._applyDisplayMode();\r\n\r\n this._mediaQueryList = this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\r\n this._mediaQueryList.addEventListener('change', this._pixelRatioChangeHandler);\r\n\r\n this._canvas.addEventListener('fullscreenchange', this._fullscreenChangeHandler);\r\n this.applyResolutionAndViewport();\r\n }\r\n\r\n public dispose(): void {\r\n if (!this._isDisposed) {\r\n // Clean up handlers\r\n this._isDisposed = true;\r\n this._browser.window.off('resize', this._resizeHandler);\r\n if (this._resizeObserver) {\r\n this._resizeObserver.disconnect();\r\n }\r\n this.parent.removeEventListener('resize', this._resizeHandler);\r\n this._mediaQueryList.removeEventListener('change', this._pixelRatioChangeHandler);\r\n this._canvas.removeEventListener('fullscreenchange', this._fullscreenChangeHandler);\r\n }\r\n }\r\n\r\n private _fullscreenChangeHandler = () => {\r\n this._isFullScreen = !this._isFullScreen;\r\n this._logger.debug('Fullscreen Change', this._isFullScreen);\r\n };\r\n\r\n private _pixelRatioChangeHandler = () => {\r\n this._logger.debug('Pixel Ratio Change', window.devicePixelRatio);\r\n this._devicePixelRatio = this._calculateDevicePixelRatio();\r\n this.applyResolutionAndViewport();\r\n };\r\n\r\n private _resizeHandler = () => {\r\n const parent = this.parent;\r\n this._logger.debug('View port resized');\r\n this._setResolutionAndViewportByDisplayMode(parent);\r\n this.applyResolutionAndViewport();\r\n };\r\n\r\n private _calculateDevicePixelRatio() {\r\n if (window.devicePixelRatio < 1) {\r\n return 1;\r\n }\r\n\r\n const devicePixelRatio = window.devicePixelRatio || 1;\r\n\r\n return devicePixelRatio;\r\n }\r\n\r\n // Asking the window.devicePixelRatio is expensive we do it once\r\n private _devicePixelRatio = this._calculateDevicePixelRatio();\r\n\r\n public get pixelRatio(): number {\r\n if (this._pixelRatioOverride) {\r\n return this._pixelRatioOverride;\r\n }\r\n\r\n return this._devicePixelRatio;\r\n }\r\n\r\n public get isHiDpi() {\r\n return this.pixelRatio !== 1;\r\n }\r\n\r\n public get displayMode(): DisplayMode {\r\n return this._displayMode;\r\n }\r\n\r\n public get canvas(): HTMLCanvasElement {\r\n return this._canvas;\r\n }\r\n\r\n public get parent(): HTMLElement | Window {\r\n return <HTMLElement | Window>(\r\n (this.displayMode === DisplayMode.FillContainer || this.displayMode === DisplayMode.FitContainer\r\n ? this.canvas.parentElement || document.body\r\n : window)\r\n );\r\n }\r\n\r\n public get resolution(): ScreenDimension {\r\n return this._resolution;\r\n }\r\n\r\n public set resolution(resolution: ScreenDimension) {\r\n this._resolution = resolution;\r\n }\r\n\r\n public get viewport(): ScreenDimension {\r\n if (this._viewport) {\r\n return this._viewport;\r\n }\r\n return this._resolution;\r\n }\r\n\r\n public set viewport(viewport: ScreenDimension) {\r\n this._viewport = viewport;\r\n }\r\n\r\n public get aspectRatio() {\r\n return this._resolution.width / this._resolution.height;\r\n }\r\n\r\n public get scaledWidth() {\r\n return this._resolution.width * this.pixelRatio;\r\n }\r\n\r\n public get scaledHeight() {\r\n return this._resolution.height * this.pixelRatio;\r\n }\r\n\r\n public setCurrentCamera(camera: Camera) {\r\n this._camera = camera;\r\n }\r\n\r\n public pushResolutionAndViewport() {\r\n this._resolutionStack.push(this.resolution);\r\n this._viewportStack.push(this.viewport);\r\n\r\n this.resolution = { ...this.resolution };\r\n this.viewport = { ...this.viewport };\r\n }\r\n\r\n public peekViewport(): ScreenDimension {\r\n return this._viewportStack[this._viewportStack.length - 1];\r\n }\r\n\r\n public peekResolution(): ScreenDimension {\r\n return this._resolutionStack[this._resolutionStack.length - 1];\r\n }\r\n\r\n public popResolutionAndViewport() {\r\n this.resolution = this._resolutionStack.pop();\r\n this.viewport = this._viewportStack.pop();\r\n }\r\n\r\n private _alreadyWarned = false;\r\n public applyResolutionAndViewport() {\r\n this._canvas.width = this.scaledWidth;\r\n this._canvas.height = this.scaledHeight;\r\n\r\n if (this._ctx instanceof ExcaliburGraphicsContextWebGL) {\r\n const supported = this._ctx.checkIfResolutionSupported({\r\n width: this.scaledWidth,\r\n height: this.scaledHeight\r\n });\r\n if (!supported && !this._alreadyWarned) {\r\n this._alreadyWarned = true; // warn once\r\n this._logger.warn(\r\n `The currently configured resolution (${this.resolution.width}x${this.resolution.height})` +\r\n ' is too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly.' +\r\n ' Try reducing the resolution or disabling Hi DPI scaling to avoid this' +\r\n ' (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).');\r\n }\r\n }\r\n\r\n if (this._antialiasing) {\r\n this._canvas.style.imageRendering = 'auto';\r\n } else {\r\n this._canvas.style.imageRendering = 'pixelated';\r\n // Fall back to 'crisp-edges' if 'pixelated' is not supported\r\n // Currently for firefox https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering\r\n if (this._canvas.style.imageRendering === '') {\r\n this._canvas.style.imageRendering = 'crisp-edges';\r\n }\r\n }\r\n this._canvas.style.width = this.viewport.width + 'px';\r\n this._canvas.style.height = this.viewport.height + 'px';\r\n\r\n // After messing with the canvas width/height the graphics context is invalidated and needs to have some properties reset\r\n this._ctx.updateViewport();\r\n this._ctx.resetTransform();\r\n this._ctx.scale(this.pixelRatio, this.pixelRatio);\r\n this._ctx.smoothing = this._antialiasing;\r\n }\r\n\r\n public get antialiasing() {\r\n return this._antialiasing;\r\n }\r\n\r\n public set antialiasing(isSmooth: boolean) {\r\n this._antialiasing = isSmooth;\r\n this._ctx.smoothing = this._antialiasing;\r\n }\r\n\r\n /**\r\n * Returns true if excalibur is fullscreened using the browser fullscreen api\r\n */\r\n public get isFullScreen() {\r\n return this._isFullScreen;\r\n }\r\n\r\n /**\r\n * Requests to go fullscreen using the browser fullscreen api, requires user interaction to be successful.\r\n * For example, wire this to a user click handler.\r\n */\r\n public goFullScreen(): Promise<void> {\r\n return this._canvas.requestFullscreen();\r\n }\r\n\r\n /**\r\n * Requests to exit fullscreen using the browser fullscreen api\r\n */\r\n public exitFullScreen(): Promise<void> {\r\n return document.exitFullscreen();\r\n }\r\n\r\n /**\r\n * Takes a coordinate in normal html page space, for example from a pointer move event, and translates it to\r\n * Excalibur screen space.\r\n *\r\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\r\n * bottom right corner (resolutionX, resolutionY)\r\n * @param point\r\n */\r\n public pageToScreenCoordinates(point: Vector): Vector {\r\n let newX = point.x;\r\n let newY = point.y;\r\n\r\n if (!this._isFullScreen) {\r\n newX -= getPosition(this._canvas).x;\r\n newY -= getPosition(this._canvas).y;\r\n }\r\n\r\n // if fullscreen api on it centers with black bars\r\n // we need to adjust the screen to world coordinates in this case\r\n if (this._isFullScreen) {\r\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\r\n const screenHeight = window.innerWidth / this.aspectRatio;\r\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\r\n newY = ((newY - screenMarginY) / screenHeight) * this.viewport.height;\r\n newX = (newX / window.innerWidth) * this.viewport.width;\r\n } else {\r\n const screenWidth = window.innerHeight * this.aspectRatio;\r\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\r\n newX = ((newX - screenMarginX) / screenWidth) * this.viewport.width;\r\n newY = (newY / window.innerHeight) * this.viewport.height;\r\n }\r\n }\r\n\r\n newX = (newX / this.viewport.width) * this.resolution.width;\r\n newY = (newY / this.viewport.height) * this.resolution.height;\r\n\r\n return new Vector(newX, newY);\r\n }\r\n\r\n /**\r\n * Takes a coordinate in Excalibur screen space, and translates it to normal html page space. For example,\r\n * this is where html elements might live if you want to position them relative to Excalibur.\r\n *\r\n * Excalibur screen space starts at the top left (0, 0) corner of the viewport, and extends to the\r\n * bottom right corner (resolutionX, resolutionY)\r\n * @param point\r\n */\r\n public screenToPageCoordinates(point: Vector): Vector {\r\n let newX = point.x;\r\n let newY = point.y;\r\n\r\n newX = (newX / this.resolution.width) * this.viewport.width;\r\n newY = (newY / this.resolution.height) * this.viewport.height;\r\n\r\n if (this._isFullScreen) {\r\n if (window.innerWidth / this.aspectRatio < window.innerHeight) {\r\n const screenHeight = window.innerWidth / this.aspectRatio;\r\n const screenMarginY = (window.innerHeight - screenHeight) / 2;\r\n newY = (newY / this.viewport.height) * screenHeight + screenMarginY;\r\n newX = (newX / this.viewport.width) * window.innerWidth;\r\n } else {\r\n const screenWidth = window.innerHeight * this.aspectRatio;\r\n const screenMarginX = (window.innerWidth - screenWidth) / 2;\r\n newX = (newX / this.viewport.width) * screenWidth + screenMarginX;\r\n newY = (newY / this.viewport.height) * window.innerHeight;\r\n }\r\n }\r\n\r\n if (!this._isFullScreen) {\r\n newX += getPosition(this._canvas).x;\r\n newY += getPosition(this._canvas).y;\r\n }\r\n\r\n return new Vector(newX, newY);\r\n }\r\n\r\n /**\r\n * Takes a coordinate in Excalibur screen space, and translates it to Excalibur world space.\r\n *\r\n * World space is where [[Entity|entities]] in Excalibur live by default [[CoordPlane.World]]\r\n * and extends infinitely out relative from the [[Camera]].\r\n * @param point Screen coordinate to convert\r\n */\r\n public screenToWorldCoordinates(point: Vector): Vector {\r\n let newX = point.x;\r\n let newY = point.y;\r\n\r\n // transform back to world space\r\n newX = (newX / this.resolution.width) * this.drawWidth;\r\n newY = (newY / this.resolution.height) * this.drawHeight;\r\n\r\n // transform based on zoom\r\n newX = newX - this.halfDrawWidth;\r\n newY = newY - this.halfDrawHeight;\r\n\r\n // shift by camera focus\r\n newX += this._camera?.x ?? 0;\r\n newY += this._camera?.y ?? 0;\r\n\r\n return new Vector(newX, newY);\r\n }\r\n\r\n /**\r\n * Takes a coordinate in Excalibur world space, and translates it to Excalibur screen space.\r\n *\r\n * Screen space is where [[ScreenElement|screen elements]] and [[Entity|entities]] with [[CoordPlane.Screen]] live.\r\n * @param point World coordinate to convert\r\n */\r\n public worldToScreenCoordinates(point: Vector): Vector {\r\n let screenX = point.x;\r\n let screenY = point.y;\r\n\r\n // shift by camera focus\r\n screenX -= this._camera?.x ?? 0;\r\n screenY -= this._camera?.y ?? 0;\r\n\r\n // transform back on zoom\r\n screenX = screenX + this.halfDrawWidth;\r\n screenY = screenY + this.halfDrawHeight;\r\n\r\n // transform back to screen space\r\n screenX = (screenX / this.drawWidth) * this.resolution.width;\r\n screenY = (screenY / this.drawHeight) * this.resolution.height;\r\n\r\n return new Vector(screenX, screenY);\r\n }\r\n\r\n public pageToWorldCoordinates(point: Vector): Vector {\r\n const screen = this.pageToScreenCoordinates(point);\r\n return this.screenToWorldCoordinates(screen);\r\n }\r\n\r\n public worldToPageCoordinates(point: Vector): Vector {\r\n const screen = this.worldToScreenCoordinates(point);\r\n return this.screenToPageCoordinates(screen);\r\n }\r\n\r\n /**\r\n * Returns a BoundingBox of the top left corner of the screen\r\n * and the bottom right corner of the screen.\r\n *\r\n * World bounds are in world coordinates, useful for culling objects offscreen\r\n */\r\n public getWorldBounds(): BoundingBox {\r\n const left = this.screenToWorldCoordinates(Vector.Zero).x;\r\n const top = this.screenToWorldCoordinates(Vector.Zero).y;\r\n const right = left + this.drawWidth;\r\n const bottom = top + this.drawHeight;\r\n\r\n return new BoundingBox(left, top, right, bottom);\r\n }\r\n\r\n /**\r\n * The width of the game canvas in pixels (physical width component of the\r\n * resolution of the canvas element)\r\n */\r\n public get canvasWidth(): number {\r\n return this.canvas.width;\r\n }\r\n\r\n /**\r\n * Returns half width of the game canvas in pixels (half physical width component)\r\n */\r\n public get halfCanvasWidth(): number {\r\n return this.canvas.width / 2;\r\n }\r\n\r\n /**\r\n * The height of the game canvas in pixels, (physical height component of\r\n * the resolution of the canvas element)\r\n */\r\n public get canvasHeight(): number {\r\n return this.canvas.height;\r\n }\r\n\r\n /**\r\n * Returns half height of the game canvas in pixels (half physical height component)\r\n */\r\n public get halfCanvasHeight(): number {\r\n return this.canvas.height / 2;\r\n }\r\n\r\n /**\r\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\r\n */\r\n public get drawWidth(): number {\r\n if (this._camera) {\r\n return this.resolution.width / this._camera.zoom;\r\n }\r\n return this.resolution.width;\r\n }\r\n\r\n /**\r\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\r\n */\r\n public get halfDrawWidth(): number {\r\n return this.drawWidth / 2;\r\n }\r\n\r\n /**\r\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\r\n */\r\n public get drawHeight(): number {\r\n if (this._camera) {\r\n return this.resolution.height / this._camera.zoom;\r\n }\r\n return this.resolution.height;\r\n }\r\n\r\n /**\r\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\r\n */\r\n public get halfDrawHeight(): number {\r\n return this.drawHeight / 2;\r\n }\r\n\r\n /**\r\n * Returns screen center coordinates including zoom and device pixel ratio.\r\n */\r\n public get center(): Vector {\r\n return vec(this.halfDrawWidth, this.halfDrawHeight);\r\n }\r\n\r\n private _computeFit() {\r\n document.body.style.margin = '0px';\r\n document.body.style.overflow = 'hidden';\r\n const aspect = this.aspectRatio;\r\n let adjustedWidth = 0;\r\n let adjustedHeight = 0;\r\n if (window.innerWidth / aspect < window.innerHeight) {\r\n adjustedWidth = window.innerWidth;\r\n adjustedHeight = window.innerWidth / aspect;\r\n } else {\r\n adjustedWidth = window.innerHeight * aspect;\r\n adjustedHeight = window.innerHeight;\r\n }\r\n\r\n this.viewport = {\r\n width: adjustedWidth,\r\n height: adjustedHeight\r\n };\r\n }\r\n\r\n private _computeFitContainer() {\r\n const aspect = this.aspectRatio;\r\n let adjustedWidth = 0;\r\n let adjustedHeight = 0;\r\n const parent = this.canvas.parentElement;\r\n if (parent.clientWidth / aspect < parent.clientHeight) {\r\n adjustedWidth = parent.clientWidth;\r\n adjustedHeight = parent.clientWidth / aspect;\r\n } else {\r\n adjustedWidth = parent.clientHeight * aspect;\r\n adjustedHeight = parent.clientHeight;\r\n }\r\n\r\n this.viewport = {\r\n width: adjustedWidth,\r\n height: adjustedHeight\r\n };\r\n }\r\n\r\n private _applyDisplayMode() {\r\n if (this.displayMode === DisplayMode.Position) {\r\n this._initializeDisplayModePosition(this._position);\r\n } else {\r\n this._setResolutionAndViewportByDisplayMode(this.parent);\r\n\r\n // watch resizing\r\n if (this.parent instanceof Window) {\r\n this._browser.window.on('resize', this._resizeHandler);\r\n } else {\r\n this._resizeObserver = new ResizeObserver(() => {\r\n this._resizeHandler();\r\n });\r\n this._resizeObserver.observe(this.parent);\r\n }\r\n this.parent.addEventListener('resize', this._resizeHandler);\r\n }\r\n }\r\n\r\n /**\r\n * Sets the resoultion and viewport based on the selected display mode.\r\n */\r\n private _setResolutionAndViewportByDisplayMode(parent: HTMLElement | Window) {\r\n if (this.displayMode === DisplayMode.FillContainer) {\r\n this.resolution = {\r\n width: (<HTMLElement>parent).clientWidth,\r\n height: (<HTMLElement>parent).clientHeight\r\n };\r\n\r\n this.viewport = this.resolution;\r\n }\r\n\r\n if (this.displayMode === DisplayMode.FillScreen) {\r\n document.body.style.margin = '0px';\r\n document.body.style.overflow = 'hidden';\r\n this.resolution = {\r\n width: (<Window>parent).innerWidth,\r\n height: (<Window>parent).innerHeight\r\n };\r\n\r\n this.viewport = this.resolution;\r\n }\r\n\r\n if (this.displayMode === DisplayMode.FitScreen) {\r\n this._computeFit();\r\n }\r\n\r\n if (this.displayMode === DisplayMode.FitContainer) {\r\n this._computeFitContainer();\r\n }\r\n }\r\n\r\n private _initializeDisplayModePosition(position: CanvasPosition) {\r\n if (!position) {\r\n throw new Error('DisplayMode of Position was selected but no position option was given');\r\n } else {\r\n this.canvas.style.display = 'block';\r\n this.canvas.style.position = 'absolute';\r\n\r\n if (typeof position === 'string') {\r\n const specifiedPosition = position.split(' ');\r\n\r\n switch (specifiedPosition[0]) {\r\n case 'top':\r\n this.canvas.style.top = '0px';\r\n break;\r\n case 'bottom':\r\n this.canvas.style.bottom = '0px';\r\n break;\r\n case 'middle':\r\n this.canvas.style.top = '50%';\r\n const offsetY = -this.halfDrawHeight;\r\n this.canvas.style.marginTop = offsetY.toString();\r\n break;\r\n default:\r\n throw new Error('Invalid Position Given');\r\n }\r\n\r\n if (specifiedPosition[1]) {\r\n switch (specifiedPosition[1]) {\r\n case 'left':\r\n this.canvas.style.left = '0px';\r\n break;\r\n case 'right':\r\n this.canvas.style.right = '0px';\r\n break;\r\n case 'center':\r\n this.canvas.style.left = '50%';\r\n const offsetX = -this.halfDrawWidth;\r\n this.canvas.style.marginLeft = offsetX.toString();\r\n break;\r\n default:\r\n throw new Error('Invalid Position Given');\r\n }\r\n }\r\n } else {\r\n if (position.top) {\r\n typeof position.top === 'number'\r\n ? (this.canvas.style.top = position.top.toString() + 'px')\r\n : (this.canvas.style.top = position.top);\r\n }\r\n if (position.right) {\r\n typeof position.right === 'number'\r\n ? (this.canvas.style.right = position.right.toString() + 'px')\r\n : (this.canvas.style.right = position.right);\r\n }\r\n if (position.bottom) {\r\n typeof position.bottom === 'number'\r\n ? (this.canvas.style.bottom = position.bottom.toString() + 'px')\r\n : (this.canvas.style.bottom = position.bottom);\r\n }\r\n if (position.left) {\r\n typeof position.left === 'number'\r\n ? (this.canvas.style.left = position.left.toString() + 'px')\r\n : (this.canvas.style.left = position.left);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * Internal class used to build instances of AudioContext\r\n */\r\n/* istanbul ignore next */\r\nexport class AudioContextFactory {\r\n private static _INSTANCE: AudioContext = null;\r\n\r\n public static create(): AudioContext {\r\n if (!this._INSTANCE) {\r\n if ((<any>window).AudioContext || (<any>window).webkitAudioContext) {\r\n this._INSTANCE = new AudioContext();\r\n }\r\n }\r\n\r\n return this._INSTANCE;\r\n }\r\n}\r\n","import { AudioContextFactory } from '../Resources/Sound/AudioContext';\r\nimport { Logger } from './Log';\r\n\r\nexport interface LegacyWebAudioSource {\r\n playbackState: string;\r\n PLAYING_STATE: 'playing';\r\n FINISHED_STATE: 'finished';\r\n}\r\n\r\n/**\r\n * Patch for detecting legacy web audio in browsers\r\n * @internal\r\n * @param source\r\n */\r\nfunction isLegacyWebAudioSource(source: any): source is LegacyWebAudioSource {\r\n return !!source.playbackState;\r\n}\r\n\r\nexport class WebAudio {\r\n private static _UNLOCKED: boolean = false;\r\n\r\n /**\r\n * Play an empty sound to unlock Safari WebAudio context. Call this function\r\n * right after a user interaction event.\r\n * @source https://paulbakaus.com/tutorials/html5/web-audio-on-ios/\r\n */\r\n static unlock(): Promise<boolean> {\r\n const promise = new Promise<boolean>((resolve, reject) => {\r\n if (WebAudio._UNLOCKED || !AudioContextFactory.create()) {\r\n return resolve(true);\r\n }\r\n const unlockTimeoutTimer = setTimeout(() => {\r\n Logger.getInstance().warn('Excalibur was unable to unlock the audio context, audio probably will not play in this browser.');\r\n resolve(false);\r\n }, 200);\r\n\r\n const audioContext = AudioContextFactory.create();\r\n audioContext.resume().then(\r\n () => {\r\n // create empty buffer and play it\r\n const buffer = audioContext.createBuffer(1, 1, 22050);\r\n const source = audioContext.createBufferSource();\r\n let ended = false;\r\n\r\n source.buffer = buffer;\r\n source.connect(audioContext.destination);\r\n source.onended = () => (ended = true);\r\n\r\n source.start(0);\r\n\r\n // by checking the play state after some time, we know if we're really unlocked\r\n setTimeout(() => {\r\n if (isLegacyWebAudioSource(source)) {\r\n if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {\r\n WebAudio._UNLOCKED = true;\r\n }\r\n } else {\r\n if (audioContext.currentTime > 0 || ended) {\r\n WebAudio._UNLOCKED = true;\r\n }\r\n }\r\n }, 0);\r\n\r\n clearTimeout(unlockTimeoutTimer);\r\n resolve(true);\r\n },\r\n () => {\r\n reject();\r\n }\r\n );\r\n });\r\n\r\n\r\n return promise;\r\n }\r\n\r\n static isUnlocked() {\r\n return this._UNLOCKED;\r\n }\r\n}\r\n","import { GameEvent } from './Events';\r\nimport { EventDispatcher } from './EventDispatcher';\r\nimport { Eventable } from './Interfaces/Evented';\r\n\r\n/**\r\n * Excalibur base class that provides basic functionality such as [[EventDispatcher]]\r\n * and extending abilities for vanilla Javascript projects\r\n */\r\nexport class Class implements Eventable {\r\n /**\r\n * Direct access to the game object event dispatcher.\r\n */\r\n public eventDispatcher: EventDispatcher;\r\n\r\n constructor() {\r\n this.eventDispatcher = new EventDispatcher(this);\r\n }\r\n\r\n /**\r\n * Alias for `addEventListener`. You can listen for a variety of\r\n * events off of the engine; see the events section below for a complete list.\r\n * @param eventName Name of the event to listen for\r\n * @param handler Event handler for the thrown event\r\n */\r\n public on(eventName: string, handler: (event: GameEvent<any>) => void) {\r\n this.eventDispatcher.on(eventName, handler);\r\n }\r\n\r\n /**\r\n * Alias for `removeEventListener`. If only the eventName is specified\r\n * it will remove all handlers registered for that specific event. If the eventName\r\n * and the handler instance are specified only that handler will be removed.\r\n *\r\n * @param eventName Name of the event to listen for\r\n * @param handler Event handler for the thrown event\r\n */\r\n public off(eventName: string, handler?: (event: GameEvent<any>) => void) {\r\n this.eventDispatcher.off(eventName, handler);\r\n }\r\n\r\n /**\r\n * Emits a new event\r\n * @param eventName Name of the event to emit\r\n * @param eventObject Data associated with this event\r\n */\r\n public emit(eventName: string, eventObject: GameEvent<any>) {\r\n this.eventDispatcher.emit(eventName, eventObject);\r\n }\r\n\r\n /**\r\n * Once listens to an event one time, then unsubscribes from that event\r\n *\r\n * @param eventName The name of the event to subscribe to once\r\n * @param handler The handler of the event that will be auto unsubscribed\r\n */\r\n public once(eventName: string, handler: (event: GameEvent<any>) => void) {\r\n this.eventDispatcher.once(eventName, handler);\r\n }\r\n}\r\n","import { Color } from '../Color';\nimport { Vector } from '../Math/vector';\n\n/**\n * A canvas linecap style. \"butt\" is the default flush style, \"round\" is a semi-circle cap with a radius half the width of\n * the line, and \"square\" is a rectangle that is an equal width and half height cap.\n */\nexport type LineCapStyle = 'butt' | 'round' | 'square';\n\n/* istanbul ignore next */\n/**\n * Draw a line on canvas context\n *\n * @param ctx The canvas context\n * @param color The color of the line\n * @param x1 The start x coordinate\n * @param y1 The start y coordinate\n * @param x2 The ending x coordinate\n * @param y2 The ending y coordinate\n * @param thickness The line thickness\n * @param cap The [[LineCapStyle]] (butt, round, or square)\n */\nexport function line(\n ctx: CanvasRenderingContext2D,\n color: Color = Color.Red,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n thickness: number = 1,\n cap: LineCapStyle = 'butt'\n) {\n ctx.beginPath();\n ctx.lineWidth = thickness;\n ctx.lineCap = cap;\n ctx.strokeStyle = color.toString();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.closePath();\n ctx.stroke();\n}\n\n/* istanbul ignore next */\n/**\n * Draw the vector as a point onto the canvas.\n */\nexport function point(ctx: CanvasRenderingContext2D, color: Color = Color.Red, point: Vector): void {\n ctx.beginPath();\n ctx.strokeStyle = color.toString();\n ctx.arc(point.x, point.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n}\n\n/**\n * Draw the vector as a line onto the canvas starting a origin point.\n */\n/* istanbul ignore next */\n/**\n *\n */\nexport function vector(ctx: CanvasRenderingContext2D, color: Color, origin: Vector, vector: Vector, scale: number = 1.0): void {\n const c = color ? color.toString() : 'blue';\n const v = vector.scale(scale);\n ctx.beginPath();\n ctx.strokeStyle = c;\n ctx.moveTo(origin.x, origin.y);\n ctx.lineTo(origin.x + v.x, origin.y + v.y);\n ctx.closePath();\n ctx.stroke();\n}\n\n/**\n * Represents border radius values\n */\nexport interface BorderRadius {\n /**\n * Top-left\n */\n tl: number;\n /**\n * Top-right\n */\n tr: number;\n /**\n * Bottom-right\n */\n br: number;\n /**\n * Bottom-left\n */\n bl: number;\n}\n\n/**\n * Draw a round rectangle on a canvas context\n *\n * @param ctx The canvas context\n * @param x The top-left x coordinate\n * @param y The top-left y coordinate\n * @param width The width of the rectangle\n * @param height The height of the rectangle\n * @param radius The border radius of the rectangle\n * @param stroke The [[Color]] to stroke rectangle with\n * @param fill The [[Color]] to fill rectangle with\n */\nexport function roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number | BorderRadius = 5,\n stroke: Color = Color.White,\n fill: Color = null\n) {\n let br: BorderRadius;\n\n if (typeof radius === 'number') {\n br = { tl: radius, tr: radius, br: radius, bl: radius };\n } else {\n const defaultRadius: BorderRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\n\n for (const prop in defaultRadius) {\n if (defaultRadius.hasOwnProperty(prop)) {\n const side = <keyof BorderRadius>prop;\n br[side] = radius[side] || defaultRadius[side];\n }\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + br.tl, y);\n ctx.lineTo(x + width - br.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + br.tr);\n ctx.lineTo(x + width, y + height - br.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - br.br, y + height);\n ctx.lineTo(x + br.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - br.bl);\n ctx.lineTo(x, y + br.tl);\n ctx.quadraticCurveTo(x, y, x + br.tl, y);\n ctx.closePath();\n\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n\n/**\n *\n */\nexport function circle(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n radius: number,\n stroke: Color = Color.White,\n fill: Color = null\n) {\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n\n if (fill) {\n ctx.fillStyle = fill.toString();\n ctx.fill();\n }\n\n if (stroke) {\n ctx.strokeStyle = stroke.toString();\n ctx.stroke();\n }\n}\n","export default \"data:image/png;base64,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\"","import { Color } from './Color';\r\nimport { WebAudio } from './Util/WebAudio';\r\nimport { Engine } from './Engine';\r\nimport { Loadable } from './Interfaces/Loadable';\r\nimport { Class } from './Class';\r\nimport * as DrawUtil from './Util/DrawUtil';\r\n\r\nimport logoImg from './Loader.logo.png';\r\nimport loaderCss from './Loader.css';\r\nimport { Canvas } from './Graphics/Canvas';\r\nimport { Vector } from './Math/vector';\r\nimport { clamp, delay } from './Util/Util';\r\n\r\n/**\r\n * Pre-loading assets\r\n *\r\n * The loader provides a mechanism to preload multiple resources at\r\n * one time. The loader must be passed to the engine in order to\r\n * trigger the loading progress bar.\r\n *\r\n * The [[Loader]] itself implements [[Loadable]] so you can load loaders.\r\n *\r\n * ## Example: Pre-loading resources for a game\r\n *\r\n * ```js\r\n * // create a loader\r\n * var loader = new ex.Loader();\r\n *\r\n * // create a resource dictionary (best practice is to keep a separate file)\r\n * var resources = {\r\n * TextureGround: new ex.Texture(\"/images/textures/ground.png\"),\r\n * SoundDeath: new ex.Sound(\"/sound/death.wav\", \"/sound/death.mp3\")\r\n * };\r\n *\r\n * // loop through dictionary and add to loader\r\n * for (var loadable in resources) {\r\n * if (resources.hasOwnProperty(loadable)) {\r\n * loader.addResource(resources[loadable]);\r\n * }\r\n * }\r\n *\r\n * // start game\r\n * game.start(loader).then(function () {\r\n * console.log(\"Game started!\");\r\n * });\r\n * ```\r\n *\r\n * ## Customize the Loader\r\n *\r\n * The loader can be customized to show different, text, logo, background color, and button.\r\n *\r\n * ```typescript\r\n * const loader = new ex.Loader([playerTexture]);\r\n *\r\n * // The loaders button text can simply modified using this\r\n * loader.playButtonText = 'Start the best game ever';\r\n *\r\n * // The logo can be changed by inserting a base64 image string here\r\n *\r\n * loader.logo = 'data:image/png;base64,iVBORw...';\r\n * loader.logoWidth = 15;\r\n * loader.logoHeight = 14;\r\n *\r\n * // The background color can be changed like so by supplying a valid CSS color string\r\n *\r\n * loader.backgroundColor = 'red'\r\n * loader.backgroundColor = '#176BAA'\r\n *\r\n * // To build a completely new button\r\n * loader.startButtonFactory = () => {\r\n * let myButton = document.createElement('button');\r\n * myButton.textContent = 'The best button';\r\n * return myButton;\r\n * };\r\n *\r\n * engine.start(loader).then(() => {});\r\n * ```\r\n */\r\nexport class Loader extends Class implements Loadable<Loadable<any>[]> {\r\n public canvas: Canvas = new Canvas({\r\n smoothing: true,\r\n draw: this.draw.bind(this)\r\n });\r\n private _resourceList: Loadable<any>[] = [];\r\n private _index = 0;\r\n\r\n private _playButtonShown: boolean = false;\r\n private _resourceCount: number = 0;\r\n private _numLoaded: number = 0;\r\n private _progressCounts: { [key: string]: number } = {};\r\n private _totalCounts: { [key: string]: number } = {};\r\n private _engine: Engine;\r\n\r\n // logo drawing stuff\r\n\r\n // base64 string encoding of the excalibur logo (logo-white.png)\r\n public logo = logoImg;\r\n public logoWidth = 468;\r\n public logoHeight = 118;\r\n /**\r\n * Positions the top left corner of the logo image\r\n * If not set, the loader automatically positions the logo\r\n */\r\n public logoPosition: Vector | null;\r\n /**\r\n * Positions the top left corner of the play button.\r\n * If not set, the loader automatically positions the play button\r\n */\r\n public playButtonPosition: Vector | null;\r\n /**\r\n * Positions the top left corner of the loading bar\r\n * If not set, the loader automatically positions the loading bar\r\n */\r\n public loadingBarPosition: Vector | null;\r\n\r\n /**\r\n * Gets or sets the color of the loading bar, default is [[Color.White]]\r\n */\r\n public loadingBarColor: Color = Color.White;\r\n\r\n /**\r\n * Gets or sets the background color of the loader as a hex string\r\n */\r\n public backgroundColor: string = '#176BAA';\r\n\r\n protected _imageElement: HTMLImageElement;\r\n protected get _image() {\r\n if (!this._imageElement) {\r\n this._imageElement = new Image();\r\n this._imageElement.src = this.logo;\r\n }\r\n\r\n return this._imageElement;\r\n }\r\n\r\n public suppressPlayButton: boolean = false;\r\n public get playButtonRootElement(): HTMLElement | null {\r\n return this._playButtonRootElement;\r\n }\r\n public get playButtonElement(): HTMLButtonElement | null {\r\n return this._playButtonElement;\r\n }\r\n protected _playButtonRootElement: HTMLElement;\r\n protected _playButtonElement: HTMLButtonElement;\r\n protected _styleBlock: HTMLStyleElement;\r\n /** Loads the css from Loader.css */\r\n protected _playButtonStyles: string = loaderCss.toString();\r\n protected get _playButton() {\r\n const existingRoot = document.getElementById('excalibur-play-root');\r\n if (existingRoot) {\r\n this._playButtonRootElement = existingRoot;\r\n }\r\n if (!this._playButtonRootElement) {\r\n this._playButtonRootElement = document.createElement('div');\r\n this._playButtonRootElement.id = 'excalibur-play-root';\r\n this._playButtonRootElement.style.position = 'absolute';\r\n document.body.appendChild(this._playButtonRootElement);\r\n }\r\n if (!this._styleBlock) {\r\n this._styleBlock = document.createElement('style');\r\n this._styleBlock.textContent = this._playButtonStyles;\r\n document.head.appendChild(this._styleBlock);\r\n }\r\n if (!this._playButtonElement) {\r\n this._playButtonElement = this.startButtonFactory();\r\n this._playButtonRootElement.appendChild(this._playButtonElement);\r\n }\r\n return this._playButtonElement;\r\n }\r\n\r\n /**\r\n * Get/set play button text\r\n */\r\n public playButtonText: string = 'Play game';\r\n\r\n /**\r\n * Return a html button element for excalibur to use as a play button\r\n */\r\n public startButtonFactory = () => {\r\n let buttonElement: HTMLButtonElement = document.getElementById('excalibur-play') as HTMLButtonElement;\r\n if (!buttonElement) {\r\n buttonElement = document.createElement('button');\r\n }\r\n\r\n buttonElement.id = 'excalibur-play';\r\n buttonElement.textContent = this.playButtonText;\r\n buttonElement.style.display = 'none';\r\n return buttonElement;\r\n };\r\n\r\n /**\r\n * @param loadables Optionally provide the list of resources you want to load at constructor time\r\n */\r\n constructor(loadables?: Loadable<any>[]) {\r\n super();\r\n\r\n if (loadables) {\r\n this.addResources(loadables);\r\n }\r\n }\r\n\r\n public wireEngine(engine: Engine) {\r\n this._engine = engine;\r\n this.canvas.width = this._engine.canvas.width;\r\n this.canvas.height = this._engine.canvas.height;\r\n }\r\n\r\n /**\r\n * Add a resource to the loader to load\r\n * @param loadable Resource to add\r\n */\r\n public addResource(loadable: Loadable<any>) {\r\n const key = this._index++;\r\n this._resourceList.push(loadable);\r\n this._progressCounts[key] = 0;\r\n this._totalCounts[key] = 1;\r\n this._resourceCount++;\r\n }\r\n\r\n /**\r\n * Add a list of resources to the loader to load\r\n * @param loadables The list of resources to load\r\n */\r\n public addResources(loadables: Loadable<any>[]) {\r\n let i = 0;\r\n const len = loadables.length;\r\n\r\n for (i; i < len; i++) {\r\n this.addResource(loadables[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the loader has completely loaded all resources\r\n */\r\n public isLoaded() {\r\n return this._numLoaded === this._resourceCount;\r\n }\r\n\r\n /**\r\n * Shows the play button and returns a promise that resolves when clicked\r\n */\r\n public showPlayButton(): Promise<void> {\r\n if (this.suppressPlayButton) {\r\n this.hidePlayButton();\r\n return Promise.resolve();\r\n } else {\r\n const resizeHandler = () => {\r\n this._positionPlayButton();\r\n };\r\n if (this._engine?.browser) {\r\n this._engine.browser.window.on('resize', resizeHandler);\r\n }\r\n this._playButtonShown = true;\r\n this._playButton.style.display = 'block';\r\n document.body.addEventListener('keyup', (evt: KeyboardEvent) => {\r\n if (evt.key === 'Enter') {\r\n this._playButton.click();\r\n }\r\n });\r\n const promise = new Promise<void>((resolve) => {\r\n const startButtonHandler = (e: Event) => {\r\n // We want to stop propogation to keep bubbling to the engine pointer handlers\r\n e.stopPropagation();\r\n // Hide Button after click\r\n this.hidePlayButton();\r\n if (this._engine?.browser) {\r\n this._engine.browser.window.off('resize', resizeHandler);\r\n }\r\n resolve();\r\n };\r\n this._playButton.addEventListener('click', startButtonHandler);\r\n this._playButton.addEventListener('touchend', startButtonHandler);\r\n this._playButton.addEventListener('pointerup', startButtonHandler);\r\n });\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n public hidePlayButton() {\r\n this._playButtonShown = false;\r\n this._playButton.style.display = 'none';\r\n }\r\n\r\n /**\r\n * Clean up generated elements for the loader\r\n */\r\n public dispose() {\r\n if (this._playButtonRootElement.parentElement) {\r\n this._playButtonRootElement.removeChild(this._playButtonElement);\r\n document.body.removeChild(this._playButtonRootElement);\r\n document.head.removeChild(this._styleBlock);\r\n this._playButtonRootElement = null;\r\n this._playButtonElement = null;\r\n this._styleBlock = null;\r\n }\r\n }\r\n\r\n update(_engine: Engine, _delta: number): void {\r\n // override me\r\n }\r\n\r\n data: Loadable<any>[];\r\n\r\n /**\r\n * Begin loading all of the supplied resources, returning a promise\r\n * that resolves when loading of all is complete\r\n */\r\n public async load(): Promise<Loadable<any>[]> {\r\n await Promise.all(\r\n this._resourceList.map((r) =>\r\n r.load().finally(() => {\r\n // capture progress\r\n this._numLoaded++;\r\n })\r\n )\r\n );\r\n\r\n // short delay in showing the button for aesthetics\r\n await delay(200);\r\n await this.showPlayButton();\r\n // Unlock browser AudioContext in after user gesture\r\n // See: https://github.com/excaliburjs/Excalibur/issues/262\r\n // See: https://github.com/excaliburjs/Excalibur/issues/1031\r\n await WebAudio.unlock();\r\n\r\n return (this.data = this._resourceList);\r\n }\r\n\r\n public markResourceComplete(): void {\r\n this._numLoaded++;\r\n }\r\n\r\n /**\r\n * Returns the progess of the loader as a number between [0, 1] inclusive.\r\n */\r\n public get progress(): number {\r\n return this._resourceCount > 0 ? clamp(this._numLoaded, 0, this._resourceCount) / this._resourceCount : 1;\r\n }\r\n\r\n private _positionPlayButton() {\r\n const screenHeight = this._engine.screen.viewport.height;\r\n const screenWidth = this._engine.screen.viewport.width;\r\n if (this._playButtonRootElement) {\r\n const left = this._engine.canvas.offsetLeft;\r\n const top = this._engine.canvas.offsetTop;\r\n const buttonWidth = this._playButton.clientWidth;\r\n const buttonHeight = this._playButton.clientHeight;\r\n if (this.playButtonPosition) {\r\n this._playButtonRootElement.style.left = `${this.playButtonPosition.x}px`;\r\n this._playButtonRootElement.style.top = `${this.playButtonPosition.y}px`;\r\n } else {\r\n this._playButtonRootElement.style.left = `${left + screenWidth / 2 - buttonWidth / 2}px`;\r\n this._playButtonRootElement.style.top = `${top + screenHeight / 2 - buttonHeight / 2 + 100}px`;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Loader draw function. Draws the default Excalibur loading screen.\r\n * Override `logo`, `logoWidth`, `logoHeight` and `backgroundColor` properties\r\n * to customize the drawing, or just override entire method.\r\n */\r\n public draw(ctx: CanvasRenderingContext2D) {\r\n const canvasHeight = this._engine.canvasHeight / this._engine.pixelRatio;\r\n const canvasWidth = this._engine.canvasWidth / this._engine.pixelRatio;\r\n\r\n this._positionPlayButton();\r\n\r\n ctx.fillStyle = this.backgroundColor;\r\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\r\n\r\n let logoY = canvasHeight / 2;\r\n const width = Math.min(this.logoWidth, canvasWidth * 0.75);\r\n let logoX = canvasWidth / 2 - width / 2;\r\n\r\n if (this.logoPosition) {\r\n logoX = this.logoPosition.x;\r\n logoY = this.logoPosition.y;\r\n }\r\n\r\n const imageHeight = Math.floor(width * (this.logoHeight / this.logoWidth)); // OG height/width factor\r\n const oldAntialias = this._engine.getAntialiasing();\r\n this._engine.setAntialiasing(true);\r\n if (!this.logoPosition) {\r\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY - imageHeight - 20, width, imageHeight);\r\n } else {\r\n ctx.drawImage(this._image, 0, 0, this.logoWidth, this.logoHeight, logoX, logoY, width, imageHeight);\r\n }\r\n\r\n // loading box\r\n if (!this.suppressPlayButton && this._playButtonShown) {\r\n this._engine.setAntialiasing(oldAntialias);\r\n return;\r\n }\r\n\r\n let loadingX = logoX;\r\n let loadingY = logoY;\r\n if (this.loadingBarPosition) {\r\n loadingX = this.loadingBarPosition.x;\r\n loadingY = this.loadingBarPosition.y;\r\n }\r\n\r\n ctx.lineWidth = 2;\r\n DrawUtil.roundRect(ctx, loadingX, loadingY, width, 20, 10, this.loadingBarColor);\r\n const progress = width * this.progress;\r\n const margin = 5;\r\n const progressWidth = progress - margin * 2;\r\n const height = 20 - margin * 2;\r\n DrawUtil.roundRect(\r\n ctx,\r\n loadingX + margin,\r\n loadingY + margin,\r\n progressWidth > 10 ? progressWidth : 10,\r\n height,\r\n 5,\r\n null,\r\n this.loadingBarColor\r\n );\r\n this._engine.setAntialiasing(oldAntialias);\r\n }\r\n}\r\n","import { Logger } from './Log';\r\n/**\r\n * This is the list of features that will be used to log the supported\r\n * features to the console when Detector.logBrowserFeatures() is called.\r\n */\r\n\r\nconst REPORTED_FEATURES: { [key: string]: string } = {\r\n webgl: 'WebGL',\r\n webaudio: 'WebAudio',\r\n gamepadapi: 'Gamepad API'\r\n};\r\n\r\n/**\r\n * Interface for detected browser features matrix\r\n */\r\nexport interface DetectedFeatures {\r\n readonly canvas: boolean;\r\n readonly arraybuffer: boolean;\r\n readonly dataurl: boolean;\r\n readonly objecturl: boolean;\r\n readonly rgba: boolean;\r\n readonly webaudio: boolean;\r\n readonly webgl: boolean;\r\n readonly gamepadapi: boolean;\r\n}\r\n\r\ninterface CriticalTests {\r\n canvasSupport(): boolean;\r\n arrayBufferSupport(): boolean;\r\n dataUrlSupport(): boolean;\r\n objectUrlSupport(): boolean;\r\n rgbaSupport(): boolean;\r\n}\r\n\r\ninterface WarningTests {\r\n webAudioSupport(): boolean;\r\n webglSupport(): boolean;\r\n}\r\n\r\n/**\r\n * Excalibur internal feature detection helper class\r\n */\r\nexport class Detector {\r\n private _features: DetectedFeatures = null;\r\n\r\n public failedTests: string[] = [];\r\n\r\n public constructor() {\r\n this._features = this._loadBrowserFeatures();\r\n }\r\n\r\n /**\r\n * Returns a map of currently supported browser features. This method\r\n * treats the features as a singleton and will only calculate feature\r\n * support if it has not previously been done.\r\n */\r\n public getBrowserFeatures(): DetectedFeatures {\r\n if (this._features === null) {\r\n this._features = this._loadBrowserFeatures();\r\n }\r\n return this._features;\r\n }\r\n\r\n /**\r\n * Report on non-critical browser support for debugging purposes.\r\n * Use native browser console colors for visibility.\r\n */\r\n public logBrowserFeatures(): void {\r\n let msg = '%cSUPPORTED BROWSER FEATURES\\n==========================%c\\n';\r\n const args = ['font-weight: bold; color: navy', 'font-weight: normal; color: inherit'];\r\n\r\n const supported: any = this.getBrowserFeatures();\r\n for (const feature of Object.keys(REPORTED_FEATURES)) {\r\n if (supported[feature]) {\r\n msg += '(%c\\u2713%c)'; // (✓)\r\n args.push('font-weight: bold; color: green');\r\n args.push('font-weight: normal; color: inherit');\r\n } else {\r\n msg += '(%c\\u2717%c)'; // (✗)\r\n args.push('font-weight: bold; color: red');\r\n args.push('font-weight: normal; color: inherit');\r\n }\r\n\r\n msg += ' ' + REPORTED_FEATURES[feature] + '\\n';\r\n }\r\n\r\n args.unshift(msg);\r\n // eslint-disable-next-line no-console\r\n console.log.apply(console, args);\r\n }\r\n\r\n /**\r\n * Executes several IIFE's to get a constant reference to supported\r\n * features within the current execution context.\r\n */\r\n private _loadBrowserFeatures(): DetectedFeatures {\r\n return {\r\n // IIFE to check canvas support\r\n canvas: (() => {\r\n return this._criticalTests.canvasSupport();\r\n })(),\r\n\r\n // IIFE to check arraybuffer support\r\n arraybuffer: (() => {\r\n return this._criticalTests.arrayBufferSupport();\r\n })(),\r\n\r\n // IIFE to check dataurl support\r\n dataurl: (() => {\r\n return this._criticalTests.dataUrlSupport();\r\n })(),\r\n\r\n // IIFE to check objecturl support\r\n objecturl: (() => {\r\n return this._criticalTests.objectUrlSupport();\r\n })(),\r\n\r\n // IIFE to check rgba support\r\n rgba: (() => {\r\n return this._criticalTests.rgbaSupport();\r\n })(),\r\n\r\n // IIFE to check webaudio support\r\n webaudio: (() => {\r\n return this._warningTest.webAudioSupport();\r\n })(),\r\n\r\n // IIFE to check webgl support\r\n webgl: (() => {\r\n return this._warningTest.webglSupport();\r\n })(),\r\n\r\n // IIFE to check gamepadapi support\r\n gamepadapi: (() => {\r\n return !!(<any>navigator).getGamepads;\r\n })()\r\n };\r\n }\r\n\r\n // critical browser features required for ex to run\r\n private _criticalTests: CriticalTests = {\r\n // Test canvas/2d context support\r\n canvasSupport: function() {\r\n const elem = document.createElement('canvas');\r\n return !!(elem.getContext && elem.getContext('2d'));\r\n },\r\n\r\n // Test array buffer support ex uses for downloading binary data\r\n arrayBufferSupport: function() {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('GET', '/');\r\n try {\r\n xhr.responseType = 'arraybuffer';\r\n } catch (e) {\r\n return false;\r\n }\r\n return xhr.responseType === 'arraybuffer';\r\n },\r\n\r\n // Test data urls ex uses for sprites\r\n dataUrlSupport: function() {\r\n const canvas = document.createElement('canvas');\r\n return canvas.toDataURL('image/png').indexOf('data:image/png') === 0;\r\n },\r\n\r\n // Test object url support for loading\r\n objectUrlSupport: function() {\r\n return 'URL' in window && 'revokeObjectURL' in URL && 'createObjectURL' in URL;\r\n },\r\n\r\n // RGBA support for colors\r\n rgbaSupport: function() {\r\n const style = document.createElement('a').style;\r\n style.cssText = 'background-color:rgba(150,255,150,.5)';\r\n return ('' + style.backgroundColor).indexOf('rgba') > -1;\r\n }\r\n };\r\n\r\n // warnings excalibur performance will be degraded\r\n private _warningTest: WarningTests = {\r\n webAudioSupport: function() {\r\n return !!(\r\n (<any>window).AudioContext ||\r\n (<any>window).webkitAudioContext ||\r\n (<any>window).mozAudioContext ||\r\n (<any>window).msAudioContext ||\r\n (<any>window).oAudioContext\r\n );\r\n },\r\n webglSupport: function() {\r\n const elem = document.createElement('canvas');\r\n return !!(elem.getContext && elem.getContext('webgl'));\r\n }\r\n };\r\n\r\n public test(): boolean {\r\n // Critical test will for ex not to run\r\n let failedCritical = false;\r\n for (const test in this._criticalTests) {\r\n if (!this._criticalTests[<keyof CriticalTests>test].call(this)) {\r\n this.failedTests.push(test);\r\n Logger.getInstance().error('Critical browser feature missing, Excalibur requires:', test);\r\n failedCritical = true;\r\n }\r\n }\r\n if (failedCritical) {\r\n return false;\r\n }\r\n\r\n // Warning tests do not for ex to return false to compatibility\r\n for (const warning in this._warningTest) {\r\n if (!this._warningTest[<keyof WarningTests>warning]()) {\r\n Logger.getInstance().warn('Warning browser feature missing, Excalibur will have reduced performance:', warning);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n","/**\r\n * An enum that describes the types of collisions bodies can participate in\r\n */\r\nexport enum CollisionType {\r\n /**\r\n * Bodies with the `PreventCollision` setting do not participate in any\r\n * collisions and do not raise collision events.\r\n */\r\n PreventCollision = 'PreventCollision',\r\n /**\r\n * Bodies with the `Passive` setting only raise collision events, but are not\r\n * influenced or moved by other bodies and do not influence or move other bodies.\r\n * This is useful for use in trigger type behavior.\r\n */\r\n Passive = 'Passive',\r\n /**\r\n * Bodies with the `Active` setting raise collision events and participate\r\n * in collisions with other bodies and will be push or moved by bodies sharing\r\n * the `Active` or `Fixed` setting.\r\n */\r\n Active = 'Active',\r\n /**\r\n * Bodies with the `Fixed` setting raise collision events and participate in\r\n * collisions with other bodies. Actors with the `Fixed` setting will not be\r\n * pushed or moved by other bodies sharing the `Fixed`. Think of Fixed\r\n * bodies as \"immovable/unstoppable\" objects. If two `Fixed` bodies meet they will\r\n * not be pushed or moved by each other, they will not interact except to throw\r\n * collision events.\r\n */\r\n Fixed = 'Fixed'\r\n}\r\n","import { Vector } from '../Math/vector';\r\nimport { obsolete } from '../Util/Decorators';\r\n\r\n\r\n/**\r\n * Possible collision resolution strategies\r\n *\r\n * The default is [[CollisionResolutionStrategy.Arcade]] which performs simple axis aligned arcade style physics. This is useful for things\r\n * like platformers or top down games.\r\n *\r\n * More advanced rigid body physics are enabled by setting [[CollisionResolutionStrategy.Realistic]] which allows for complicated\r\n * simulated physical interactions.\r\n */\r\nexport enum CollisionResolutionStrategy {\r\n Arcade = 'arcade',\r\n Realistic = 'realistic'\r\n}\r\n\r\n/**\r\n * Possible broadphase collision pair identification strategies\r\n *\r\n * The default strategy is [[BroadphaseStrategy.DynamicAABBTree]] which uses a binary tree of axis-aligned bounding boxes to identify\r\n * potential collision pairs which is O(nlog(n)) faster.\r\n */\r\nexport enum BroadphaseStrategy {\r\n DynamicAABBTree\r\n}\r\n\r\n/**\r\n * Possible numerical integrators for position and velocity\r\n */\r\nexport enum Integrator {\r\n Euler\r\n}\r\n\r\n/**\r\n * The [[Physics]] object is the global configuration object for all Excalibur physics.\r\n */\r\n/* istanbul ignore next */\r\nexport class Physics {\r\n /**\r\n * Global acceleration that is applied to all vanilla actors that have a [[CollisionType.Active|active]] collision type.\r\n * Global acceleration won't effect [[Label|labels]], [[ScreenElement|ui actors]], or [[Trigger|triggers]] in Excalibur.\r\n *\r\n * This is a great way to globally simulate effects like gravity.\r\n */\r\n public static acc = new Vector(0, 0);\r\n public static get gravity() {\r\n return Physics.acc;\r\n }\r\n public static set gravity(v: Vector) {\r\n Physics.acc = v;\r\n }\r\n\r\n /**\r\n * Globally switches all Excalibur physics behavior on or off.\r\n */\r\n public static enabled = true;\r\n\r\n /**\r\n * Gets or sets the broadphase pair identification strategy.\r\n *\r\n * The default strategy is [[BroadphaseStrategy.DynamicAABBTree]] which uses a binary tree of axis-aligned bounding boxes to identify\r\n * potential collision pairs which is O(nlog(n)) faster.\r\n */\r\n public static broadphaseStrategy: BroadphaseStrategy = BroadphaseStrategy.DynamicAABBTree;\r\n\r\n /**\r\n * Gets or sets the global collision resolution strategy (narrowphase).\r\n *\r\n * The default is [[CollisionResolutionStrategy.Arcade]] which performs simple axis aligned arcade style physics.\r\n *\r\n * More advanced rigid body physics are enabled by setting [[CollisionResolutionStrategy.Realistic]] which allows for complicated\r\n * simulated physical interactions.\r\n */\r\n public static collisionResolutionStrategy: CollisionResolutionStrategy = CollisionResolutionStrategy.Arcade;\r\n /**\r\n * The default mass to use if none is specified\r\n */\r\n public static defaultMass: number = 10;\r\n /**\r\n * Gets or sets the position and velocity positional integrator, currently only Euler is supported.\r\n */\r\n public static integrator: Integrator = Integrator.Euler;\r\n\r\n /**\r\n * Configures Excalibur to use \"arcade\" physics. Arcade physics which performs simple axis aligned arcade style physics.\r\n */\r\n public static useArcadePhysics(): void {\r\n Physics.collisionResolutionStrategy = CollisionResolutionStrategy.Arcade;\r\n }\r\n\r\n /**\r\n * Configures Excalibur to use rigid body physics. Rigid body physics allows for complicated\r\n * simulated physical interactions.\r\n */\r\n public static useRealisticPhysics(): void {\r\n Physics.collisionResolutionStrategy = CollisionResolutionStrategy.Realistic;\r\n }\r\n\r\n /**\r\n * Factor to add to the RigidBody BoundingBox, bounding box (dimensions += vel * dynamicTreeVelocityMultiplier);\r\n */\r\n public static dynamicTreeVelocityMultiplier = 2;\r\n\r\n @obsolete({\r\n message: 'Alias for incorrect spelling used in older versions, will be removed in v0.25.0',\r\n alternateMethod: 'dynamicTreeVelocityMultiplier'\r\n })\r\n public static get dynamicTreeVelocityMultiplyer() {\r\n return Physics.dynamicTreeVelocityMultiplier;\r\n }\r\n\r\n public static set dynamicTreeVelocityMultiplyer(value: number) {\r\n Physics.dynamicTreeVelocityMultiplier = value;\r\n }\r\n\r\n /**\r\n * Pad RigidBody BoundingBox by a constant amount\r\n */\r\n public static boundsPadding = 5;\r\n\r\n /**\r\n * Number of position iterations (overlap) to run in the solver\r\n */\r\n public static positionIterations = 3;\r\n\r\n /**\r\n * Number of velocity iteration (response) to run in the solver\r\n */\r\n public static velocityIterations = 8;\r\n\r\n /**\r\n * Amount of overlap to tolerate in pixels\r\n */\r\n public static slop = 1;\r\n\r\n /**\r\n * Amount of positional overlap correction to apply each position iteration of the solver\r\n * O - meaning no correction, 1 - meaning correct all overlap\r\n */\r\n public static steeringFactor = 0.2;\r\n\r\n /**\r\n * Warm start set to true re-uses impulses from previous frames back in the solver\r\n */\r\n public static warmStart = true;\r\n\r\n /**\r\n * By default bodies do not sleep\r\n */\r\n public static bodiesCanSleepByDefault = false;\r\n\r\n /**\r\n * Surface epsilon is used to help deal with surface penetration\r\n */\r\n public static surfaceEpsilon = 0.1;\r\n\r\n public static sleepEpsilon = 0.07;\r\n\r\n public static wakeThreshold = Physics.sleepEpsilon * 3;\r\n\r\n public static sleepBias = 0.9;\r\n\r\n /**\r\n * Enable fast moving body checking, this enables checking for collision pairs via raycast for fast moving objects to prevent\r\n * bodies from tunneling through one another.\r\n */\r\n public static checkForFastBodies = true;\r\n\r\n /**\r\n * Disable minimum fast moving body raycast, by default if ex.Physics.checkForFastBodies = true Excalibur will only check if the\r\n * body is moving at least half of its minimum dimension in an update. If ex.Physics.disableMinimumSpeedForFastBody is set to true,\r\n * Excalibur will always perform the fast body raycast regardless of speed.\r\n */\r\n public static disableMinimumSpeedForFastBody = false;\r\n}\r\n","import { Vector } from './vector';\r\n\r\nexport interface VectorViewOptions {\r\n getX: () => number;\r\n getY: () => number;\r\n setX: (x: number) => void;\r\n setY: (y: number) => void;\r\n}\r\nexport class VectorView extends Vector {\r\n private _getX: () => number;\r\n private _getY: () => number;\r\n private _setX: (x: number) => void;\r\n private _setY: (y: number) => void;\r\n constructor(options: VectorViewOptions) {\r\n super(0, 0);\r\n this._getX = options.getX;\r\n this._getY = options.getY;\r\n this._setX = options.setX;\r\n this._setY = options.setY;\r\n }\r\n public get x() {\r\n return (this._x = this._getX());\r\n }\r\n\r\n public set x(val) {\r\n this._setX(val);\r\n this._x = val;\r\n }\r\n\r\n public get y() {\r\n return (this._y = this._getY());\r\n }\r\n public set y(val) {\r\n this._setY(val);\r\n this._y = val;\r\n }\r\n}\r\n","import { Entity } from './Entity';\r\n\r\n/**\r\n * Component Contructor Types\r\n */\r\nexport declare type ComponentCtor<T extends Component = Component> = new (...args:any[]) => T;\r\n\r\n/**\r\n * Type guard to check if a component implements clone\r\n * @param x\r\n */\r\nfunction hasClone(x: any): x is { clone(): any } {\r\n return !!x?.clone;\r\n}\r\n\r\nexport type ComponentType<ComponentToParse> = ComponentToParse extends Component<infer TypeName> ? TypeName : never;\r\n\r\n/**\r\n * Plucks the string type out of a component type\r\n */\r\nexport type ComponentStringType<T> = T extends Component<infer R> ? R : string;\r\n\r\n/**\r\n * Components are containers for state in Excalibur, the are meant to convey capabilities that an Entity posesses\r\n *\r\n * Implementations of Component must have a zero-arg constructor to support dependecies\r\n *\r\n * ```typescript\r\n * class MyComponent extends ex.Component<'my'> {\r\n * public readonly type = 'my';\r\n * // zero arg support required if you want to use component dependencies\r\n * constructor(public optionalPos?: ex.Vector) {}\r\n * }\r\n * ```\r\n */\r\nexport abstract class Component<TypeName extends string = string> {\r\n /**\r\n * Optionally list any component types this component depends on\r\n * If the owner entity does not have these components, new components will be added to the entity\r\n *\r\n * Only components with zero-arg constructors are supported as automatic component dependencies\r\n */\r\n readonly dependencies?: ComponentCtor[];\r\n\r\n // todo implement optional\r\n readonly optional?: ComponentCtor[];\r\n\r\n /**\r\n * Type of this component, must be a unique type among component types in you game.\r\n */\r\n abstract readonly type: TypeName;\r\n\r\n /**\r\n * Current owning [[Entity]], if any, of this component. Null if not added to any [[Entity]]\r\n */\r\n owner?: Entity = null;\r\n\r\n /**\r\n * Clones any properties on this component, if that property value has a `clone()` method it will be called\r\n */\r\n clone(): this {\r\n const newComponent = new (this.constructor as any)();\r\n for (const prop in this) {\r\n if (this.hasOwnProperty(prop)) {\r\n const val = this[prop];\r\n if (hasClone(val) && prop !== 'owner' && prop !== 'clone') {\r\n newComponent[prop] = val.clone();\r\n } else {\r\n newComponent[prop] = val;\r\n }\r\n }\r\n }\r\n return newComponent;\r\n }\r\n\r\n /**\r\n * Optional callback called when a component is added to an entity\r\n */\r\n onAdd?(owner: Entity): void;\r\n\r\n /**\r\n * Opitonal callback called when acomponent is added to an entity\r\n */\r\n onRemove?(previousOwner: Entity): void;\r\n}\r\n\r\n/**\r\n * Tag components are a way of tagging a component with label and a simple value\r\n *\r\n * For example:\r\n *\r\n * ```typescript\r\n * const isOffscreen = new TagComponent('offscreen');\r\n * entity.addComponent(isOffscreen);\r\n * entity.tags.includes\r\n * ```\r\n */\r\nexport class TagComponent<TypeName extends string, MaybeValueType extends string | symbol | number | boolean = never> extends Component<\r\nTypeName\r\n> {\r\n constructor(public readonly type: TypeName, public readonly value?: MaybeValueType) {\r\n super();\r\n }\r\n}\r\n","import { Matrix, MatrixLocations } from '../../Math/matrix';\r\nimport { VectorView } from '../../Math/vector-view';\r\nimport { Vector, vec } from '../../Math/vector';\r\nimport { Component } from '../Component';\r\n\r\nexport interface Transform {\r\n /**\r\n * The [[CoordPlane|coordinate plane]] for this transform for the entity.\r\n */\r\n coordPlane: CoordPlane;\r\n\r\n /**\r\n * The current position of the entity in world space or in screen space depending on the the [[CoordPlane|coordinate plane]].\r\n *\r\n * If the entity has a parent this position is relative to the parent entity.\r\n */\r\n pos: Vector;\r\n\r\n /**\r\n * The z-index ordering of the entity, a higher values are drawn on top of lower values.\r\n * For example z=99 would be drawn on top of z=0.\r\n */\r\n z: number;\r\n\r\n /**\r\n * The rotation of the entity in radians. For example `Math.PI` radians is the same as 180 degrees.\r\n *\r\n * If the entity has a parent this rotation is relative to the parent.\r\n */\r\n rotation: number;\r\n\r\n /**\r\n * The scale of the entity. If the entity has a parent this scale is relative to the parent.\r\n */\r\n scale: Vector;\r\n}\r\n\r\nconst createPosView = (matrix: Matrix) => {\r\n const source = matrix;\r\n return new VectorView({\r\n setX: (x) => {\r\n source.data[MatrixLocations.X] = x;\r\n },\r\n setY: (y) => {\r\n source.data[MatrixLocations.Y] = y;\r\n },\r\n getX: () => {\r\n return source.data[MatrixLocations.X];\r\n },\r\n getY: () => {\r\n return source.data[MatrixLocations.Y];\r\n }\r\n });\r\n};\r\n\r\nconst createScaleView = (matrix: Matrix) => {\r\n const source = matrix;\r\n return new VectorView({\r\n setX: (x) => {\r\n source.setScaleX(x);\r\n },\r\n setY: (y) => {\r\n source.setScaleY(y);\r\n },\r\n getX: () => {\r\n return source.getScaleX();\r\n },\r\n getY: () => {\r\n return source.getScaleY();\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Enum representing the coordinate plane for the position 2D vector in the [[TransformComponent]]\r\n */\r\nexport enum CoordPlane {\r\n /**\r\n * The world coordinate plane (default) represents world space, any entities drawn with world\r\n * space move when the camera moves.\r\n */\r\n World = 'world',\r\n /**\r\n * The screen coordinate plane represents screen space, entities drawn in screen space are pinned\r\n * to screen coordinates ignoring the camera.\r\n */\r\n Screen = 'screen'\r\n}\r\n\r\nexport class TransformComponent extends Component<'ex.transform'> implements Transform {\r\n public readonly type = 'ex.transform';\r\n\r\n private _dirty = false;\r\n\r\n public readonly matrix = Matrix.identity().translate(0, 0).rotate(0).scale(1, 1);\r\n private _position = createPosView(this.matrix);\r\n private _rotation = 0;\r\n private _scale = createScaleView(this.matrix);\r\n\r\n private _recalculate() {\r\n this._rotation = this.matrix.getRotation();\r\n this._dirty = false;\r\n }\r\n\r\n public getGlobalMatrix(): Matrix {\r\n if (!this.parent) {\r\n return this.matrix;\r\n } else {\r\n return this.parent.getGlobalMatrix().multm(this.matrix);\r\n }\r\n }\r\n\r\n public getGlobalTransform(): Transform {\r\n return {\r\n pos: this.globalPos,\r\n scale: this.globalScale,\r\n rotation: this.globalRotation,\r\n z: this.z,\r\n coordPlane: this.coordPlane\r\n };\r\n }\r\n\r\n public get parent(): TransformComponent | null {\r\n return this?.owner?.parent?.get(TransformComponent);\r\n }\r\n\r\n /**\r\n * The [[CoordPlane|coordinate plane|]] for this transform for the entity.\r\n */\r\n public coordPlane = CoordPlane.World;\r\n\r\n /**\r\n * The current position of the entity in world space or in screen space depending on the the [[CoordPlane|coordinate plane]].\r\n *\r\n * If a parent entity exists coordinates are local to the parent.\r\n */\r\n public get pos(): Vector {\r\n if (this._dirty) {\r\n this._recalculate();\r\n }\r\n return this._position;\r\n }\r\n\r\n public set pos(val: Vector) {\r\n this.matrix.setPosition(val.x, val.y);\r\n this._dirty = true;\r\n }\r\n\r\n // Dirty flag check up the chain\r\n public get dirty(): boolean {\r\n if (this?.owner?.parent) {\r\n const parent = this.parent;\r\n return parent.dirty || this._dirty;\r\n }\r\n return this._dirty;\r\n }\r\n\r\n /**\r\n * The current world position calculated\r\n */\r\n public get globalPos(): Vector {\r\n const source = this.getGlobalMatrix();\r\n return new VectorView({\r\n getX: () => source.data[MatrixLocations.X],\r\n getY: () => source.data[MatrixLocations.Y],\r\n setX: (x) => {\r\n if (this.parent) {\r\n const [newX] = this.parent?.getGlobalMatrix().getAffineInverse().multv([x, source.data[MatrixLocations.Y]]);\r\n this.matrix.data[MatrixLocations.X] = newX;\r\n } else {\r\n this.matrix.data[MatrixLocations.X] = x;\r\n }\r\n },\r\n setY: (y) => {\r\n if (this.parent) {\r\n const [, newY] = this.parent?.getGlobalMatrix().getAffineInverse().multv([source.data[MatrixLocations.X], y]);\r\n this.matrix.data[MatrixLocations.Y] = newY;\r\n } else {\r\n this.matrix.data[MatrixLocations.Y] = y;\r\n }\r\n }\r\n });\r\n }\r\n\r\n public set globalPos(val: Vector) {\r\n const parentTransform = this.parent;\r\n if (!parentTransform) {\r\n this.pos = val;\r\n } else {\r\n this.pos = parentTransform.getGlobalMatrix().getAffineInverse().multv(val);\r\n }\r\n }\r\n\r\n /**\r\n * The z-index ordering of the entity, a higher values are drawn on top of lower values.\r\n * For example z=99 would be drawn on top of z=0.\r\n */\r\n public z: number = 0;\r\n\r\n /**\r\n * The rotation of the entity in radians. For example `Math.PI` radians is the same as 180 degrees.\r\n */\r\n public get rotation(): number {\r\n if (this._dirty) {\r\n this._recalculate();\r\n }\r\n return this._rotation;\r\n }\r\n\r\n public set rotation(val: number) {\r\n this.matrix.setRotation(val);\r\n this._dirty = true;\r\n }\r\n\r\n public get globalRotation(): number {\r\n return this.getGlobalMatrix().getRotation();\r\n }\r\n\r\n public set globalRotation(val: number) {\r\n const parentTransform = this.parent;\r\n if (!parentTransform) {\r\n this.rotation = val;\r\n } else {\r\n this.rotation = val - parentTransform.globalRotation;\r\n }\r\n }\r\n\r\n /**\r\n * The scale of the entity.\r\n */\r\n public get scale(): Vector {\r\n if (this._dirty) {\r\n this._recalculate();\r\n }\r\n return this._scale;\r\n }\r\n\r\n public set scale(val: Vector) {\r\n this.matrix.setScale(val);\r\n this._dirty = true;\r\n }\r\n\r\n public get globalScale(): Vector {\r\n const source = this.getGlobalMatrix();\r\n return new VectorView({\r\n getX: () => source.getScaleX(),\r\n getY: () => source.getScaleY(),\r\n setX: (x) => {\r\n if (this.parent) {\r\n const globalScaleX = this.parent.globalScale.x;\r\n this.matrix.setScaleX(x / globalScaleX);\r\n } else {\r\n this.matrix.setScaleX(x);\r\n }\r\n },\r\n setY: (y) => {\r\n if (this.parent) {\r\n const globalScaleY = this.parent.globalScale.y;\r\n this.matrix.setScaleY(y / globalScaleY);\r\n } else {\r\n this.matrix.setScaleY(y);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public set globalScale(val: Vector) {\r\n const parentTransform = this.parent;\r\n if (!parentTransform) {\r\n this.scale = val;\r\n } else {\r\n this.scale = vec(val.x / parentTransform.globalScale.x, val.y / parentTransform.globalScale.y);\r\n }\r\n }\r\n\r\n /**\r\n * Apply the transform to a point\r\n * @param point\r\n */\r\n public apply(point: Vector): Vector {\r\n return this.matrix.multv(point);\r\n }\r\n\r\n /**\r\n * Apply the inverse transform to a point\r\n * @param point\r\n */\r\n public applyInverse(point: Vector): Vector {\r\n return this.matrix.getAffineInverse().multv(point);\r\n }\r\n}\r\n","import { Vector } from '../../Math/vector';\nimport { Component } from '../Component';\n\nexport interface Motion {\n /**\n * The velocity of an entity in pixels per second\n */\n vel: Vector;\n\n /**\n * The acceleration of entity in pixels per second^2\n */\n acc: Vector;\n\n /**\n * The scale rate of change in scale units per second\n */\n scaleFactor: Vector;\n\n /**\n * The angular velocity which is how quickly the entity is rotating in radians per second\n */\n angularVelocity: number;\n\n /**\n * The amount of torque applied to the entity, angular acceleration is torque * inertia\n */\n torque: number;\n\n /**\n * Inerita can be thought of as the resistance to motion\n */\n inertia: number;\n}\n\nexport class MotionComponent extends Component<'ex.motion'> {\n public readonly type = 'ex.motion';\n\n /**\n * The velocity of an entity in pixels per second\n */\n public vel: Vector = Vector.Zero;\n\n /**\n * The acceleration of entity in pixels per second^2\n */\n public acc: Vector = Vector.Zero;\n\n /**\n * The scale rate of change in scale units per second\n */\n public scaleFactor: Vector = Vector.Zero;\n\n /**\n * The angular velocity which is how quickly the entity is rotating in radians per second\n */\n public angularVelocity = 0;\n\n /**\n * The amount of torque applied to the entity, angular acceleration is torque * inertia\n */\n public torque: number = 0;\n\n /**\n * Inerita can be thought of as the resistance to motion\n */\n public inertia: number = 1;\n}\n","/**\r\n * CollisionGroups indicate like members that do not collide with each other. Use [[CollisionGroupManager]] to create [[CollisionGroup]]s\r\n *\r\n * For example:\r\n *\r\n * Players have collision group \"player\"\r\n *\r\n * ![Player Collision Group](/assets/images/docs/CollisionGroupsPlayer.png)\r\n *\r\n * Enemies have collision group \"enemy\"\r\n *\r\n * ![Enemy Collision Group](/assets/images/docs/CollisionGroupsEnemy.png)\r\n *\r\n * Blocks have collision group \"ground\"\r\n *\r\n * ![Ground collision group](/assets/images/docs/CollisionGroupsGround.png)\r\n *\r\n * Players don't collide with each other, but enemies and blocks. Likewise, enemies don't collide with each other but collide\r\n * with players and blocks.\r\n *\r\n * This is done with bitmasking, see the following pseudo-code\r\n *\r\n * PlayerGroup = `0b001`\r\n * PlayerGroupMask = `0b110`\r\n *\r\n * EnemyGroup = `0b010`\r\n * EnemyGroupMask = `0b101`\r\n *\r\n * BlockGroup = `0b100`\r\n * BlockGroupMask = `0b011`\r\n *\r\n * Should Players collide? No because the bitwise mask evaluates to 0\r\n * `(player1.group & player2.mask) === 0`\r\n * `(0b001 & 0b110) === 0`\r\n *\r\n * Should Players and Enemies collide? Yes because the bitwise mask is non-zero\r\n * `(player1.group & enemy1.mask) === 1`\r\n * `(0b001 & 0b101) === 1`\r\n *\r\n * Should Players and Blocks collide? Yes because the bitwise mask is non-zero\r\n * `(player1.group & blocks1.mask) === 1`\r\n * `(0b001 & 0b011) === 1`\r\n */\r\nexport class CollisionGroup {\r\n /**\r\n * The `All` [[CollisionGroup]] is a special group that collides with all other groups including itself,\r\n * it is the default collision group on colliders.\r\n */\r\n public static All = new CollisionGroup('Collide with all groups', -1, -1);\r\n\r\n private _name: string;\r\n private _category: number;\r\n private _mask: number;\r\n\r\n /**\r\n * STOP!!** It is preferred that [[CollisionGroupManager.create]] is used to create collision groups\r\n * unless you know how to construct the proper bitmasks. See https://github.com/excaliburjs/Excalibur/issues/1091 for more info.\r\n * @param name Name of the collision group\r\n * @param category 32 bit category for the group, should be a unique power of 2. For example `0b001` or `0b010`\r\n * @param mask 32 bit mask of category, or `~category` generally. For a category of `0b001`, the mask would be `0b110`\r\n */\r\n constructor(name: string, category: number, mask: number) {\r\n this._name = name;\r\n this._category = category;\r\n this._mask = mask;\r\n }\r\n\r\n /**\r\n * Get the name of the collision group\r\n */\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Get the category of the collision group, a 32 bit number which should be a unique power of 2\r\n */\r\n public get category() {\r\n return this._category;\r\n }\r\n\r\n /**\r\n * Get the mask for this collision group\r\n */\r\n public get mask() {\r\n return this._mask;\r\n }\r\n\r\n /**\r\n * Evaluates whether 2 collision groups can collide\r\n * @param other CollisionGroup\r\n */\r\n public canCollide(other: CollisionGroup): boolean {\r\n return (this.category & other.mask) !== 0 && (other.category & this.mask) !== 0;\r\n }\r\n\r\n /**\r\n * Inverts the collision group. For example, if before the group specified \"players\",\r\n * inverting would specify all groups except players\r\n * @returns CollisionGroup\r\n */\r\n public invert(): CollisionGroup {\r\n return new CollisionGroup('~(' + this.name + ')', ~this.category, ~this.mask);\r\n }\r\n\r\n /**\r\n * Combine collision groups with each other. The new group includes all of the previous groups.\r\n *\r\n * @param collisionGroups\r\n * @returns\r\n */\r\n public static combine(collisionGroups: CollisionGroup[]) {\r\n const combinedName = collisionGroups.map((c) => c.name).join('+');\r\n const combinedCategory = collisionGroups.reduce((current, g) => g.category | current, 0b0);\r\n const combinedMask = ~combinedCategory;\r\n\r\n return new CollisionGroup(combinedName, combinedCategory, combinedMask);\r\n }\r\n\r\n /**\r\n * Creates a collision group that collides with the listed groups\r\n * @param collisionGroups\r\n */\r\n public static collidesWith(collisionGroups: CollisionGroup[]) {\r\n return CollisionGroup.combine(collisionGroups).invert();\r\n }\r\n}\r\n","/**\r\n * Defines a generic message that can contain any data\r\n * @template T is the typescript Type of the data\r\n */\r\nexport interface Message<T> {\r\n type: string;\r\n data: T;\r\n}\r\n\r\n/**\r\n * Defines an interface for an observer to receive a message via a notify() method\r\n */\r\nexport interface Observer<T> {\r\n notify(message: T): void;\r\n}\r\n\r\n/**\r\n * Defines an interface for something that might be an observer if a notify() is present\r\n */\r\nexport type MaybeObserver<T> = Partial<Observer<T>>;\r\n\r\n/**\r\n * Simple Observable implemenation\r\n * @template T is the typescript Type that defines the data being observed\r\n */\r\nexport class Observable<T> {\r\n public observers: Observer<T>[] = [];\r\n public subscriptions: ((val: T) => any)[] = [];\r\n\r\n /**\r\n * Register an observer to listen to this observable\r\n * @param observer\r\n */\r\n register(observer: Observer<T>) {\r\n this.observers.push(observer);\r\n }\r\n\r\n /**\r\n * Register a callback to listen to this observable\r\n * @param func\r\n */\r\n subscribe(func: (val: T) => any) {\r\n this.subscriptions.push(func);\r\n }\r\n\r\n /**\r\n * Remove an observer from the observable\r\n * @param observer\r\n */\r\n unregister(observer: Observer<T>) {\r\n const i = this.observers.indexOf(observer);\r\n if (i !== -1) {\r\n this.observers.splice(i, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Remove a callback that is listening to this observable\r\n * @param func\r\n */\r\n unsubscribe(func: (val: T) => any) {\r\n const i = this.subscriptions.indexOf(func);\r\n if (i !== -1) {\r\n this.subscriptions.splice(i, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Broadcasts a message to all observers and callbacks\r\n * @param message\r\n */\r\n notifyAll(message: T) {\r\n this.observers.forEach((o) => o.notify(message));\r\n this.subscriptions.forEach(cb => cb(message));\r\n }\r\n\r\n /**\r\n * Removes all observers and callbacks\r\n */\r\n clear() {\r\n this.observers.length = 0;\r\n this.subscriptions.length = 0;\r\n }\r\n}\r\n","import { CollisionContact } from './CollisionContact';\r\nimport { CollisionType } from '../CollisionType';\r\nimport { BodyComponent } from '../BodyComponent';\r\nimport { Id } from '../../Id';\r\nimport { Collider } from '../Colliders/Collider';\r\n\r\n/**\r\n * Models a potential collision between 2 colliders\r\n */\r\nexport class Pair {\r\n public id: string = null;\r\n constructor(public colliderA: Collider, public colliderB: Collider) {\r\n this.id = Pair.calculatePairHash(colliderA.id, colliderB.id);\r\n }\r\n\r\n public static canCollide(colliderA: Collider, colliderB: Collider) {\r\n const bodyA = colliderA?.owner?.get(BodyComponent);\r\n const bodyB = colliderB?.owner?.get(BodyComponent);\r\n\r\n // Body's needed for collision in the current state\r\n // TODO can we collide without a body?\r\n if (!bodyA || !bodyB) {\r\n return false;\r\n }\r\n\r\n // If both are in the same collision group short circuit\r\n if (!bodyA.group.canCollide(bodyB.group)) {\r\n return false;\r\n }\r\n\r\n // if both are fixed short circuit\r\n if (bodyA.collisionType === CollisionType.Fixed && bodyB.collisionType === CollisionType.Fixed) {\r\n return false;\r\n }\r\n\r\n // if the either is prevent collision short circuit\r\n if (bodyB.collisionType === CollisionType.PreventCollision || bodyA.collisionType === CollisionType.PreventCollision) {\r\n return false;\r\n }\r\n\r\n // if either is dead short circuit\r\n if (!bodyA.active || !bodyB.active) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns whether or not it is possible for the pairs to collide\r\n */\r\n public get canCollide(): boolean {\r\n const colliderA = this.colliderA;\r\n const colliderB = this.colliderB;\r\n return Pair.canCollide(colliderA, colliderB);\r\n }\r\n\r\n /**\r\n * Runs the collision intersection logic on the members of this pair\r\n */\r\n public collide(): CollisionContact[] {\r\n return this.colliderA.collide(this.colliderB);\r\n }\r\n\r\n /**\r\n * Check if the collider is part of the pair\r\n * @param collider\r\n * @returns\r\n */\r\n public hasCollider(collider: Collider) {\r\n return collider === this.colliderA || collider === this.colliderB;\r\n }\r\n\r\n /**\r\n * Calculates the unique pair hash id for this collision pair (owning id)\r\n */\r\n public static calculatePairHash(idA: Id<'collider'>, idB: Id<'collider'>): string {\r\n if (idA.value < idB.value) {\r\n return `#${idA.value}+${idB.value}`;\r\n } else {\r\n return `#${idB.value}+${idA.value}`;\r\n }\r\n }\r\n}\r\n","/**\n * A 1 dimensional projection on an axis, used to test overlaps\n */\n\nexport class Projection {\n constructor(public min: number, public max: number) {}\n public overlaps(projection: Projection): boolean {\n return this.max > projection.min && projection.max > this.min;\n }\n\n public getOverlap(projection: Projection): number {\n if (this.overlaps(projection)) {\n if (this.max > projection.max) {\n return projection.max - this.min;\n } else {\n return this.max - projection.min;\n }\n }\n return 0;\n }\n}\n","import { Physics } from '../Physics';\r\nimport { BoundingBox } from '../BoundingBox';\r\n\r\nimport { Ray } from '../../Math/ray';\r\nimport { Logger } from '../../Util/Log';\r\nimport { Id } from '../../Id';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { BodyComponent } from '../BodyComponent';\r\nimport { Color, ExcaliburGraphicsContext } from '../..';\r\n\r\n/**\r\n * Dynamic Tree Node used for tracking bounds within the tree\r\n */\r\nexport class TreeNode<T> {\r\n public left: TreeNode<T>;\r\n public right: TreeNode<T>;\r\n public bounds: BoundingBox;\r\n public height: number;\r\n public data: T;\r\n constructor(public parent?: TreeNode<T>) {\r\n this.parent = parent || null;\r\n this.data = null;\r\n this.bounds = new BoundingBox();\r\n this.left = null;\r\n this.right = null;\r\n this.height = 0;\r\n }\r\n\r\n public isLeaf(): boolean {\r\n return !this.left && !this.right;\r\n }\r\n}\r\n\r\nexport interface ColliderProxy<T> {\r\n id: Id<'collider'>;\r\n owner: T;\r\n bounds: BoundingBox;\r\n}\r\n\r\n/**\r\n * The DynamicTrees provides a spatial partitioning data structure for quickly querying for overlapping bounding boxes for\r\n * all tracked bodies. The worst case performance of this is O(n*log(n)) where n is the number of bodies in the tree.\r\n *\r\n * Internally the bounding boxes are organized as a balanced binary tree of bounding boxes, where the leaf nodes are tracked bodies.\r\n * Every non-leaf node is a bounding box that contains child bounding boxes.\r\n */\r\nexport class DynamicTree<T extends ColliderProxy<Entity>> {\r\n public root: TreeNode<T>;\r\n public nodes: { [key: number]: TreeNode<T> };\r\n constructor(public worldBounds: BoundingBox = new BoundingBox(-Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)) {\r\n this.root = null;\r\n this.nodes = {};\r\n }\r\n\r\n /**\r\n * Inserts a node into the dynamic tree\r\n */\r\n private _insert(leaf: TreeNode<T>): void {\r\n // If there are no nodes in the tree, make this the root leaf\r\n if (this.root === null) {\r\n this.root = leaf;\r\n this.root.parent = null;\r\n return;\r\n }\r\n\r\n // Search the tree for a node that is not a leaf and find the best place to insert\r\n const leafAABB = leaf.bounds;\r\n let currentRoot = this.root;\r\n while (!currentRoot.isLeaf()) {\r\n const left = currentRoot.left;\r\n const right = currentRoot.right;\r\n\r\n const area = currentRoot.bounds.getPerimeter();\r\n const combinedAABB = currentRoot.bounds.combine(leafAABB);\r\n const combinedArea = combinedAABB.getPerimeter();\r\n\r\n // Calculate cost heuristic for creating a new parent and leaf\r\n const cost = 2 * combinedArea;\r\n\r\n // Minimum cost of pushing the leaf down the tree\r\n const inheritanceCost = 2 * (combinedArea - area);\r\n\r\n // Cost of descending\r\n let leftCost = 0;\r\n const leftCombined = leafAABB.combine(left.bounds);\r\n let newArea;\r\n let oldArea;\r\n if (left.isLeaf()) {\r\n leftCost = leftCombined.getPerimeter() + inheritanceCost;\r\n } else {\r\n oldArea = left.bounds.getPerimeter();\r\n newArea = leftCombined.getPerimeter();\r\n leftCost = newArea - oldArea + inheritanceCost;\r\n }\r\n\r\n let rightCost = 0;\r\n const rightCombined = leafAABB.combine(right.bounds);\r\n if (right.isLeaf()) {\r\n rightCost = rightCombined.getPerimeter() + inheritanceCost;\r\n } else {\r\n oldArea = right.bounds.getPerimeter();\r\n newArea = rightCombined.getPerimeter();\r\n rightCost = newArea - oldArea + inheritanceCost;\r\n }\r\n\r\n // cost is acceptable\r\n if (cost < leftCost && cost < rightCost) {\r\n break;\r\n }\r\n\r\n // Descend to the depths\r\n if (leftCost < rightCost) {\r\n currentRoot = left;\r\n } else {\r\n currentRoot = right;\r\n }\r\n }\r\n\r\n // Create the new parent node and insert into the tree\r\n const oldParent = currentRoot.parent;\r\n const newParent = new TreeNode(oldParent);\r\n newParent.bounds = leafAABB.combine(currentRoot.bounds);\r\n newParent.height = currentRoot.height + 1;\r\n\r\n if (oldParent !== null) {\r\n // The sibling node was not the root\r\n if (oldParent.left === currentRoot) {\r\n oldParent.left = newParent;\r\n } else {\r\n oldParent.right = newParent;\r\n }\r\n\r\n newParent.left = currentRoot;\r\n newParent.right = leaf;\r\n\r\n currentRoot.parent = newParent;\r\n leaf.parent = newParent;\r\n } else {\r\n // The sibling node was the root\r\n newParent.left = currentRoot;\r\n newParent.right = leaf;\r\n\r\n currentRoot.parent = newParent;\r\n leaf.parent = newParent;\r\n this.root = newParent;\r\n }\r\n\r\n // Walk up the tree fixing heights and AABBs\r\n let currentNode = leaf.parent;\r\n while (currentNode) {\r\n currentNode = this._balance(currentNode);\r\n\r\n if (!currentNode.left) {\r\n throw new Error('Parent of current leaf cannot have a null left child' + currentNode);\r\n }\r\n if (!currentNode.right) {\r\n throw new Error('Parent of current leaf cannot have a null right child' + currentNode);\r\n }\r\n\r\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\r\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\r\n\r\n currentNode = currentNode.parent;\r\n }\r\n }\r\n\r\n /**\r\n * Removes a node from the dynamic tree\r\n */\r\n private _remove(leaf: TreeNode<T>) {\r\n if (leaf === this.root) {\r\n this.root = null;\r\n return;\r\n }\r\n\r\n const parent = leaf.parent;\r\n const grandParent = parent.parent;\r\n let sibling: TreeNode<T>;\r\n if (parent.left === leaf) {\r\n sibling = parent.right;\r\n } else {\r\n sibling = parent.left;\r\n }\r\n\r\n if (grandParent) {\r\n if (grandParent.left === parent) {\r\n grandParent.left = sibling;\r\n } else {\r\n grandParent.right = sibling;\r\n }\r\n sibling.parent = grandParent;\r\n\r\n let currentNode = grandParent;\r\n while (currentNode) {\r\n currentNode = this._balance(currentNode);\r\n currentNode.bounds = currentNode.left.bounds.combine(currentNode.right.bounds);\r\n currentNode.height = 1 + Math.max(currentNode.left.height, currentNode.right.height);\r\n\r\n currentNode = currentNode.parent;\r\n }\r\n } else {\r\n this.root = sibling;\r\n sibling.parent = null;\r\n }\r\n }\r\n\r\n /**\r\n * Tracks a body in the dynamic tree\r\n */\r\n public trackCollider(collider: T) {\r\n const node = new TreeNode<T>();\r\n node.data = collider;\r\n node.bounds = collider.bounds;\r\n node.bounds.left -= 2;\r\n node.bounds.top -= 2;\r\n node.bounds.right += 2;\r\n node.bounds.bottom += 2;\r\n this.nodes[collider.id.value] = node;\r\n this._insert(node);\r\n }\r\n\r\n /**\r\n * Updates the dynamic tree given the current bounds of each body being tracked\r\n */\r\n public updateCollider(collider: T) {\r\n const node = this.nodes[collider.id.value];\r\n if (!node) {\r\n return false;\r\n }\r\n const b = collider.bounds;\r\n\r\n // if the body is outside the world no longer update it\r\n if (!this.worldBounds.contains(b)) {\r\n Logger.getInstance().warn(\r\n 'Collider with id ' + collider.id.value + ' is outside the world bounds and will no longer be tracked for physics'\r\n );\r\n this.untrackCollider(collider);\r\n return false;\r\n }\r\n\r\n if (node.bounds.contains(b)) {\r\n return false;\r\n }\r\n\r\n this._remove(node);\r\n b.left -= Physics.boundsPadding;\r\n b.top -= Physics.boundsPadding;\r\n b.right += Physics.boundsPadding;\r\n b.bottom += Physics.boundsPadding;\r\n\r\n // THIS IS CAUSING UNECESSARY CHECKS\r\n if (collider.owner) {\r\n const body = collider.owner?.get(BodyComponent);\r\n if (body) {\r\n const multdx = ((body.vel.x * 32) / 1000) * Physics.dynamicTreeVelocityMultiplier;\r\n const multdy = ((body.vel.y * 32) / 1000) * Physics.dynamicTreeVelocityMultiplier;\r\n\r\n if (multdx < 0) {\r\n b.left += multdx;\r\n } else {\r\n b.right += multdx;\r\n }\r\n\r\n if (multdy < 0) {\r\n b.top += multdy;\r\n } else {\r\n b.bottom += multdy;\r\n }\r\n }\r\n }\r\n\r\n node.bounds = b;\r\n this._insert(node);\r\n return true;\r\n }\r\n\r\n /**\r\n * Untracks a body from the dynamic tree\r\n */\r\n public untrackCollider(collider: T) {\r\n const node = this.nodes[collider.id.value];\r\n if (!node) {\r\n return;\r\n }\r\n this._remove(node);\r\n this.nodes[collider.id.value] = null;\r\n delete this.nodes[collider.id.value];\r\n }\r\n\r\n /**\r\n * Balances the tree about a node\r\n */\r\n private _balance(node: TreeNode<T>) {\r\n if (node === null) {\r\n throw new Error('Cannot balance at null node');\r\n }\r\n\r\n if (node.isLeaf() || node.height < 2) {\r\n return node;\r\n }\r\n\r\n const left = node.left;\r\n const right = node.right;\r\n\r\n const a = node;\r\n const b = left;\r\n const c = right;\r\n const d = left.left;\r\n const e = left.right;\r\n const f = right.left;\r\n const g = right.right;\r\n\r\n const balance = c.height - b.height;\r\n // Rotate c node up\r\n if (balance > 1) {\r\n // Swap the right node with it's parent\r\n c.left = a;\r\n c.parent = a.parent;\r\n a.parent = c;\r\n\r\n // The original node's old parent should point to the right node\r\n // this is mega confusing\r\n if (c.parent) {\r\n if (c.parent.left === a) {\r\n c.parent.left = c;\r\n } else {\r\n c.parent.right = c;\r\n }\r\n } else {\r\n this.root = c;\r\n }\r\n\r\n // Rotate\r\n if (f.height > g.height) {\r\n c.right = f;\r\n a.right = g;\r\n g.parent = a;\r\n\r\n a.bounds = b.bounds.combine(g.bounds);\r\n c.bounds = a.bounds.combine(f.bounds);\r\n\r\n a.height = 1 + Math.max(b.height, g.height);\r\n c.height = 1 + Math.max(a.height, f.height);\r\n } else {\r\n c.right = g;\r\n a.right = f;\r\n f.parent = a;\r\n\r\n a.bounds = b.bounds.combine(f.bounds);\r\n c.bounds = a.bounds.combine(g.bounds);\r\n\r\n a.height = 1 + Math.max(b.height, f.height);\r\n c.height = 1 + Math.max(a.height, g.height);\r\n }\r\n\r\n return c;\r\n }\r\n // Rotate left node up\r\n if (balance < -1) {\r\n // swap\r\n b.left = a;\r\n b.parent = a.parent;\r\n a.parent = b;\r\n\r\n // node's old parent should point to b\r\n if (b.parent) {\r\n if (b.parent.left === a) {\r\n b.parent.left = b;\r\n } else {\r\n if (b.parent.right !== a) {\r\n throw 'Error rotating Dynamic Tree';\r\n }\r\n b.parent.right = b;\r\n }\r\n } else {\r\n this.root = b;\r\n }\r\n\r\n // rotate\r\n if (d.height > e.height) {\r\n b.right = d;\r\n a.left = e;\r\n e.parent = a;\r\n\r\n a.bounds = c.bounds.combine(e.bounds);\r\n b.bounds = a.bounds.combine(d.bounds);\r\n\r\n a.height = 1 + Math.max(c.height, e.height);\r\n b.height = 1 + Math.max(a.height, d.height);\r\n } else {\r\n b.right = e;\r\n a.left = d;\r\n d.parent = a;\r\n\r\n a.bounds = c.bounds.combine(d.bounds);\r\n b.bounds = a.bounds.combine(e.bounds);\r\n\r\n a.height = 1 + Math.max(c.height, d.height);\r\n b.height = 1 + Math.max(a.height, e.height);\r\n }\r\n return b;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n /**\r\n * Returns the internal height of the tree, shorter trees are better. Performance drops as the tree grows\r\n */\r\n public getHeight(): number {\r\n if (this.root === null) {\r\n return 0;\r\n }\r\n return this.root.height;\r\n }\r\n\r\n /**\r\n * Queries the Dynamic Axis Aligned Tree for bodies that could be colliding with the provided body.\r\n *\r\n * In the query callback, it will be passed a potential collider. Returning true from this callback indicates\r\n * that you are complete with your query and you do not want to continue. Returning false will continue searching\r\n * the tree until all possible colliders have been returned.\r\n */\r\n public query(collider: T, callback: (other: T) => boolean): void {\r\n const bounds = collider.bounds;\r\n const helper = (currentNode: TreeNode<T>): boolean => {\r\n if (currentNode && currentNode.bounds.intersect(bounds)) {\r\n if (currentNode.isLeaf() && currentNode.data !== collider) {\r\n if (callback.call(collider, currentNode.data)) {\r\n return true;\r\n }\r\n } else {\r\n return helper(currentNode.left) || helper(currentNode.right);\r\n }\r\n }\r\n return false;\r\n };\r\n helper(this.root);\r\n }\r\n\r\n /**\r\n * Queries the Dynamic Axis Aligned Tree for bodies that could be intersecting. By default the raycast query uses an infinitely\r\n * long ray to test the tree specified by `max`.\r\n *\r\n * In the query callback, it will be passed a potential body that intersects with the raycast. Returning true from this\r\n * callback indicates that your are complete with your query and do not want to continue. Return false will continue searching\r\n * the tree until all possible bodies that would intersect with the ray have been returned.\r\n */\r\n public rayCastQuery(ray: Ray, max: number = Infinity, callback: (other: T) => boolean): void {\r\n const helper = (currentNode: TreeNode<T>): boolean => {\r\n if (currentNode && currentNode.bounds.rayCast(ray, max)) {\r\n if (currentNode.isLeaf()) {\r\n if (callback.call(ray, currentNode.data)) {\r\n // ray hit a leaf! return the body\r\n return true;\r\n }\r\n } else {\r\n // ray hit but not at a leaf, recurse deeper\r\n return helper(currentNode.left) || helper(currentNode.right);\r\n }\r\n }\r\n return false; // ray missed\r\n };\r\n helper(this.root);\r\n }\r\n\r\n public getNodes(): TreeNode<T>[] {\r\n const helper = (currentNode: TreeNode<T>): TreeNode<T>[] => {\r\n if (currentNode) {\r\n return [currentNode].concat(helper(currentNode.left), helper(currentNode.right));\r\n } else {\r\n return [];\r\n }\r\n };\r\n return helper(this.root);\r\n }\r\n\r\n public debug(ex: ExcaliburGraphicsContext) {\r\n // draw all the nodes in the Dynamic Tree\r\n const helper = (currentNode: TreeNode<T>) => {\r\n if (currentNode) {\r\n if (currentNode.isLeaf()) {\r\n currentNode.bounds.draw(ex, Color.Green);\r\n } else {\r\n currentNode.bounds.draw(ex, Color.White);\r\n }\r\n\r\n if (currentNode.left) {\r\n helper(currentNode.left);\r\n }\r\n if (currentNode.right) {\r\n helper(currentNode.right);\r\n }\r\n }\r\n };\r\n\r\n helper(this.root);\r\n }\r\n}\r\n","import { Line } from './line';\nimport { Vector } from './vector';\n\n/**\n * A 2D ray that can be cast into the scene to do collision detection\n */\n\nexport class Ray {\n public pos: Vector;\n public dir: Vector;\n\n /**\n * @param pos The starting position for the ray\n * @param dir The vector indicating the direction of the ray\n */\n constructor(pos: Vector, dir: Vector) {\n this.pos = pos;\n this.dir = dir.normalize();\n }\n\n /**\n * Tests a whether this ray intersects with a line segment. Returns a number greater than or equal to 0 on success.\n * This number indicates the mathematical intersection time.\n * @param line The line to test\n */\n public intersect(line: Line): number {\n const numerator = line.begin.sub(this.pos);\n\n // Test is line and ray are parallel and non intersecting\n if (this.dir.cross(line.getSlope()) === 0 && numerator.cross(this.dir) !== 0) {\n return -1;\n }\n\n // Lines are parallel\n const divisor = this.dir.cross(line.getSlope());\n if (divisor === 0) {\n return -1;\n }\n\n const t = numerator.cross(line.getSlope()) / divisor;\n\n if (t >= 0) {\n const u = numerator.cross(this.dir) / divisor / line.getLength();\n if (u >= 0 && u <= 1) {\n return t;\n }\n }\n return -1;\n }\n\n public intersectPoint(line: Line): Vector {\n const time = this.intersect(line);\n if (time < 0) {\n return null;\n }\n return this.getPoint(time);\n }\n\n /**\n * Returns the point of intersection given the intersection time\n */\n public getPoint(time: number): Vector {\n return this.pos.add(this.dir.scale(time));\n }\n}\n","import { Physics } from '../Physics';\r\nimport { CollisionProcessor } from './CollisionProcessor';\r\nimport { DynamicTree } from './DynamicTree';\r\nimport { Pair } from './Pair';\r\n\r\nimport { Vector } from '../../Math/vector';\r\nimport { Ray } from '../../Math/ray';\r\nimport { FrameStats } from '../../Debug';\r\nimport { Logger } from '../../Util/Log';\r\nimport { CollisionType } from '../CollisionType';\r\nimport { Collider } from '../Colliders/Collider';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { BodyComponent } from '../BodyComponent';\r\nimport { CompositeCollider } from '../Colliders/CompositeCollider';\r\nimport { ExcaliburGraphicsContext } from '../..';\r\n\r\n/**\r\n * Responsible for performing the collision broadphase (locating potential colllisions) and\r\n * the narrowphase (actual collision contacts)\r\n */\r\nexport class DynamicTreeCollisionProcessor implements CollisionProcessor {\r\n private _dynamicCollisionTree = new DynamicTree<Collider>();\r\n private _collisions = new Set<string>();\r\n\r\n private _collisionPairCache: Pair[] = [];\r\n private _colliders: Collider[] = [];\r\n\r\n public getColliders(): readonly Collider[] {\r\n return this._colliders;\r\n }\r\n\r\n /**\r\n * Tracks a physics body for collisions\r\n */\r\n public track(target: Collider): void {\r\n if (!target) {\r\n Logger.getInstance().warn('Cannot track null collider');\r\n return;\r\n }\r\n if (target instanceof CompositeCollider) {\r\n const colliders = target.getColliders();\r\n for (const c of colliders) {\r\n c.owner = target.owner;\r\n this._colliders.push(c);\r\n this._dynamicCollisionTree.trackCollider(c);\r\n }\r\n } else {\r\n this._colliders.push(target);\r\n this._dynamicCollisionTree.trackCollider(target);\r\n }\r\n }\r\n\r\n /**\r\n * Untracks a physics body\r\n */\r\n public untrack(target: Collider): void {\r\n if (!target) {\r\n Logger.getInstance().warn('Cannot untrack a null collider');\r\n return;\r\n }\r\n\r\n if (target instanceof CompositeCollider) {\r\n const colliders = target.getColliders();\r\n for (const c of colliders) {\r\n const index = this._colliders.indexOf(c);\r\n if (index !== -1) {\r\n this._colliders.splice(index, 1);\r\n }\r\n this._dynamicCollisionTree.untrackCollider(c);\r\n }\r\n } else {\r\n const index = this._colliders.indexOf(target);\r\n if (index !== -1) {\r\n this._colliders.splice(index, 1);\r\n }\r\n this._dynamicCollisionTree.untrackCollider(target);\r\n }\r\n }\r\n\r\n private _shouldGenerateCollisionPair(colliderA: Collider, colliderB: Collider) {\r\n // if the collision pair must be 2 separate colliders\r\n // Also separate owners for composite colliders\r\n if (\r\n (colliderA.id !== null &&\r\n colliderB.id !== null &&\r\n colliderA.id === colliderB.id) ||\r\n (colliderA.owner !== null &&\r\n colliderB.owner !== null &&\r\n colliderA.owner === colliderB.owner)) {\r\n return false;\r\n }\r\n\r\n // if the collision pair has been calculated already short circuit\r\n const hash = Pair.calculatePairHash(colliderA.id, colliderB.id);\r\n if (this._collisions.has(hash)) {\r\n return false; // pair exists easy exit return false\r\n }\r\n\r\n // if the pair has a member with zero dimension\r\n if (colliderA.localBounds.hasZeroDimensions() || colliderB.localBounds.hasZeroDimensions()) {\r\n return false;\r\n }\r\n\r\n return Pair.canCollide(colliderA, colliderB);\r\n }\r\n\r\n /**\r\n * Detects potential collision pairs in a broadphase approach with the dynamic aabb tree strategy\r\n */\r\n public broadphase(targets: Collider[], delta: number, stats?: FrameStats): Pair[] {\r\n const seconds = delta / 1000;\r\n\r\n // Retrieve the list of potential colliders, exclude killed, prevented, and self\r\n const potentialColliders = targets.filter((other) => {\r\n const body = other.owner?.get(BodyComponent);\r\n return other.owner?.active && body.collisionType !== CollisionType.PreventCollision;\r\n });\r\n\r\n // clear old list of collision pairs\r\n this._collisionPairCache = [];\r\n this._collisions.clear();\r\n\r\n // check for normal collision pairs\r\n let collider: Collider;\r\n for (let j = 0, l = potentialColliders.length; j < l; j++) {\r\n collider = potentialColliders[j];\r\n // Query the collision tree for potential colliders\r\n this._dynamicCollisionTree.query(collider, (other: Collider) => {\r\n if (this._shouldGenerateCollisionPair(collider, other)) {\r\n const pair = new Pair(collider, other);\r\n this._collisions.add(pair.id);\r\n this._collisionPairCache.push(pair);\r\n }\r\n // Always return false, to query whole tree. Returning true in the query method stops searching\r\n return false;\r\n });\r\n }\r\n if (stats) {\r\n stats.physics.pairs = this._collisionPairCache.length;\r\n }\r\n\r\n // Check dynamic tree for fast moving objects\r\n // Fast moving objects are those moving at least there smallest bound per frame\r\n if (Physics.checkForFastBodies) {\r\n for (const collider of potentialColliders) {\r\n const body = collider.owner.get(BodyComponent);\r\n // Skip non-active objects. Does not make sense on other collision types\r\n if (body.collisionType !== CollisionType.Active) {\r\n continue;\r\n }\r\n\r\n // Maximum travel distance next frame\r\n const updateDistance =\r\n body.vel.size * seconds + // velocity term\r\n body.acc.size * 0.5 * seconds * seconds; // acc term\r\n\r\n // Find the minimum dimension\r\n const minDimension = Math.min(collider.bounds.height, collider.bounds.width);\r\n if (Physics.disableMinimumSpeedForFastBody || updateDistance > minDimension / 2) {\r\n if (stats) {\r\n stats.physics.fastBodies++;\r\n }\r\n\r\n // start with the oldPos because the integration for actors has already happened\r\n // objects resting on a surface may be slightly penetrating in the current position\r\n const updateVec = body.pos.sub(body.oldPos);\r\n const centerPoint = collider.center;\r\n const furthestPoint = collider.getFurthestPoint(body.vel);\r\n const origin: Vector = furthestPoint.sub(updateVec);\r\n\r\n const ray: Ray = new Ray(origin, body.vel);\r\n\r\n // back the ray up by -2x surfaceEpsilon to account for fast moving objects starting on the surface\r\n ray.pos = ray.pos.add(ray.dir.scale(-2 * Physics.surfaceEpsilon));\r\n let minCollider: Collider;\r\n let minTranslate: Vector = new Vector(Infinity, Infinity);\r\n this._dynamicCollisionTree.rayCastQuery(ray, updateDistance + Physics.surfaceEpsilon * 2, (other: Collider) => {\r\n if (collider !== other && Pair.canCollide(collider, other)) {\r\n const hitPoint = other.rayCast(ray, updateDistance + Physics.surfaceEpsilon * 10);\r\n if (hitPoint) {\r\n const translate = hitPoint.sub(origin);\r\n if (translate.size < minTranslate.size) {\r\n minTranslate = translate;\r\n minCollider = other;\r\n }\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n if (minCollider && Vector.isValid(minTranslate)) {\r\n const pair = new Pair(collider, minCollider);\r\n if (!this._collisions.has(pair.id)) {\r\n this._collisions.add(pair.id);\r\n this._collisionPairCache.push(pair);\r\n }\r\n // move the fast moving object to the other body\r\n // need to push into the surface by ex.Physics.surfaceEpsilon\r\n const shift = centerPoint.sub(furthestPoint);\r\n body.pos = origin\r\n .add(shift)\r\n .add(minTranslate)\r\n .add(ray.dir.scale(10 * Physics.surfaceEpsilon)); // needed to push the shape slightly into contact\r\n collider.update(body.transform);\r\n\r\n if (stats) {\r\n stats.physics.fastBodyCollisions++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // return cache\r\n return this._collisionPairCache;\r\n }\r\n\r\n /**\r\n * Applies narrow phase on collision pairs to find actual area intersections\r\n * Adds actual colliding pairs to stats' Frame data\r\n */\r\n public narrowphase(pairs: Pair[], stats?: FrameStats): CollisionContact[] {\r\n let contacts: CollisionContact[] = [];\r\n for (let i = 0; i < pairs.length; i++) {\r\n const newContacts = pairs[i].collide();\r\n contacts = contacts.concat(newContacts);\r\n if (stats && newContacts.length > 0) {\r\n for (const c of newContacts) {\r\n stats.physics.contacts.set(c.id, c);\r\n }\r\n }\r\n }\r\n if (stats) {\r\n stats.physics.collisions += contacts.length;\r\n }\r\n return contacts;\r\n }\r\n\r\n /**\r\n * Update the dynamic tree positions\r\n */\r\n public update(targets: Collider[]): number {\r\n let updated = 0;\r\n const len = targets.length;\r\n\r\n for (let i = 0; i < len; i++) {\r\n if (this._dynamicCollisionTree.updateCollider(targets[i])) {\r\n updated++;\r\n }\r\n }\r\n return updated;\r\n }\r\n\r\n public debug(ex: ExcaliburGraphicsContext) {\r\n this._dynamicCollisionTree.debug(ex);\r\n }\r\n}\r\n","import { Color } from '../../Color';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { BoundingBox } from '../BoundingBox';\r\nimport { Projection } from '../../Math/projection';\r\nimport { Line } from '../../Math/line';\r\nimport { Vector } from '../../Math/vector';\r\nimport { Ray } from '../../Math/ray';\r\nimport { Clonable } from '../../Interfaces/Clonable';\r\nimport { Entity, Transform } from '../../EntityComponentSystem';\r\nimport { createId, Id } from '../../Id';\r\nimport { EventDispatcher } from '../../EventDispatcher';\r\nimport { ExcaliburGraphicsContext } from '../../Graphics/Context/ExcaliburGraphicsContext';\r\n\r\n/**\r\n * A collision collider specifies the geometry that can detect when other collision colliders intersect\r\n * for the purposes of colliding 2 objects in excalibur.\r\n */\r\nexport abstract class Collider implements Clonable<Collider> {\r\n private static _ID = 0;\r\n public readonly id: Id<'collider'> = createId('collider', Collider._ID++);\r\n public events: EventDispatcher<Collider> = new EventDispatcher<Collider>(this);\r\n\r\n /**\r\n * Returns a boolean indicating whether this body collided with\r\n * or was in stationary contact with\r\n * the body of the other [[Collider]]\r\n */\r\n public touching(other: Collider): boolean {\r\n const contact = this.collide(other);\r\n\r\n if (contact) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public owner: Entity;\r\n\r\n /**\r\n * Pixel offset of the collision collider relative to the collider, by default (0, 0) meaning the collider is positioned\r\n * on top of the collider.\r\n */\r\n offset: Vector;\r\n\r\n /**\r\n * Position of the collision collider in world coordinates\r\n */\r\n abstract get worldPos(): Vector;\r\n\r\n /**\r\n * The center point of the collision collider, for example if the collider is a circle it would be the center.\r\n */\r\n abstract get center(): Vector;\r\n\r\n /**\r\n * Return the axis-aligned bounding box of the collision collider in world coordinates\r\n */\r\n abstract get bounds(): BoundingBox;\r\n\r\n /**\r\n * Return the axis-aligned bounding box of the collision collider in local coordinates\r\n */\r\n abstract get localBounds(): BoundingBox;\r\n\r\n /**\r\n * Return the axes of this particular collider\r\n */\r\n abstract get axes(): Vector[];\r\n /**\r\n * Find the furthest point on the convex hull of this particular collider in a certain direction.\r\n */\r\n abstract getFurthestPoint(direction: Vector): Vector;\r\n\r\n abstract getInertia(mass: number): number;\r\n\r\n // All new CollisionShape need to do the following\r\n // Create a new collision function in the CollisionJumpTable against all the primitives\r\n // Currently there are 3 primitive collision collider 3! = 6 jump functions\r\n abstract collide(collider: Collider): CollisionContact[];\r\n\r\n /**\r\n * Returns the closest line between the surfaces this collider and another\r\n * @param collider\r\n */\r\n abstract getClosestLineBetween(collider: Collider): Line;\r\n\r\n /**\r\n * Return wether the collider contains a point inclusive to it's border\r\n */\r\n abstract contains(point: Vector): boolean;\r\n\r\n /**\r\n * Return the point on the border of the collision collider that intersects with a ray (if any).\r\n */\r\n abstract rayCast(ray: Ray, max?: number): Vector;\r\n\r\n /**\r\n * Create a projection of this collider along an axis. Think of this as casting a \"shadow\" along an axis\r\n */\r\n abstract project(axis: Vector): Projection;\r\n\r\n /**\r\n * Updates collider world space geometry\r\n */\r\n abstract update(transform: Transform): void;\r\n\r\n /**\r\n * Draw the collider\r\n * @deprecated Will be removed in 0.26.0\r\n * @param ctx\r\n * @param color\r\n */\r\n abstract draw(ctx: CanvasRenderingContext2D, color?: Color, pos?: Vector): void;\r\n\r\n abstract debug(ex: ExcaliburGraphicsContext, color: Color): void;\r\n /**\r\n * Draw any debug information\r\n * @deprecated Will be removed in 0.26.0\r\n */\r\n abstract debugDraw(ctx: CanvasRenderingContext2D, color: Color): void;\r\n\r\n abstract clone(): Collider;\r\n}\r\n","import { Util } from '../..';\r\nimport { Pair } from '../Detection/Pair';\r\nimport { Color } from '../../Color';\r\nimport { Transform } from '../../EntityComponentSystem';\r\nimport { ExcaliburGraphicsContext } from '../../Graphics/Context/ExcaliburGraphicsContext';\r\nimport { Line } from '../../Math/line';\r\nimport { Projection } from '../../Math/projection';\r\nimport { Ray } from '../../Math/ray';\r\nimport { Vector } from '../../Math/vector';\r\nimport { BoundingBox } from '../BoundingBox';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { DynamicTree } from '../Detection/DynamicTree';\r\nimport { DynamicTreeCollisionProcessor } from '../Detection/DynamicTreeCollisionProcessor';\r\nimport { Collider } from './Collider';\r\n\r\nexport class CompositeCollider extends Collider {\r\n private _transform: Transform;\r\n private _collisionProcessor = new DynamicTreeCollisionProcessor();\r\n private _dynamicAABBTree = new DynamicTree();\r\n private _colliders: Collider[] = [];\r\n\r\n constructor(colliders: Collider[]) {\r\n super();\r\n for (const c of colliders) {\r\n this.addCollider(c);\r\n }\r\n }\r\n\r\n clearColliders() {\r\n this._colliders = [];\r\n }\r\n\r\n addCollider(collider: Collider) {\r\n this.events.wire(collider.events);\r\n this._colliders.push(collider);\r\n this._collisionProcessor.track(collider);\r\n this._dynamicAABBTree.trackCollider(collider);\r\n }\r\n\r\n removeCollider(collider: Collider) {\r\n this.events.unwire(collider.events);\r\n Util.removeItemFromArray(collider, this._colliders);\r\n this._collisionProcessor.untrack(collider);\r\n this._dynamicAABBTree.untrackCollider(collider);\r\n }\r\n\r\n getColliders(): Collider[] {\r\n return this._colliders;\r\n }\r\n\r\n get worldPos(): Vector {\r\n // TODO transform component world pos\r\n return this._transform?.pos ?? Vector.Zero;\r\n }\r\n\r\n get center(): Vector {\r\n return this._transform?.pos ?? Vector.Zero;\r\n }\r\n\r\n get bounds(): BoundingBox {\r\n // TODO cache this\r\n const colliders = this.getColliders();\r\n const results = colliders.reduce(\r\n (acc, collider) => acc.combine(collider.bounds),\r\n colliders[0]?.bounds ?? new BoundingBox().translate(this.worldPos)\r\n );\r\n\r\n return results;\r\n }\r\n\r\n get localBounds(): BoundingBox {\r\n // TODO cache this\r\n const colliders = this.getColliders();\r\n const results = colliders.reduce((acc, collider) => acc.combine(collider.localBounds), colliders[0]?.localBounds ?? new BoundingBox());\r\n\r\n return results;\r\n }\r\n\r\n get axes(): Vector[] {\r\n // TODO cache this\r\n const colliders = this.getColliders();\r\n let axes: Vector[] = [];\r\n for (const collider of colliders) {\r\n axes = axes.concat(collider.axes);\r\n }\r\n return axes;\r\n }\r\n\r\n getFurthestPoint(direction: Vector): Vector {\r\n const colliders = this.getColliders();\r\n const furthestPoints: Vector[] = [];\r\n for (const collider of colliders) {\r\n furthestPoints.push(collider.getFurthestPoint(direction));\r\n }\r\n // Pick best point from all colliders\r\n let bestPoint = furthestPoints[0];\r\n let maxDistance = -Number.MAX_VALUE;\r\n for (const point of furthestPoints) {\r\n const distance = point.dot(direction);\r\n if (distance > maxDistance) {\r\n bestPoint = point;\r\n maxDistance = distance;\r\n }\r\n }\r\n return bestPoint;\r\n }\r\n\r\n getInertia(mass: number): number {\r\n const colliders = this.getColliders();\r\n let totalInertia = 0;\r\n for (const collider of colliders) {\r\n totalInertia += collider.getInertia(mass);\r\n }\r\n return totalInertia;\r\n }\r\n\r\n collide(other: Collider): CollisionContact[] {\r\n let otherColliders = [other];\r\n if (other instanceof CompositeCollider) {\r\n otherColliders = other.getColliders();\r\n }\r\n\r\n const pairs: Pair[] = [];\r\n for (const c of otherColliders) {\r\n this._dynamicAABBTree.query(c, (potentialCollider: Collider) => {\r\n pairs.push(new Pair(c, potentialCollider));\r\n return false;\r\n });\r\n }\r\n\r\n let contacts: CollisionContact[] = [];\r\n for (const p of pairs) {\r\n contacts = contacts.concat(p.collide());\r\n }\r\n return contacts;\r\n }\r\n\r\n getClosestLineBetween(other: Collider): Line {\r\n const colliders = this.getColliders();\r\n const lines: Line[] = [];\r\n if (other instanceof CompositeCollider) {\r\n const otherColliders = other.getColliders();\r\n for (const colliderA of colliders) {\r\n for (const colliderB of otherColliders) {\r\n const maybeLine = colliderA.getClosestLineBetween(colliderB);\r\n if (maybeLine) {\r\n lines.push(maybeLine);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const collider of colliders) {\r\n const maybeLine = other.getClosestLineBetween(collider);\r\n if (maybeLine) {\r\n lines.push(maybeLine);\r\n }\r\n }\r\n }\r\n\r\n if (lines.length) {\r\n let minLength = lines[0].getLength();\r\n let minLine = lines[0];\r\n for (const line of lines) {\r\n const length = line.getLength();\r\n if (length < minLength) {\r\n minLength = length;\r\n minLine = line;\r\n }\r\n }\r\n return minLine;\r\n }\r\n return null;\r\n }\r\n contains(point: Vector): boolean {\r\n const colliders = this.getColliders();\r\n for (const collider of colliders) {\r\n if (collider.contains(point)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n rayCast(ray: Ray, max?: number): Vector {\r\n const colliders = this.getColliders();\r\n const points: Vector[] = [];\r\n for (const collider of colliders) {\r\n const vec = collider.rayCast(ray, max);\r\n if (vec) {\r\n points.push(vec);\r\n }\r\n }\r\n if (points.length) {\r\n let minPoint = points[0];\r\n let minDistance = minPoint.dot(ray.dir);\r\n for (const point of points) {\r\n const distance = ray.dir.dot(point);\r\n if (distance < minDistance) {\r\n minPoint = point;\r\n minDistance = distance;\r\n }\r\n }\r\n return minPoint;\r\n }\r\n return null;\r\n }\r\n project(axis: Vector): Projection {\r\n const colliders = this.getColliders();\r\n const projs: Projection[] = [];\r\n for (const collider of colliders) {\r\n const proj = collider.project(axis);\r\n if (proj) {\r\n projs.push(proj);\r\n }\r\n }\r\n // Merge all proj's on the same axis\r\n if (projs.length) {\r\n const newProjection = new Projection(projs[0].min, projs[0].max);\r\n for (const proj of projs) {\r\n newProjection.min = Math.min(proj.min, newProjection.min);\r\n newProjection.max = Math.max(proj.max, newProjection.max);\r\n }\r\n return newProjection;\r\n }\r\n return null;\r\n }\r\n\r\n update(transform: Transform): void {\r\n if (transform) {\r\n const colliders = this.getColliders();\r\n for (const collider of colliders) {\r\n collider.owner = this.owner;\r\n collider.update(transform);\r\n }\r\n }\r\n }\r\n\r\n draw(ctx: CanvasRenderingContext2D, color?: Color, pos?: Vector): void {\r\n const colliders = this.getColliders();\r\n for (const collider of colliders) {\r\n collider.draw(ctx, color, pos);\r\n }\r\n }\r\n\r\n public debug(ex: ExcaliburGraphicsContext, color: Color) {\r\n const colliders = this.getColliders();\r\n for (const collider of colliders) {\r\n collider.debug(ex, color);\r\n }\r\n }\r\n\r\n debugDraw(ctx: CanvasRenderingContext2D, color: Color): void {\r\n const colliders = this.getColliders();\r\n for (const collider of colliders) {\r\n collider.draw(ctx, color);\r\n }\r\n }\r\n clone(): Collider {\r\n return new CompositeCollider(this._colliders.map((c) => c.clone()));\r\n }\r\n}\r\n","import { Vector } from './vector';\n\n/**\n * A 2D line segment\n */\n\nexport class Line {\n /**\n * @param begin The starting point of the line segment\n * @param end The ending point of the line segment\n */\n constructor(public begin: Vector, public end: Vector) {}\n\n /**\n * Gets the raw slope (m) of the line. Will return (+/-)Infinity for vertical lines.\n */\n public get slope() {\n return (this.end.y - this.begin.y) / (this.end.x - this.begin.x);\n }\n\n /**\n * Gets the Y-intercept (b) of the line. Will return (+/-)Infinity if there is no intercept.\n */\n public get intercept() {\n return this.begin.y - this.slope * this.begin.x;\n }\n\n /**\n * Gets the normal of the line\n */\n public normal(): Vector {\n return this.end.sub(this.begin).normal();\n }\n\n public dir(): Vector {\n return this.end.sub(this.begin);\n }\n\n public getPoints(): Vector[] {\n return [this.begin, this.end];\n }\n\n /**\n * Returns the slope of the line in the form of a vector of length 1\n */\n public getSlope(): Vector {\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return end.sub(begin).scale(1 / distance);\n }\n\n /**\n * Returns the edge of the line as vector, the length of the vector is the length of the edge\n */\n public getEdge(): Vector {\n const begin = this.begin;\n const end = this.end;\n return end.sub(begin);\n }\n\n /**\n * Returns the length of the line segment in pixels\n */\n public getLength(): number {\n const begin = this.begin;\n const end = this.end;\n const distance = begin.distance(end);\n return distance;\n }\n\n /**\n * Returns the midpoint of the edge\n */\n public get midpoint(): Vector {\n return this.begin.add(this.end).scale(0.5);\n }\n\n /**\n * Flips the direction of the line segment\n */\n public flip(): Line {\n return new Line(this.end, this.begin);\n }\n\n /**\n * Tests if a given point is below the line, points in the normal direction above the line are considered above.\n * @param point\n */\n public below(point: Vector): boolean {\n const above2 = (this.end.x - this.begin.x) * (point.y - this.begin.y) - (this.end.y - this.begin.y) * (point.x - this.begin.x);\n return above2 >= 0;\n }\n\n /**\n * Returns the clip point\n * @param sideVector Vector that traces the line\n * @param length Length to clip along side\n */\n public clip(sideVector: Vector, length: number): Line {\n let dir = sideVector;\n dir = dir.normalize();\n\n const near = dir.dot(this.begin) - length;\n const far = dir.dot(this.end) - length;\n\n const results = [];\n if (near <= 0) {\n results.push(this.begin);\n }\n if (far <= 0) {\n results.push(this.end);\n }\n\n if (near * far < 0) {\n const clipTime = near / (near - far);\n results.push(this.begin.add(this.end.sub(this.begin).scale(clipTime)));\n }\n if (results.length !== 2) {\n return null;\n }\n\n return new Line(results[0], results[1]);\n }\n\n /**\n * Find the perpendicular distance from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * @param point\n */\n public distanceToPoint(point: Vector, signed: boolean = false) {\n const x0 = point.x;\n const y0 = point.y;\n\n const l = this.getLength();\n\n const dy = this.end.y - this.begin.y;\n const dx = this.end.x - this.begin.x;\n const distance = (dy * x0 - dx * y0 + this.end.x * this.begin.y - this.end.y * this.begin.x) / l;\n return signed ? distance : Math.abs(distance);\n }\n\n /**\n * Find the perpendicular line from the line to a point\n * https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n * (a - p) - ((a - p) * n)n\n * a is a point on the line\n * p is the arbitrary point above the line\n * n is a unit vector in direction of the line\n * @param point\n */\n public findVectorToPoint(point: Vector): Vector {\n const aMinusP = this.begin.sub(point);\n const n = this.getSlope();\n\n return aMinusP.sub(n.scale(aMinusP.dot(n)));\n }\n\n /**\n * Finds a point on the line given only an X or a Y value. Given an X value, the function returns\n * a new point with the calculated Y value and vice-versa.\n *\n * @param x The known X value of the target point\n * @param y The known Y value of the target point\n * @returns A new point with the other calculated axis value\n */\n public findPoint(x: number = null, y: number = null): Vector {\n const m = this.slope;\n const b = this.intercept;\n\n if (x !== null) {\n return new Vector(x, m * x + b);\n } else if (y !== null) {\n return new Vector((y - b) / m, y);\n } else {\n throw new Error('You must provide an X or a Y value');\n }\n }\n\n /**\n * Whether or not the given point lies on this line. This method is precise by default\n * meaning the point must lie exactly on the line. Adjust threshold to\n * loosen the strictness of the check for floating-point calculations.\n */\n public hasPoint(x: number, y: number, threshold?: number): boolean;\n\n /**\n * Whether or not the given point lies on this line. This method is precise by default\n * meaning the point must lie exactly on the line. Adjust threshold to\n * loosen the strictness of the check for floating-point calculations.\n */\n public hasPoint(v: Vector, threshold?: number): boolean;\n\n /**\n * @see http://stackoverflow.com/a/11908158/109458\n */\n public hasPoint(): boolean {\n let currPoint: Vector;\n let threshold = 0;\n\n if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number') {\n currPoint = new Vector(arguments[0], arguments[1]);\n threshold = arguments[2] || 0;\n } else if (arguments[0] instanceof Vector) {\n currPoint = arguments[0];\n threshold = arguments[1] || 0;\n } else {\n throw 'Could not determine the arguments for Vector.hasPoint';\n }\n\n const dxc = currPoint.x - this.begin.x;\n const dyc = currPoint.y - this.begin.y;\n\n const dx1 = this.end.x - this.begin.x;\n const dy1 = this.end.y - this.begin.y;\n\n const cross = dxc * dy1 - dyc * dx1;\n\n // check whether point lines on the line\n if (Math.abs(cross) > threshold) {\n return false;\n }\n\n // check whether point lies in-between start and end\n if (Math.abs(dx1) >= Math.abs(dy1)) {\n return dx1 > 0 ? this.begin.x <= currPoint.x && currPoint.x <= this.end.x : this.end.x <= currPoint.x && currPoint.x <= this.begin.x;\n } else {\n return dy1 > 0 ? this.begin.y <= currPoint.y && currPoint.y <= this.end.y : this.end.y <= currPoint.y && currPoint.y <= this.begin.y;\n }\n }\n}\n","import { Line } from '../../Math/line';\nimport { Vector } from '../../Math/vector';\nimport { Ray } from '../../Math/ray';\nimport { PolygonCollider } from './PolygonCollider';\nimport { EdgeCollider } from './EdgeCollider';\nimport { CircleCollider } from './CircleCollider';\n\n/**\n * Finds the closes line between 2 line segments, were the magnitude of u, v are the lengths of each segment\n * L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n * L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n * @param p0 Point where L1 begins\n * @param u Direction and length of L1\n * @param q0 Point were L2 begins\n * @param v Direction and length of L2\n */\nexport function ClosestLine(p0: Vector, u: Vector, q0: Vector, v: Vector) {\n // Distance between 2 lines http://geomalgorithms.com/a07-_distance.html\n\n // w(s, t) = P(s) - Q(t)\n // The w(s, t) that has the minimum distance we will say is w(sClosest, tClosest) = wClosest\n //\n // wClosest is the vector that is uniquely perpendicular to the 2 line directions u & v.\n // wClosest = w0 + sClosest * u - tClosest * v, where w0 is p0 - q0\n //\n // The closest point between 2 lines then satisfies this pair of equations\n // 1: u * wClosest = 0\n // 2: v * wClosest = 0\n //\n // Substituting wClosest into the equations we get\n //\n // 1: (u * u) * sClosest - (u * v) tClosest = -u * w0\n // 2: (v * u) * sClosest - (v * v) tClosest = -v * w0\n\n // simplify w0\n const w0 = p0.sub(q0);\n\n // simplify (u * u);\n const a = u.dot(u);\n // simplify (u * v);\n const b = u.dot(v);\n // simplify (v * v)\n const c = v.dot(v);\n // simplify (u * w0)\n const d = u.dot(w0);\n // simplify (v * w0)\n const e = v.dot(w0);\n\n // denominator ac - b^2\n const denom = a * c - b * b;\n let sDenom = denom;\n let tDenom = denom;\n // if denom is 0 they are parallel, use any point from either as the start in this case p0\n if (denom === 0 || denom <= 0.01) {\n const tClosestParallel = d / b;\n return new Line(p0, q0.add(v.scale(tClosestParallel)));\n }\n\n // Solve for sClosest for infinite line\n let sClosest = b * e - c * d; // / denom;\n\n // Solve for tClosest for infinite line\n let tClosest = a * e - b * d; // / denom;\n\n // Solve for segments candidate edges, if sClosest and tClosest are outside their segments\n if (sClosest < 0) {\n sClosest = 0;\n tClosest = e;\n tDenom = c;\n } else if (sClosest > sDenom) {\n sClosest = sDenom;\n tClosest = e + b;\n tDenom = c;\n }\n\n if (tClosest < 0) {\n tClosest = 0;\n if (-d < 0) {\n sClosest = 0;\n } else if (-d > a) {\n sClosest = sDenom;\n } else {\n sClosest = -d;\n sDenom = a;\n }\n } else if (tClosest > tDenom) {\n tClosest = tDenom;\n if (-d + b < 0) {\n sClosest = 0;\n } else if (-d + b > a) {\n sClosest = sDenom;\n } else {\n sClosest = -d + b;\n sDenom = a;\n }\n }\n sClosest = Math.abs(sClosest) < 0.001 ? 0 : sClosest / sDenom;\n tClosest = Math.abs(tClosest) < 0.001 ? 0 : tClosest / tDenom;\n\n return new Line(p0.add(u.scale(sClosest)), q0.add(v.scale(tClosest)));\n}\n\nexport const ClosestLineJumpTable = {\n PolygonPolygonClosestLine(polygonA: PolygonCollider, polygonB: PolygonCollider) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = polygonB.worldPos;\n const otherDirection = otherWorldPos.sub(polygonA.worldPos);\n const thisDirection = otherDirection.negate();\n\n const rayTowardsOther = new Ray(polygonA.worldPos, otherDirection);\n const rayTowardsThis = new Ray(otherWorldPos, thisDirection);\n\n const thisPoint = polygonA.rayCast(rayTowardsOther).add(rayTowardsOther.dir.scale(0.1));\n const otherPoint = polygonB.rayCast(rayTowardsThis).add(rayTowardsThis.dir.scale(0.1));\n\n const thisFace = polygonA.getClosestFace(thisPoint);\n const otherFace = polygonB.getClosestFace(otherPoint);\n\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const q0 = otherFace.face.begin;\n const v = otherFace.face.getEdge();\n\n return ClosestLine(p0, u, q0, v);\n },\n\n PolygonEdgeClosestLine(polygon: PolygonCollider, edge: EdgeCollider) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = edge.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n\n const rayTowardsOther = new Ray(polygon.worldPos, otherDirection);\n\n const thisPoint = polygon.rayCast(rayTowardsOther).add(rayTowardsOther.dir.scale(0.1));\n\n const thisFace = polygon.getClosestFace(thisPoint);\n\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLine = edge.asLine();\n const edgeStart = edgeLine.begin;\n const edgeVector = edgeLine.getEdge();\n const q0 = edgeStart;\n const v = edgeVector;\n\n return ClosestLine(p0, u, q0, v);\n },\n\n PolygonCircleClosestLine(polygon: PolygonCollider, circle: CircleCollider) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circle.worldPos;\n const otherDirection = otherWorldPos.sub(polygon.worldPos);\n\n const rayTowardsOther = new Ray(polygon.worldPos, otherDirection.normalize());\n\n const thisPoint = polygon.rayCast(rayTowardsOther).add(rayTowardsOther.dir.scale(0.1));\n\n const thisFace = polygon.getClosestFace(thisPoint);\n\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const p0 = thisFace.face.begin;\n const u = thisFace.face.getEdge();\n\n // Time of minimum distance\n let t = (u.x * (otherWorldPos.x - p0.x) + u.y * (otherWorldPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n\n // If time of minimum is past the edge clamp\n if (t > 1) {\n t = 1;\n } else if (t < 0) {\n t = 0;\n }\n\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - otherWorldPos.x, 2) + Math.pow(p0.y + u.y * t - otherWorldPos.y, 2)) - circle.radius;\n\n const circlex = ((p0.x + u.x * t - otherWorldPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - otherWorldPos.y) * circle.radius) / (circle.radius + d);\n return new Line(u.scale(t).add(p0), new Vector(otherWorldPos.x + circlex, otherWorldPos.y + circley));\n },\n\n CircleCircleClosestLine(circleA: CircleCollider, circleB: CircleCollider) {\n // Find the 2 closest faces on each polygon\n const otherWorldPos = circleB.worldPos;\n const otherDirection = otherWorldPos.sub(circleA.worldPos);\n\n const thisWorldPos = circleA.worldPos;\n const thisDirection = thisWorldPos.sub(circleB.worldPos);\n\n const rayTowardsOther = new Ray(circleA.worldPos, otherDirection);\n const rayTowardsThis = new Ray(circleB.worldPos, thisDirection);\n\n const thisPoint = circleA.rayCast(rayTowardsOther);\n const otherPoint = circleB.rayCast(rayTowardsThis);\n\n return new Line(thisPoint, otherPoint);\n },\n\n CircleEdgeClosestLine(circle: CircleCollider, edge: EdgeCollider) {\n // https://math.stackexchange.com/questions/1919177/how-to-find-point-on-line-closest-to-sphere\n const circleWorlPos = circle.worldPos;\n\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLine = edge.asLine();\n const edgeStart = edgeLine.begin;\n const edgeVector = edgeLine.getEdge();\n const p0 = edgeStart;\n const u = edgeVector;\n\n // Time of minimum distance\n let t = (u.x * (circleWorlPos.x - p0.x) + u.y * (circleWorlPos.y - p0.y)) / (u.x * u.x + u.y * u.y);\n\n // If time of minimum is past the edge clamp to edge\n if (t > 1) {\n t = 1;\n } else if (t < 0) {\n t = 0;\n }\n\n // Minimum distance\n const d = Math.sqrt(Math.pow(p0.x + u.x * t - circleWorlPos.x, 2) + Math.pow(p0.y + u.y * t - circleWorlPos.y, 2)) - circle.radius;\n\n const circlex = ((p0.x + u.x * t - circleWorlPos.x) * circle.radius) / (circle.radius + d);\n const circley = ((p0.y + u.y * t - circleWorlPos.y) * circle.radius) / (circle.radius + d);\n return new Line(u.scale(t).add(p0), new Vector(circleWorlPos.x + circlex, circleWorlPos.y + circley));\n },\n\n EdgeEdgeClosestLine(edgeA: EdgeCollider, edgeB: EdgeCollider) {\n // L1 = P(s) = p0 + s * u, where s is time and p0 is the start of the line\n const edgeLineA = edgeA.asLine();\n const edgeStartA = edgeLineA.begin;\n const edgeVectorA = edgeLineA.getEdge();\n const p0 = edgeStartA;\n const u = edgeVectorA;\n\n // L2 = Q(t) = q0 + t * v, where t is time and q0 is the start of the line\n const edgeLineB = edgeB.asLine();\n const edgeStartB = edgeLineB.begin;\n const edgeVectorB = edgeLineB.getEdge();\n const q0 = edgeStartB;\n const v = edgeVectorB;\n\n return ClosestLine(p0, u, q0, v);\n }\n};\n","import { BoundingBox } from '../BoundingBox';\r\nimport { CollisionJumpTable } from './CollisionJumpTable';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { PolygonCollider } from './PolygonCollider';\r\nimport { EdgeCollider } from './EdgeCollider';\r\n\r\nimport { Projection } from '../../Math/projection';\r\nimport { Line } from '../../Math/line';\r\nimport { Vector } from '../../Math/vector';\r\nimport { Ray } from '../../Math/ray';\r\nimport { Color } from '../../Color';\r\nimport { Collider } from './Collider';\r\n\r\nimport { ClosestLineJumpTable } from './ClosestLineJumpTable';\r\nimport { Transform, TransformComponent } from '../../EntityComponentSystem';\r\nimport { ExcaliburGraphicsContext } from '../../Graphics/Context/ExcaliburGraphicsContext';\r\n\r\nexport interface CircleColliderOptions {\r\n /**\r\n * Optional pixel offset to shift the circle relative to the collider, by default (0, 0).\r\n */\r\n offset?: Vector;\r\n /**\r\n * Required radius of the circle\r\n */\r\n radius: number;\r\n}\r\n\r\n/**\r\n * This is a circle collider for the excalibur rigid body physics simulation\r\n */\r\nexport class CircleCollider extends Collider {\r\n /**\r\n * Position of the circle relative to the collider, by default (0, 0).\r\n */\r\n public offset: Vector = Vector.Zero;\r\n\r\n public get worldPos(): Vector {\r\n return this.offset.add(this._transform?.pos ?? Vector.Zero);\r\n }\r\n\r\n /**\r\n * This is the radius of the circle\r\n */\r\n public radius: number;\r\n\r\n private _transform: Transform;\r\n\r\n constructor(options: CircleColliderOptions) {\r\n super();\r\n this.offset = options.offset || Vector.Zero;\r\n this.radius = options.radius || 0;\r\n }\r\n\r\n /**\r\n * Returns a clone of this shape, not associated with any collider\r\n */\r\n public clone(): CircleCollider {\r\n return new CircleCollider({\r\n offset: this.offset.clone(),\r\n radius: this.radius\r\n });\r\n }\r\n\r\n /**\r\n * Get the center of the collider in world coordinates\r\n */\r\n public get center(): Vector {\r\n return this.offset.add(this._transform?.pos ?? Vector.Zero);\r\n }\r\n\r\n /**\r\n * Tests if a point is contained in this collider\r\n */\r\n public contains(point: Vector): boolean {\r\n const pos = this._transform?.pos ?? this.offset;\r\n const distance = pos.distance(point);\r\n if (distance <= this.radius) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Casts a ray at the Circle collider and returns the nearest point of collision\r\n * @param ray\r\n */\r\n public rayCast(ray: Ray, max: number = Infinity): Vector {\r\n //https://en.wikipedia.org/wiki/Line%E2%80%93sphere_intersection\r\n const c = this.center;\r\n const dir = ray.dir;\r\n const orig = ray.pos;\r\n\r\n const discriminant = Math.sqrt(Math.pow(dir.dot(orig.sub(c)), 2) - Math.pow(orig.sub(c).distance(), 2) + Math.pow(this.radius, 2));\r\n\r\n if (discriminant < 0) {\r\n // no intersection\r\n return null;\r\n } else {\r\n let toi = 0;\r\n if (discriminant === 0) {\r\n toi = -dir.dot(orig.sub(c));\r\n if (toi > 0 && toi < max) {\r\n return ray.getPoint(toi);\r\n }\r\n return null;\r\n } else {\r\n const toi1 = -dir.dot(orig.sub(c)) + discriminant;\r\n const toi2 = -dir.dot(orig.sub(c)) - discriminant;\r\n\r\n const positiveToi: number[] = [];\r\n if (toi1 >= 0) {\r\n positiveToi.push(toi1);\r\n }\r\n\r\n if (toi2 >= 0) {\r\n positiveToi.push(toi2);\r\n }\r\n\r\n const mintoi = Math.min(...positiveToi);\r\n if (mintoi <= max) {\r\n return ray.getPoint(mintoi);\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n public getClosestLineBetween(shape: Collider): Line {\r\n if (shape instanceof CircleCollider) {\r\n return ClosestLineJumpTable.CircleCircleClosestLine(this, shape);\r\n } else if (shape instanceof PolygonCollider) {\r\n return ClosestLineJumpTable.PolygonCircleClosestLine(shape, this).flip();\r\n } else if (shape instanceof EdgeCollider) {\r\n return ClosestLineJumpTable.CircleEdgeClosestLine(this, shape).flip();\r\n } else {\r\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\r\n }\r\n }\r\n\r\n /**\r\n * @inheritdoc\r\n */\r\n public collide(collider: Collider): CollisionContact[] {\r\n if (collider instanceof CircleCollider) {\r\n return CollisionJumpTable.CollideCircleCircle(this, collider);\r\n } else if (collider instanceof PolygonCollider) {\r\n return CollisionJumpTable.CollideCirclePolygon(this, collider);\r\n } else if (collider instanceof EdgeCollider) {\r\n return CollisionJumpTable.CollideCircleEdge(this, collider);\r\n } else {\r\n throw new Error(`Circle could not collide with unknown CollisionShape ${typeof collider}`);\r\n }\r\n }\r\n\r\n /**\r\n * Find the point on the collider furthest in the direction specified\r\n */\r\n public getFurthestPoint(direction: Vector): Vector {\r\n return this.center.add(direction.normalize().scale(this.radius));\r\n }\r\n\r\n /**\r\n * Find the local point on the shape in the direction specified\r\n * @param direction\r\n */\r\n public getFurthestLocalPoint(direction: Vector): Vector {\r\n const dir = direction.normalize();\r\n return dir.scale(this.radius);\r\n }\r\n\r\n /**\r\n * Get the axis aligned bounding box for the circle collider in world coordinates\r\n */\r\n public get bounds(): BoundingBox {\r\n const tx = this._transform as TransformComponent;\r\n const bodyPos = tx?.globalPos ?? Vector.Zero;\r\n return new BoundingBox(\r\n this.offset.x + bodyPos.x - this.radius,\r\n this.offset.y + bodyPos.y - this.radius,\r\n this.offset.x + bodyPos.x + this.radius,\r\n this.offset.y + bodyPos.y + this.radius\r\n );\r\n }\r\n\r\n /**\r\n * Get the axis aligned bounding box for the circle collider in local coordinates\r\n */\r\n public get localBounds(): BoundingBox {\r\n return new BoundingBox(\r\n this.offset.x - this.radius,\r\n this.offset.y - this.radius,\r\n this.offset.x + this.radius,\r\n this.offset.y + this.radius\r\n );\r\n }\r\n\r\n /**\r\n * Get axis not implemented on circles, since there are infinite axis in a circle\r\n */\r\n public get axes(): Vector[] {\r\n return [];\r\n }\r\n\r\n /**\r\n * Returns the moment of inertia of a circle given it's mass\r\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\r\n */\r\n public getInertia(mass: number): number {\r\n return (mass * this.radius * this.radius) / 2;\r\n }\r\n\r\n /* istanbul ignore next */\r\n public update(transform: Transform): void {\r\n this._transform = transform;\r\n }\r\n\r\n /**\r\n * Project the circle along a specified axis\r\n */\r\n public project(axis: Vector): Projection {\r\n const scalars = [];\r\n const point = this.center;\r\n const dotProduct = point.dot(axis);\r\n scalars.push(dotProduct);\r\n scalars.push(dotProduct + this.radius);\r\n scalars.push(dotProduct - this.radius);\r\n return new Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\r\n }\r\n\r\n public draw(ctx: CanvasRenderingContext2D, color: Color = Color.Green, pos: Vector = Vector.Zero) {\r\n const newPos = pos.add(this.offset);\r\n ctx.beginPath();\r\n ctx.fillStyle = color.toString();\r\n ctx.arc(newPos.x, newPos.y, this.radius, 0, Math.PI * 2);\r\n ctx.closePath();\r\n ctx.fill();\r\n }\r\n\r\n public debug(ex: ExcaliburGraphicsContext, color: Color) {\r\n const tx = this._transform as TransformComponent;\r\n const pos = tx?.globalPos ? tx?.globalPos.add(this.offset) : this.offset;\r\n ex.drawCircle(pos, this.radius, color);\r\n }\r\n\r\n /* istanbul ignore next */\r\n public debugDraw(ctx: CanvasRenderingContext2D, color: Color = Color.Green) {\r\n const transform = this._transform;\r\n const pos = transform ? transform.pos.add(this.offset) : this.offset;\r\n const rotation = transform ? transform.rotation : 0;\r\n\r\n ctx.beginPath();\r\n ctx.strokeStyle = color.toString();\r\n ctx.arc(pos.x, pos.y, this.radius, 0, Math.PI * 2);\r\n ctx.closePath();\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.moveTo(pos.x, pos.y);\r\n ctx.lineTo(Math.cos(rotation) * this.radius + pos.x, Math.sin(rotation) * this.radius + pos.y);\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n}\r\n","import { Vector } from '../../Math/vector';\nimport { Physics } from '../Physics';\nimport { Collider } from '../Colliders/Collider';\nimport { CollisionType } from '../CollisionType';\nimport { Pair } from './Pair';\nimport { SeparationInfo } from '../Colliders/SeparatingAxis';\nimport { BodyComponent } from '../BodyComponent';\n\n/**\n * Collision contacts are used internally by Excalibur to resolve collision between colliders. This\n * Pair prevents collisions from being evaluated more than one time\n */\nexport class CollisionContact {\n private _canceled = false;\n\n /**\n * Currently the ids between colliders\n */\n readonly id: string;\n\n /**\n * The first collider in the collision\n */\n colliderA: Collider;\n\n /**\n * The second collider in the collision\n */\n colliderB: Collider;\n\n /**\n * The minimum translation vector to resolve overlap, pointing away from colliderA\n */\n mtv: Vector;\n\n /**\n * World space contact points between colliderA and colliderB\n */\n points: Vector[];\n\n /**\n * Local space contact points between colliderA and colliderB\n */\n localPoints: Vector[];\n\n /**\n * The collision normal, pointing away from colliderA\n */\n normal: Vector;\n\n /**\n * The collision tangent\n */\n tangent: Vector;\n\n /**\n * Information about the specifics of the collision contact separation\n */\n info: SeparationInfo;\n\n constructor(\n colliderA: Collider,\n colliderB: Collider,\n mtv: Vector,\n normal: Vector,\n tangent: Vector,\n points: Vector[],\n localPoints: Vector[],\n info: SeparationInfo\n ) {\n this.colliderA = colliderA;\n this.colliderB = colliderB;\n this.mtv = mtv;\n this.normal = normal;\n this.tangent = tangent;\n this.points = points;\n this.localPoints = localPoints;\n this.info = info;\n this.id = Pair.calculatePairHash(colliderA.id, colliderB.id);\n }\n\n /**\n * Match contact awake state, except if body's are Fixed\n */\n public matchAwake(): void {\n const bodyA = this.colliderA.owner.get(BodyComponent);\n const bodyB = this.colliderB.owner.get(BodyComponent);\n if (bodyA && bodyB) {\n if (bodyA.sleeping !== bodyB.sleeping) {\n if (bodyA.sleeping && bodyA.collisionType !== CollisionType.Fixed && bodyB.sleepMotion >= Physics.wakeThreshold) {\n bodyA.setSleeping(false);\n }\n if (bodyB.sleeping && bodyB.collisionType !== CollisionType.Fixed && bodyA.sleepMotion >= Physics.wakeThreshold) {\n bodyB.setSleeping(false);\n }\n }\n }\n }\n\n public isCanceled() {\n return this._canceled;\n }\n\n public cancel(): void {\n this._canceled = true;\n }\n}\n","import { Line } from '../../Math/line';\nimport { Vector } from '../../Math/vector';\nimport { Collider } from './Collider';\nimport { CircleCollider } from './CircleCollider';\nimport { PolygonCollider } from './PolygonCollider';\n\n/**\n * Specific information about a contact and it's separation\n */\nexport interface SeparationInfo {\n /**\n * Collider A\n */\n collider: Collider;\n\n /**\n * Signed value (negative means overlap, positive no overlap)\n */\n separation: number;\n\n /**\n * Axis of separation from the collider's perpective\n */\n axis: Vector;\n\n /**\n * Side of separation (reference) from the collider's perpsective\n */\n\n side?: Line;\n\n /**\n * Local side of separation (reference) from the collider's perspective\n */\n localSide?: Line;\n\n /**\n * Index of the separation side (reference) from the collider's perspective\n */\n sideId?: number;\n\n /**\n * Point on collider B (incident point)\n */\n point: Vector;\n\n /**\n * Local point on collider B (incident point)\n */\n localPoint?: Vector;\n}\n\nexport class SeparatingAxis {\n static findPolygonPolygonSeparation(polyA: PolygonCollider, polyB: PolygonCollider): SeparationInfo {\n let bestSeparation = -Number.MAX_VALUE;\n let bestSide: Line | null = null;\n let bestAxis: Vector | null = null;\n let bestSideIndex: number = -1;\n let bestOtherPoint: Vector | null = null;\n const sides = polyA.getSides();\n const localSides = polyA.getLocalSides();\n for (let i = 0; i < sides.length; i++) {\n const side = sides[i];\n const axis = side.normal();\n const vertB = polyB.getFurthestPoint(axis.negate());\n // Separation on side i's axis\n // We are looking for the largest separation between poly A's sides\n const vertSeparation = side.distanceToPoint(vertB, true);\n if (vertSeparation > bestSeparation) {\n bestSeparation = vertSeparation;\n bestSide = side;\n bestAxis = axis;\n bestSideIndex = i;\n bestOtherPoint = vertB;\n }\n }\n\n return {\n collider: polyA,\n separation: bestAxis ? bestSeparation : 99,\n axis: bestAxis as Vector,\n side: bestSide,\n localSide: localSides[bestSideIndex],\n sideId: bestSideIndex,\n point: bestOtherPoint as Vector,\n localPoint: bestAxis ? polyB.getFurthestLocalPoint(bestAxis!.negate()) : null\n };\n }\n\n static findCirclePolygonSeparation(circle: CircleCollider, polygon: PolygonCollider): Vector | null {\n const axes = polygon.axes;\n const pc = polygon.center;\n // Special SAT with circles\n const polyDir = pc.sub(circle.worldPos);\n const closestPointOnPoly = polygon.getFurthestPoint(polyDir.negate());\n axes.push(closestPointOnPoly.sub(circle.worldPos).normalize());\n\n let minOverlap = Number.MAX_VALUE;\n let minAxis = null;\n let minIndex = -1;\n for (let i = 0; i < axes.length; i++) {\n const proj1 = polygon.project(axes[i]);\n const proj2 = circle.project(axes[i]);\n const overlap = proj1.getOverlap(proj2);\n if (overlap <= 0) {\n return null;\n } else {\n if (overlap < minOverlap) {\n minOverlap = overlap;\n minAxis = axes[i];\n minIndex = i;\n }\n }\n }\n if (minIndex < 0) {\n return null;\n }\n return minAxis.normalize().scale(minOverlap);\n }\n}\n","import { CircleCollider } from './CircleCollider';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { PolygonCollider } from './PolygonCollider';\r\nimport { EdgeCollider } from './EdgeCollider';\r\nimport { SeparatingAxis, SeparationInfo } from './SeparatingAxis';\r\nimport { Line } from '../../Math/line';\r\nimport { Vector } from '../../Math/vector';\r\nimport { TransformComponent } from '../../EntityComponentSystem';\r\nimport { Pair } from '../Detection/Pair';\r\n\r\nexport const CollisionJumpTable = {\r\n CollideCircleCircle(circleA: CircleCollider, circleB: CircleCollider): CollisionContact[] {\r\n const circleAPos = circleA.worldPos;\r\n const circleBPos = circleB.worldPos;\r\n const combinedRadius = circleA.radius + circleB.radius;\r\n const distance = circleAPos.distance(circleBPos);\r\n\r\n if (distance > combinedRadius) {\r\n return [];\r\n }\r\n\r\n // negative means overlap\r\n const separation = combinedRadius - distance;\r\n\r\n // Normal points from A -> B\r\n const normal = circleBPos.sub(circleAPos).normalize();\r\n const tangent = normal.perpendicular();\r\n const mvt = normal.scale(separation);\r\n\r\n const point = circleA.getFurthestPoint(normal);\r\n const local = circleA.getFurthestLocalPoint(normal);\r\n\r\n const info: SeparationInfo = {\r\n collider: circleA,\r\n separation,\r\n axis: normal,\r\n point: point\r\n };\r\n\r\n return [new CollisionContact(circleA, circleB, mvt, normal, tangent, [point], [local], info)];\r\n },\r\n\r\n CollideCirclePolygon(circle: CircleCollider, polygon: PolygonCollider): CollisionContact[] {\r\n let minAxis = SeparatingAxis.findCirclePolygonSeparation(circle, polygon);\r\n if (!minAxis) {\r\n return [];\r\n }\r\n\r\n // make sure that the minAxis is pointing away from circle\r\n const samedir = minAxis.dot(polygon.center.sub(circle.center));\r\n minAxis = samedir < 0 ? minAxis.negate() : minAxis;\r\n\r\n const point = circle.getFurthestPoint(minAxis);\r\n const xf = circle.owner?.get(TransformComponent) ?? new TransformComponent();\r\n const local = xf.applyInverse(point);\r\n const normal = minAxis.normalize();\r\n\r\n const info: SeparationInfo = {\r\n collider: circle,\r\n separation: -minAxis.size,\r\n axis: normal,\r\n point: point,\r\n localPoint: local,\r\n side: polygon.findSide(normal.negate()),\r\n localSide: polygon.findLocalSide(normal.negate())\r\n };\r\n\r\n return [new CollisionContact(circle, polygon, minAxis, normal, normal.perpendicular(), [point], [local], info)];\r\n },\r\n\r\n CollideCircleEdge(circle: CircleCollider, edge: EdgeCollider): CollisionContact[] {\r\n // TODO not sure this actually abides by local/world collisions\r\n // Are edge.begin and edge.end local space or world space? I think they should be local\r\n\r\n // center of the circle in world pos\r\n const cc = circle.center;\r\n // vector in the direction of the edge\r\n const edgeWorld = edge.asLine();\r\n const e = edgeWorld.end.sub(edgeWorld.begin);\r\n\r\n // amount of overlap with the circle's center along the edge direction\r\n const u = e.dot(edgeWorld.end.sub(cc));\r\n const v = e.dot(cc.sub(edgeWorld.begin));\r\n const side = edge.asLine();\r\n const localSide = edge.asLocalLine();\r\n\r\n // Potential region A collision (circle is on the left side of the edge, before the beginning)\r\n if (v <= 0) {\r\n const da = edgeWorld.begin.sub(cc);\r\n const dda = da.dot(da); // quick and dirty way of calc'n distance in r^2 terms saves some sqrts\r\n // save some sqrts\r\n if (dda > circle.radius * circle.radius) {\r\n return []; // no collision\r\n }\r\n\r\n const normal = da.normalize();\r\n const separation = circle.radius - Math.sqrt(dda);\r\n\r\n const info: SeparationInfo = {\r\n collider: circle,\r\n separation: separation,\r\n axis: normal,\r\n point: side.begin,\r\n side: side,\r\n localSide: localSide\r\n };\r\n\r\n return [\r\n new CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.begin], [localSide.begin], info)\r\n ];\r\n }\r\n\r\n // Potential region B collision (circle is on the right side of the edge, after the end)\r\n if (u <= 0) {\r\n const db = edgeWorld.end.sub(cc);\r\n const ddb = db.dot(db);\r\n if (ddb > circle.radius * circle.radius) {\r\n return [];\r\n }\r\n\r\n const normal = db.normalize();\r\n const separation = circle.radius - Math.sqrt(ddb);\r\n\r\n const info: SeparationInfo = {\r\n collider: circle,\r\n separation: separation,\r\n axis: normal,\r\n point: side.end,\r\n side: side,\r\n localSide: localSide\r\n };\r\n\r\n return [\r\n new CollisionContact(circle, edge, normal.scale(separation), normal, normal.perpendicular(), [side.end], [localSide.end], info)\r\n ];\r\n }\r\n\r\n // Otherwise potential region AB collision (circle is in the middle of the edge between the beginning and end)\r\n const den = e.dot(e);\r\n const pointOnEdge = edgeWorld.begin\r\n .scale(u)\r\n .add(edgeWorld.end.scale(v))\r\n .scale(1 / den);\r\n const d = cc.sub(pointOnEdge);\r\n\r\n const dd = d.dot(d);\r\n if (dd > circle.radius * circle.radius) {\r\n return []; // no collision\r\n }\r\n\r\n let normal = e.perpendicular();\r\n // flip correct direction\r\n if (normal.dot(cc.sub(edgeWorld.begin)) < 0) {\r\n normal.x = -normal.x;\r\n normal.y = -normal.y;\r\n }\r\n\r\n normal = normal.normalize();\r\n const separation = circle.radius - Math.sqrt(dd);\r\n\r\n const mvt = normal.scale(separation);\r\n const info: SeparationInfo = {\r\n collider: circle,\r\n separation: separation,\r\n axis: normal,\r\n point: pointOnEdge,\r\n side: side,\r\n localSide: localSide\r\n };\r\n\r\n return [\r\n new CollisionContact(\r\n circle,\r\n edge,\r\n mvt,\r\n normal.negate(),\r\n normal.negate().perpendicular(),\r\n [pointOnEdge],\r\n [pointOnEdge.sub(edge.worldPos)],\r\n info\r\n )\r\n ];\r\n },\r\n\r\n CollideEdgeEdge(): CollisionContact[] {\r\n // Edge-edge collision doesn't make sense\r\n return [];\r\n },\r\n\r\n CollidePolygonEdge(polygon: PolygonCollider, edge: EdgeCollider): CollisionContact[] {\r\n const pc = polygon.center;\r\n const ec = edge.center;\r\n const dir = ec.sub(pc).normalize();\r\n\r\n // build a temporary polygon from the edge to use SAT\r\n const linePoly = new PolygonCollider({\r\n points: [edge.begin, edge.end, edge.end.add(dir.scale(100)), edge.begin.add(dir.scale(100))],\r\n offset: edge.offset\r\n });\r\n linePoly.owner = edge.owner;\r\n const tx = edge.owner?.get(TransformComponent);\r\n if (tx) {\r\n linePoly.update(edge.owner.get(TransformComponent));\r\n }\r\n // Gross hack but poly-poly works well\r\n const contact = this.CollidePolygonPolygon(polygon, linePoly);\r\n if (contact.length) {\r\n // Fudge the contact back to edge\r\n contact[0].colliderB = edge;\r\n (contact[0].id as any) = Pair.calculatePairHash(polygon.id, edge.id);\r\n // contact[0].info.collider\r\n }\r\n return contact;\r\n },\r\n\r\n CollidePolygonPolygon(polyA: PolygonCollider, polyB: PolygonCollider): CollisionContact[] {\r\n // Multi contact from SAT\r\n // https://gamedev.stackexchange.com/questions/111390/multiple-contacts-for-sat-collision-detection\r\n // do a SAT test to find a min axis if it exists\r\n const separationA = SeparatingAxis.findPolygonPolygonSeparation(polyA, polyB);\r\n // If there is no overlap from boxA's perspective we can end early\r\n if (separationA.separation > 0) {\r\n return [];\r\n }\r\n\r\n const separationB = SeparatingAxis.findPolygonPolygonSeparation(polyB, polyA);\r\n // If there is no overlap from boxB's perspective exit now\r\n if (separationB.separation > 0) {\r\n return [];\r\n }\r\n\r\n // Separations are both negative, we want to pick the least negative (minimal movement)\r\n const separation = separationA.separation > separationB.separation ? separationA : separationB;\r\n\r\n // The incident side is the most opposite from the axes of collision on the other collider\r\n const other = separation.collider === polyA ? polyB : polyA;\r\n const incident = other.findSide(separation.axis.negate()) as Line;\r\n\r\n // Clip incident side by the perpendicular lines at each end of the reference side\r\n // https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm\r\n const reference = separation.side;\r\n const refDir = reference.dir().normalize();\r\n\r\n // Find our contact points by clipping the incident by the collision side\r\n const clipRight = incident.clip(refDir.negate(), -refDir.dot(reference.begin));\r\n let clipLeft: Line | null = null;\r\n if (clipRight) {\r\n clipLeft = clipRight.clip(refDir, refDir.dot(reference.end));\r\n }\r\n\r\n // If there is no left there is no collision\r\n if (clipLeft) {\r\n // We only want clip points below the reference edge, discard the others\r\n const points = clipLeft.getPoints().filter((p) => {\r\n return reference.below(p);\r\n });\r\n\r\n let normal = separation.axis;\r\n let tangent = normal.perpendicular();\r\n // Point Contact A -> B\r\n if (polyB.worldPos.sub(polyA.worldPos).dot(normal) < 0) {\r\n normal = normal.negate();\r\n tangent = normal.perpendicular();\r\n }\r\n // Points are clipped from incident which is the other collider\r\n // Store those as locals\r\n let localPoints: Vector[] = [];\r\n if (separation.collider === polyA) {\r\n const xf = polyB.owner?.get(TransformComponent) ?? new TransformComponent();\r\n localPoints = points.map((p) => xf.applyInverse(p));\r\n } else {\r\n const xf = polyA.owner?.get(TransformComponent) ?? new TransformComponent();\r\n localPoints = points.map((p) => xf.applyInverse(p));\r\n }\r\n return [new CollisionContact(polyA, polyB, normal.scale(-separation.separation), normal, tangent, points, localPoints, separation)];\r\n }\r\n return [];\r\n },\r\n\r\n FindContactSeparation(contact: CollisionContact, localPoint: Vector) {\r\n const shapeA = contact.colliderA;\r\n const txA = contact.colliderA.owner?.get(TransformComponent) ?? new TransformComponent();\r\n const shapeB = contact.colliderB;\r\n const txB = contact.colliderB.owner?.get(TransformComponent) ?? new TransformComponent();\r\n\r\n // both are circles\r\n if (shapeA instanceof CircleCollider && shapeB instanceof CircleCollider) {\r\n const combinedRadius = shapeA.radius + shapeB.radius;\r\n const distance = txA.pos.distance(txB.pos);\r\n const separation = combinedRadius - distance;\r\n return -separation;\r\n }\r\n\r\n // both are polygons\r\n if (shapeA instanceof PolygonCollider && shapeB instanceof PolygonCollider) {\r\n if (contact.info.localSide) {\r\n let side: Line;\r\n let worldPoint: Vector;\r\n if (contact.info.collider === shapeA) {\r\n side = new Line(txA.apply(contact.info.localSide.begin), txA.apply(contact.info.localSide.end));\r\n worldPoint = txB.apply(localPoint);\r\n } else {\r\n side = new Line(txB.apply(contact.info.localSide.begin), txB.apply(contact.info.localSide.end));\r\n worldPoint = txA.apply(localPoint);\r\n }\r\n\r\n return side.distanceToPoint(worldPoint, true);\r\n }\r\n }\r\n\r\n // polygon v circle\r\n if (\r\n (shapeA instanceof PolygonCollider && shapeB instanceof CircleCollider) ||\r\n (shapeB instanceof PolygonCollider && shapeA instanceof CircleCollider)\r\n ) {\r\n const worldPoint = txA.apply(localPoint);\r\n if (contact.info.side) {\r\n return contact.info.side.distanceToPoint(worldPoint, true);\r\n }\r\n }\r\n\r\n // polygon v edge\r\n if (\r\n (shapeA instanceof EdgeCollider && shapeB instanceof PolygonCollider) ||\r\n (shapeB instanceof EdgeCollider && shapeA instanceof PolygonCollider)\r\n ) {\r\n let worldPoint: Vector;\r\n if (contact.info.collider === shapeA) {\r\n worldPoint = txB.apply(localPoint);\r\n } else {\r\n worldPoint = txA.apply(localPoint);\r\n }\r\n if (contact.info.side) {\r\n return contact.info.side.distanceToPoint(worldPoint, true);\r\n }\r\n }\r\n\r\n // circle v edge\r\n if (\r\n (shapeA instanceof CircleCollider && shapeB instanceof EdgeCollider) ||\r\n (shapeB instanceof CircleCollider && shapeA instanceof EdgeCollider)\r\n ) {\r\n // Local point is always on the edge which is always shapeB\r\n const worldPoint = txB.apply(localPoint);\r\n\r\n let circlePoint: Vector;\r\n if (shapeA instanceof CircleCollider) {\r\n circlePoint = shapeA.getFurthestPoint(contact.normal);\r\n }\r\n\r\n const dist = worldPoint.distance(circlePoint);\r\n\r\n if (contact.info.side) {\r\n return dist > 0 ? -dist : 0;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n};\r\n","import { BoundingBox } from '../BoundingBox';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { CollisionJumpTable } from './CollisionJumpTable';\r\nimport { CircleCollider } from './CircleCollider';\r\nimport { PolygonCollider } from './PolygonCollider';\r\n\r\nimport { Projection } from '../../Math/projection';\r\nimport { Line } from '../../Math/line';\r\nimport { Vector } from '../../Math/vector';\r\nimport { Ray } from '../../Math/ray';\r\nimport { Color } from '../../Color';\r\nimport { Collider } from './Collider';\r\nimport { ClosestLineJumpTable } from './ClosestLineJumpTable';\r\nimport { Transform, TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { ExcaliburGraphicsContext } from '../../Graphics/Context/ExcaliburGraphicsContext';\r\n\r\nexport interface EdgeColliderOptions {\r\n /**\r\n * The beginning of the edge defined in local coordinates to the collider\r\n */\r\n begin: Vector;\r\n /**\r\n * The ending of the edge defined in local coordinates to the collider\r\n */\r\n end: Vector;\r\n /**\r\n * Optionall specify an offset\r\n */\r\n offset?: Vector;\r\n}\r\n\r\n/**\r\n * Edge is a single line collider to create collisions with a single line.\r\n */\r\nexport class EdgeCollider extends Collider {\r\n offset: Vector;\r\n begin: Vector;\r\n end: Vector;\r\n\r\n private _transform: Transform;\r\n\r\n constructor(options: EdgeColliderOptions) {\r\n super();\r\n this.begin = options.begin || Vector.Zero;\r\n this.end = options.end || Vector.Zero;\r\n this.offset = options.offset ?? Vector.Zero;\r\n }\r\n\r\n /**\r\n * Returns a clone of this Edge, not associated with any collider\r\n */\r\n public clone(): EdgeCollider {\r\n return new EdgeCollider({\r\n begin: this.begin.clone(),\r\n end: this.end.clone()\r\n });\r\n }\r\n\r\n public get worldPos(): Vector {\r\n const tx = this._transform as TransformComponent;\r\n return tx?.globalPos.add(this.offset) ?? this.offset;\r\n }\r\n\r\n /**\r\n * Get the center of the collision area in world coordinates\r\n */\r\n public get center(): Vector {\r\n const pos = this.begin.average(this.end).add(this._getBodyPos());\r\n return pos;\r\n }\r\n\r\n private _getBodyPos(): Vector {\r\n const tx = this._transform as TransformComponent;\r\n const bodyPos = tx?.globalPos ?? Vector.Zero;\r\n return bodyPos;\r\n }\r\n\r\n private _getTransformedBegin(): Vector {\r\n const tx = this._transform as TransformComponent;\r\n const angle = tx ? tx.globalRotation : 0;\r\n return this.begin.rotate(angle).add(this._getBodyPos());\r\n }\r\n\r\n private _getTransformedEnd(): Vector {\r\n const tx = this._transform as TransformComponent;\r\n const angle = tx ? tx.globalRotation : 0;\r\n return this.end.rotate(angle).add(this._getBodyPos());\r\n }\r\n\r\n /**\r\n * Returns the slope of the line in the form of a vector\r\n */\r\n public getSlope(): Vector {\r\n const begin = this._getTransformedBegin();\r\n const end = this._getTransformedEnd();\r\n const distance = begin.distance(end);\r\n return end.sub(begin).scale(1 / distance);\r\n }\r\n\r\n /**\r\n * Returns the length of the line segment in pixels\r\n */\r\n public getLength(): number {\r\n const begin = this._getTransformedBegin();\r\n const end = this._getTransformedEnd();\r\n const distance = begin.distance(end);\r\n return distance;\r\n }\r\n\r\n /**\r\n * Tests if a point is contained in this collision area\r\n */\r\n public contains(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * @inheritdoc\r\n */\r\n public rayCast(ray: Ray, max: number = Infinity): Vector {\r\n const numerator = this._getTransformedBegin().sub(ray.pos);\r\n\r\n // Test is line and ray are parallel and non intersecting\r\n if (ray.dir.cross(this.getSlope()) === 0 && numerator.cross(ray.dir) !== 0) {\r\n return null;\r\n }\r\n\r\n // Lines are parallel\r\n const divisor = ray.dir.cross(this.getSlope());\r\n if (divisor === 0) {\r\n return null;\r\n }\r\n\r\n const t = numerator.cross(this.getSlope()) / divisor;\r\n\r\n if (t >= 0 && t <= max) {\r\n const u = numerator.cross(ray.dir) / divisor / this.getLength();\r\n if (u >= 0 && u <= 1) {\r\n return ray.getPoint(t);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the closes line between this and another collider, from this -> collider\r\n * @param shape\r\n */\r\n public getClosestLineBetween(shape: Collider): Line {\r\n if (shape instanceof CircleCollider) {\r\n return ClosestLineJumpTable.CircleEdgeClosestLine(shape, this);\r\n } else if (shape instanceof PolygonCollider) {\r\n return ClosestLineJumpTable.PolygonEdgeClosestLine(shape, this).flip();\r\n } else if (shape instanceof EdgeCollider) {\r\n return ClosestLineJumpTable.EdgeEdgeClosestLine(this, shape);\r\n } else {\r\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof shape}`);\r\n }\r\n }\r\n\r\n /**\r\n * @inheritdoc\r\n */\r\n public collide(shape: Collider): CollisionContact[] {\r\n if (shape instanceof CircleCollider) {\r\n return CollisionJumpTable.CollideCircleEdge(shape, this);\r\n } else if (shape instanceof PolygonCollider) {\r\n return CollisionJumpTable.CollidePolygonEdge(shape, this);\r\n } else if (shape instanceof EdgeCollider) {\r\n return CollisionJumpTable.CollideEdgeEdge();\r\n } else {\r\n throw new Error(`Edge could not collide with unknown CollisionShape ${typeof shape}`);\r\n }\r\n }\r\n\r\n /**\r\n * Find the point on the collider furthest in the direction specified\r\n */\r\n public getFurthestPoint(direction: Vector): Vector {\r\n const transformedBegin = this._getTransformedBegin();\r\n const transformedEnd = this._getTransformedEnd();\r\n if (direction.dot(transformedBegin) > 0) {\r\n return transformedBegin;\r\n } else {\r\n return transformedEnd;\r\n }\r\n }\r\n\r\n private _boundsFromBeginEnd(begin: Vector, end: Vector, padding = 10) {\r\n // A perfectly vertical or horizontal edge would have a bounds 0 width or height\r\n // this causes problems for the collision system so we give them some padding\r\n return new BoundingBox(\r\n Math.min(begin.x, end.x) - padding,\r\n Math.min(begin.y, end.y) - padding,\r\n Math.max(begin.x, end.x) + padding,\r\n Math.max(begin.y, end.y) + padding\r\n );\r\n }\r\n\r\n /**\r\n * Get the axis aligned bounding box for the edge collider in world space\r\n */\r\n public get bounds(): BoundingBox {\r\n const transformedBegin = this._getTransformedBegin();\r\n const transformedEnd = this._getTransformedEnd();\r\n return this._boundsFromBeginEnd(transformedBegin, transformedEnd);\r\n }\r\n\r\n /**\r\n * Get the axis aligned bounding box for the edge collider in local space\r\n */\r\n public get localBounds(): BoundingBox {\r\n return this._boundsFromBeginEnd(this.begin, this.end);\r\n }\r\n\r\n /**\r\n * Returns this edge represented as a line in world coordinates\r\n */\r\n public asLine(): Line {\r\n return new Line(this._getTransformedBegin(), this._getTransformedEnd());\r\n }\r\n\r\n /**\r\n * Return this edge as a line in local line coordinates (relative to the position)\r\n */\r\n public asLocalLine(): Line {\r\n return new Line(this.begin, this.end);\r\n }\r\n\r\n /**\r\n * Get the axis associated with the edge\r\n */\r\n public get axes(): Vector[] {\r\n const e = this._getTransformedEnd().sub(this._getTransformedBegin());\r\n const edgeNormal = e.normal();\r\n\r\n const axes = [];\r\n axes.push(edgeNormal);\r\n axes.push(edgeNormal.negate());\r\n axes.push(edgeNormal.normal());\r\n axes.push(edgeNormal.normal().negate());\r\n return axes;\r\n }\r\n\r\n /**\r\n * Get the moment of inertia for an edge\r\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\r\n */\r\n public getInertia(mass: number): number {\r\n const length = this.end.sub(this.begin).distance() / 2;\r\n return mass * length * length;\r\n }\r\n\r\n /**\r\n * @inheritdoc\r\n */\r\n public update(transform: Transform): void {\r\n this._transform = transform;\r\n }\r\n\r\n /**\r\n * Project the edge along a specified axis\r\n */\r\n public project(axis: Vector): Projection {\r\n const scalars = [];\r\n\r\n const points = [this._getTransformedBegin(), this._getTransformedEnd()];\r\n const len = points.length;\r\n for (let i = 0; i < len; i++) {\r\n scalars.push(points[i].dot(axis));\r\n }\r\n\r\n return new Projection(Math.min.apply(Math, scalars), Math.max.apply(Math, scalars));\r\n }\r\n\r\n public draw(ctx: CanvasRenderingContext2D, color: Color = Color.Green, pos: Vector = Vector.Zero) {\r\n const begin = this.begin.add(pos);\r\n const end = this.end.add(pos);\r\n ctx.strokeStyle = color.toString();\r\n ctx.beginPath();\r\n ctx.moveTo(begin.x, begin.y);\r\n ctx.lineTo(end.x, end.y);\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n\r\n public debug(ex: ExcaliburGraphicsContext, color: Color) {\r\n const begin = this._getTransformedBegin();\r\n const end = this._getTransformedEnd();\r\n ex.drawLine(begin, end, color, 2);\r\n ex.drawCircle(begin, 2, color);\r\n ex.drawCircle(end, 2, color);\r\n }\r\n\r\n /* istanbul ignore next */\r\n public debugDraw(ctx: CanvasRenderingContext2D, color: Color = Color.Red) {\r\n const begin = this._getTransformedBegin();\r\n const end = this._getTransformedEnd();\r\n ctx.strokeStyle = color.toString();\r\n ctx.beginPath();\r\n ctx.moveTo(begin.x, begin.y);\r\n ctx.lineTo(end.x, end.y);\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n}\r\n","import { Color } from '../../Color';\r\nimport { BoundingBox } from '../BoundingBox';\r\nimport { EdgeCollider } from './EdgeCollider';\r\nimport { CollisionJumpTable } from './CollisionJumpTable';\r\nimport { CircleCollider } from './CircleCollider';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { Projection } from '../../Math/projection';\r\nimport { Line } from '../../Math/line';\r\nimport { Vector } from '../../Math/vector';\r\nimport { Ray } from '../../Math/ray';\r\nimport { ClosestLineJumpTable } from './ClosestLineJumpTable';\r\nimport { Transform, TransformComponent } from '../../EntityComponentSystem';\r\nimport { Collider } from './Collider';\r\nimport { ExcaliburGraphicsContext } from '../..';\r\n\r\nexport interface PolygonColliderOptions {\r\n /**\r\n * Pixel offset relative to a collider's body transform position.\r\n */\r\n offset?: Vector;\r\n /**\r\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\r\n */\r\n points: Vector[];\r\n /**\r\n * Whether points are specified in clockwise or counter clockwise order, default counter-clockwise\r\n */\r\n clockwiseWinding?: boolean;\r\n}\r\n\r\n/**\r\n * Polygon collider for detecting collisions\r\n */\r\nexport class PolygonCollider extends Collider {\r\n /**\r\n * Pixel offset relative to a collider's body transform position.\r\n */\r\n public offset: Vector;\r\n\r\n /**\r\n * Points in the polygon in order around the perimeter in local coordinates. These are relative from the body transform position.\r\n */\r\n public points: Vector[];\r\n\r\n private _transform: Transform;\r\n\r\n private _transformedPoints: Vector[] = [];\r\n private _axes: Vector[] = [];\r\n private _sides: Line[] = [];\r\n private _localSides: Line[] = [];\r\n\r\n constructor(options: PolygonColliderOptions) {\r\n super();\r\n this.offset = options.offset ?? Vector.Zero;\r\n const winding = !!options.clockwiseWinding;\r\n this.points = (winding ? options.points.reverse() : options.points) || [];\r\n\r\n // calculate initial transformation\r\n this._calculateTransformation();\r\n }\r\n\r\n /**\r\n * Returns a clone of this ConvexPolygon, not associated with any collider\r\n */\r\n public clone(): PolygonCollider {\r\n return new PolygonCollider({\r\n offset: this.offset.clone(),\r\n points: this.points.map((p) => p.clone())\r\n });\r\n }\r\n\r\n /**\r\n * Returns the world position of the collider, which is the current body transform plus any defined offset\r\n */\r\n public get worldPos(): Vector {\r\n if (this._transform) {\r\n return this._transform.pos.add(this.offset);\r\n }\r\n return this.offset;\r\n }\r\n\r\n /**\r\n * Get the center of the collider in world coordinates\r\n */\r\n public get center(): Vector {\r\n return this.bounds.center;\r\n }\r\n\r\n /**\r\n * Calculates the underlying transformation from the body relative space to world space\r\n */\r\n private _calculateTransformation() {\r\n const transform = this._transform as TransformComponent;\r\n\r\n const pos = transform ? transform.globalPos.add(this.offset) : this.offset;\r\n const angle = transform ? transform.globalRotation : 0;\r\n const scale = transform ? transform.globalScale : Vector.One;\r\n\r\n const len = this.points.length;\r\n this._transformedPoints.length = 0; // clear out old transform\r\n for (let i = 0; i < len; i++) {\r\n this._transformedPoints[i] = this.points[i].scale(scale).rotate(angle).add(pos);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the points that make up the polygon in world space, from actor relative space (if specified)\r\n */\r\n public getTransformedPoints(): Vector[] {\r\n this._calculateTransformation();\r\n return this._transformedPoints;\r\n }\r\n\r\n /**\r\n * Gets the sides of the polygon in world space\r\n */\r\n public getSides(): Line[] {\r\n if (this._sides.length) {\r\n return this._sides;\r\n }\r\n const lines = [];\r\n const points = this.getTransformedPoints();\r\n const len = points.length;\r\n for (let i = 0; i < len; i++) {\r\n // This winding is important\r\n lines.push(new Line(points[i], points[(i + 1) % len]));\r\n }\r\n this._sides = lines;\r\n return this._sides;\r\n }\r\n\r\n /**\r\n * Returns the local coordinate space sides\r\n */\r\n public getLocalSides(): Line[] {\r\n if (this._localSides.length) {\r\n return this._localSides;\r\n }\r\n const lines = [];\r\n const points = this.points;\r\n const len = points.length;\r\n for (let i = 0; i < len; i++) {\r\n // This winding is important\r\n lines.push(new Line(points[i], points[(i + 1) % len]));\r\n }\r\n this._localSides = lines;\r\n return this._localSides;\r\n }\r\n\r\n /**\r\n * Given a direction vector find the world space side that is most in that direction\r\n * @param direction\r\n */\r\n public findSide(direction: Vector): Line {\r\n const sides = this.getSides();\r\n let bestSide = sides[0];\r\n let maxDistance = -Number.MAX_VALUE;\r\n for (let side = 0; side < sides.length; side++) {\r\n const currentSide = sides[side];\r\n const sideNormal = currentSide.normal();\r\n const mostDirection = sideNormal.dot(direction);\r\n if (mostDirection > maxDistance) {\r\n bestSide = currentSide;\r\n maxDistance = mostDirection;\r\n }\r\n }\r\n return bestSide;\r\n }\r\n\r\n /**\r\n * Given a direction vector find the local space side that is most in that direction\r\n * @param direction\r\n */\r\n public findLocalSide(direction: Vector): Line {\r\n const sides = this.getLocalSides();\r\n let bestSide = sides[0];\r\n let maxDistance = -Number.MAX_VALUE;\r\n for (let side = 0; side < sides.length; side++) {\r\n const currentSide = sides[side];\r\n const sideNormal = currentSide.normal();\r\n const mostDirection = sideNormal.dot(direction);\r\n if (mostDirection > maxDistance) {\r\n bestSide = currentSide;\r\n maxDistance = mostDirection;\r\n }\r\n }\r\n return bestSide;\r\n }\r\n\r\n /**\r\n * Get the axis associated with the convex polygon\r\n */\r\n public get axes(): Vector[] {\r\n if (this._axes.length) {\r\n return this._axes;\r\n }\r\n const axes = this.getSides().map((s) => s.normal());\r\n this._axes = axes;\r\n return this._axes;\r\n }\r\n\r\n public update(transform: Transform): void {\r\n this._transform = transform;\r\n this._sides.length = 0;\r\n this._localSides.length = 0;\r\n this._axes.length = 0;\r\n this._transformedPoints.length = 0;\r\n this.getTransformedPoints();\r\n this.getSides();\r\n this.getLocalSides();\r\n }\r\n\r\n /**\r\n * Tests if a point is contained in this collider in world space\r\n */\r\n public contains(point: Vector): boolean {\r\n // Always cast to the right, as long as we cast in a consistent fixed direction we\r\n // will be fine\r\n const testRay = new Ray(point, new Vector(1, 0));\r\n const intersectCount = this.getSides().reduce(function (accum, side) {\r\n if (testRay.intersect(side) >= 0) {\r\n return accum + 1;\r\n }\r\n return accum;\r\n }, 0);\r\n\r\n if (intersectCount % 2 === 0) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public getClosestLineBetween(collider: Collider): Line {\r\n if (collider instanceof CircleCollider) {\r\n return ClosestLineJumpTable.PolygonCircleClosestLine(this, collider);\r\n } else if (collider instanceof PolygonCollider) {\r\n return ClosestLineJumpTable.PolygonPolygonClosestLine(this, collider);\r\n } else if (collider instanceof EdgeCollider) {\r\n return ClosestLineJumpTable.PolygonEdgeClosestLine(this, collider);\r\n } else {\r\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a collision contact if the 2 colliders collide, otherwise collide will\r\n * return null.\r\n * @param collider\r\n */\r\n public collide(collider: Collider): CollisionContact[] {\r\n if (collider instanceof CircleCollider) {\r\n return CollisionJumpTable.CollideCirclePolygon(collider, this);\r\n } else if (collider instanceof PolygonCollider) {\r\n return CollisionJumpTable.CollidePolygonPolygon(this, collider);\r\n } else if (collider instanceof EdgeCollider) {\r\n return CollisionJumpTable.CollidePolygonEdge(this, collider);\r\n } else {\r\n throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof collider}`);\r\n }\r\n }\r\n\r\n /**\r\n * Find the point on the collider furthest in the direction specified\r\n */\r\n public getFurthestPoint(direction: Vector): Vector {\r\n const pts = this.getTransformedPoints();\r\n let furthestPoint = null;\r\n let maxDistance = -Number.MAX_VALUE;\r\n for (let i = 0; i < pts.length; i++) {\r\n const distance = direction.dot(pts[i]);\r\n if (distance > maxDistance) {\r\n maxDistance = distance;\r\n furthestPoint = pts[i];\r\n }\r\n }\r\n return furthestPoint;\r\n }\r\n\r\n /**\r\n * Find the local point on the collider furthest in the direction specified\r\n * @param direction\r\n */\r\n public getFurthestLocalPoint(direction: Vector): Vector {\r\n const pts = this.points;\r\n let furthestPoint = pts[0];\r\n let maxDistance = -Number.MAX_VALUE;\r\n for (let i = 0; i < pts.length; i++) {\r\n const distance = direction.dot(pts[i]);\r\n if (distance > maxDistance) {\r\n maxDistance = distance;\r\n furthestPoint = pts[i];\r\n }\r\n }\r\n return furthestPoint;\r\n }\r\n\r\n /**\r\n * Finds the closes face to the point using perpendicular distance\r\n * @param point point to test against polygon\r\n */\r\n public getClosestFace(point: Vector): { distance: Vector; face: Line } {\r\n const sides = this.getSides();\r\n let min = Number.POSITIVE_INFINITY;\r\n let faceIndex = -1;\r\n let distance = -1;\r\n for (let i = 0; i < sides.length; i++) {\r\n const dist = sides[i].distanceToPoint(point);\r\n if (dist < min) {\r\n min = dist;\r\n faceIndex = i;\r\n distance = dist;\r\n }\r\n }\r\n\r\n if (faceIndex !== -1) {\r\n return {\r\n distance: sides[faceIndex].normal().scale(distance),\r\n face: sides[faceIndex]\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the axis aligned bounding box for the polygon collider in world coordinates\r\n */\r\n public get bounds(): BoundingBox {\r\n const tx = this._transform as TransformComponent;\r\n const scale = tx?.globalScale ?? Vector.One;\r\n const rotation = tx?.globalRotation ?? 0;\r\n const pos = (tx?.globalPos ?? Vector.Zero).add(this.offset);\r\n return this.localBounds.scale(scale).rotate(rotation).translate(pos);\r\n }\r\n\r\n /**\r\n * Get the axis aligned bounding box for the polygon collider in local coordinates\r\n */\r\n public get localBounds(): BoundingBox {\r\n return BoundingBox.fromPoints(this.points);\r\n }\r\n\r\n /**\r\n * Get the moment of inertia for an arbitrary polygon\r\n * https://en.wikipedia.org/wiki/List_of_moments_of_inertia\r\n */\r\n public getInertia(mass: number): number {\r\n let numerator = 0;\r\n let denominator = 0;\r\n for (let i = 0; i < this.points.length; i++) {\r\n const iplusone = (i + 1) % this.points.length;\r\n const crossTerm = this.points[iplusone].cross(this.points[i]);\r\n numerator +=\r\n crossTerm *\r\n (this.points[i].dot(this.points[i]) + this.points[i].dot(this.points[iplusone]) + this.points[iplusone].dot(this.points[iplusone]));\r\n denominator += crossTerm;\r\n }\r\n return (mass / 6) * (numerator / denominator);\r\n }\r\n\r\n /**\r\n * Casts a ray into the polygon and returns a vector representing the point of contact (in world space) or null if no collision.\r\n */\r\n public rayCast(ray: Ray, max: number = Infinity) {\r\n // find the minimum contact time greater than 0\r\n // contact times less than 0 are behind the ray and we don't want those\r\n const sides = this.getSides();\r\n const len = sides.length;\r\n let minContactTime = Number.MAX_VALUE;\r\n let contactIndex = -1;\r\n for (let i = 0; i < len; i++) {\r\n const contactTime = ray.intersect(sides[i]);\r\n if (contactTime >= 0 && contactTime < minContactTime && contactTime <= max) {\r\n minContactTime = contactTime;\r\n contactIndex = i;\r\n }\r\n }\r\n\r\n // contact was found\r\n if (contactIndex >= 0) {\r\n return ray.getPoint(minContactTime);\r\n }\r\n\r\n // no contact found\r\n return null;\r\n }\r\n\r\n /**\r\n * Project the edges of the polygon along a specified axis\r\n */\r\n public project(axis: Vector): Projection {\r\n const points = this.getTransformedPoints();\r\n const len = points.length;\r\n let min = Number.MAX_VALUE;\r\n let max = -Number.MAX_VALUE;\r\n for (let i = 0; i < len; i++) {\r\n const scalar = points[i].dot(axis);\r\n min = Math.min(min, scalar);\r\n max = Math.max(max, scalar);\r\n }\r\n\r\n return new Projection(min, max);\r\n }\r\n\r\n public draw(ctx: CanvasRenderingContext2D, color: Color = Color.Green, pos: Vector = Vector.Zero) {\r\n const effectiveOffset = pos.add(this.offset);\r\n ctx.beginPath();\r\n ctx.fillStyle = color.toString();\r\n\r\n const firstPoint = this.points[0].add(effectiveOffset);\r\n ctx.moveTo(firstPoint.x, firstPoint.y);\r\n\r\n // Points are relative\r\n this.points\r\n .map((p) => p.add(effectiveOffset))\r\n .forEach(function (point) {\r\n ctx.lineTo(point.x, point.y);\r\n });\r\n ctx.lineTo(firstPoint.x, firstPoint.y);\r\n ctx.closePath();\r\n ctx.fill();\r\n }\r\n public debug(ex: ExcaliburGraphicsContext, color: Color) {\r\n const firstPoint = this.getTransformedPoints()[0];\r\n const points = [firstPoint, ...this.getTransformedPoints(), firstPoint];\r\n for (let i = 0; i < points.length - 1; i++) {\r\n ex.drawLine(points[i], points[i + 1], color, 2);\r\n ex.drawCircle(points[i], 2, color);\r\n ex.drawCircle(points[i + 1], 2, color);\r\n }\r\n }\r\n\r\n /* istanbul ignore next */\r\n public debugDraw(ctx: CanvasRenderingContext2D, color: Color = Color.Red) {\r\n ctx.beginPath();\r\n ctx.strokeStyle = color.toString();\r\n // Iterate through the supplied points and construct a 'polygon'\r\n const firstPoint = this.getTransformedPoints()[0];\r\n ctx.moveTo(firstPoint.x, firstPoint.y);\r\n this.getTransformedPoints().forEach(function (point) {\r\n ctx.lineTo(point.x, point.y);\r\n });\r\n ctx.lineTo(firstPoint.x, firstPoint.y);\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n}\r\n","import { PolygonCollider } from './PolygonCollider';\r\nimport { CircleCollider } from './CircleCollider';\r\nimport { EdgeCollider } from './EdgeCollider';\r\nimport { BoundingBox } from '../BoundingBox';\r\nimport { vec, Vector } from '../../Math/vector';\r\nimport { CompositeCollider } from './CompositeCollider';\r\nimport { Logger } from '../..';\r\n\r\n/**\r\n * Excalibur helper for defining colliders quickly\r\n */\r\nexport class Shape {\r\n /**\r\n * Creates a box collider, under the hood defines a [[PolygonCollider]] collider\r\n * @param width Width of the box\r\n * @param height Height of the box\r\n * @param anchor Anchor of the box (default (.5, .5)) which positions the box relative to the center of the collider's position\r\n * @param offset Optional offset relative to the collider in local coordinates\r\n */\r\n static Box(width: number, height: number, anchor: Vector = Vector.Half, offset: Vector = Vector.Zero): PolygonCollider {\r\n return new PolygonCollider({\r\n points: new BoundingBox(-width * anchor.x, -height * anchor.y, width - width * anchor.x, height - height * anchor.y).getPoints(),\r\n offset: offset\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new [[PolygonCollider|arbitrary polygon]] collider\r\n *\r\n * PolygonColliders are useful for creating convex polygon shapes\r\n * @param points Points specified in counter clockwise\r\n * @param clockwiseWinding Optionally changed the winding of points, by default false meaning counter-clockwise winding.\r\n * @param offset Optional offset relative to the collider in local coordinates\r\n */\r\n static Polygon(points: Vector[], clockwiseWinding: boolean = false, offset: Vector = Vector.Zero): PolygonCollider {\r\n return new PolygonCollider({\r\n points: points,\r\n offset: offset,\r\n clockwiseWinding: clockwiseWinding\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new [[CircleCollider|circle]] collider\r\n *\r\n * Circle colliders are useful for balls, or to make collisions more forgiving on sharp edges\r\n * @param radius Radius of the circle collider\r\n * @param offset Optional offset relative to the collider in local coordinates\r\n */\r\n static Circle(radius: number, offset: Vector = Vector.Zero): CircleCollider {\r\n return new CircleCollider({\r\n radius: radius,\r\n offset: offset\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new [[EdgeCollider|edge]] collider\r\n *\r\n * Edge colliders are useful for floors, walls, and other barriers\r\n * @param begin Beginning of the edge in local coordinates to the collider\r\n * @param end Ending of the edge in local coordinates to the collider\r\n */\r\n static Edge(begin: Vector, end: Vector): EdgeCollider {\r\n return new EdgeCollider({\r\n begin: begin,\r\n end: end\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new capsule shaped [[CompositeCollider]] using 2 circles and a box\r\n *\r\n * Capsule colliders are useful for platformers with incline or jagged floors to have a smooth\r\n * player experience.\r\n *\r\n * @param width\r\n * @param height\r\n * @param offset Optional offset\r\n */\r\n static Capsule(width: number, height: number, offset = Vector.Zero): CompositeCollider {\r\n const logger = Logger.getInstance();\r\n if (width === height) {\r\n logger.warn('A capsule collider with equal width and height is a circle, consider using a ex.Shape.Circle or ex.CircleCollider');\r\n }\r\n\r\n const vertical = height >= width;\r\n\r\n if (vertical) {\r\n // height > width, if equal maybe use a circle\r\n const capsule = new CompositeCollider([\r\n Shape.Circle(width / 2, vec(0, -height / 2 + width / 2).add(offset)),\r\n Shape.Box(width, height - width, Vector.Half, offset),\r\n Shape.Circle(width / 2, vec(0, height / 2 - width / 2).add(offset))\r\n ]);\r\n return capsule;\r\n } else {\r\n // width > height, if equal maybe use a circle\r\n const capsule = new CompositeCollider([\r\n Shape.Circle(height / 2, vec(-width / 2 + height / 2, 0).add(offset)),\r\n Shape.Box(width - height, height, Vector.Half, offset),\r\n Shape.Circle(height / 2, vec(width / 2 - height / 2, 0).add(offset))\r\n ]);\r\n return capsule;\r\n }\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\r\nimport { TransformComponent } from '../EntityComponentSystem';\r\nimport { Component } from '../EntityComponentSystem/Component';\r\nimport { Entity } from '../EntityComponentSystem/Entity';\r\nimport { EventDispatcher } from '../EventDispatcher';\r\nimport { CollisionEndEvent, CollisionStartEvent, PostCollisionEvent, PreCollisionEvent } from '../Events';\r\nimport { Observable } from '../Util/Observable';\r\nimport { BoundingBox } from './BoundingBox';\r\nimport { CollisionContact } from './Detection/CollisionContact';\r\nimport { CircleCollider } from './Colliders/CircleCollider';\r\nimport { Collider } from './Colliders/Collider';\r\nimport { CompositeCollider } from './Colliders/CompositeCollider';\r\nimport { PolygonCollider } from './Colliders/PolygonCollider';\r\nimport { EdgeCollider } from './Colliders/EdgeCollider';\r\nimport { Shape } from './Colliders/Shape';\r\n\r\nexport class ColliderComponent extends Component<'ex.collider'> {\r\n public readonly type = 'ex.collider';\r\n\r\n public events = new EventDispatcher(this);\r\n /**\r\n * Observable that notifies when a collider is added to the body\r\n */\r\n public $colliderAdded = new Observable<Collider>();\r\n\r\n /**\r\n * Observable that notifies when a collider is removed from the body\r\n */\r\n public $colliderRemoved = new Observable<Collider>();\r\n\r\n constructor(collider?: Collider) {\r\n super();\r\n this.set(collider);\r\n }\r\n\r\n private _collider: Collider;\r\n /**\r\n * Get the current collider geometry\r\n * @returns\r\n */\r\n public get() {\r\n return this._collider;\r\n }\r\n\r\n /**\r\n * Set the collider geometry\r\n * @param collider\r\n * @returns the collider you set\r\n */\r\n public set<T extends Collider>(collider: T): T {\r\n this.clear();\r\n if (collider) {\r\n this._collider = collider;\r\n this._collider.owner = this.owner;\r\n this.events.wire(collider.events);\r\n this.$colliderAdded.notifyAll(collider);\r\n this.update();\r\n }\r\n return collider;\r\n }\r\n\r\n /**\r\n * Remove collider geometry from collider component\r\n */\r\n public clear() {\r\n if (this._collider) {\r\n this.events.unwire(this._collider.events);\r\n this.$colliderRemoved.notifyAll(this._collider);\r\n this._collider.owner = null;\r\n this._collider = null;\r\n }\r\n }\r\n\r\n /**\r\n * Return world space bounds\r\n */\r\n public get bounds() {\r\n return this._collider?.bounds ?? new BoundingBox();\r\n }\r\n\r\n /**\r\n * Return local space bounds\r\n */\r\n public get localBounds() {\r\n return this._collider?.localBounds ?? new BoundingBox();\r\n }\r\n\r\n /**\r\n * Update the collider's transformed geometry\r\n */\r\n public update() {\r\n const tx = this.owner?.get(TransformComponent);\r\n if (this._collider) {\r\n this._collider.owner = this.owner;\r\n if (tx) {\r\n this._collider.update(tx);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Collide component with another\r\n * @param other\r\n * @returns\r\n */\r\n collide(other: ColliderComponent): CollisionContact[] {\r\n let colliderA = this._collider;\r\n let colliderB = other._collider;\r\n if (!colliderA || !colliderB) {\r\n return [];\r\n }\r\n\r\n // If we have a composite lefthand side :(\r\n // Might bite us, but to avoid updating all the handlers make composite always left side\r\n let flipped = false;\r\n if (colliderB instanceof CompositeCollider) {\r\n colliderA = colliderB;\r\n colliderB = this._collider;\r\n flipped = true;\r\n }\r\n\r\n if (this._collider) {\r\n const contacts = colliderA.collide(colliderB);\r\n if (contacts) {\r\n if (flipped) {\r\n contacts.forEach((contact) => {\r\n contact.mtv = contact.mtv.negate();\r\n contact.normal = contact.normal.negate();\r\n contact.tangent = contact.normal.perpendicular();\r\n contact.colliderA = this._collider;\r\n contact.colliderB = other._collider;\r\n });\r\n }\r\n return contacts;\r\n }\r\n return [];\r\n }\r\n return [];\r\n }\r\n\r\n onAdd(entity: Entity) {\r\n if (this._collider) {\r\n this.update();\r\n }\r\n // Wire up the collider events to the owning entity\r\n this.events.on('precollision', (evt: any) => {\r\n const precollision = evt as PreCollisionEvent<Collider>;\r\n entity.events.emit(\r\n 'precollision',\r\n new PreCollisionEvent(precollision.target.owner, precollision.other.owner, precollision.side, precollision.intersection)\r\n );\r\n });\r\n this.events.on('postcollision', (evt: any) => {\r\n const postcollision = evt as PostCollisionEvent<Collider>;\r\n entity.events.emit(\r\n 'postcollision',\r\n new PostCollisionEvent(postcollision.target.owner, postcollision.other.owner, postcollision.side, postcollision.intersection)\r\n );\r\n });\r\n this.events.on('collisionstart', (evt: any) => {\r\n const start = evt as CollisionStartEvent<Collider>;\r\n entity.events.emit('collisionstart', new CollisionStartEvent(start.target.owner, start.other.owner, start.contact));\r\n });\r\n this.events.on('collisionend', (evt: any) => {\r\n const end = evt as CollisionEndEvent<Collider>;\r\n entity.events.emit('collisionend', new CollisionEndEvent(end.target.owner, end.other.owner));\r\n });\r\n }\r\n\r\n onRemove() {\r\n this.events.clear();\r\n this.$colliderRemoved.notifyAll(this._collider);\r\n }\r\n\r\n /**\r\n * Sets up a box geometry based on the current bounds of the associated actor of this physics body.\r\n *\r\n * If no width/height are specified the body will attempt to use the associated actor's width/height.\r\n *\r\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\r\n */\r\n useBoxCollider(width: number, height: number, anchor: Vector = Vector.Half, center: Vector = Vector.Zero): PolygonCollider {\r\n const collider = Shape.Box(width, height, anchor, center);\r\n return (this.set(collider));\r\n }\r\n\r\n /**\r\n * Sets up a [[PolygonCollider|polygon]] collision geometry based on a list of of points relative\r\n * to the anchor of the associated actor\r\n * of this physics body.\r\n *\r\n * Only [convex polygon](https://en.wikipedia.org/wiki/Convex_polygon) definitions are supported.\r\n *\r\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\r\n */\r\n usePolygonCollider(points: Vector[], center: Vector = Vector.Zero): PolygonCollider {\r\n const poly = Shape.Polygon(points, false, center);\r\n return (this.set(poly));\r\n }\r\n\r\n /**\r\n * Sets up a [[Circle|circle collision geometry]] as the only collider with a specified radius in pixels.\r\n *\r\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\r\n */\r\n useCircleCollider(radius: number, center: Vector = Vector.Zero): CircleCollider {\r\n const collider = Shape.Circle(radius, center);\r\n return (this.set(collider));\r\n }\r\n\r\n /**\r\n * Sets up an [[Edge|edge collision geometry]] with a start point and an end point relative to the anchor of the associated actor\r\n * of this physics body.\r\n *\r\n * By default, the box is center is at (0, 0) which means it is centered around the actors anchor.\r\n */\r\n useEdgeCollider(begin: Vector, end: Vector): EdgeCollider {\r\n const collider = Shape.Edge(begin, end);\r\n return (this.set(collider));\r\n }\r\n\r\n /**\r\n * Setups up a [[CompositeCollider]] which can define any arbitrary set of excalibur colliders\r\n * @param colliders\r\n * @returns\r\n */\r\n useCompositeCollider(colliders: Collider[]): CompositeCollider {\r\n return (this.set(new CompositeCollider(colliders)));\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\r\nimport { CollisionType } from './CollisionType';\r\nimport { Physics } from './Physics';\r\nimport { Clonable } from '../Interfaces/Clonable';\r\nimport { TransformComponent } from '../EntityComponentSystem/Components/TransformComponent';\r\nimport { MotionComponent } from '../EntityComponentSystem/Components/MotionComponent';\r\nimport { Component } from '../EntityComponentSystem/Component';\r\nimport { CollisionGroup } from './Group/CollisionGroup';\r\nimport { EventDispatcher } from '../EventDispatcher';\r\nimport { createId, Id } from '../Id';\r\nimport { clamp } from '../Util/Util';\r\nimport { ColliderComponent } from './ColliderComponent';\r\n\r\nexport interface BodyComponentOptions {\r\n type?: CollisionType;\r\n group?: CollisionGroup;\r\n useGravity?: boolean;\r\n}\r\n\r\nexport enum DegreeOfFreedom {\r\n Rotation = 'rotation',\r\n X = 'x',\r\n Y = 'y'\r\n}\r\n\r\n/**\r\n * Body describes all the physical properties pos, vel, acc, rotation, angular velocity for the purpose of\r\n * of physics simulation.\r\n */\r\nexport class BodyComponent extends Component<'ex.body'> implements Clonable<BodyComponent> {\r\n public readonly type = 'ex.body';\r\n public dependencies = [TransformComponent, MotionComponent];\r\n public static _ID = 0;\r\n public readonly id: Id<'body'> = createId('body', BodyComponent._ID++);\r\n public events = new EventDispatcher(this);\r\n\r\n constructor(options?: BodyComponentOptions) {\r\n super();\r\n if (options) {\r\n this.collisionType = options.type ?? this.collisionType;\r\n this.group = options.group ?? this.group;\r\n this.useGravity = options.useGravity ?? this.useGravity;\r\n }\r\n }\r\n\r\n /**\r\n * Collision type for the rigidbody physics simulation, by default [[CollisionType.PreventCollision]]\r\n */\r\n public collisionType: CollisionType = CollisionType.PreventCollision;\r\n\r\n /**\r\n * The collision group for the body's colliders, by default body colliders collide with everything\r\n */\r\n public group: CollisionGroup = CollisionGroup.All;\r\n\r\n /**\r\n * The amount of mass the body has\r\n */\r\n public mass: number = Physics.defaultMass;\r\n\r\n /**\r\n * The inverse mass (1/mass) of the body. If [[CollisionType.Fixed]] this is 0, meaning \"infinite\" mass\r\n */\r\n public get inverseMass(): number {\r\n return this.collisionType === CollisionType.Fixed ? 0 : 1 / this.mass;\r\n }\r\n\r\n /**\r\n * Amount of \"motion\" the body has before sleeping. If below [[Physics.sleepEpsilon]] it goes to \"sleep\"\r\n */\r\n public sleepMotion: number = Physics.sleepEpsilon * 5;\r\n\r\n /**\r\n * Can this body sleep, by default bodies do not sleep\r\n */\r\n public canSleep: boolean = Physics.bodiesCanSleepByDefault;\r\n\r\n private _sleeping = false;\r\n /**\r\n * Whether this body is sleeping or not\r\n */\r\n public get sleeping(): boolean {\r\n return this._sleeping;\r\n }\r\n\r\n /**\r\n * Set the sleep state of the body\r\n * @param sleeping\r\n */\r\n public setSleeping(sleeping: boolean) {\r\n this._sleeping = sleeping;\r\n if (!sleeping) {\r\n // Give it a kick to keep it from falling asleep immediately\r\n this.sleepMotion = Physics.sleepEpsilon * 5;\r\n } else {\r\n this.vel = Vector.Zero;\r\n this.acc = Vector.Zero;\r\n this.angularVelocity = 0;\r\n this.sleepMotion = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Update body's [[BodyComponent.sleepMotion]] for the purpose of sleeping\r\n */\r\n public updateMotion() {\r\n if (this._sleeping) {\r\n this.setSleeping(true);\r\n }\r\n const currentMotion = this.vel.size * this.vel.size + Math.abs(this.angularVelocity * this.angularVelocity);\r\n const bias = Physics.sleepBias;\r\n this.sleepMotion = bias * this.sleepMotion + (1 - bias) * currentMotion;\r\n this.sleepMotion = clamp(this.sleepMotion, 0, 10 * Physics.sleepEpsilon);\r\n if (this.canSleep && this.sleepMotion < Physics.sleepEpsilon) {\r\n this.setSleeping(true);\r\n }\r\n }\r\n\r\n /**\r\n * Get the moment of inertia from the [[ColliderComponent]]\r\n */\r\n public get inertia() {\r\n // Inertia is a property of the geometry, so this is a little goofy but seems to be okay?\r\n const collider = this.owner.get(ColliderComponent);\r\n if (collider?.get()) {\r\n return collider.get().getInertia(this.mass);\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Get the inverse moment of inertial from the [[ColliderComponent]]. If [[CollisionType.Fixed]] this is 0, meaning \"infinite\" mass\r\n */\r\n public get inverseInertia() {\r\n return this.collisionType === CollisionType.Fixed ? 0 : 1 / this.inertia;\r\n }\r\n\r\n /**\r\n * The also known as coefficient of restitution of this actor, represents the amount of energy preserved after collision or the\r\n * bounciness. If 1, it is 100% bouncy, 0 it completely absorbs.\r\n */\r\n public bounciness: number = 0.2;\r\n\r\n /**\r\n * The coefficient of friction on this actor\r\n */\r\n public friction: number = 0.99;\r\n\r\n /**\r\n * Should use global gravity [[Physics.gravity]] in it's physics simulation, default is true\r\n */\r\n public useGravity: boolean = true;\r\n\r\n /**\r\n * Degrees of freedom to limit\r\n */\r\n public limitDegreeOfFreedom: DegreeOfFreedom[] = [];\r\n\r\n /**\r\n * Returns if the owner is active\r\n */\r\n public get active() {\r\n return !!this.owner?.active;\r\n }\r\n\r\n public get center() {\r\n return this.pos;\r\n }\r\n\r\n public get transform(): TransformComponent {\r\n return this.owner?.get(TransformComponent);\r\n }\r\n\r\n public get motion(): MotionComponent {\r\n return this.owner?.get(MotionComponent);\r\n }\r\n\r\n /**\r\n * The (x, y) position of the actor this will be in the middle of the actor if the\r\n * [[Actor.anchor]] is set to (0.5, 0.5) which is default.\r\n * If you want the (x, y) position to be the top left of the actor specify an anchor of (0, 0).\r\n */\r\n public get pos(): Vector {\r\n return this.transform.globalPos;\r\n }\r\n\r\n public set pos(val: Vector) {\r\n this.transform.globalPos = val;\r\n }\r\n\r\n /**\r\n * The position of the actor last frame (x, y) in pixels\r\n */\r\n public oldPos: Vector = new Vector(0, 0);\r\n\r\n /**\r\n * The current velocity vector (vx, vy) of the actor in pixels/second\r\n */\r\n public get vel(): Vector {\r\n return this.motion.vel;\r\n }\r\n\r\n public set vel(val: Vector) {\r\n this.motion.vel = val;\r\n }\r\n\r\n /**\r\n * The velocity of the actor last frame (vx, vy) in pixels/second\r\n */\r\n public oldVel: Vector = new Vector(0, 0);\r\n\r\n /**\r\n * The current acceleration vector (ax, ay) of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may\r\n * be useful to simulate a gravitational effect.\r\n */\r\n public get acc(): Vector {\r\n return this.motion.acc;\r\n }\r\n\r\n public set acc(val: Vector) {\r\n this.motion.acc = val;\r\n }\r\n\r\n /**\r\n * Gets/sets the acceleration of the actor from the last frame. This does not include the global acc [[Physics.acc]].\r\n */\r\n public oldAcc: Vector = Vector.Zero;\r\n\r\n /**\r\n * The current torque applied to the actor\r\n */\r\n public get torque(): number {\r\n return this.motion.torque;\r\n }\r\n\r\n public set torque(val: number) {\r\n this.motion.torque = val;\r\n }\r\n\r\n /**\r\n * Gets/sets the rotation of the body from the last frame.\r\n */\r\n public oldRotation: number = 0; // radians\r\n\r\n /**\r\n * The rotation of the body in radians\r\n */\r\n public get rotation() {\r\n return this.transform.globalRotation;\r\n }\r\n\r\n public set rotation(val: number) {\r\n this.transform.globalRotation = val;\r\n }\r\n\r\n /**\r\n * The scale vector of the actor\r\n * @deprecated ex.Body.scale will be removed in v0.25.0, Use ex.Transform.scale\r\n */\r\n public get scale(): Vector {\r\n return this.transform.globalScale;\r\n }\r\n\r\n public set scale(val: Vector) {\r\n this.transform.globalScale = val;\r\n }\r\n\r\n /**\r\n * The scale of the actor last frame\r\n * @deprecated ex.Body.scale will be removed in v0.25.0\r\n */\r\n public oldScale: Vector = Vector.One;\r\n\r\n /**\r\n * The x scalar velocity of the actor in scale/second\r\n * @deprecated ex.Body.scale will be removed in v0.25.0\r\n */\r\n public get sx(): number {\r\n return this.motion.scaleFactor.x;\r\n }\r\n\r\n public set sx(xFactor: number) {\r\n this.motion.scaleFactor.x = xFactor;\r\n }\r\n\r\n /**\r\n * The y scalar velocity of the actor in scale/second\r\n * @deprecated ex.Body.scale will be removed in v0.25.0\r\n */\r\n public get sy(): number {\r\n return this.motion.scaleFactor.y;\r\n }\r\n\r\n public set sy(yFactor: number) {\r\n this.motion.scaleFactor.y = yFactor;\r\n }\r\n\r\n /**\r\n * The rotational velocity of the actor in radians/second\r\n * @deprecated\r\n */\r\n public get rx(): number {\r\n return this.motion.angularVelocity;\r\n }\r\n\r\n /**\r\n * The rotational velocity of the actor in radians/second\r\n * @deprecated\r\n */\r\n public set rx(value: number) {\r\n this.motion.angularVelocity = value;\r\n }\r\n\r\n /**\r\n * Get the angular velocity in radians/second\r\n */\r\n public get angularVelocity(): number {\r\n return this.motion.angularVelocity;\r\n }\r\n\r\n /**\r\n * Set the angular velocity in radians/second\r\n */\r\n public set angularVelocity(value: number) {\r\n this.motion.angularVelocity = value;\r\n }\r\n\r\n /**\r\n * Apply a specific impulse to the body\r\n * @param point\r\n * @param impulse\r\n */\r\n public applyImpulse(point: Vector, impulse: Vector) {\r\n if (this.collisionType !== CollisionType.Active) {\r\n return; // only active objects participate in the simulation\r\n }\r\n\r\n const finalImpulse = impulse.scale(this.inverseMass);\r\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.X)) {\r\n finalImpulse.x = 0;\r\n }\r\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Y)) {\r\n finalImpulse.y = 0;\r\n }\r\n\r\n this.vel.addEqual(finalImpulse);\r\n\r\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\r\n const distanceFromCenter = point.sub(this.pos);\r\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\r\n }\r\n }\r\n\r\n /**\r\n * Apply only linear impulse to the body\r\n * @param impulse\r\n */\r\n public applyLinearImpulse(impulse: Vector) {\r\n if (this.collisionType !== CollisionType.Active) {\r\n return; // only active objects participate in the simulation\r\n }\r\n\r\n const finalImpulse = impulse.scale(this.inverseMass);\r\n\r\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.X)) {\r\n finalImpulse.x = 0;\r\n }\r\n if (this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Y)) {\r\n finalImpulse.y = 0;\r\n }\r\n\r\n this.vel = this.vel.add(finalImpulse);\r\n }\r\n\r\n /**\r\n * Apply only angular impuse to the body\r\n * @param point\r\n * @param impulse\r\n */\r\n public applyAngularImpulse(point: Vector, impulse: Vector) {\r\n if (this.collisionType !== CollisionType.Active) {\r\n return; // only active objects participate in the simulation\r\n }\r\n\r\n if (!this.limitDegreeOfFreedom.includes(DegreeOfFreedom.Rotation)) {\r\n const distanceFromCenter = point.sub(this.pos);\r\n this.angularVelocity += this.inverseInertia * distanceFromCenter.cross(impulse);\r\n }\r\n }\r\n\r\n /**\r\n * Sets the old versions of pos, vel, acc, and scale.\r\n */\r\n public captureOldTransform() {\r\n // Capture old values before integration step updates them\r\n this.oldVel.setTo(this.vel.x, this.vel.y);\r\n this.oldPos.setTo(this.pos.x, this.pos.y);\r\n this.oldAcc.setTo(this.acc.x, this.acc.y);\r\n this.oldScale.setTo(this.scale.x, this.scale.y);\r\n this.oldRotation = this.rotation;\r\n }\r\n\r\n debugDraw(_ctx: CanvasRenderingContext2D) {\r\n // pass\r\n }\r\n}\r\n","import { Vector, vec } from '../Math/vector';\nimport { Actor } from '../Actor';\nimport { Engine } from '../Engine';\nimport { Color } from '../Color';\n\n/**\n * @deprecated Will be removed in 0.26.0\n */\nexport class CullingBox {\n private _topLeft: Vector = new Vector(0, 0);\n private _topRight: Vector = new Vector(0, 0);\n private _bottomLeft: Vector = new Vector(0, 0);\n private _bottomRight: Vector = new Vector(0, 0);\n\n private _xCoords: Array<number>;\n private _yCoords: Array<number>;\n private _xMin: number;\n private _yMin: number;\n private _xMax: number;\n private _yMax: number;\n\n private _xMinWorld: number;\n private _yMinWorld: number;\n private _xMaxWorld: number;\n private _yMaxWorld: number;\n\n public isSpriteOffScreen(actor: Actor, engine: Engine): boolean {\n const drawingWidth = actor.currentDrawing.drawWidth;\n const drawingHeight = actor.currentDrawing.drawHeight;\n const rotation = actor.rotation;\n const anchor = actor.center;\n const worldPos = actor.getGlobalPos();\n\n this._topLeft = vec(worldPos.x - drawingWidth / 2, worldPos.y - drawingHeight / 2);\n this._topLeft = this._topLeft.rotate(rotation, anchor);\n\n this._topRight = vec(worldPos.x + drawingWidth / 2, worldPos.y - drawingHeight / 2);\n this._topRight = this._topRight.rotate(rotation, anchor);\n\n this._bottomLeft = vec(worldPos.x - drawingWidth / 2, worldPos.y + drawingHeight / 2);\n this._bottomLeft = this._bottomLeft.rotate(rotation, anchor);\n\n this._bottomRight = vec(worldPos.x + drawingWidth / 2, worldPos.y + drawingHeight / 2);\n this._bottomRight = this._bottomRight.rotate(rotation, anchor);\n\n const topLeftScreen = engine.worldToScreenCoordinates(this._topLeft);\n const topRightScreen = engine.worldToScreenCoordinates(this._topRight);\n const bottomLeftScreen = engine.worldToScreenCoordinates(this._bottomLeft);\n const bottomRightScreen = engine.worldToScreenCoordinates(this._bottomRight);\n this._xCoords = [];\n this._yCoords = [];\n\n this._xCoords.push(topLeftScreen.x, topRightScreen.x, bottomLeftScreen.x, bottomRightScreen.x);\n this._yCoords.push(topLeftScreen.y, topRightScreen.y, bottomLeftScreen.y, bottomRightScreen.y);\n\n this._xMin = Math.min.apply(null, this._xCoords);\n this._yMin = Math.min.apply(null, this._yCoords);\n this._xMax = Math.max.apply(null, this._xCoords);\n this._yMax = Math.max.apply(null, this._yCoords);\n\n const minWorld = engine.screenToWorldCoordinates(new Vector(this._xMin, this._yMin));\n const maxWorld = engine.screenToWorldCoordinates(new Vector(this._xMax, this._yMax));\n this._xMinWorld = minWorld.x;\n this._yMinWorld = minWorld.y;\n this._xMaxWorld = maxWorld.x;\n this._yMaxWorld = maxWorld.y;\n\n const boundingPoints = [\n new Vector(this._xMin, this._yMin), // top left\n new Vector(this._xMax, this._yMin), // top right\n new Vector(this._xMin, this._yMax), // bottom left\n new Vector(this._xMax, this._yMax) // bottom right\n ];\n\n // sprite can be wider than canvas screen (and still visible within canvas)\n // top or bottom of sprite must be within canvas\n if (\n boundingPoints[0].x < 0 &&\n boundingPoints[1].x > engine.canvas.clientWidth &&\n (boundingPoints[0].y > 0 || boundingPoints[2].y < engine.canvas.clientHeight)\n ) {\n return false;\n }\n\n // sprite can be taller than canvas screen (and still visible within canvas)\n // left or right of sprite must be within canvas\n if (\n boundingPoints[0].y < 0 &&\n boundingPoints[2].y > engine.canvas.clientHeight &&\n (boundingPoints[1].x > 0 || boundingPoints[0].x < engine.canvas.clientWidth)\n ) {\n return false;\n }\n\n // otherwise if any corner is visible, we're not offscreen\n for (let i = 0; i < boundingPoints.length; i++) {\n if (\n boundingPoints[i].x > 0 &&\n boundingPoints[i].y > 0 &&\n boundingPoints[i].x < engine.canvas.clientWidth &&\n boundingPoints[i].y < engine.canvas.clientHeight\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n public debugDraw(ctx: CanvasRenderingContext2D) {\n // bounding rectangle\n ctx.beginPath();\n ctx.strokeStyle = Color.White.toString();\n ctx.rect(this._xMinWorld, this._yMinWorld, this._xMaxWorld - this._xMinWorld, this._yMaxWorld - this._yMinWorld);\n ctx.stroke();\n\n ctx.fillStyle = Color.Red.toString();\n ctx.beginPath();\n ctx.arc(this._topLeft.x, this._topLeft.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillStyle = Color.Green.toString();\n ctx.beginPath();\n ctx.arc(this._topRight.x, this._topRight.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillStyle = Color.Blue.toString();\n ctx.beginPath();\n ctx.arc(this._bottomLeft.x, this._bottomLeft.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillStyle = Color.Magenta.toString();\n ctx.beginPath();\n ctx.arc(this._bottomRight.x, this._bottomRight.y, 5, 0, Math.PI * 2);\n ctx.closePath();\n ctx.fill();\n }\n}\n","import { CullingBox } from './../Util/CullingBox';\nimport { Trait } from '../Interfaces/Trait';\nimport { Actor } from '../Actor';\nimport { Engine } from '../Engine';\nimport { ExitViewPortEvent, EnterViewPortEvent } from '../Events';\nimport { TagComponent } from '../EntityComponentSystem';\n\n/**\n * @deprecated will be removed in 0.26.0\n */\nexport class OffscreenCulling implements Trait {\n public cullingBox: CullingBox = new CullingBox();\n\n public update(actor: Actor, engine: Engine) {\n const events = actor.eventDispatcher;\n\n let isSpriteOffScreen = true;\n if (actor.currentDrawing != null) {\n isSpriteOffScreen = this.cullingBox.isSpriteOffScreen(actor, engine);\n }\n\n let actorBoundsOffscreen = false;\n if (engine && engine.currentScene && engine.currentScene.camera && engine.currentScene.camera.viewport && !actor.parent) {\n actorBoundsOffscreen = !engine.currentScene.camera.viewport.intersect(actor.collider.bounds);\n }\n\n if (!actor.isOffScreen) {\n if (actorBoundsOffscreen && isSpriteOffScreen) {\n events.emit('exitviewport', new ExitViewPortEvent(actor));\n actor.addComponent(new TagComponent('offscreen'));\n }\n } else {\n if (!actorBoundsOffscreen || !isSpriteOffScreen) {\n events.emit('enterviewport', new EnterViewPortEvent(actor));\n actor.removeComponent('offscreen');\n }\n }\n }\n}\n","import { Trait } from '../Interfaces/Trait';\r\nimport { Actor } from '../Actor';\r\nimport { Engine } from '../Engine';\r\n\r\n/**\r\n * Revises pointer events path accordingly to the actor\r\n * @deprecated Will be removed in 0.26.0\r\n */\r\nexport class CapturePointer implements Trait {\r\n public update(actor: Actor, engine: Engine) {\r\n if (!actor.enableCapturePointer) {\r\n return;\r\n }\r\n if (actor.isKilled()) {\r\n return;\r\n }\r\n\r\n engine.input.pointers.checkAndUpdateActorUnderPointer(actor);\r\n }\r\n}\r\n","import { Component, ComponentCtor, TagComponent } from './Component';\r\n\r\nimport { Observable, Message } from '../Util/Observable';\r\nimport { Class } from '../Class';\r\nimport { OnInitialize, OnPreUpdate, OnPostUpdate } from '../Interfaces/LifecycleEvents';\r\nimport { Engine } from '../Engine';\r\nimport { InitializeEvent, PreUpdateEvent, PostUpdateEvent } from '../Events';\r\nimport { EventDispatcher } from '../EventDispatcher';\r\nimport { Util } from '..';\r\n\r\n/**\r\n * Interface holding an entity component pair\r\n */\r\nexport interface EntityComponent {\r\n component: Component;\r\n entity: Entity;\r\n}\r\n\r\n/**\r\n * AddedComponent message\r\n */\r\nexport class AddedComponent implements Message<EntityComponent> {\r\n readonly type: 'Component Added' = 'Component Added';\r\n constructor(public data: EntityComponent) {}\r\n}\r\n\r\n/**\r\n * Type guard to know if message is f an Added Component\r\n */\r\nexport function isAddedComponent(x: Message<EntityComponent>): x is AddedComponent {\r\n return !!x && x.type === 'Component Added';\r\n}\r\n\r\n/**\r\n * RemovedComponent message\r\n */\r\nexport class RemovedComponent implements Message<EntityComponent> {\r\n readonly type: 'Component Removed' = 'Component Removed';\r\n constructor(public data: EntityComponent) {}\r\n}\r\n\r\n/**\r\n * Type guard to know if message is for a Removed Component\r\n */\r\nexport function isRemovedComponent(x: Message<EntityComponent>): x is RemovedComponent {\r\n return !!x && x.type === 'Component Removed';\r\n}\r\n\r\n/**\r\n * An Entity is the base type of anything that can have behavior in Excalibur, they are part of the built in entity component system\r\n *\r\n * Entities can be strongly typed with the components they contain\r\n *\r\n * ```typescript\r\n * const entity = new Entity<ComponentA | ComponentB>();\r\n * entity.components.a; // Type ComponentA\r\n * entity.components.b; // Type ComponentB\r\n * ```\r\n */\r\nexport class Entity extends Class implements OnInitialize, OnPreUpdate, OnPostUpdate {\r\n private static _ID = 0;\r\n\r\n constructor(components?: Component[], name?: string) {\r\n super();\r\n this._setName(name);\r\n if (components) {\r\n for (const component of components) {\r\n this.addComponent(component);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The unique identifier for the entity\r\n */\r\n public id: number = Entity._ID++;\r\n\r\n private _name: string = 'anonymous';\r\n protected _setName(name: string) {\r\n if (name) {\r\n this._name = name;\r\n }\r\n }\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n public get events(): EventDispatcher {\r\n return this.eventDispatcher;\r\n }\r\n\r\n /**\r\n * Whether this entity is active, if set to false it will be reclaimed\r\n */\r\n public active: boolean = true;\r\n\r\n /**\r\n * Kill the entity, means it will no longer be updated. Kills are deferred to the end of the update.\r\n */\r\n public kill() {\r\n this.active = false;\r\n }\r\n\r\n public isKilled() {\r\n return !this.active;\r\n }\r\n\r\n /**\r\n * Specifically get the tags on the entity from [[TagComponent]]\r\n */\r\n public get tags(): readonly string[] {\r\n return this._tagsMemo;\r\n }\r\n\r\n /**\r\n * Check if a tag exists on the entity\r\n * @param tag name to check for\r\n */\r\n public hasTag(tag: string): boolean {\r\n return this.tags.includes(tag);\r\n }\r\n\r\n /**\r\n * Adds a tag to an entity\r\n * @param tag\r\n * @returns Entity\r\n */\r\n public addTag(tag: string) {\r\n return this.addComponent(new TagComponent(tag));\r\n }\r\n\r\n /**\r\n * Removes a tag on the entity\r\n *\r\n * Removals are deferred until the end of update\r\n * @param tag\r\n * @param force Remove component immediately, no deferred\r\n */\r\n public removeTag(tag: string, force = false) {\r\n return this.removeComponent(tag, force);\r\n }\r\n\r\n /**\r\n * The types of the components on the Entity\r\n */\r\n public get types(): string[] {\r\n return this._typesMemo;\r\n }\r\n\r\n /**\r\n * Bucket to hold on to deferred removals\r\n */\r\n private _componentsToRemove: (Component | string)[] = [];\r\n private _componentTypeToInstance = new Map<ComponentCtor, Component>();\r\n private _componentStringToInstance = new Map<string, Component>();\r\n\r\n private _tagsMemo: string[] = [];\r\n private _typesMemo: string[] = [];\r\n private _rebuildMemos() {\r\n this._tagsMemo = Array.from(this._componentStringToInstance.values())\r\n .filter((c) => c instanceof TagComponent)\r\n .map((c) => c.type);\r\n this._typesMemo = Array.from(this._componentStringToInstance.keys());\r\n }\r\n\r\n public getComponents(): Component[] {\r\n return Array.from(this._componentStringToInstance.values());\r\n }\r\n\r\n /**\r\n * Observable that keeps track of component add or remove changes on the entity\r\n */\r\n public componentAdded$ = new Observable<AddedComponent>();\r\n private _notifyAddComponent(component: Component) {\r\n this._rebuildMemos();\r\n const added = new AddedComponent({\r\n component,\r\n entity: this\r\n });\r\n this.componentAdded$.notifyAll(added);\r\n }\r\n\r\n public componentRemoved$ = new Observable<RemovedComponent>();\r\n private _notifyRemoveComponent(component: Component) {\r\n const removed = new RemovedComponent({\r\n component,\r\n entity: this\r\n });\r\n this.componentRemoved$.notifyAll(removed);\r\n this._rebuildMemos();\r\n }\r\n\r\n private _parent: Entity = null;\r\n public get parent(): Entity {\r\n return this._parent;\r\n }\r\n\r\n public childrenAdded$ = new Observable<Entity>();\r\n public childrenRemoved$ = new Observable<Entity>();\r\n\r\n private _children: Entity[] = [];\r\n /**\r\n * Get the direct children of this entity\r\n */\r\n public get children(): readonly Entity[] {\r\n return this._children;\r\n }\r\n\r\n /**\r\n * Unparents this entity, if there is a parent. Otherwise it does nothing.\r\n */\r\n public unparent() {\r\n if (this._parent) {\r\n this._parent.removeChild(this);\r\n this._parent = null;\r\n }\r\n }\r\n\r\n /**\r\n * Adds an entity to be a child of this entity\r\n * @param entity\r\n */\r\n public addChild(entity: Entity): Entity {\r\n if (entity.parent === null) {\r\n if (this.getAncestors().includes(entity)) {\r\n throw new Error('Cycle detected, cannot add entity');\r\n }\r\n this._children.push(entity);\r\n entity._parent = this;\r\n this.childrenAdded$.notifyAll(entity);\r\n } else {\r\n throw new Error('Entity already has a parent, cannot add without unparenting');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an entity from children if it exists\r\n * @param entity\r\n */\r\n public removeChild(entity: Entity): Entity {\r\n if (entity.parent === this) {\r\n Util.removeItemFromArray(entity, this._children);\r\n entity._parent = null;\r\n this.childrenRemoved$.notifyAll(entity);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all children from this entity\r\n */\r\n public removeAllChildren(): Entity {\r\n this.children.forEach((c) => {\r\n this.removeChild(c);\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a list of parent entities starting with the topmost parent. Includes the current entity.\r\n */\r\n public getAncestors(): Entity[] {\r\n const result: Entity[] = [this];\r\n let current = this.parent;\r\n while (current) {\r\n result.push(current);\r\n current = current.parent;\r\n }\r\n return result.reverse();\r\n }\r\n\r\n /**\r\n * Returns a list of all the entities that descend from this entity. Includes the current entity.\r\n */\r\n public getDescendants(): Entity[] {\r\n let result: Entity[] = [this];\r\n let queue: Entity[] = [this];\r\n while (queue.length > 0) {\r\n const curr = queue.pop();\r\n queue = queue.concat(curr.children);\r\n result = result.concat(curr.children);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a deep copy of the entity and a copy of all its components\r\n */\r\n public clone(): Entity {\r\n const newEntity = new Entity();\r\n for (const c of this.types) {\r\n newEntity.addComponent(this.get(c).clone());\r\n }\r\n for (const child of this.children) {\r\n newEntity.addChild(child.clone());\r\n }\r\n return newEntity;\r\n }\r\n\r\n /**\r\n * Adds a copy of all the components from another template entity as a \"prefab\"\r\n * @param templateEntity Entity to use as a template\r\n * @param force Force component replacement if it aleady exists on the target entity\r\n */\r\n public addTemplate(templateEntity: Entity, force: boolean = false): Entity {\r\n for (const c of templateEntity.getComponents()) {\r\n this.addComponent(c.clone(), force);\r\n }\r\n for (const child of templateEntity.children) {\r\n this.addChild(child.clone().addTemplate(child));\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a component to the entity\r\n * @param component Component or Entity to add copy of components from\r\n * @param force Optionally overwrite any existing components of the same type\r\n */\r\n public addComponent<T extends Component>(component: T, force: boolean = false): Entity {\r\n // if component already exists, skip if not forced\r\n if (this.has(component.type)) {\r\n if (force) {\r\n // Remove existing component type if exists when forced\r\n this.removeComponent(component);\r\n } else {\r\n // early exit component exiss\r\n return this;\r\n }\r\n }\r\n\r\n // TODO circular dependencies will be a problem\r\n if (component.dependencies && component.dependencies.length) {\r\n for (const ctor of component.dependencies) {\r\n this.addComponent(new ctor());\r\n }\r\n }\r\n\r\n component.owner = this;\r\n const constuctorType = component.constructor as ComponentCtor<T>;\r\n this._componentTypeToInstance.set(constuctorType, component);\r\n this._componentStringToInstance.set(component.type, component);\r\n if (component.onAdd) {\r\n component.onAdd(this);\r\n }\r\n this._notifyAddComponent(component);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a component from the entity, by default removals are deferred to the end of entity update to avoid consistency issues\r\n *\r\n * Components can be force removed with the `force` flag, the removal is not deferred and happens immediately\r\n * @param componentOrType\r\n * @param force\r\n */\r\n public removeComponent<ComponentOrType extends string | Component>(componentOrType: ComponentOrType, force = false): Entity {\r\n if (force) {\r\n if (typeof componentOrType === 'string') {\r\n this._removeComponentByType(componentOrType);\r\n } else if (componentOrType instanceof Component) {\r\n this._removeComponentByType(componentOrType.type);\r\n }\r\n } else {\r\n this._componentsToRemove.push(componentOrType);\r\n }\r\n\r\n return this as any;\r\n }\r\n\r\n private _removeComponentByType(type: string) {\r\n if (this.has(type)) {\r\n const component = this.get(type);\r\n component.owner = null;\r\n if (component.onRemove) {\r\n component.onRemove(this);\r\n }\r\n const ctor = component.constructor as ComponentCtor;\r\n this._componentTypeToInstance.delete(ctor);\r\n this._componentStringToInstance.delete(component.type);\r\n this._notifyRemoveComponent(component);\r\n }\r\n }\r\n\r\n /**\r\n * @hidden\r\n * @internal\r\n */\r\n public processComponentRemoval() {\r\n for (const componentOrType of this._componentsToRemove) {\r\n const type = typeof componentOrType === 'string' ? componentOrType : componentOrType.type;\r\n this._removeComponentByType(type);\r\n }\r\n this._componentsToRemove.length = 0;\r\n }\r\n\r\n /**\r\n * Check if a component type exists\r\n * @param type\r\n */\r\n public has<T extends Component>(type: ComponentCtor<T>): boolean;\r\n public has(type: string): boolean;\r\n public has<T extends Component>(type: ComponentCtor<T> | string): boolean {\r\n if (typeof type === 'string') {\r\n return this._componentStringToInstance.has(type);\r\n } else {\r\n return this._componentTypeToInstance.has(type);\r\n }\r\n }\r\n\r\n /**\r\n * Get a component by type with typecheck\r\n *\r\n * (Does not work on tag components, use .hasTag(\"mytag\") instead)\r\n * @param type\r\n */\r\n public get<T extends Component>(type: ComponentCtor<T>): T | null;\r\n public get<T extends Component>(type: string): T | null;\r\n public get<T extends Component>(type: ComponentCtor<T> | string): T | null {\r\n if (typeof type === 'string') {\r\n return this._componentStringToInstance.get(type) as T;\r\n } else {\r\n return this._componentTypeToInstance.get(type) as T;\r\n }\r\n }\r\n\r\n private _isInitialized = false;\r\n\r\n /**\r\n * Gets whether the actor is Initialized\r\n */\r\n public get isInitialized(): boolean {\r\n return this._isInitialized;\r\n }\r\n\r\n /**\r\n * Initializes this entity, meant to be called by the Scene before first update not by users of Excalibur.\r\n *\r\n * It is not recommended that internal excalibur methods be overriden, do so at your own risk.\r\n *\r\n * @internal\r\n */\r\n public _initialize(engine: Engine) {\r\n if (!this.isInitialized) {\r\n this.onInitialize(engine);\r\n super.emit('initialize', new InitializeEvent(engine, this));\r\n this._isInitialized = true;\r\n }\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overriden, do so at your own risk.\r\n *\r\n * Internal _preupdate handler for [[onPreUpdate]] lifecycle event\r\n * @internal\r\n */\r\n public _preupdate(engine: Engine, delta: number): void {\r\n this.emit('preupdate', new PreUpdateEvent(engine, delta, this));\r\n this.onPreUpdate(engine, delta);\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overriden, do so at your own risk.\r\n *\r\n * Internal _preupdate handler for [[onPostUpdate]] lifecycle event\r\n * @internal\r\n */\r\n public _postupdate(engine: Engine, delta: number): void {\r\n this.emit('postupdate', new PostUpdateEvent(engine, delta, this));\r\n this.onPostUpdate(engine, delta);\r\n }\r\n\r\n /**\r\n * `onInitialize` is called before the first update of the entity. This method is meant to be\r\n * overridden.\r\n *\r\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\r\n */\r\n public onInitialize(_engine: Engine): void {\r\n // Override me\r\n }\r\n\r\n /**\r\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPreUpdate` is called directly before an entity is updated.\r\n */\r\n public onPreUpdate(_engine: Engine, _delta: number): void {\r\n // Override me\r\n }\r\n\r\n /**\r\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\r\n *\r\n * `onPostUpdate` is called directly after an entity is updated.\r\n */\r\n public onPostUpdate(_engine: Engine, _delta: number): void {\r\n // Override me\r\n }\r\n\r\n /**\r\n *\r\n * Entity update lifecycle, called internally\r\n *\r\n * @internal\r\n * @param engine\r\n * @param delta\r\n */\r\n public update(engine: Engine, delta: number): void {\r\n this._initialize(engine);\r\n this._preupdate(engine, delta);\r\n for (const child of this.children) {\r\n child.update(engine, delta);\r\n }\r\n this._postupdate(engine, delta);\r\n }\r\n}\r\n","import { Component } from '../EntityComponentSystem';\r\n\r\n/**\r\n * Shim to draw to the canvas when in LegacyDrawing mode\r\n * @deprecated\r\n */\r\nexport class CanvasDrawComponent extends Component<'ex.canvas'> {\r\n public readonly type = 'ex.canvas';\r\n\r\n constructor(public draw?: (ctx: CanvasRenderingContext2D, delta: number) => void) {\r\n super();\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n this.draw = this.draw ?? (() => {});\r\n }\r\n}\r\n","import { Vector, vec } from '../Math/vector';\r\nimport { Graphic } from './Graphic';\r\nimport { HasTick } from './Animation';\r\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\r\nimport { Logger } from '../Util/Log';\r\nimport { BoundingBox } from '../Collision/Index';\r\nimport { Component } from '../EntityComponentSystem/Component';\r\n\r\n/**\r\n * Type guard for checking if a Graphic HasTick (used for graphics that change over time like animations)\r\n * @param graphic\r\n */\r\nexport function hasGraphicsTick(graphic: Graphic): graphic is Graphic & HasTick {\r\n return !!(graphic as unknown as HasTick).tick;\r\n}\r\nexport interface GraphicsShowOptions {\r\n offset?: Vector;\r\n anchor?: Vector;\r\n}\r\n\r\nexport interface GraphicsComponentOptions {\r\n onPostDraw?: (ex: ExcaliburGraphicsContext, elapsed: number) => void;\r\n onPreDraw?: (ex: ExcaliburGraphicsContext, elapsed: number) => void;\r\n\r\n /**\r\n * Name of current graphic to use\r\n */\r\n current?: string;\r\n\r\n /**\r\n * Optionally copy instances of graphics by calling .clone(), you may set this to false to avoid sharing graphics when added to the\r\n * component for performance reasons. By default graphics are not copied and are shared when added to the component.\r\n */\r\n copyGraphics?: boolean;\r\n\r\n /**\r\n * Optional visible flag, if the graphics component is not visible it will not be displayed\r\n */\r\n visible?: boolean;\r\n\r\n /**\r\n * Optional opacity\r\n */\r\n opacity?: number;\r\n\r\n /**\r\n * List of graphics\r\n */\r\n graphics?: { [graphicName: string]: Graphic };\r\n\r\n /**\r\n * Optional offset in absolute pixels to shift all graphics in this component from each graphic's anchor (default is top left corner)\r\n */\r\n offset?: Vector;\r\n\r\n /**\r\n * Optional anchor\r\n */\r\n anchor?: Vector;\r\n}\r\n\r\nexport interface GraphicsLayerOptions {\r\n /**\r\n * Name of the layer required, for example 'background'\r\n */\r\n name: string;\r\n /**\r\n * Order of the layer, a layer with order -1 will be below a layer with order of 1\r\n */\r\n order: number;\r\n /**\r\n * Offset to shift the entire layer\r\n */\r\n offset?: Vector;\r\n}\r\nexport class GraphicsLayer {\r\n public graphics: { graphic: Graphic; options: GraphicsShowOptions }[] = [];\r\n constructor(private _options: GraphicsLayerOptions, private _graphics: GraphicsComponent) {}\r\n public get name(): string {\r\n return this._options.name;\r\n }\r\n\r\n /**\r\n * Remove any instance(s) of a graphic currently being shown in this layer\r\n */\r\n public hide(nameOrGraphic: string | Graphic): void;\r\n /**\r\n * Remove all currently shown graphics in this layer\r\n */\r\n public hide(): void;\r\n public hide(nameOrGraphic?: string | Graphic): void {\r\n if (!nameOrGraphic) {\r\n this.graphics.length = 0;\r\n } else {\r\n let gfx: Graphic = null;\r\n if (nameOrGraphic instanceof Graphic) {\r\n gfx = nameOrGraphic;\r\n } else {\r\n gfx = this._graphics.getGraphic(nameOrGraphic);\r\n }\r\n this.graphics = this.graphics.filter((g) => g.graphic !== gfx);\r\n }\r\n }\r\n\r\n /**\r\n * Show a graphic by name or instance at an offset, graphics are shown in the order in which `show()` is called.\r\n *\r\n * If `show()` is called multiple times for the same graphic it will be shown multiple times.\r\n * @param nameOrGraphic\r\n * @param options\r\n */\r\n public show<T extends Graphic = Graphic>(nameOrGraphic: string | T, options?: GraphicsShowOptions): T {\r\n options = { ...options };\r\n let gfx: Graphic;\r\n if (nameOrGraphic instanceof Graphic) {\r\n gfx = this._graphics.copyGraphics ? nameOrGraphic.clone() : nameOrGraphic;\r\n } else {\r\n gfx = this._graphics.getGraphic(nameOrGraphic);\r\n if (!gfx) {\r\n Logger.getInstance().error(\r\n `No such graphic added to component named ${nameOrGraphic}. These named graphics are available: `,\r\n this._graphics.getNames()\r\n );\r\n }\r\n }\r\n if (gfx) {\r\n this.graphics.push({ graphic: gfx, options });\r\n return gfx as T;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Use a specific graphic, swap out any current graphics being shown\r\n * @param nameOrGraphic\r\n * @param options\r\n */\r\n public use<T extends Graphic = Graphic>(nameOrGraphic: string | T, options?: GraphicsShowOptions): T {\r\n options = { ...options };\r\n this.hide();\r\n return this.show<T>(nameOrGraphic, options);\r\n }\r\n\r\n /**\r\n * Current order of the layer, higher numbers are on top, lower numbers are on the bottom.\r\n *\r\n * For example a layer with `order = -1` would be under a layer of `order = 1`\r\n */\r\n public get order(): number {\r\n return this._options.order;\r\n }\r\n\r\n /**\r\n * Set the order of the layer, higher numbers are on top, lower numbers are on the bottom.\r\n *\r\n * For example a layer with `order = -1` would be under a layer of `order = 1`\r\n */\r\n public set order(order: number) {\r\n this._options.order = order;\r\n }\r\n\r\n /**\r\n * Get or set the pixel offset from the layer anchor for all graphics in the layer\r\n */\r\n public get offset(): Vector {\r\n return this._options.offset ?? Vector.Zero;\r\n }\r\n\r\n public set offset(value: Vector) {\r\n this._options.offset = value;\r\n }\r\n\r\n public get currentKeys(): string {\r\n return this.name ?? 'anonymous';\r\n }\r\n}\r\n\r\nexport class GraphicsLayers {\r\n private _layers: GraphicsLayer[] = [];\r\n private _layerMap: { [layerName: string]: GraphicsLayer } = {};\r\n public default: GraphicsLayer;\r\n constructor(private _component: GraphicsComponent) {\r\n this.default = new GraphicsLayer({ name: 'default', order: 0 }, _component);\r\n this._maybeAddLayer(this.default);\r\n }\r\n public create(options: GraphicsLayerOptions): GraphicsLayer {\r\n const layer = new GraphicsLayer(options, this._component);\r\n return this._maybeAddLayer(layer);\r\n }\r\n\r\n /**\r\n * Retrieve a single layer by name\r\n * @param name\r\n */\r\n public get(name: string): GraphicsLayer;\r\n /**\r\n * Retrieve all layers\r\n */\r\n public get(): readonly GraphicsLayer[];\r\n public get(name?: string): GraphicsLayer | readonly GraphicsLayer[] {\r\n if (name) {\r\n return this._getLayer(name);\r\n }\r\n return this._layers;\r\n }\r\n\r\n public currentKeys() {\r\n const graphicsLayerKeys = [];\r\n for (const layer of this._layers) {\r\n graphicsLayerKeys.push(layer.currentKeys);\r\n }\r\n return graphicsLayerKeys;\r\n }\r\n\r\n public has(name: string): boolean {\r\n return name in this._layerMap;\r\n }\r\n\r\n private _maybeAddLayer(layer: GraphicsLayer) {\r\n if (this._layerMap[layer.name]) {\r\n // todo log warning\r\n return this._layerMap[layer.name];\r\n }\r\n this._layerMap[layer.name] = layer;\r\n this._layers.push(layer);\r\n this._layers.sort((a, b) => a.order - b.order);\r\n return layer;\r\n }\r\n\r\n private _getLayer(name: string): GraphicsLayer | undefined {\r\n return this._layerMap[name];\r\n }\r\n}\r\n\r\n/**\r\n * Component to manage drawings, using with the position component\r\n */\r\nexport class GraphicsComponent extends Component<'ex.graphics'> {\r\n readonly type = 'ex.graphics';\r\n\r\n private _graphics: { [graphicName: string]: Graphic } = {};\r\n\r\n public layers: GraphicsLayers;\r\n\r\n public getGraphic(name: string): Graphic | undefined {\r\n return this._graphics[name];\r\n }\r\n\r\n /**\r\n * Get registered graphics names\r\n */\r\n public getNames(): string[] {\r\n return Object.keys(this._graphics);\r\n }\r\n\r\n /**\r\n * Draws after the entity transform has bene applied, but before graphics component graphics have been drawn\r\n */\r\n public onPreDraw: (ctx: ExcaliburGraphicsContext, elapsedMilliseconds: number) => void;\r\n\r\n /**\r\n * Draws after the entity transform has been applied, and after graphics component graphics has been drawn\r\n */\r\n public onPostDraw: (ctx: ExcaliburGraphicsContext, elapsedMilliseconds: number) => void;\r\n\r\n /**\r\n * Sets or gets wether any drawing should be visible in this component\r\n */\r\n public visible: boolean = true;\r\n\r\n /**\r\n * Sets or gets wither all drawings should have an opacity applied\r\n */\r\n public opacity: number = 1;\r\n\r\n /**\r\n * Offset to apply to graphics by default\r\n */\r\n public offset: Vector = Vector.Zero;\r\n\r\n /**\r\n * Anchor to apply to graphics by default\r\n */\r\n public anchor: Vector = Vector.Half;\r\n\r\n /**\r\n * If set to true graphics added to the component will be copied. This can affect performance\r\n */\r\n public copyGraphics: boolean = false;\r\n\r\n constructor(options?: GraphicsComponentOptions) {\r\n super();\r\n // Defaults\r\n options = {\r\n visible: this.visible,\r\n ...options\r\n };\r\n\r\n const { current, anchor, opacity, visible, graphics, offset, copyGraphics, onPreDraw, onPostDraw } = options;\r\n\r\n this._graphics = graphics || {};\r\n this.offset = offset ?? this.offset;\r\n this.opacity = opacity ?? this.opacity;\r\n this.anchor = anchor ?? this.anchor;\r\n this.copyGraphics = copyGraphics ?? this.copyGraphics;\r\n this.onPreDraw = onPreDraw ?? this.onPreDraw;\r\n this.onPostDraw = onPostDraw ?? this.onPostDraw;\r\n this.visible = !!visible;\r\n\r\n this.layers = new GraphicsLayers(this);\r\n if (current && this._graphics[current]) {\r\n this.show(this._graphics[current]);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the currently displayed graphics and their offsets, empty array if hidden\r\n */\r\n public get current(): { graphic: Graphic; options: GraphicsShowOptions }[] {\r\n return this.layers.default.graphics;\r\n }\r\n\r\n /**\r\n * Returns all graphics associated with this component\r\n */\r\n public get graphics(): { [graphicName: string]: Graphic } {\r\n return this._graphics;\r\n }\r\n\r\n /**\r\n * Adds a named graphic to this component, if the name is \"default\" or not specified, it will be shown by default without needing to call\r\n * `show(\"default\")`\r\n * @param graphic\r\n */\r\n public add(graphic: Graphic): Graphic;\r\n public add(name: string, graphic: Graphic): Graphic;\r\n public add(nameOrGraphic: string | Graphic, graphic?: Graphic): Graphic {\r\n let name = 'default';\r\n let graphicToSet: Graphic = null;\r\n if (typeof nameOrGraphic === 'string') {\r\n name = nameOrGraphic;\r\n graphicToSet = graphic;\r\n } else {\r\n graphicToSet = nameOrGraphic;\r\n }\r\n\r\n this._graphics[name] = this.copyGraphics ? graphicToSet.clone() : graphicToSet;\r\n if (name === 'default') {\r\n this.show('default');\r\n }\r\n return graphicToSet;\r\n }\r\n\r\n /**\r\n * Show a graphic by name on the **default** layer, returns the new [[Graphic]]\r\n */\r\n public show<T extends Graphic = Graphic>(nameOrGraphic: string | T, options?: GraphicsShowOptions): T {\r\n return this.layers.default.show<T>(nameOrGraphic, options);\r\n }\r\n\r\n /**\r\n * Use a graphic only, swap out any graphics on the **default** layer, returns the new [[Graphic]]\r\n * @param nameOrGraphic\r\n * @param options\r\n */\r\n public use<T extends Graphic = Graphic>(nameOrGraphic: string | T, options?: GraphicsShowOptions): T {\r\n return this.layers.default.use<T>(nameOrGraphic, options);\r\n }\r\n\r\n /**\r\n * Remove any instance(s) of a graphic currently being shown in the **default** layer\r\n */\r\n public hide(nameOrGraphic: string | Graphic): void;\r\n /**\r\n * Remove all currently shown graphics in the **default** layer\r\n */\r\n public hide(): void;\r\n public hide(nameOrGraphic?: string | Graphic): void {\r\n this.layers.default.hide(nameOrGraphic);\r\n }\r\n\r\n private _bounds: BoundingBox = null;\r\n public set localBounds(bounds: BoundingBox) {\r\n this._bounds = bounds;\r\n }\r\n\r\n public get localBounds(): BoundingBox {\r\n if (this._bounds) {\r\n return this._bounds;\r\n }\r\n let bb = new BoundingBox();\r\n for (const layer of this.layers.get()) {\r\n for (const { graphic, options } of layer.graphics) {\r\n let anchor = this.anchor;\r\n let offset = this.offset;\r\n if (options?.anchor) {\r\n anchor = options.anchor;\r\n }\r\n if (options?.offset) {\r\n offset = options.offset;\r\n }\r\n const bounds = graphic.localBounds;\r\n const offsetX = -bounds.width * graphic.scale.x * anchor.x + offset.x;\r\n const offsetY = -bounds.height * graphic.scale.y * anchor.y + offset.y;\r\n bb = graphic?.localBounds.translate(vec(offsetX + layer.offset.x, offsetY + layer.offset.y)).combine(bb);\r\n }\r\n }\r\n return bb;\r\n }\r\n\r\n /**\r\n * Update underlying graphics if necesary, called internally\r\n * @param elapsed\r\n * @internal\r\n */\r\n public update(elapsed: number, idempotencyToken: number = 0) {\r\n for (const layer of this.layers.get()) {\r\n for (const { graphic } of layer.graphics) {\r\n if (hasGraphicsTick(graphic)) {\r\n graphic?.tick(elapsed, idempotencyToken);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { Raster, RasterOptions } from './Raster';\r\n\r\nexport interface RectangleOptions {\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * A Rectangle [[Graphic]] for drawing rectangles to the [[ExcaliburGraphicsContext]]\r\n */\r\nexport class Rectangle extends Raster {\r\n constructor(options: RasterOptions & RectangleOptions) {\r\n super(options);\r\n this.width = options.width;\r\n this.height = options.height;\r\n this.rasterize();\r\n }\r\n\r\n public clone(): Rectangle {\r\n return new Rectangle({\r\n width: this.width,\r\n height: this.height,\r\n ...this.cloneGraphicOptions(),\r\n ...this.cloneRasterOptions()\r\n });\r\n }\r\n\r\n execute(ctx: CanvasRenderingContext2D): void {\r\n if (this.color) {\r\n ctx.fillRect(0, 0, this.width, this.height);\r\n }\r\n if (this.strokeColor) {\r\n ctx.strokeRect(0, 0, this.width, this.height);\r\n }\r\n }\r\n}\r\n","import { Raster, RasterOptions } from './Raster';\r\n\r\nexport interface CircleOptions {\r\n radius: number;\r\n}\r\n\r\n/**\r\n * A circle [[Graphic]] for drawing circles to the [[ExcaliburGraphicsContext]]\r\n */\r\nexport class Circle extends Raster {\r\n private _radius: number = 0;\r\n public get radius() {\r\n return this._radius;\r\n }\r\n public set radius(value: number) {\r\n this._radius = value;\r\n this.width = this._radius * 2;\r\n this.height = this._radius * 2;\r\n this.flagDirty();\r\n }\r\n constructor(options: RasterOptions & CircleOptions) {\r\n super(options);\r\n this.padding = options.padding ?? 2; // default 2 padding for circles looks nice\r\n this.radius = options.radius;\r\n this.rasterize();\r\n }\r\n\r\n public clone(): Circle {\r\n return new Circle({\r\n radius: this.radius,\r\n ...this.cloneGraphicOptions(),\r\n ...this.cloneRasterOptions()\r\n });\r\n }\r\n\r\n execute(ctx: CanvasRenderingContext2D): void {\r\n if (this.radius > 0) {\r\n ctx.beginPath();\r\n ctx.arc(this.radius, this.radius, this.radius, 0, Math.PI * 2);\r\n\r\n if (this.color) {\r\n ctx.fill();\r\n }\r\n\r\n if (this.strokeColor) {\r\n ctx.stroke();\r\n }\r\n }\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\nimport { obsolete } from '../Util/Decorators';\n\n/**\n * A definition of an EasingFunction. See [[EasingFunctions]].\n */\n// tslint:disable-next-line\nexport interface EasingFunction {\n (currentTime: number, startValue: number, endValue: number, duration: number): number;\n}\n\n/**\n * Standard easing functions for motion in Excalibur, defined on a domain of [0, duration] and a range from [+startValue,+endValue]\n * Given a time, the function will return a value from positive startValue to positive endValue.\n *\n * ```js\n * function Linear (t) {\n * return t * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInQuad (t) {\n * return t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutQuad (t) {\n * return t * (2 - t);\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutQuad (t) {\n * return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n * }\n *\n * // accelerating from zero velocity\n * function EaseInCubic (t) {\n * return t * t * t;\n * }\n *\n * // decelerating to zero velocity\n * function EaseOutCubic (t) {\n * return (--t) * t * t + 1;\n * }\n *\n * // acceleration until halfway, then deceleration\n * function EaseInOutCubic (t) {\n * return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n * }\n * ```\n */\nexport class EasingFunctions {\n public static CreateReversibleEasingFunction(easing: EasingFunction) {\n return (time: number, start: number, end: number, duration: number) => {\n if (end < start) {\n return start - (easing(time, end, start, duration) - end);\n } else {\n return easing(time, start, end, duration);\n }\n };\n }\n\n @obsolete({\n message: 'Alias for incorrect spelling used in older versions, will be removed in v0.25.0',\n alternateMethod: 'CreateReversibleEasingFunction'\n })\n public static CreateReversableEasingFunction(easing: EasingFunction) {\n return EasingFunctions.CreateReversibleEasingFunction(easing);\n }\n\n public static CreateVectorEasingFunction(easing: EasingFunction) {\n return (time: number, start: Vector, end: Vector, duration: number) => {\n return new Vector(easing(time, start.x, end.x, duration), easing(time, start.y, end.y, duration));\n };\n }\n\n public static Linear: EasingFunction = EasingFunctions.CreateReversibleEasingFunction(\n (currentTime: number, startValue: number, endValue: number, duration: number) => {\n endValue = endValue - startValue;\n return (endValue * currentTime) / duration + startValue;\n }\n );\n\n public static EaseInQuad = EasingFunctions.CreateReversibleEasingFunction(\n (currentTime: number, startValue: number, endValue: number, duration: number) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n\n return endValue * currentTime * currentTime + startValue;\n }\n );\n\n public static EaseOutQuad: EasingFunction = EasingFunctions.CreateReversibleEasingFunction(\n (currentTime: number, startValue: number, endValue: number, duration: number) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return -endValue * currentTime * (currentTime - 2) + startValue;\n }\n );\n\n public static EaseInOutQuad: EasingFunction = EasingFunctions.CreateReversibleEasingFunction(\n (currentTime: number, startValue: number, endValue: number, duration: number) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime + startValue;\n }\n currentTime--;\n\n return (-endValue / 2) * (currentTime * (currentTime - 2) - 1) + startValue;\n }\n );\n\n public static EaseInCubic: EasingFunction = EasingFunctions.CreateReversibleEasingFunction(\n (currentTime: number, startValue: number, endValue: number, duration: number) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n return endValue * currentTime * currentTime * currentTime + startValue;\n }\n );\n\n public static EaseOutCubic: EasingFunction = EasingFunctions.CreateReversibleEasingFunction(\n (currentTime: number, startValue: number, endValue: number, duration: number) => {\n endValue = endValue - startValue;\n currentTime /= duration;\n currentTime--;\n return endValue * (currentTime * currentTime * currentTime + 1) + startValue;\n }\n );\n\n public static EaseInOutCubic: EasingFunction = EasingFunctions.CreateReversibleEasingFunction(\n (currentTime: number, startValue: number, endValue: number, duration: number) => {\n endValue = endValue - startValue;\n currentTime /= duration / 2;\n if (currentTime < 1) {\n return (endValue / 2) * currentTime * currentTime * currentTime + startValue;\n }\n currentTime -= 2;\n return (endValue / 2) * (currentTime * currentTime * currentTime + 2) + startValue;\n }\n );\n}\n","import { Entity } from '../EntityComponentSystem/Entity';\r\nimport { Action } from './Action';\r\n\r\n/**\r\n * Action Queues represent an ordered sequence of actions\r\n *\r\n * Action queues are part of the [[ActionContext|Action API]] and\r\n * store the list of actions to be executed for an [[Actor]].\r\n *\r\n * Actors implement [[Actor.actions]] which can be manipulated by\r\n * advanced users to adjust the actions currently being executed in the\r\n * queue.\r\n */\r\nexport class ActionQueue {\r\n private _entity: Entity;\r\n private _actions: Action[] = [];\r\n private _currentAction: Action;\r\n private _completedActions: Action[] = [];\r\n constructor(entity: Entity) {\r\n this._entity = entity;\r\n }\r\n\r\n /**\r\n * Add an action to the sequence\r\n * @param action\r\n */\r\n public add(action: Action) {\r\n this._actions.push(action);\r\n }\r\n\r\n /**\r\n * Remove an action by reference from the sequence\r\n * @param action\r\n */\r\n public remove(action: Action) {\r\n const index = this._actions.indexOf(action);\r\n this._actions.splice(index, 1);\r\n }\r\n\r\n /**\r\n * Removes all actions from this sequence\r\n */\r\n public clearActions(): void {\r\n this._actions.length = 0;\r\n this._completedActions.length = 0;\r\n if (this._currentAction) {\r\n this._currentAction.stop();\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @returns The total list of actions in this sequence complete or not\r\n */\r\n public getActions(): Action[] {\r\n return this._actions.concat(this._completedActions);\r\n }\r\n\r\n /**\r\n *\r\n * @returns `true` if there are more actions to process in the sequence\r\n */\r\n public hasNext(): boolean {\r\n return this._actions.length > 0;\r\n }\r\n\r\n /**\r\n * @returns `true` if the current sequence of actions is done\r\n */\r\n public isComplete(): boolean {\r\n return this._actions.length === 0;\r\n }\r\n\r\n /**\r\n * Resets the sequence of actions, this is used to restart a sequence from the beginning\r\n */\r\n public reset(): void {\r\n this._actions = this.getActions();\r\n\r\n const len = this._actions.length;\r\n for (let i = 0; i < len; i++) {\r\n this._actions[i].reset();\r\n }\r\n this._completedActions = [];\r\n }\r\n\r\n /**\r\n * Update the queue which updates actions and handles completing actions\r\n * @param elapsedMs\r\n */\r\n public update(elapsedMs: number) {\r\n if (this._actions.length > 0) {\r\n this._currentAction = this._actions[0];\r\n this._currentAction.update(elapsedMs);\r\n\r\n if (this._currentAction.isComplete(this._entity)) {\r\n this._completedActions.push(this._actions.shift());\r\n }\r\n }\r\n }\r\n}\r\n","import { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { Action } from '../Action';\r\nimport { ActionContext } from '../ActionContext';\r\nimport { ActionQueue } from '../ActionQueue';\r\n\r\nexport class Repeat implements Action {\r\n private _actionQueue: ActionQueue;\r\n private _repeat: number;\r\n private _originalRepeat: number;\r\n private _stopped: boolean = false;\r\n private _repeatContext: ActionContext;\r\n private _repeatBuilder: (repeatContext: ActionContext) => any;\r\n constructor(entity: Entity, repeatBuilder: (repeatContext: ActionContext) => any, repeat: number) {\r\n this._repeatBuilder = repeatBuilder;\r\n this._repeatContext = new ActionContext(entity);\r\n this._actionQueue = this._repeatContext.getQueue();\r\n\r\n this._repeat = repeat;\r\n this._originalRepeat = repeat;\r\n\r\n this._repeatBuilder(this._repeatContext);\r\n this._repeat--; // current execution is the first repeat\r\n }\r\n\r\n public update(delta: number): void {\r\n if (this._actionQueue.isComplete()) {\r\n this._actionQueue.clearActions();\r\n this._repeatBuilder(this._repeatContext);\r\n this._repeat--;\r\n }\r\n this._actionQueue.update(delta);\r\n }\r\n\r\n public isComplete(): boolean {\r\n return this._stopped || (this._repeat <= 0 && this._actionQueue.isComplete());\r\n }\r\n\r\n public stop(): void {\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._repeat = this._originalRepeat;\r\n }\r\n}\r\n","import { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { Action } from '../Action';\r\nimport { ActionContext } from '../ActionContext';\r\nimport { ActionQueue } from '../ActionQueue';\r\n\r\n/**\r\n * RepeatForever Action implementation, it is recommended you use the fluent action\r\n * context API.\r\n *\r\n *\r\n */\r\nexport class RepeatForever implements Action {\r\n private _actionQueue: ActionQueue;\r\n private _stopped: boolean = false;\r\n private _repeatContext: ActionContext;\r\n private _repeatBuilder: (repeatContext: ActionContext) => any;\r\n constructor(entity: Entity, repeatBuilder: (repeatContext: ActionContext) => any) {\r\n this._repeatBuilder = repeatBuilder;\r\n this._repeatContext = new ActionContext(entity);\r\n this._actionQueue = this._repeatContext.getQueue();\r\n\r\n this._repeatBuilder(this._repeatContext);\r\n }\r\n\r\n public update(delta: number): void {\r\n if (this._stopped) {\r\n return;\r\n }\r\n\r\n if (this._actionQueue.isComplete()) {\r\n this._actionQueue.clearActions();\r\n this._repeatBuilder(this._repeatContext);\r\n }\r\n\r\n this._actionQueue.update(delta);\r\n }\r\n\r\n public isComplete(): boolean {\r\n return this._stopped;\r\n }\r\n\r\n public stop(): void {\r\n this._stopped = true;\r\n this._actionQueue.clearActions();\r\n }\r\n\r\n public reset(): void {\r\n return;\r\n }\r\n}\r\n","import { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { Vector, vec } from '../../Math/vector';\r\nimport { Logger } from '../../Util/Log';\r\nimport { Action } from '../Action';\r\n\r\nexport class MoveBy implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n private _entity: Entity;\r\n public x: number;\r\n public y: number;\r\n private _distance: number;\r\n private _speed: number;\r\n\r\n private _start: Vector;\r\n private _offset: Vector;\r\n private _end: Vector;\r\n private _dir: Vector;\r\n private _started = false;\r\n private _stopped = false;\r\n\r\n constructor(entity: Entity, offsetX: number, offsetY: number, speed: number) {\r\n this._entity = entity;\r\n this._tx = entity.get(TransformComponent);\r\n this._motion = entity.get(MotionComponent);\r\n this._speed = speed;\r\n this._offset = new Vector(offsetX, offsetY);\r\n if (speed <= 0) {\r\n Logger.getInstance().error('Attempted to moveBy with speed less than or equal to zero : ' + speed);\r\n throw new Error('Speed must be greater than 0 pixels per second');\r\n }\r\n }\r\n\r\n public update(_delta: number) {\r\n if (!this._started) {\r\n this._started = true;\r\n this._start = new Vector(this._tx.pos.x, this._tx.pos.y);\r\n this._end = this._start.add(this._offset);\r\n this._distance = this._offset.size;\r\n this._dir = this._end.sub(this._start).normalize();\r\n }\r\n\r\n if (this.isComplete(this._entity)) {\r\n this._tx.pos = vec(this._end.x, this._end.y);\r\n this._motion.vel = vec(0, 0);\r\n } else {\r\n this._motion.vel = this._dir.scale(this._speed);\r\n }\r\n }\r\n\r\n public isComplete(entity: Entity): boolean {\r\n const tx = entity.get(TransformComponent);\r\n return this._stopped || tx.pos.distance(this._start) >= this._distance;\r\n }\r\n\r\n public stop(): void {\r\n this._motion.vel = vec(0, 0);\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","import { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { Vector, vec } from '../../Math/vector';\r\nimport { Action } from '../Action';\r\n\r\nexport class MoveTo implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n public x: number;\r\n public y: number;\r\n private _start: Vector;\r\n private _end: Vector;\r\n private _dir: Vector;\r\n private _speed: number;\r\n private _distance: number;\r\n private _started = false;\r\n private _stopped = false;\r\n constructor(public entity: Entity, destx: number, desty: number, speed: number) {\r\n this._tx = entity.get(TransformComponent);\r\n this._motion = entity.get(MotionComponent);\r\n this._end = new Vector(destx, desty);\r\n this._speed = speed;\r\n }\r\n\r\n public update(_delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n this._start = new Vector(this._tx.pos.x, this._tx.pos.y);\r\n this._distance = this._start.distance(this._end);\r\n this._dir = this._end.sub(this._start).normalize();\r\n }\r\n const m = this._dir.scale(this._speed);\r\n this._motion.vel = vec(m.x, m.y);\r\n\r\n if (this.isComplete(this.entity)) {\r\n this._tx.pos = vec(this._end.x, this._end.y);\r\n this._motion.vel = vec(0, 0);\r\n }\r\n }\r\n\r\n public isComplete(entity: Entity): boolean {\r\n const tx = entity.get(TransformComponent);\r\n return this._stopped || new Vector(tx.pos.x, tx.pos.y).distance(this._start) >= this._distance;\r\n }\r\n\r\n public stop(): void {\r\n this._motion.vel = vec(0, 0);\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","/**\r\n * An enum that describes the strategies that rotation actions can use\r\n */\r\nexport enum RotationType {\r\n /**\r\n * Rotation via `ShortestPath` will use the smallest angle\r\n * between the starting and ending points. This strategy is the default behavior.\r\n */\r\n ShortestPath = 0,\r\n /**\r\n * Rotation via `LongestPath` will use the largest angle\r\n * between the starting and ending points.\r\n */\r\n LongestPath = 1,\r\n /**\r\n * Rotation via `Clockwise` will travel in a clockwise direction,\r\n * regardless of the starting and ending points.\r\n */\r\n Clockwise = 2,\r\n /**\r\n * Rotation via `CounterClockwise` will travel in a counterclockwise direction,\r\n * regardless of the starting and ending points.\r\n */\r\n CounterClockwise = 3\r\n}\r\n","import { Action } from '../Action';\r\nimport { RotationType } from '../RotationType';\r\nimport * as Util from '../../Util/Util';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\n\r\nexport class RotateTo implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n public x: number;\r\n public y: number;\r\n private _start: number;\r\n private _end: number;\r\n private _speed: number;\r\n private _rotationType: RotationType;\r\n private _direction: number;\r\n private _distance: number;\r\n private _shortDistance: number;\r\n private _longDistance: number;\r\n private _shortestPathIsPositive: boolean;\r\n private _currentNonCannonAngle: number;\r\n private _started = false;\r\n private _stopped = false;\r\n constructor(entity: Entity, angleRadians: number, speed: number, rotationType?: RotationType) {\r\n this._tx = entity.get(TransformComponent);\r\n this._motion = entity.get(MotionComponent);\r\n this._end = angleRadians;\r\n this._speed = speed;\r\n this._rotationType = rotationType || RotationType.ShortestPath;\r\n }\r\n\r\n public update(_delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n this._start = this._tx.rotation;\r\n this._currentNonCannonAngle = this._tx.rotation;\r\n const distance1 = Math.abs(this._end - this._start);\r\n const distance2 = Util.TwoPI - distance1;\r\n if (distance1 > distance2) {\r\n this._shortDistance = distance2;\r\n this._longDistance = distance1;\r\n } else {\r\n this._shortDistance = distance1;\r\n this._longDistance = distance2;\r\n }\r\n\r\n this._shortestPathIsPositive = (this._start - this._end + Util.TwoPI) % Util.TwoPI >= Math.PI;\r\n\r\n switch (this._rotationType) {\r\n case RotationType.ShortestPath:\r\n this._distance = this._shortDistance;\r\n if (this._shortestPathIsPositive) {\r\n this._direction = 1;\r\n } else {\r\n this._direction = -1;\r\n }\r\n break;\r\n case RotationType.LongestPath:\r\n this._distance = this._longDistance;\r\n if (this._shortestPathIsPositive) {\r\n this._direction = -1;\r\n } else {\r\n this._direction = 1;\r\n }\r\n break;\r\n case RotationType.Clockwise:\r\n this._direction = 1;\r\n if (this._shortestPathIsPositive) {\r\n this._distance = this._shortDistance;\r\n } else {\r\n this._distance = this._longDistance;\r\n }\r\n break;\r\n case RotationType.CounterClockwise:\r\n this._direction = -1;\r\n if (!this._shortestPathIsPositive) {\r\n this._distance = this._shortDistance;\r\n } else {\r\n this._distance = this._longDistance;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n this._motion.angularVelocity = this._direction * this._speed;\r\n this._currentNonCannonAngle += this._direction * this._speed * (_delta / 1000);\r\n\r\n if (this.isComplete()) {\r\n this._tx.rotation = this._end;\r\n this._motion.angularVelocity = 0;\r\n this._stopped = true;\r\n }\r\n }\r\n\r\n public isComplete(): boolean {\r\n const distanceTravelled = Math.abs(this._currentNonCannonAngle - this._start);\r\n return this._stopped || distanceTravelled >= Math.abs(this._distance);\r\n }\r\n\r\n public stop(): void {\r\n this._motion.angularVelocity = 0;\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","import { Action } from '../Action';\r\nimport { RotationType } from '../RotationType';\r\nimport * as Util from '../../Util/Util';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\n\r\nexport class RotateBy implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n public x: number;\r\n public y: number;\r\n private _start: number;\r\n private _end: number;\r\n private _speed: number;\r\n private _offset: number;\r\n\r\n private _rotationType: RotationType;\r\n private _direction: number;\r\n private _distance: number;\r\n private _shortDistance: number;\r\n private _longDistance: number;\r\n private _shortestPathIsPositive: boolean;\r\n private _currentNonCannonAngle: number;\r\n private _started = false;\r\n private _stopped = false;\r\n constructor(entity: Entity, angleRadiansOffset: number, speed: number, rotationType?: RotationType) {\r\n this._tx = entity.get(TransformComponent);\r\n this._motion = entity.get(MotionComponent);\r\n this._speed = speed;\r\n this._offset = angleRadiansOffset;\r\n this._rotationType = rotationType || RotationType.ShortestPath;\r\n }\r\n\r\n public update(_delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n this._start = this._tx.rotation;\r\n this._currentNonCannonAngle = this._tx.rotation;\r\n this._end = this._start + this._offset;\r\n\r\n const distance1 = Math.abs(this._end - this._start);\r\n const distance2 = Util.TwoPI - distance1;\r\n if (distance1 > distance2) {\r\n this._shortDistance = distance2;\r\n this._longDistance = distance1;\r\n } else {\r\n this._shortDistance = distance1;\r\n this._longDistance = distance2;\r\n }\r\n\r\n this._shortestPathIsPositive = (this._start - this._end + Util.TwoPI) % Util.TwoPI >= Math.PI;\r\n\r\n switch (this._rotationType) {\r\n case RotationType.ShortestPath:\r\n this._distance = this._shortDistance;\r\n if (this._shortestPathIsPositive) {\r\n this._direction = 1;\r\n } else {\r\n this._direction = -1;\r\n }\r\n break;\r\n case RotationType.LongestPath:\r\n this._distance = this._longDistance;\r\n if (this._shortestPathIsPositive) {\r\n this._direction = -1;\r\n } else {\r\n this._direction = 1;\r\n }\r\n break;\r\n case RotationType.Clockwise:\r\n this._direction = 1;\r\n if (this._shortDistance >= 0) {\r\n this._distance = this._shortDistance;\r\n } else {\r\n this._distance = this._longDistance;\r\n }\r\n break;\r\n case RotationType.CounterClockwise:\r\n this._direction = -1;\r\n if (this._shortDistance <= 0) {\r\n this._distance = this._shortDistance;\r\n } else {\r\n this._distance = this._longDistance;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n this._motion.angularVelocity = this._direction * this._speed;\r\n this._currentNonCannonAngle += this._direction * this._speed * (_delta / 1000);\r\n\r\n if (this.isComplete()) {\r\n this._tx.rotation = this._end;\r\n this._motion.angularVelocity = 0;\r\n this._stopped = true;\r\n }\r\n }\r\n\r\n public isComplete(): boolean {\r\n const distanceTravelled = Math.abs(this._currentNonCannonAngle - this._start);\r\n return this._stopped || distanceTravelled >= Math.abs(this._distance);\r\n }\r\n\r\n public stop(): void {\r\n this._motion.angularVelocity = 0;\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","import { vec } from '../../Math/vector';\r\nimport { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { Action } from '../Action';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\n\r\nexport class ScaleTo implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n public x: number;\r\n public y: number;\r\n private _startX: number;\r\n private _startY: number;\r\n private _endX: number;\r\n private _endY: number;\r\n private _speedX: number;\r\n private _speedY: number;\r\n private _distanceX: number;\r\n private _distanceY: number;\r\n private _started = false;\r\n private _stopped = false;\r\n constructor(entity: Entity, scaleX: number, scaleY: number, speedX: number, speedY: number) {\r\n this._tx = entity.get(TransformComponent);\r\n this._motion = entity.get(MotionComponent);\r\n this._endX = scaleX;\r\n this._endY = scaleY;\r\n this._speedX = speedX;\r\n this._speedY = speedY;\r\n }\r\n\r\n public update(_delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n this._startX = this._tx.scale.x;\r\n this._startY = this._tx.scale.y;\r\n this._distanceX = Math.abs(this._endX - this._startX);\r\n this._distanceY = Math.abs(this._endY - this._startY);\r\n }\r\n\r\n if (!(Math.abs(this._tx.scale.x - this._startX) >= this._distanceX)) {\r\n const directionX = this._endY < this._startY ? -1 : 1;\r\n this._motion.scaleFactor.x = this._speedX * directionX;\r\n } else {\r\n this._motion.scaleFactor.x = 0;\r\n }\r\n\r\n if (!(Math.abs(this._tx.scale.y - this._startY) >= this._distanceY)) {\r\n const directionY = this._endY < this._startY ? -1 : 1;\r\n this._motion.scaleFactor.y = this._speedY * directionY;\r\n } else {\r\n this._motion.scaleFactor.y = 0;\r\n }\r\n\r\n if (this.isComplete()) {\r\n this._tx.scale = vec(this._endX, this._endY);\r\n this._motion.scaleFactor.x = 0;\r\n this._motion.scaleFactor.y = 0;\r\n }\r\n }\r\n\r\n public isComplete(): boolean {\r\n return (\r\n this._stopped ||\r\n (Math.abs(this._tx.scale.y - this._startX) >= this._distanceX && Math.abs(this._tx.scale.y - this._startY) >= this._distanceY)\r\n );\r\n }\r\n\r\n public stop(): void {\r\n this._motion.scaleFactor.x = 0;\r\n this._motion.scaleFactor.y = 0;\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","import { Vector } from '../../Math/vector';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { Action } from '../Action';\r\n\r\nexport class ScaleBy implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n public x: number;\r\n public y: number;\r\n private _startScale: Vector;\r\n private _endScale: Vector;\r\n private _offset: Vector;\r\n private _distanceX: number;\r\n private _distanceY: number;\r\n private _directionX: number;\r\n private _directionY: number;\r\n private _started = false;\r\n private _stopped = false;\r\n private _speedX: number;\r\n private _speedY: number;\r\n constructor(entity: Entity, scaleOffsetX: number, scaleOffsetY: number, speed: number) {\r\n this._tx = entity.get(TransformComponent);\r\n this._motion = entity.get(MotionComponent);\r\n this._offset = new Vector(scaleOffsetX, scaleOffsetY);\r\n this._speedX = this._speedY = speed;\r\n }\r\n\r\n public update(_delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n this._startScale = this._tx.scale.clone();\r\n this._endScale = this._startScale.add(this._offset);\r\n this._distanceX = Math.abs(this._endScale.x - this._startScale.x);\r\n this._distanceY = Math.abs(this._endScale.y - this._startScale.y);\r\n this._directionX = this._endScale.x < this._startScale.x ? -1 : 1;\r\n this._directionY = this._endScale.y < this._startScale.y ? -1 : 1;\r\n }\r\n\r\n this._motion.scaleFactor.x = this._speedX * this._directionX;\r\n this._motion.scaleFactor.y = this._speedY * this._directionY;\r\n\r\n if (this.isComplete()) {\r\n this._tx.scale = this._endScale;\r\n this._motion.scaleFactor.x = 0;\r\n this._motion.scaleFactor.y = 0;\r\n }\r\n }\r\n\r\n public isComplete(): boolean {\r\n return (\r\n this._stopped ||\r\n (Math.abs(this._tx.scale.x - this._startScale.x) >= this._distanceX &&\r\n Math.abs(this._tx.scale.y - this._startScale.y) >= this._distanceY)\r\n );\r\n }\r\n\r\n public stop(): void {\r\n this._motion.scaleFactor.x = 0;\r\n this._motion.scaleFactor.y = 0;\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","import { Action } from '../Action';\r\n\r\nexport class CallMethod implements Action {\r\n private _method: () => any = null;\r\n private _hasBeenCalled: boolean = false;\r\n constructor(method: () => any) {\r\n this._method = method;\r\n }\r\n\r\n public update(_delta: number) {\r\n this._method();\r\n this._hasBeenCalled = true;\r\n }\r\n public isComplete() {\r\n return this._hasBeenCalled;\r\n }\r\n public reset() {\r\n this._hasBeenCalled = false;\r\n }\r\n public stop() {\r\n this._hasBeenCalled = true;\r\n }\r\n}\r\n","import { Entity} from '../../EntityComponentSystem/Entity';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { Actor } from '../../Actor';\r\nimport { vec, Vector } from '../../Math/vector';\r\nimport { Action } from '../Action';\r\n\r\nexport class EaseTo implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n private _currentLerpTime: number = 0;\r\n private _lerpDuration: number = 1 * 1000; // 1 second\r\n private _lerpStart: Vector = new Vector(0, 0);\r\n private _lerpEnd: Vector = new Vector(0, 0);\r\n private _initialized: boolean = false;\r\n private _stopped: boolean = false;\r\n private _distance: number = 0;\r\n constructor(\r\n entity: Entity,\r\n x: number,\r\n y: number,\r\n duration: number,\r\n public easingFcn: (currentTime: number, startValue: number, endValue: number, duration: number) => number\r\n ) {\r\n this._tx = entity.get(TransformComponent);\r\n this._motion = entity.get(MotionComponent);\r\n this._lerpDuration = duration;\r\n this._lerpEnd = new Vector(x, y);\r\n }\r\n private _initialize() {\r\n this._lerpStart = new Vector(this._tx.pos.x, this._tx.pos.y);\r\n this._currentLerpTime = 0;\r\n this._distance = this._lerpStart.distance(this._lerpEnd);\r\n }\r\n\r\n public update(delta: number): void {\r\n if (!this._initialized) {\r\n this._initialize();\r\n this._initialized = true;\r\n }\r\n\r\n // Need to update lerp time first, otherwise the first update will always be zero\r\n this._currentLerpTime += delta;\r\n let newX = this._tx.pos.x;\r\n let newY = this._tx.pos.y;\r\n if (this._currentLerpTime < this._lerpDuration) {\r\n if (this._lerpEnd.x < this._lerpStart.x) {\r\n newX =\r\n this._lerpStart.x -\r\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.x, this._lerpStart.x, this._lerpDuration) - this._lerpEnd.x);\r\n } else {\r\n newX = this.easingFcn(this._currentLerpTime, this._lerpStart.x, this._lerpEnd.x, this._lerpDuration);\r\n }\r\n\r\n if (this._lerpEnd.y < this._lerpStart.y) {\r\n newY =\r\n this._lerpStart.y -\r\n (this.easingFcn(this._currentLerpTime, this._lerpEnd.y, this._lerpStart.y, this._lerpDuration) - this._lerpEnd.y);\r\n } else {\r\n newY = this.easingFcn(this._currentLerpTime, this._lerpStart.y, this._lerpEnd.y, this._lerpDuration);\r\n }\r\n // Given the lerp position figure out the velocity in pixels per second\r\n this._motion.vel = vec((newX - this._tx.pos.x) / (delta / 1000), (newY - this._tx.pos.y) / (delta / 1000));\r\n } else {\r\n this._tx.pos = vec(this._lerpEnd.x, this._lerpEnd.y);\r\n this._motion.vel = Vector.Zero;\r\n }\r\n }\r\n public isComplete(actor: Actor): boolean {\r\n return this._stopped || new Vector(actor.pos.x, actor.pos.y).distance(this._lerpStart) >= this._distance;\r\n }\r\n\r\n public reset(): void {\r\n this._initialized = false;\r\n }\r\n public stop(): void {\r\n this._motion.vel = vec(0, 0);\r\n this._stopped = true;\r\n }\r\n}\r\n","import { GraphicsComponent } from '../../Graphics/GraphicsComponent';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { Action } from '../Action';\r\n\r\nexport class Blink implements Action {\r\n private _graphics: GraphicsComponent;\r\n private _timeVisible: number = 0;\r\n private _timeNotVisible: number = 0;\r\n private _elapsedTime: number = 0;\r\n private _totalTime: number = 0;\r\n private _duration: number;\r\n private _stopped: boolean = false;\r\n private _started: boolean = false;\r\n constructor(entity: Entity, timeVisible: number, timeNotVisible: number, numBlinks: number = 1) {\r\n this._graphics = entity.get(GraphicsComponent);\r\n this._timeVisible = timeVisible;\r\n this._timeNotVisible = timeNotVisible;\r\n this._duration = (timeVisible + timeNotVisible) * numBlinks;\r\n }\r\n\r\n public update(delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n }\r\n if (!this._graphics) {\r\n return;\r\n }\r\n\r\n this._elapsedTime += delta;\r\n this._totalTime += delta;\r\n if (this._graphics.visible && this._elapsedTime >= this._timeVisible) {\r\n this._graphics.visible = false;\r\n this._elapsedTime = 0;\r\n }\r\n\r\n if (!this._graphics.visible && this._elapsedTime >= this._timeNotVisible) {\r\n this._graphics.visible = true;\r\n this._elapsedTime = 0;\r\n }\r\n\r\n if (this.isComplete()) {\r\n this._graphics.visible = true;\r\n }\r\n }\r\n\r\n public isComplete(): boolean {\r\n return this._stopped || this._totalTime >= this._duration;\r\n }\r\n\r\n public stop(): void {\r\n if (this._graphics) {\r\n this._graphics.visible = true;\r\n }\r\n this._stopped = true;\r\n }\r\n\r\n public reset() {\r\n this._started = false;\r\n this._elapsedTime = 0;\r\n this._totalTime = 0;\r\n }\r\n}\r\n","import { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { GraphicsComponent } from '../../Graphics/GraphicsComponent';\r\nimport { Logger } from '../../Util/Log';\r\nimport { Action } from '../Action';\r\n\r\nexport class Fade implements Action {\r\n private _graphics: GraphicsComponent;\r\n public x: number;\r\n public y: number;\r\n\r\n private _endOpacity: number;\r\n private _speed: number;\r\n private _multiplier: number = 1;\r\n private _started = false;\r\n private _stopped = false;\r\n\r\n constructor(entity: Entity, endOpacity: number, speed: number) {\r\n this._graphics = entity.get(GraphicsComponent);\r\n this._endOpacity = endOpacity;\r\n this._speed = speed;\r\n }\r\n\r\n public update(delta: number): void {\r\n if (!this._graphics) {\r\n return;\r\n }\r\n\r\n if (!this._started) {\r\n this._started = true;\r\n\r\n // determine direction when we start\r\n if (this._endOpacity < this._graphics.opacity) {\r\n this._multiplier = -1;\r\n } else {\r\n this._multiplier = 1;\r\n }\r\n }\r\n\r\n if (this._speed > 0) {\r\n this._graphics.opacity += (this._multiplier *\r\n (Math.abs(this._graphics.opacity - this._endOpacity) * delta)) / this._speed;\r\n }\r\n\r\n this._speed -= delta;\r\n\r\n if (this.isComplete()) {\r\n this._graphics.opacity = this._endOpacity;\r\n }\r\n\r\n Logger.getInstance().debug('[Action fade] Actor opacity:', this._graphics.opacity);\r\n }\r\n\r\n public isComplete(): boolean {\r\n return this._stopped || Math.abs(this._graphics.opacity - this._endOpacity) < 0.05;\r\n }\r\n\r\n public stop(): void {\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","import { Action } from '../Action';\r\n\r\nexport class Delay implements Action {\r\n private _elapsedTime: number = 0;\r\n private _delay: number;\r\n private _started: boolean = false;\r\n private _stopped = false;\r\n constructor(delay: number) {\r\n this._delay = delay;\r\n }\r\n\r\n public update(delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n }\r\n\r\n this._elapsedTime += delta;\r\n }\r\n\r\n isComplete(): boolean {\r\n return this._stopped || this._elapsedTime >= this._delay;\r\n }\r\n\r\n public stop(): void {\r\n this._stopped = true;\r\n }\r\n\r\n reset(): void {\r\n this._elapsedTime = 0;\r\n this._started = false;\r\n }\r\n}\r\n","import { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { Action } from '../Action';\r\nimport { ActionsComponent } from '../ActionsComponent';\r\n\r\nexport class Die implements Action {\r\n private _entity: Entity;\r\n private _stopped = false;\r\n\r\n constructor(entity: Entity) {\r\n this._entity = entity;\r\n }\r\n\r\n public update(_delta: number): void {\r\n this._entity.get(ActionsComponent).clearActions();\r\n this._entity.kill();\r\n this._stopped = true;\r\n }\r\n\r\n public isComplete(): boolean {\r\n return this._stopped;\r\n }\r\n\r\n public stop(): void {\r\n return;\r\n }\r\n\r\n public reset(): void {\r\n return;\r\n }\r\n}\r\n","import { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { vec, Vector } from '../../Math/vector';\r\nimport { Action } from '../Action';\r\n\r\nexport class Follow implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n private _followTx: TransformComponent;\r\n private _followMotion: MotionComponent;\r\n\r\n public x: number;\r\n public y: number;\r\n private _current: Vector;\r\n private _end: Vector;\r\n private _dir: Vector;\r\n private _speed: number;\r\n private _maximumDistance: number;\r\n private _distanceBetween: number;\r\n private _started = false;\r\n private _stopped = false;\r\n\r\n constructor(entity: Entity, entityToFollow: Entity, followDistance?: number) {\r\n this._tx = entity.get(TransformComponent);\r\n this._motion = entity.get(MotionComponent);\r\n this._followTx = entityToFollow.get(TransformComponent);\r\n this._followMotion = entityToFollow.get(MotionComponent);\r\n this._current = new Vector(this._tx.pos.x, this._tx.pos.y);\r\n this._end = new Vector(this._followTx.pos.x, this._followTx.pos.y);\r\n this._maximumDistance = followDistance !== undefined ? followDistance : this._current.distance(this._end);\r\n this._speed = 0;\r\n }\r\n\r\n public update(_delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n this._distanceBetween = this._current.distance(this._end);\r\n this._dir = this._end.sub(this._current).normalize();\r\n }\r\n\r\n const actorToFollowSpeed = Math.sqrt(Math.pow(this._followMotion.vel.x, 2) + Math.pow(this._followMotion.vel.y, 2));\r\n if (actorToFollowSpeed !== 0) {\r\n this._speed = actorToFollowSpeed;\r\n }\r\n this._current = vec(this._tx.pos.x, this._tx.pos.y);\r\n\r\n this._end = vec(this._followTx.pos.x, this._followTx.pos.y);\r\n this._distanceBetween = this._current.distance(this._end);\r\n this._dir = this._end.sub(this._current).normalize();\r\n\r\n if (this._distanceBetween >= this._maximumDistance) {\r\n const m = this._dir.scale(this._speed);\r\n this._motion.vel = vec(m.x, m.y);\r\n } else {\r\n this._motion.vel = vec(0, 0);\r\n }\r\n\r\n if (this.isComplete()) {\r\n this._tx.pos = vec(this._end.x, this._end.y);\r\n this._motion.vel = vec(0, 0);\r\n }\r\n }\r\n\r\n public stop(): void {\r\n this._motion.vel = vec(0, 0);\r\n this._stopped = true;\r\n }\r\n\r\n public isComplete(): boolean {\r\n // the actor following should never stop unless specified to do so\r\n return this._stopped;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","import { MotionComponent } from '../../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../../EntityComponentSystem/Components/TransformComponent';\r\nimport { Entity } from '../../EntityComponentSystem/Entity';\r\nimport { Vector, vec } from '../../Math/vector';\r\nimport { Action } from '../Action';\r\n\r\nexport class Meet implements Action {\r\n private _tx: TransformComponent;\r\n private _motion: MotionComponent;\r\n private _meetTx: TransformComponent;\r\n private _meetMotion: MotionComponent;\r\n public x: number;\r\n public y: number;\r\n private _current: Vector;\r\n private _end: Vector;\r\n private _dir: Vector;\r\n private _speed: number;\r\n private _distanceBetween: number;\r\n private _started = false;\r\n private _stopped = false;\r\n private _speedWasSpecified = false;\r\n\r\n constructor(actor: Entity, actorToMeet: Entity, speed?: number) {\r\n this._tx = actor.get(TransformComponent);\r\n this._motion = actor.get(MotionComponent);\r\n this._meetTx = actorToMeet.get(TransformComponent);\r\n this._meetMotion = actorToMeet.get(MotionComponent);\r\n this._current = new Vector(this._tx.pos.x, this._tx.pos.y);\r\n this._end = new Vector(this._meetTx.pos.x, this._meetTx.pos.y);\r\n this._speed = speed || 0;\r\n\r\n if (speed !== undefined) {\r\n this._speedWasSpecified = true;\r\n }\r\n }\r\n\r\n public update(_delta: number): void {\r\n if (!this._started) {\r\n this._started = true;\r\n this._distanceBetween = this._current.distance(this._end);\r\n this._dir = this._end.sub(this._current).normalize();\r\n }\r\n\r\n const actorToMeetSpeed = Math.sqrt(Math.pow(this._meetMotion.vel.x, 2) + Math.pow(this._meetMotion.vel.y, 2));\r\n if (actorToMeetSpeed !== 0 && !this._speedWasSpecified) {\r\n this._speed = actorToMeetSpeed;\r\n }\r\n this._current = vec(this._tx.pos.x, this._tx.pos.y);\r\n\r\n this._end = vec(this._meetTx.pos.x, this._meetTx.pos.y);\r\n this._distanceBetween = this._current.distance(this._end);\r\n this._dir = this._end.sub(this._current).normalize();\r\n\r\n const m = this._dir.scale(this._speed);\r\n this._motion.vel = vec(m.x, m.y);\r\n\r\n if (this.isComplete()) {\r\n this._tx.pos = vec(this._end.x, this._end.y);\r\n this._motion.vel = vec(0, 0);\r\n }\r\n }\r\n\r\n public isComplete(): boolean {\r\n return this._stopped || this._distanceBetween <= 1;\r\n }\r\n\r\n public stop(): void {\r\n this._motion.vel = vec(0, 0);\r\n this._stopped = true;\r\n }\r\n\r\n public reset(): void {\r\n this._started = false;\r\n }\r\n}\r\n","import { RotationType } from './RotationType';\r\n\r\nimport { EasingFunction, EasingFunctions } from '../Util/EasingFunctions';\r\nimport { ActionQueue } from './ActionQueue';\r\nimport { Repeat } from './Action/Repeat';\r\nimport { RepeatForever } from './Action/RepeatForever';\r\nimport { MoveBy } from './Action/MoveBy';\r\nimport { MoveTo } from './Action/MoveTo';\r\nimport { RotateTo } from './Action/RotateTo';\r\nimport { RotateBy } from './Action/RotateBy';\r\nimport { ScaleTo } from './Action/ScaleTo';\r\nimport { ScaleBy } from './Action/ScaleBy';\r\nimport { CallMethod } from './Action/CallMethod';\r\nimport { EaseTo } from './Action/EaseTo';\r\nimport { Blink } from './Action/Blink';\r\nimport { Fade } from './Action/Fade';\r\nimport { Delay } from './Action/Delay';\r\nimport { Die } from './Action/Die';\r\nimport { Follow } from './Action/Follow';\r\nimport { Meet } from './Action/Meet';\r\nimport { Vector } from '../Math/vector';\r\nimport { Entity } from '../EntityComponentSystem/Entity';\r\n\r\n/**\r\n * The fluent Action API allows you to perform \"actions\" on\r\n * [[Actor|Actors]] such as following, moving, rotating, and\r\n * more. You can implement your own actions by implementing\r\n * the [[Action]] interface.\r\n */\r\nexport class ActionContext {\r\n private _entity: Entity;\r\n private _queue: ActionQueue;\r\n\r\n constructor(entity: Entity) {\r\n this._entity = entity;\r\n this._queue = new ActionQueue(entity);\r\n }\r\n\r\n public getQueue(): ActionQueue {\r\n return this._queue;\r\n }\r\n\r\n public update(elapsedMs: number) {\r\n this._queue.update(elapsedMs);\r\n }\r\n\r\n /**\r\n * Clears all queued actions from the Actor\r\n */\r\n public clearActions(): void {\r\n this._queue.clearActions();\r\n }\r\n\r\n /**\r\n * This method will move an actor to the specified `x` and `y` position over the\r\n * specified duration using a given [[EasingFunctions]] and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param pos The x,y vector location to move the actor to\r\n * @param duration The time it should take the actor to move to the new location in milliseconds\r\n * @param easingFcn Use [[EasingFunctions]] or a custom function to use to calculate position, Default is [[EasingFunctions.Linear]]\r\n */\r\n public easeTo(pos: Vector, duration: number, easingFcn?: EasingFunction): ActionContext\r\n /**\r\n * This method will move an actor to the specified `x` and `y` position over the\r\n * specified duration using a given [[EasingFunctions]] and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param x The x location to move the actor to\r\n * @param y The y location to move the actor to\r\n * @param duration The time it should take the actor to move to the new location in milliseconds\r\n * @param easingFcn Use [[EasingFunctions]] or a custom function to use to calculate position, Default is [[EasingFunctions.Linear]]\r\n */\r\n public easeTo(x: number, y: number, duration: number, easingFcn?: EasingFunction): ActionContext\r\n public easeTo(...args: any[]): ActionContext {\r\n let x = 0;\r\n let y = 0;\r\n let duration = 0;\r\n let easingFcn = EasingFunctions.Linear;\r\n if (args[0] instanceof Vector) {\r\n x = args[0].x;\r\n y = args[0].y;\r\n duration = args[1];\r\n easingFcn = args[2] ?? easingFcn;\r\n } else {\r\n x = args[0];\r\n y = args[1];\r\n duration = args[2];\r\n easingFcn = args[3] ?? easingFcn;\r\n }\r\n\r\n this._queue.add(new EaseTo(this._entity, x, y, duration, easingFcn));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will move an actor to the specified x and y position at the\r\n * speed specified (in pixels per second) and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param pos The x,y vector location to move the actor to\r\n * @param speed The speed in pixels per second to move\r\n */\r\n public moveTo(pos: Vector, speed: number): ActionContext;\r\n /**\r\n * This method will move an actor to the specified x and y position at the\r\n * speed specified (in pixels per second) and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param x The x location to move the actor to\r\n * @param y The y location to move the actor to\r\n * @param speed The speed in pixels per second to move\r\n */\r\n public moveTo(x: number, y: number, speed: number): ActionContext;\r\n public moveTo(xOrPos: number | Vector, yOrSpeed: number, speedOrUndefined?: number | undefined): ActionContext {\r\n let x = 0;\r\n let y = 0;\r\n let speed = 0;\r\n if (xOrPos instanceof Vector) {\r\n x = xOrPos.x;\r\n y = xOrPos.y;\r\n speed = yOrSpeed;\r\n } else {\r\n x = xOrPos;\r\n y = yOrSpeed;\r\n speed = speedOrUndefined;\r\n }\r\n this._queue.add(new MoveTo(this._entity, x, y, speed));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will move an actor by the specified x offset and y offset from its current position, at a certain speed.\r\n * This method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param xOffset The x offset to apply to this actor\r\n * @param yOffset The y location to move the actor to\r\n * @param speed The speed in pixels per second the actor should move\r\n */\r\n public moveBy(offset: Vector, speed: number): ActionContext;\r\n public moveBy(xOffset: number, yOffset: number, speed: number): ActionContext;\r\n public moveBy(xOffsetOrVector: number | Vector, yOffsetOrSpeed: number, speedOrUndefined?: number | undefined): ActionContext {\r\n let xOffset = 0;\r\n let yOffset = 0;\r\n let speed = 0;\r\n if (xOffsetOrVector instanceof Vector) {\r\n xOffset = xOffsetOrVector.x;\r\n yOffset = xOffsetOrVector.y;\r\n speed = yOffsetOrSpeed;\r\n } else {\r\n xOffset = xOffsetOrVector;\r\n yOffset = yOffsetOrSpeed;\r\n speed = speedOrUndefined;\r\n }\r\n this._queue.add(new MoveBy(this._entity, xOffset, yOffset, speed));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will rotate an actor to the specified angle at the speed\r\n * specified (in radians per second) and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param angleRadians The angle to rotate to in radians\r\n * @param speed The angular velocity of the rotation specified in radians per second\r\n * @param rotationType The [[RotationType]] to use for this rotation\r\n */\r\n public rotateTo(angleRadians: number, speed: number, rotationType?: RotationType): ActionContext {\r\n this._queue.add(new RotateTo(this._entity, angleRadians, speed, rotationType));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will rotate an actor by the specified angle offset, from it's current rotation given a certain speed\r\n * in radians/sec and return back the actor. This method is part\r\n * of the actor 'Action' fluent API allowing action chaining.\r\n * @param angleRadiansOffset The angle to rotate to in radians relative to the current rotation\r\n * @param speed The speed in radians/sec the actor should rotate at\r\n * @param rotationType The [[RotationType]] to use for this rotation, default is shortest path\r\n */\r\n public rotateBy(angleRadiansOffset: number, speed: number, rotationType?: RotationType): ActionContext {\r\n this._queue.add(new RotateBy(this._entity, angleRadiansOffset, speed, rotationType));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will scale an actor to the specified size at the speed\r\n * specified (in magnitude increase per second) and return back the\r\n * actor. This method is part of the actor 'Action' fluent API allowing\r\n * action chaining.\r\n * @param size The scale to adjust the actor to over time\r\n * @param speed The speed of scaling specified in magnitude increase per second\r\n */\r\n public scaleTo(size: Vector, speed: Vector): ActionContext;\r\n /**\r\n * This method will scale an actor to the specified size at the speed\r\n * specified (in magnitude increase per second) and return back the\r\n * actor. This method is part of the actor 'Action' fluent API allowing\r\n * action chaining.\r\n * @param sizeX The scaling factor to apply on X axis\r\n * @param sizeY The scaling factor to apply on Y axis\r\n * @param speedX The speed of scaling specified in magnitude increase per second on X axis\r\n * @param speedY The speed of scaling specified in magnitude increase per second on Y axis\r\n */\r\n public scaleTo(sizeX: number, sizeY: number, speedX: number, speedY: number): ActionContext;\r\n public scaleTo(sizeXOrVector: number | Vector,\r\n sizeYOrSpeed: number | Vector,\r\n speedXOrUndefined?: number | undefined,\r\n speedYOrUndefined?: number | undefined): ActionContext {\r\n\r\n let sizeX = 1;\r\n let sizeY = 1;\r\n let speedX = 0;\r\n let speedY = 0;\r\n\r\n if (sizeXOrVector instanceof Vector && sizeYOrSpeed instanceof Vector) {\r\n sizeX = sizeXOrVector.x;\r\n sizeY = sizeXOrVector.y;\r\n\r\n speedX = sizeYOrSpeed.x;\r\n speedY = sizeYOrSpeed.y;\r\n }\r\n if (typeof sizeXOrVector === 'number' && typeof sizeYOrSpeed === 'number') {\r\n sizeX = sizeXOrVector;\r\n sizeY = sizeYOrSpeed;\r\n\r\n speedX = speedXOrUndefined;\r\n speedY = speedYOrUndefined;\r\n }\r\n\r\n this._queue.add(new ScaleTo(this._entity, sizeX, sizeY, speedX, speedY));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will scale an actor by an amount relative to the current scale at a certain speed in scale units/sec\r\n * and return back the actor. This method is part of the\r\n * actor 'Action' fluent API allowing action chaining.\r\n * @param offset The scaling factor to apply to the actor\r\n * @param speed The speed to scale at in scale units/sec\r\n */\r\n public scaleBy(offset: Vector, speed: number): ActionContext;\r\n /**\r\n * This method will scale an actor by an amount relative to the current scale at a certain speed in scale units/sec\r\n * and return back the actor. This method is part of the\r\n * actor 'Action' fluent API allowing action chaining.\r\n * @param sizeOffsetX The scaling factor to apply on X axis\r\n * @param sizeOffsetY The scaling factor to apply on Y axis\r\n * @param speed The speed to scale at in scale units/sec\r\n */\r\n public scaleBy(sizeOffsetX: number, sizeOffsetY: number, speed: number): ActionContext;\r\n public scaleBy(sizeOffsetXOrVector: number | Vector, sizeOffsetYOrSpeed: number, speed?: number | undefined): ActionContext {\r\n let sizeOffsetX = 1;\r\n let sizeOffsetY = 1;\r\n\r\n if (sizeOffsetXOrVector instanceof Vector) {\r\n sizeOffsetX = sizeOffsetXOrVector.x;\r\n sizeOffsetY = sizeOffsetXOrVector.y;\r\n\r\n speed = sizeOffsetYOrSpeed;\r\n }\r\n if (typeof sizeOffsetXOrVector === 'number' && typeof sizeOffsetYOrSpeed === 'number') {\r\n sizeOffsetX = sizeOffsetXOrVector;\r\n sizeOffsetY = sizeOffsetYOrSpeed;\r\n }\r\n\r\n this._queue.add(new ScaleBy(this._entity, sizeOffsetX, sizeOffsetY, speed));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will cause an actor to blink (become visible and not\r\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\r\n * the actor should be visible per blink, and the amount of time not visible.\r\n * This method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\r\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\r\n * @param numBlinks The number of times to blink\r\n */\r\n public blink(timeVisible: number, timeNotVisible: number, numBlinks: number = 1): ActionContext {\r\n this._queue.add(new Blink(this._entity, timeVisible, timeNotVisible, numBlinks));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will cause an actor's opacity to change from its current value\r\n * to the provided value by a specified time (in milliseconds). This method is\r\n * part of the actor 'Action' fluent API allowing action chaining.\r\n * @param opacity The ending opacity\r\n * @param time The time it should take to fade the actor (in milliseconds)\r\n */\r\n public fade(opacity: number, time: number): ActionContext {\r\n this._queue.add(new Fade(this._entity, opacity, time));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will delay the next action from executing for a certain\r\n * amount of time (in milliseconds). This method is part of the actor\r\n * 'Action' fluent API allowing action chaining.\r\n * @param time The amount of time to delay the next action in the queue from executing in milliseconds\r\n */\r\n public delay(time: number): ActionContext {\r\n this._queue.add(new Delay(time));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will add an action to the queue that will remove the actor from the\r\n * scene once it has completed its previous Any actions on the\r\n * action queue after this action will not be executed.\r\n */\r\n public die(): ActionContext {\r\n this._queue.add(new Die(this._entity));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method allows you to call an arbitrary method as the next action in the\r\n * action queue. This is useful if you want to execute code in after a specific\r\n * action, i.e An actor arrives at a destination after traversing a path\r\n */\r\n public callMethod(method: () => any): ActionContext {\r\n this._queue.add(new CallMethod(method));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will cause the actor to repeat all of the actions built in\r\n * the `repeatBuilder` callback. If the number of repeats\r\n * is not specified it will repeat forever. This method is part of\r\n * the actor 'Action' fluent API allowing action chaining\r\n *\r\n * ```typescript\r\n * // Move up in a zig-zag by repeated moveBy's\r\n * actor.actions.repeat(repeatCtx => {\r\n * repeatCtx.moveBy(10, 0, 10);\r\n * repeatCtx.moveBy(0, 10, 10);\r\n * }, 5);\r\n * ```\r\n *\r\n * @param repeatBuilder The builder to specify the repeatable list of actions\r\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\r\n * will repeat forever\r\n */\r\n public repeat(repeatBuilder: (repeatContext: ActionContext) => any, times?: number): ActionContext {\r\n if (!times) {\r\n this.repeatForever(repeatBuilder);\r\n return this;\r\n }\r\n this._queue.add(new Repeat(this._entity, repeatBuilder, times));\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will cause the actor to repeat all of the actions built in\r\n * the `repeatBuilder` callback. If the number of repeats\r\n * is not specified it will repeat forever. This method is part of\r\n * the actor 'Action' fluent API allowing action chaining\r\n *\r\n * ```typescript\r\n * // Move up in a zig-zag by repeated moveBy's\r\n * actor.actions.repeat(repeatCtx => {\r\n * repeatCtx.moveBy(10, 0, 10);\r\n * repeatCtx.moveBy(0, 10, 10);\r\n * }, 5);\r\n * ```\r\n *\r\n * @param repeatBuilder The builder to specify the repeatable list of actions\r\n */\r\n public repeatForever(repeatBuilder: (repeatContext: ActionContext) => any): ActionContext {\r\n this._queue.add(new RepeatForever(this._entity, repeatBuilder));\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will cause the entity to follow another at a specified distance\r\n * @param entity The entity to follow\r\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\r\n */\r\n public follow(entity: Entity, followDistance?: number): ActionContext {\r\n if (followDistance === undefined) {\r\n this._queue.add(new Follow(this._entity, entity));\r\n } else {\r\n this._queue.add(new Follow(this._entity, entity, followDistance));\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * This method will cause the entity to move towards another until they\r\n * collide \"meet\" at a specified speed.\r\n * @param entity The entity to meet\r\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\r\n */\r\n public meet(entity: Entity, speed?: number): ActionContext {\r\n if (speed === undefined) {\r\n this._queue.add(new Meet(this._entity, entity));\r\n } else {\r\n this._queue.add(new Meet(this._entity, entity, speed));\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the current action queue up to now\r\n * is finished.\r\n * @deprecated Use `toPromise()` will be removed in v0.26.0\r\n */\r\n public asPromise(): Promise<void> {\r\n return this.toPromise();\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the current action queue up to now\r\n * is finished.\r\n */\r\n public toPromise(): Promise<void> {\r\n const temp = new Promise<void>((resolve) => {\r\n this._queue.add(\r\n new CallMethod(() => {\r\n resolve();\r\n })\r\n );\r\n });\r\n return temp;\r\n }\r\n}\r\n","import { ActionContext } from './ActionContext';\r\nimport { Component } from '../EntityComponentSystem/Component';\r\nimport { Entity } from '../EntityComponentSystem/Entity';\r\nimport { Actor } from '../Actor';\r\nimport { MotionComponent } from '../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../EntityComponentSystem/Components/TransformComponent';\r\nimport { Vector } from '../Math/vector';\r\nimport { EasingFunction } from '../Util/EasingFunctions';\r\nimport { ActionQueue } from './ActionQueue';\r\nimport { RotationType } from './RotationType';\r\n\r\nexport interface ActionContextMethods extends Pick<ActionContext, keyof ActionContext> { };\r\n\r\nexport class ActionsComponent extends Component<'ex.actions'> implements ActionContextMethods {\r\n public readonly type = 'ex.actions';\r\n dependencies = [TransformComponent, MotionComponent]\r\n private _ctx: ActionContext;\r\n\r\n onAdd(entity: Entity) {\r\n this._ctx = new ActionContext(entity);\r\n }\r\n\r\n onRemove() {\r\n this._ctx = null;\r\n }\r\n\r\n /**\r\n * Returns the internal action queue\r\n * @returns action queu\r\n */\r\n public getQueue(): ActionQueue {\r\n return this._ctx?.getQueue();\r\n }\r\n\r\n /**\r\n * Updates the internal action context, performing action and moving through the internal queue\r\n * @param elapsedMs\r\n */\r\n public update(elapsedMs: number): void {\r\n return this._ctx?.update(elapsedMs);\r\n }\r\n\r\n /**\r\n * Clears all queued actions from the Actor\r\n */\r\n public clearActions(): void {\r\n this._ctx?.clearActions();\r\n }\r\n\r\n /**\r\n * This method will move an actor to the specified `x` and `y` position over the\r\n * specified duration using a given [[EasingFunctions]] and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param pos The x,y vector location to move the actor to\r\n * @param duration The time it should take the actor to move to the new location in milliseconds\r\n * @param easingFcn Use [[EasingFunctions]] or a custom function to use to calculate position, Default is [[EasingFunctions.Linear]]\r\n */\r\n public easeTo(pos: Vector, duration: number, easingFcn?: EasingFunction): ActionContext;\r\n /**\r\n * This method will move an actor to the specified `x` and `y` position over the\r\n * specified duration using a given [[EasingFunctions]] and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param x The x location to move the actor to\r\n * @param y The y location to move the actor to\r\n * @param duration The time it should take the actor to move to the new location in milliseconds\r\n * @param easingFcn Use [[EasingFunctions]] or a custom function to use to calculate position, Default is [[EasingFunctions.Linear]]\r\n */\r\n public easeTo(x: number, y: number, duration: number, easingFcn?: EasingFunction): ActionContext;\r\n public easeTo(...args: any[]): ActionContext {\r\n return this._ctx.easeTo.apply(this._ctx, args);\r\n }\r\n\r\n /**\r\n * This method will move an actor to the specified x and y position at the\r\n * speed specified (in pixels per second) and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param pos The x,y vector location to move the actor to\r\n * @param speed The speed in pixels per second to move\r\n */\r\n public moveTo(pos: Vector, speed: number): ActionContext;\r\n /**\r\n * This method will move an actor to the specified x and y position at the\r\n * speed specified (in pixels per second) and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param x The x location to move the actor to\r\n * @param y The y location to move the actor to\r\n * @param speed The speed in pixels per second to move\r\n */\r\n public moveTo(x: number, y: number, speed: number): ActionContext;\r\n public moveTo(xOrPos: number | Vector, yOrSpeed: number, speedOrUndefined?: number): ActionContext {\r\n return this._ctx.moveTo.apply(this._ctx, [xOrPos, yOrSpeed, speedOrUndefined]);\r\n }\r\n\r\n /**\r\n * This method will move an actor by the specified x offset and y offset from its current position, at a certain speed.\r\n * This method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param offset The (x, y) offset to apply to this actor\r\n * @param speed The speed in pixels per second the actor should move\r\n */\r\n public moveBy(offset: Vector, speed: number): ActionContext;\r\n /**\r\n * This method will move an actor by the specified x offset and y offset from its current position, at a certain speed.\r\n * This method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param xOffset The x offset to apply to this actor\r\n * @param yOffset The y location to move the actor to\r\n * @param speed The speed in pixels per second the actor should move\r\n */\r\n public moveBy(xOffset: number, yOffset: number, speed: number): ActionContext;\r\n public moveBy(xOffsetOrVector: number | Vector, yOffsetOrSpeed: number, speedOrUndefined?: number): ActionContext {\r\n return this._ctx.moveBy.apply(this._ctx, [xOffsetOrVector, yOffsetOrSpeed, speedOrUndefined]);\r\n }\r\n\r\n /**\r\n * This method will rotate an actor to the specified angle at the speed\r\n * specified (in radians per second) and return back the actor. This\r\n * method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param angleRadians The angle to rotate to in radians\r\n * @param speed The angular velocity of the rotation specified in radians per second\r\n * @param rotationType The [[RotationType]] to use for this rotation\r\n */\r\n public rotateTo(angleRadians: number, speed: number, rotationType?: RotationType): ActionContext {\r\n return this._ctx.rotateTo(angleRadians, speed, rotationType);\r\n }\r\n\r\n /**\r\n * This method will rotate an actor by the specified angle offset, from it's current rotation given a certain speed\r\n * in radians/sec and return back the actor. This method is part\r\n * of the actor 'Action' fluent API allowing action chaining.\r\n * @param angleRadiansOffset The angle to rotate to in radians relative to the current rotation\r\n * @param speed The speed in radians/sec the actor should rotate at\r\n * @param rotationType The [[RotationType]] to use for this rotation, default is shortest path\r\n */\r\n public rotateBy(angleRadiansOffset: number, speed: number, rotationType?: RotationType): ActionContext {\r\n return this._ctx.rotateBy(angleRadiansOffset, speed, rotationType);\r\n }\r\n\r\n /**\r\n * This method will scale an actor to the specified size at the speed\r\n * specified (in magnitude increase per second) and return back the\r\n * actor. This method is part of the actor 'Action' fluent API allowing\r\n * action chaining.\r\n * @param size The scale to adjust the actor to over time\r\n * @param speed The speed of scaling specified in magnitude increase per second\r\n */\r\n public scaleTo(size: Vector, speed: Vector): ActionContext;\r\n /**\r\n * This method will scale an actor to the specified size at the speed\r\n * specified (in magnitude increase per second) and return back the\r\n * actor. This method is part of the actor 'Action' fluent API allowing\r\n * action chaining.\r\n * @param sizeX The scaling factor to apply on X axis\r\n * @param sizeY The scaling factor to apply on Y axis\r\n * @param speedX The speed of scaling specified in magnitude increase per second on X axis\r\n * @param speedY The speed of scaling specified in magnitude increase per second on Y axis\r\n */\r\n public scaleTo(sizeX: number, sizeY: number, speedX: number, speedY: number): ActionContext;\r\n public scaleTo(\r\n sizeXOrVector: number | Vector,\r\n sizeYOrSpeed: number | Vector,\r\n speedXOrUndefined?: number,\r\n speedYOrUndefined?: number): ActionContext {\r\n return this._ctx.scaleTo.apply(this._ctx, [sizeXOrVector, sizeYOrSpeed, speedXOrUndefined, speedYOrUndefined]);\r\n }\r\n\r\n /**\r\n * This method will scale an actor by an amount relative to the current scale at a certain speed in scale units/sec\r\n * and return back the actor. This method is part of the\r\n * actor 'Action' fluent API allowing action chaining.\r\n * @param offset The scaling factor to apply to the actor\r\n * @param speed The speed to scale at in scale units/sec\r\n */\r\n public scaleBy(offset: Vector, speed: number): ActionContext;\r\n /**\r\n * This method will scale an actor by an amount relative to the current scale at a certain speed in scale units/sec\r\n * and return back the actor. This method is part of the\r\n * actor 'Action' fluent API allowing action chaining.\r\n * @param sizeOffsetX The scaling factor to apply on X axis\r\n * @param sizeOffsetY The scaling factor to apply on Y axis\r\n * @param speed The speed to scale at in scale units/sec\r\n */\r\n public scaleBy(sizeOffsetX: number, sizeOffsetY: number, speed: number): ActionContext;\r\n public scaleBy(sizeOffsetXOrVector: number | Vector, sizeOffsetYOrSpeed: number, speed?: number): ActionContext {\r\n return this._ctx.scaleBy.apply(this._ctx, [sizeOffsetXOrVector, sizeOffsetYOrSpeed, speed]);\r\n }\r\n\r\n /**\r\n * This method will cause an actor to blink (become visible and not\r\n * visible). Optionally, you may specify the number of blinks. Specify the amount of time\r\n * the actor should be visible per blink, and the amount of time not visible.\r\n * This method is part of the actor 'Action' fluent API allowing action chaining.\r\n * @param timeVisible The amount of time to stay visible per blink in milliseconds\r\n * @param timeNotVisible The amount of time to stay not visible per blink in milliseconds\r\n * @param numBlinks The number of times to blink\r\n */\r\n public blink(timeVisible: number, timeNotVisible: number, numBlinks?: number): ActionContext {\r\n return this._ctx.blink(timeVisible, timeNotVisible, numBlinks);\r\n }\r\n\r\n /**\r\n * This method will cause an actor's opacity to change from its current value\r\n * to the provided value by a specified time (in milliseconds). This method is\r\n * part of the actor 'Action' fluent API allowing action chaining.\r\n * @param opacity The ending opacity\r\n * @param time The time it should take to fade the actor (in milliseconds)\r\n */\r\n public fade(opacity: number, time: number): ActionContext {\r\n return this._ctx.fade(opacity, time);\r\n }\r\n\r\n /**\r\n * This method will delay the next action from executing for a certain\r\n * amount of time (in milliseconds). This method is part of the actor\r\n * 'Action' fluent API allowing action chaining.\r\n * @param time The amount of time to delay the next action in the queue from executing in milliseconds\r\n */\r\n public delay(time: number): ActionContext {\r\n return this._ctx.delay(time);\r\n }\r\n\r\n /**\r\n * This method will add an action to the queue that will remove the actor from the\r\n * scene once it has completed its previous Any actions on the\r\n * action queue after this action will not be executed.\r\n */\r\n public die(): ActionContext {\r\n return this._ctx.die();\r\n }\r\n\r\n /**\r\n * This method allows you to call an arbitrary method as the next action in the\r\n * action queue. This is useful if you want to execute code in after a specific\r\n * action, i.e An actor arrives at a destination after traversing a path\r\n */\r\n public callMethod(method: () => any): ActionContext {\r\n return this._ctx.callMethod(method);\r\n }\r\n\r\n /**\r\n * This method will cause the actor to repeat all of the actions built in\r\n * the `repeatBuilder` callback. If the number of repeats\r\n * is not specified it will repeat forever. This method is part of\r\n * the actor 'Action' fluent API allowing action chaining\r\n *\r\n * ```typescript\r\n * // Move up in a zig-zag by repeated moveBy's\r\n * actor.actions.repeat(repeatCtx => {\r\n * repeatCtx.moveBy(10, 0, 10);\r\n * repeatCtx.moveBy(0, 10, 10);\r\n * }, 5);\r\n * ```\r\n *\r\n * @param repeatBuilder The builder to specify the repeatable list of actions\r\n * @param times The number of times to repeat all the previous actions in the action queue. If nothing is specified the actions\r\n * will repeat forever\r\n */\r\n public repeat(repeatBuilder: (repeatContext: ActionContext) => any, times?: number): ActionContext {\r\n return this._ctx.repeat(repeatBuilder, times);\r\n }\r\n\r\n /**\r\n * This method will cause the actor to repeat all of the actions built in\r\n * the `repeatBuilder` callback. If the number of repeats\r\n * is not specified it will repeat forever. This method is part of\r\n * the actor 'Action' fluent API allowing action chaining\r\n *\r\n * ```typescript\r\n * // Move up in a zig-zag by repeated moveBy's\r\n * actor.actions.repeat(repeatCtx => {\r\n * repeatCtx.moveBy(10, 0, 10);\r\n * repeatCtx.moveBy(0, 10, 10);\r\n * }, 5);\r\n * ```\r\n *\r\n * @param repeatBuilder The builder to specify the repeatable list of actions\r\n */\r\n public repeatForever(repeatBuilder: (repeatContext: ActionContext) => any): ActionContext {\r\n return this._ctx.repeatForever(repeatBuilder);\r\n }\r\n\r\n /**\r\n * This method will cause the entity to follow another at a specified distance\r\n * @param entity The entity to follow\r\n * @param followDistance The distance to maintain when following, if not specified the actor will follow at the current distance.\r\n */\r\n public follow(entity: Actor, followDistance?: number): ActionContext {\r\n return this._ctx.follow(entity, followDistance);\r\n }\r\n\r\n /**\r\n * This method will cause the entity to move towards another until they\r\n * collide \"meet\" at a specified speed.\r\n * @param entity The entity to meet\r\n * @param speed The speed in pixels per second to move, if not specified it will match the speed of the other actor\r\n */\r\n public meet(entity: Actor, speed?: number): ActionContext {\r\n return this._ctx.meet(entity, speed);\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the current action queue up to now\r\n * is finished.\r\n * @deprecated Use `toPromise()` will be removed in v0.26.0\r\n */\r\n public asPromise(): Promise<void> {\r\n return this.toPromise();\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the current action queue up to now\r\n * is finished.\r\n */\r\n public toPromise(): Promise<void> {\r\n return this._ctx.toPromise();\r\n }\r\n}","import { Texture } from './Drawing/Texture';\r\nimport {\r\n InitializeEvent,\r\n KillEvent,\r\n PreUpdateEvent,\r\n PostUpdateEvent,\r\n PreDrawEvent,\r\n PostDrawEvent,\r\n PreDebugDrawEvent,\r\n PostDebugDrawEvent,\r\n PostCollisionEvent,\r\n PreCollisionEvent,\r\n CollisionStartEvent,\r\n CollisionEndEvent,\r\n PostKillEvent,\r\n PreKillEvent,\r\n GameEvent,\r\n ExitTriggerEvent,\r\n EnterTriggerEvent,\r\n EnterViewPortEvent,\r\n ExitViewPortEvent\r\n} from './Events';\r\nimport { PointerEvent, WheelEvent, PointerDragEvent, PointerEventName } from './Input/PointerEvents';\r\nimport { Engine } from './Engine';\r\nimport { Color } from './Color';\r\nimport { Sprite } from './Drawing/Sprite';\r\nimport { Animation } from './Drawing/Animation';\r\nimport { Trait } from './Interfaces/Trait';\r\nimport { Drawable } from './Interfaces/Drawable';\r\nimport { CanInitialize, CanUpdate, CanDraw, CanBeKilled } from './Interfaces/LifecycleEvents';\r\nimport { Scene } from './Scene';\r\nimport { Logger } from './Util/Log';\r\nimport { Vector, vec } from './Math/vector';\r\nimport { BodyComponent } from './Collision/BodyComponent';\r\nimport { Eventable } from './Interfaces/Evented';\r\nimport * as Traits from './Traits/Index';\r\nimport * as Events from './Events';\r\nimport { PointerEvents } from './Interfaces/PointerEventHandlers';\r\nimport { CollisionType } from './Collision/CollisionType';\r\n\r\nimport { Entity } from './EntityComponentSystem/Entity';\r\nimport { CanvasDrawComponent } from './Drawing/CanvasDrawComponent';\r\nimport { TransformComponent } from './EntityComponentSystem/Components/TransformComponent';\r\nimport { MotionComponent } from './EntityComponentSystem/Components/MotionComponent';\r\nimport { GraphicsComponent } from './Graphics/GraphicsComponent';\r\nimport { Rectangle } from './Graphics/Rectangle';\r\nimport { Flags, Legacy } from './Flags';\r\nimport { obsolete } from './Util/Decorators';\r\nimport { ColliderComponent } from './Collision/ColliderComponent';\r\nimport { Shape } from './Collision/Colliders/Shape';\r\nimport { watch } from './Util/Watch';\r\nimport { Collider, CollisionGroup } from './Collision/Index';\r\nimport { Circle } from './Graphics/Circle';\r\nimport { CapturePointerConfig } from './Input/CapturePointerConfig';\r\nimport { ActionsComponent } from './Actions/ActionsComponent';\r\n\r\n/**\r\n * Type guard for checking if something is an Actor\r\n * @param x\r\n */\r\nexport function isActor(x: any): x is Actor {\r\n return x instanceof Actor;\r\n}\r\n\r\n/**\r\n * Actor contructor options\r\n */\r\nexport interface ActorArgs {\r\n /**\r\n * Optionally set the name of the actor, default is 'anonymous'\r\n */\r\n name?: string;\r\n /**\r\n * Optionally set the x position of the actor, default is 0\r\n */\r\n x?: number;\r\n /**\r\n * Optionally set the y position of the actor, default is 0\r\n */\r\n y?: number;\r\n /**\r\n * Optionaly set the (x, y) position of the actor as a vector, default is (0, 0)\r\n */\r\n pos?: Vector;\r\n /**\r\n * Optionally set the width of a box collider for the actor\r\n */\r\n width?: number;\r\n /**\r\n * Optionally set the height of a box collider for the actor\r\n */\r\n height?: number;\r\n /**\r\n * Optionally set the radius of the circle collider for the actor\r\n */\r\n radius?: number;\r\n /**\r\n * Optionally set the velocity of the actor in pixels/sec\r\n */\r\n vel?: Vector;\r\n /**\r\n * Optionally set the acceleration of the actor in pixels/sec^2\r\n */\r\n acc?: Vector;\r\n /**\r\n * Optionally se the rotation in radians (180 degrees = Math.PI radians)\r\n */\r\n rotation?: number;\r\n /**\r\n * Optionally set the angular velocity of the actor in radians/sec (180 degrees = Math.PI radians)\r\n */\r\n angularVelocity?: number;\r\n /**\r\n * Optionally set the scale of the actor's transform\r\n */\r\n scale?: Vector;\r\n /**\r\n * Optionally set the z index of the actor, default is 0\r\n */\r\n z?: number;\r\n /**\r\n * Optionally set the color of an actor, only used if no graphics are present\r\n * If a width/height or a radius was set a default graphic will be added\r\n */\r\n color?: Color;\r\n /**\r\n * Optionally set the visibility of the actor\r\n */\r\n visible?: boolean;\r\n /**\r\n * Optionally set the anchor for graphics in the actor\r\n */\r\n anchor?: Vector;\r\n /**\r\n * Optionally set the collision type\r\n */\r\n collisionType?: CollisionType;\r\n /**\r\n * Optionally supply a collider for an actor, if supplied ignores any supplied width/height\r\n */\r\n collider?: Collider;\r\n /**\r\n * Optionally suppy a [[CollisionGroup]]\r\n */\r\n collisionGroup?: CollisionGroup;\r\n}\r\n\r\n/**\r\n * The most important primitive in Excalibur is an `Actor`. Anything that\r\n * can move on the screen, collide with another `Actor`, respond to events,\r\n * or interact with the current scene, must be an actor. An `Actor` **must**\r\n * be part of a [[Scene]] for it to be drawn to the screen.\r\n */\r\nexport class Actor extends Entity implements Eventable, PointerEvents, CanInitialize, CanUpdate, CanDraw, CanBeKilled {\r\n // #region Properties\r\n\r\n /**\r\n * Set defaults for all Actors\r\n */\r\n public static defaults = {\r\n anchor: Vector.Half\r\n };\r\n\r\n /**\r\n * The physics body the is associated with this actor. The body is the container for all physical properties, like position, velocity,\r\n * acceleration, mass, inertia, etc.\r\n */\r\n public get body(): BodyComponent {\r\n return this.get(BodyComponent);\r\n }\r\n\r\n /**\r\n * Access the Actor's built in [[TransformComponent]]\r\n */\r\n public get transform(): TransformComponent {\r\n return this.get(TransformComponent);\r\n }\r\n\r\n /**\r\n * Access the Actor's built in [[MotionComponent]]\r\n */\r\n public get motion(): MotionComponent {\r\n return this.get(MotionComponent);\r\n }\r\n\r\n /**\r\n * Access to the Actor's built in [[GraphicsComponent]]\r\n */\r\n public get graphics(): GraphicsComponent {\r\n return this.get(GraphicsComponent);\r\n }\r\n\r\n /**\r\n * Access to the Actor's built in [[ColliderComponent]]\r\n */\r\n public get collider(): ColliderComponent {\r\n return this.get(ColliderComponent);\r\n }\r\n\r\n /**\r\n * Useful for quickly scripting actor behavior, like moving to a place, patroling back and forth, blinking, etc.\r\n *\r\n * Access to the Actor's built in [[ActionsComponent]] which forwards to the\r\n * [[ActionContext|Action context]] of the actor.\r\n */\r\n public get actions(): ActionsComponent {\r\n return this.get(ActionsComponent);\r\n }\r\n\r\n /**\r\n * Gets the position vector of the actor in pixels\r\n */\r\n public get pos(): Vector {\r\n return this.transform.pos;\r\n }\r\n\r\n /**\r\n * Sets the position vector of the actor in pixels\r\n */\r\n public set pos(thePos: Vector) {\r\n this.transform.pos = thePos.clone();\r\n }\r\n\r\n /**\r\n * Gets the position vector of the actor from the last frame\r\n */\r\n public get oldPos(): Vector {\r\n return this.body.oldPos;\r\n }\r\n\r\n /**\r\n * Sets the position vector of the actor in the last frame\r\n */\r\n public set oldPos(thePos: Vector) {\r\n this.body.oldPos.setTo(thePos.x, thePos.y);\r\n }\r\n\r\n /**\r\n * Gets the velocity vector of the actor in pixels/sec\r\n */\r\n public get vel(): Vector {\r\n return this.motion.vel;\r\n }\r\n\r\n /**\r\n * Sets the velocity vector of the actor in pixels/sec\r\n */\r\n public set vel(theVel: Vector) {\r\n this.motion.vel = theVel.clone();\r\n }\r\n\r\n /**\r\n * Gets the velocity vector of the actor from the last frame\r\n */\r\n public get oldVel(): Vector {\r\n return this.body.oldVel;\r\n }\r\n\r\n /**\r\n * Sets the velocity vector of the actor from the last frame\r\n */\r\n public set oldVel(theVel: Vector) {\r\n this.body.oldVel.setTo(theVel.x, theVel.y);\r\n }\r\n\r\n /**\r\n * Gets the acceleration vector of the actor in pixels/second/second. An acceleration pointing down such as (0, 100) may be\r\n * useful to simulate a gravitational effect.\r\n */\r\n public get acc(): Vector {\r\n return this.motion.acc;\r\n }\r\n\r\n /**\r\n * Sets the acceleration vector of teh actor in pixels/second/second\r\n */\r\n public set acc(theAcc: Vector) {\r\n this.motion.acc = theAcc.clone();\r\n }\r\n\r\n /**\r\n * Sets the acceleration of the actor from the last frame. This does not include the global acc [[Physics.acc]].\r\n */\r\n public set oldAcc(theAcc: Vector) {\r\n this.body.oldAcc.setTo(theAcc.x, theAcc.y);\r\n }\r\n\r\n /**\r\n * Gets the acceleration of the actor from the last frame. This does not include the global acc [[Physics.acc]].\r\n */\r\n public get oldAcc(): Vector {\r\n return this.body.oldAcc;\r\n }\r\n\r\n /**\r\n * Gets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\r\n */\r\n public get rotation(): number {\r\n return this.transform.rotation;\r\n }\r\n\r\n /**\r\n * Sets the rotation of the actor in radians. 1 radian = 180/PI Degrees.\r\n */\r\n public set rotation(theAngle: number) {\r\n this.transform.rotation = theAngle;\r\n }\r\n\r\n /**\r\n * Gets the rotational velocity of the actor in radians/second\r\n */\r\n public get angularVelocity(): number {\r\n return this.motion.angularVelocity;\r\n }\r\n\r\n /**\r\n * Sets the rotational velocity of the actor in radians/sec\r\n */\r\n public set angularVelocity(angularVelocity: number) {\r\n this.motion.angularVelocity = angularVelocity;\r\n }\r\n\r\n public get scale(): Vector {\r\n return this.get(TransformComponent).scale;\r\n }\r\n\r\n public set scale(scale: Vector) {\r\n this.get(TransformComponent).scale = scale;\r\n }\r\n\r\n /**\r\n * The anchor to apply all actor related transformations like rotation,\r\n * translation, and scaling. By default the anchor is in the center of\r\n * the actor. By default it is set to the center of the actor (.5, .5)\r\n *\r\n * An anchor of (.5, .5) will ensure that drawings are centered.\r\n *\r\n * Use `anchor.setTo` to set the anchor to a different point using\r\n * values between 0 and 1. For example, anchoring to the top-left would be\r\n * `Actor.anchor.setTo(0, 0)` and top-right would be `Actor.anchor.setTo(0, 1)`.\r\n */\r\n private _anchor: Vector = watch(Vector.Half, (v) => this._handleAnchorChange(v));\r\n public get anchor(): Vector {\r\n return this._anchor;\r\n }\r\n\r\n public set anchor(vec: Vector) {\r\n this._anchor = watch(vec, (v) => this._handleAnchorChange(v));\r\n this._handleAnchorChange(vec);\r\n }\r\n\r\n private _handleAnchorChange(v: Vector) {\r\n if (this.graphics) {\r\n this.graphics.anchor = v;\r\n }\r\n }\r\n\r\n /**\r\n * Indicates whether the actor is physically in the viewport\r\n */\r\n public get isOffScreen(): boolean {\r\n return this.hasTag('offscreen');\r\n }\r\n /**\r\n * The visibility of an actor\r\n * @deprecated Use [[GraphicsComponent.visible|Actor.graphics.visible]], will be removed in v0.26.0\r\n */\r\n @obsolete({ message: 'Actor.visible will be removed in v0.26.0', alternateMethod: 'Use Actor.graphics.visible' })\r\n public get visible(): boolean {\r\n return this.graphics.visible;\r\n }\r\n\r\n public set visible(isVisible: boolean) {\r\n this.graphics.visible = isVisible;\r\n }\r\n\r\n /**\r\n * The opacity of an actor.\r\n *\r\n * @deprecated Actor.opacity will be removed in v0.26.0, use [[GraphicsComponent.opacity|Actor.graphics.opacity]].\r\n */\r\n @obsolete({\r\n message: 'Actor.opacity will be removed in v0.26.0',\r\n alternateMethod: 'Use Actor.graphics.opacity'\r\n })\r\n public get opacity(): number {\r\n return this.graphics.opacity;\r\n }\r\n\r\n public set opacity(opacity: number) {\r\n this.graphics.opacity = opacity;\r\n }\r\n\r\n /**\r\n * Convenience reference to the global logger\r\n */\r\n public logger: Logger = Logger.getInstance();\r\n\r\n /**\r\n * The scene that the actor is in\r\n */\r\n public scene: Scene = null;\r\n\r\n public frames: { [key: string]: Drawable } = {};\r\n\r\n /**\r\n * Access to the current drawing for the actor, this can be\r\n * an [[Animation]], [[Sprite]], or [[Polygon]].\r\n * Set drawings with [[setDrawing]].\r\n * @deprecated\r\n */\r\n public currentDrawing: Drawable = null;\r\n\r\n /**\r\n * Draggable helper\r\n */\r\n private _draggable: boolean = false;\r\n private _dragging: boolean = false;\r\n\r\n private _pointerDragStartHandler = () => {\r\n this._dragging = true;\r\n };\r\n\r\n private _pointerDragEndHandler = () => {\r\n this._dragging = false;\r\n };\r\n\r\n private _pointerDragMoveHandler = (pe: PointerEvent) => {\r\n if (this._dragging) {\r\n this.pos = pe.pointer.lastWorldPos;\r\n }\r\n };\r\n\r\n private _pointerDragLeaveHandler = (pe: PointerEvent) => {\r\n if (this._dragging) {\r\n this.pos = pe.pointer.lastWorldPos;\r\n }\r\n };\r\n\r\n public get draggable(): boolean {\r\n return this._draggable;\r\n }\r\n\r\n public set draggable(isDraggable: boolean) {\r\n if (isDraggable) {\r\n if (isDraggable && !this._draggable) {\r\n this.on('pointerdragstart', this._pointerDragStartHandler);\r\n this.on('pointerdragend', this._pointerDragEndHandler);\r\n this.on('pointerdragmove', this._pointerDragMoveHandler);\r\n this.on('pointerdragleave', this._pointerDragLeaveHandler);\r\n } else if (!isDraggable && this._draggable) {\r\n this.off('pointerdragstart', this._pointerDragStartHandler);\r\n this.off('pointerdragend', this._pointerDragEndHandler);\r\n this.off('pointerdragmove', this._pointerDragMoveHandler);\r\n this.off('pointerdragleave', this._pointerDragLeaveHandler);\r\n }\r\n\r\n this._draggable = isDraggable;\r\n }\r\n }\r\n\r\n /**\r\n * Modify the current actor update pipeline.\r\n */\r\n public traits: Trait[] = [];\r\n\r\n /**\r\n * Sets the color of the actor. A rectangle of this color will be\r\n * drawn if no [[Drawable]] is specified as the actors drawing.\r\n *\r\n * The default is `null` which prevents a rectangle from being drawn.\r\n */\r\n public get color(): Color {\r\n return this._color;\r\n }\r\n public set color(v: Color) {\r\n this._color = v.clone();\r\n }\r\n private _color: Color;\r\n\r\n /**\r\n * Whether or not to enable the [[Traits.CapturePointer]] trait that propagates\r\n * pointer events to this actor\r\n */\r\n public enableCapturePointer: boolean = false;\r\n\r\n /**\r\n * Configuration for [[Traits.CapturePointer]] trait\r\n */\r\n public capturePointer: CapturePointerConfig = {\r\n captureMoveEvents: false,\r\n captureDragEvents: false\r\n };\r\n\r\n // #endregion\r\n\r\n /**\r\n *\r\n * @param config\r\n */\r\n constructor(config?: ActorArgs) {\r\n super();\r\n\r\n const {\r\n name,\r\n x,\r\n y,\r\n pos,\r\n scale,\r\n width,\r\n height,\r\n radius,\r\n collider,\r\n vel,\r\n acc,\r\n rotation,\r\n angularVelocity,\r\n z,\r\n color,\r\n visible,\r\n anchor,\r\n collisionType,\r\n collisionGroup\r\n } = {\r\n ...config\r\n };\r\n\r\n this._setName(name);\r\n this.anchor = anchor ?? Actor.defaults.anchor.clone();\r\n\r\n this.addComponent(new TransformComponent());\r\n this.pos = pos ?? vec(x ?? 0, y ?? 0);\r\n this.rotation = rotation ?? 0;\r\n this.scale = scale ?? vec(1, 1);\r\n this.z = z ?? 0;\r\n\r\n this.addComponent(new GraphicsComponent());\r\n this.addComponent(new CanvasDrawComponent((ctx, delta) => this.draw(ctx, delta)));\r\n this.addComponent(new MotionComponent());\r\n this.vel = vel ?? Vector.Zero;\r\n this.acc = acc ?? Vector.Zero;\r\n this.angularVelocity = angularVelocity ?? 0;\r\n\r\n this.addComponent(new ActionsComponent());\r\n\r\n this.addComponent(new BodyComponent());\r\n this.body.collisionType = collisionType ?? CollisionType.Passive;\r\n if (collisionGroup) {\r\n this.body.group = collisionGroup;\r\n }\r\n\r\n if (collider) {\r\n this.addComponent(new ColliderComponent(collider));\r\n } else if (radius) {\r\n this.addComponent(new ColliderComponent(Shape.Circle(radius, this.anchor)));\r\n } else {\r\n if (width > 0 && height > 0) {\r\n this.addComponent(new ColliderComponent(Shape.Box(width, height, this.anchor)));\r\n } else {\r\n this.addComponent(new ColliderComponent()); // no collider\r\n }\r\n }\r\n\r\n this.graphics.visible = visible ?? true;\r\n\r\n if (color) {\r\n this.color = color;\r\n if (width && height) {\r\n this.graphics.add(\r\n new Rectangle({\r\n color: color,\r\n width,\r\n height\r\n })\r\n );\r\n } else if (radius) {\r\n this.graphics.add(\r\n new Circle({\r\n color: color,\r\n radius\r\n })\r\n );\r\n }\r\n }\r\n\r\n // Build default pipeline\r\n if (Flags.isEnabled(Legacy.LegacyDrawing)) {\r\n // TODO remove offscreen trait after legacy drawing removed\r\n this.traits.push(new Traits.OffscreenCulling());\r\n }\r\n this.traits.push(new Traits.CapturePointer());\r\n\r\n }\r\n\r\n /**\r\n * `onInitialize` is called before the first update of the actor. This method is meant to be\r\n * overridden. This is where initialization of child actors should take place.\r\n *\r\n * Synonymous with the event handler `.on('initialize', (evt) => {...})`\r\n */\r\n public onInitialize(_engine: Engine): void {\r\n // Override me\r\n }\r\n\r\n /**\r\n * Initializes this actor and all it's child actors, meant to be called by the Scene before first update not by users of Excalibur.\r\n *\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * @internal\r\n */\r\n public _initialize(engine: Engine) {\r\n super._initialize(engine);\r\n for (const child of this.children) {\r\n child._initialize(engine);\r\n }\r\n }\r\n\r\n // #region Events\r\n\r\n private _capturePointerEvents: PointerEventName[] = [\r\n 'pointerup',\r\n 'pointerdown',\r\n 'pointermove',\r\n 'pointerenter',\r\n 'pointerleave',\r\n 'pointerdragstart',\r\n 'pointerdragend',\r\n 'pointerdragmove',\r\n 'pointerdragenter',\r\n 'pointerdragleave'\r\n ];\r\n\r\n private _captureMoveEvents: PointerEventName[] = [\r\n 'pointermove',\r\n 'pointerenter',\r\n 'pointerleave',\r\n 'pointerdragmove',\r\n 'pointerdragenter',\r\n 'pointerdragleave'\r\n ];\r\n\r\n private _captureDragEvents: PointerEventName[] = [\r\n 'pointerdragstart',\r\n 'pointerdragend',\r\n 'pointerdragmove',\r\n 'pointerdragenter',\r\n 'pointerdragleave'\r\n ];\r\n\r\n private _checkForPointerOptIn(eventName: string) {\r\n if (eventName) {\r\n const normalized = <PointerEventName>eventName.toLowerCase();\r\n\r\n if (this._capturePointerEvents.indexOf(normalized) !== -1) {\r\n this.enableCapturePointer = true;\r\n\r\n if (this._captureMoveEvents.indexOf(normalized) !== -1) {\r\n this.capturePointer.captureMoveEvents = true;\r\n }\r\n\r\n if (this._captureDragEvents.indexOf(normalized) !== -1) {\r\n this.capturePointer.captureDragEvents = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public on(eventName: Events.exittrigger, handler: (event: ExitTriggerEvent) => void): void;\r\n public on(eventName: Events.entertrigger, handler: (event: EnterTriggerEvent) => void): void;\r\n /**\r\n * The **collisionstart** event is fired when a [[BodyComponent|physics body]], usually attached to an actor,\r\n * first starts colliding with another [[BodyComponent|body]], and will not fire again while in contact until\r\n * the the pair separates and collides again.\r\n * Use cases for the **collisionstart** event may be detecting when an actor has touched a surface\r\n * (like landing) or if a item has been touched and needs to be picked up.\r\n */\r\n public on(eventName: Events.collisionstart, handler: (event: CollisionStartEvent) => void): void;\r\n /**\r\n * The **collisionend** event is fired when two [[BodyComponent|physics bodies]] are no longer in contact.\r\n * This event will not fire again until another collision and separation.\r\n *\r\n * Use cases for the **collisionend** event might be to detect when an actor has left a surface\r\n * (like jumping) or has left an area.\r\n */\r\n public on(eventName: Events.collisionend, handler: (event: CollisionEndEvent) => void): void;\r\n /**\r\n * The **precollision** event is fired **every frame** where a collision pair is found and two\r\n * bodies are intersecting.\r\n *\r\n * This event is useful for building in custom collision resolution logic in Passive-Passive or\r\n * Active-Passive scenarios. For example in a breakout game you may want to tweak the angle of\r\n * ricochet of the ball depending on which side of the paddle you hit.\r\n */\r\n public on(eventName: Events.precollision, handler: (event: PreCollisionEvent) => void): void;\r\n /**\r\n * The **postcollision** event is fired for **every frame** where collision resolution was performed.\r\n * Collision resolution is when two bodies influence each other and cause a response like bouncing\r\n * off one another. It is only possible to have *postcollision* event in Active-Active and Active-Fixed\r\n * type collision pairs.\r\n *\r\n * Post collision would be useful if you need to know that collision resolution is happening or need to\r\n * tweak the default resolution.\r\n */\r\n public on(eventName: Events.postcollision, handler: (event: PostCollisionEvent) => void): void;\r\n public on(eventName: Events.kill, handler: (event: KillEvent) => void): void;\r\n public on(eventName: Events.prekill, handler: (event: PreKillEvent) => void): void;\r\n public on(eventName: Events.postkill, handler: (event: PostKillEvent) => void): void;\r\n public on(eventName: Events.initialize, handler: (event: InitializeEvent<Actor>) => void): void;\r\n public on(eventName: Events.preupdate, handler: (event: PreUpdateEvent<Actor>) => void): void;\r\n public on(eventName: Events.postupdate, handler: (event: PostUpdateEvent<Actor>) => void): void;\r\n public on(eventName: Events.predraw, handler: (event: PreDrawEvent) => void): void;\r\n public on(eventName: Events.postdraw, handler: (event: PostDrawEvent) => void): void;\r\n public on(eventName: Events.predebugdraw, handler: (event: PreDebugDrawEvent) => void): void;\r\n public on(eventName: Events.postdebugdraw, handler: (event: PostDebugDrawEvent) => void): void;\r\n public on(eventName: Events.pointerup, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.pointerdown, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.pointerenter, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.pointerleave, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.pointermove, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.pointercancel, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.pointerwheel, handler: (event: WheelEvent) => void): void;\r\n public on(eventName: Events.pointerdragstart, handler: (event: PointerDragEvent) => void): void;\r\n public on(eventName: Events.pointerdragend, handler: (event: PointerDragEvent) => void): void;\r\n public on(eventName: Events.pointerdragenter, handler: (event: PointerDragEvent) => void): void;\r\n public on(eventName: Events.pointerdragleave, handler: (event: PointerDragEvent) => void): void;\r\n public on(eventName: Events.pointerdragmove, handler: (event: PointerDragEvent) => void): void;\r\n public on(eventName: Events.enterviewport, handler: (event: EnterViewPortEvent) => void): void;\r\n public on(eventName: Events.exitviewport, handler: (event: ExitViewPortEvent) => void): void;\r\n public on(eventName: string, handler: (event: GameEvent<Actor>) => void): void;\r\n public on(eventName: string, handler: (event: any) => void): void {\r\n this._checkForPointerOptIn(eventName);\r\n super.on(eventName, handler);\r\n }\r\n\r\n public once(eventName: Events.exittrigger, handler: (event: ExitTriggerEvent) => void): void;\r\n public once(eventName: Events.entertrigger, handler: (event: EnterTriggerEvent) => void): void;\r\n /**\r\n * The **collisionstart** event is fired when a [[BodyComponent|physics body]], usually attached to an actor,\r\n * first starts colliding with another [[BodyComponent|body]], and will not fire again while in contact until\r\n * the the pair separates and collides again.\r\n * Use cases for the **collisionstart** event may be detecting when an actor has touch a surface\r\n * (like landing) or if a item has been touched and needs to be picked up.\r\n */\r\n public once(eventName: Events.collisionstart, handler: (event: CollisionStartEvent) => void): void;\r\n /**\r\n * The **collisionend** event is fired when two [[BodyComponent|physics bodies]] are no longer in contact.\r\n * This event will not fire again until another collision and separation.\r\n *\r\n * Use cases for the **collisionend** event might be to detect when an actor has left a surface\r\n * (like jumping) or has left an area.\r\n */\r\n public once(eventName: Events.collisionend, handler: (event: CollisionEndEvent) => void): void;\r\n /**\r\n * The **precollision** event is fired **every frame** where a collision pair is found and two\r\n * bodies are intersecting.\r\n *\r\n * This event is useful for building in custom collision resolution logic in Passive-Passive or\r\n * Active-Passive scenarios. For example in a breakout game you may want to tweak the angle of\r\n * ricochet of the ball depending on which side of the paddle you hit.\r\n */\r\n public once(eventName: Events.precollision, handler: (event: PreCollisionEvent) => void): void;\r\n /**\r\n * The **postcollision** event is fired for **every frame** where collision resolution was performed.\r\n * Collision resolution is when two bodies influence each other and cause a response like bouncing\r\n * off one another. It is only possible to have *postcollision* event in Active-Active and Active-Fixed\r\n * type collision pairs.\r\n *\r\n * Post collision would be useful if you need to know that collision resolution is happening or need to\r\n * tweak the default resolution.\r\n */\r\n public once(eventName: Events.postcollision, handler: (event: PostCollisionEvent) => void): void;\r\n public once(eventName: Events.kill, handler: (event: KillEvent) => void): void;\r\n public once(eventName: Events.postkill, handler: (event: PostKillEvent) => void): void;\r\n public once(eventName: Events.prekill, handler: (event: PreKillEvent) => void): void;\r\n public once(eventName: Events.initialize, handler: (event: InitializeEvent<Actor>) => void): void;\r\n public once(eventName: Events.preupdate, handler: (event: PreUpdateEvent<Actor>) => void): void;\r\n public once(eventName: Events.postupdate, handler: (event: PostUpdateEvent<Actor>) => void): void;\r\n public once(eventName: Events.predraw, handler: (event: PreDrawEvent) => void): void;\r\n public once(eventName: Events.postdraw, handler: (event: PostDrawEvent) => void): void;\r\n public once(eventName: Events.predebugdraw, handler: (event: PreDebugDrawEvent) => void): void;\r\n public once(eventName: Events.postdebugdraw, handler: (event: PostDebugDrawEvent) => void): void;\r\n public once(eventName: Events.pointerup, handler: (event: PointerEvent) => void): void;\r\n public once(eventName: Events.pointerdown, handler: (event: PointerEvent) => void): void;\r\n public once(eventName: Events.pointerenter, handler: (event: PointerEvent) => void): void;\r\n public once(eventName: Events.pointerleave, handler: (event: PointerEvent) => void): void;\r\n public once(eventName: Events.pointermove, handler: (event: PointerEvent) => void): void;\r\n public once(eventName: Events.pointercancel, handler: (event: PointerEvent) => void): void;\r\n public once(eventName: Events.pointerwheel, handler: (event: WheelEvent) => void): void;\r\n public once(eventName: Events.pointerdragstart, handler: (event: PointerDragEvent) => void): void;\r\n public once(eventName: Events.pointerdragend, handler: (event: PointerDragEvent) => void): void;\r\n public once(eventName: Events.pointerdragenter, handler: (event: PointerDragEvent) => void): void;\r\n public once(eventName: Events.pointerdragleave, handler: (event: PointerDragEvent) => void): void;\r\n public once(eventName: Events.pointerdragmove, handler: (event: PointerDragEvent) => void): void;\r\n public once(eventName: Events.enterviewport, handler: (event: EnterViewPortEvent) => void): void;\r\n public once(eventName: Events.exitviewport, handler: (event: ExitViewPortEvent) => void): void;\r\n public once(eventName: string, handler: (event: GameEvent<Actor>) => void): void;\r\n public once(eventName: string, handler: (event: any) => void): void {\r\n this._checkForPointerOptIn(eventName);\r\n super.once(eventName, handler);\r\n }\r\n\r\n public off(eventName: Events.exittrigger, handler?: (event: ExitTriggerEvent) => void): void;\r\n public off(eventName: Events.entertrigger, handler?: (event: EnterTriggerEvent) => void): void;\r\n /**\r\n * The **collisionstart** event is fired when a [[BodyComponent|physics body]], usually attached to an actor,\r\n * first starts colliding with another [[BodyComponent|body]], and will not fire again while in contact until\r\n * the the pair separates and collides again.\r\n * Use cases for the **collisionstart** event may be detecting when an actor has touch a surface\r\n * (like landing) or if a item has been touched and needs to be picked up.\r\n */\r\n public off(eventName: Events.collisionstart, handler?: (event: CollisionStartEvent) => void): void;\r\n /**\r\n * The **collisionend** event is fired when two [[BodyComponent|physics bodies]] are no longer in contact.\r\n * This event will not fire again until another collision and separation.\r\n *\r\n * Use cases for the **collisionend** event might be to detect when an actor has left a surface\r\n * (like jumping) or has left an area.\r\n */\r\n public off(eventName: Events.collisionend, handler?: (event: CollisionEndEvent) => void): void;\r\n /**\r\n * The **precollision** event is fired **every frame** where a collision pair is found and two\r\n * bodies are intersecting.\r\n *\r\n * This event is useful for building in custom collision resolution logic in Passive-Passive or\r\n * Active-Passive scenarios. For example in a breakout game you may want to tweak the angle of\r\n * ricochet of the ball depending on which side of the paddle you hit.\r\n */\r\n public off(eventName: Events.precollision, handler?: (event: PreCollisionEvent) => void): void;\r\n /**\r\n * The **postcollision** event is fired for **every frame** where collision resolution was performed.\r\n * Collision resolution is when two bodies influence each other and cause a response like bouncing\r\n * off one another. It is only possible to have *postcollision* event in Active-Active and Active-Fixed\r\n * type collision pairs.\r\n *\r\n * Post collision would be useful if you need to know that collision resolution is happening or need to\r\n * tweak the default resolution.\r\n */\r\n public off(eventName: Events.postcollision, handler: (event: PostCollisionEvent) => void): void;\r\n public off(eventName: Events.pointerup, handler?: (event: PointerEvent) => void): void;\r\n public off(eventName: Events.pointerdown, handler?: (event: PointerEvent) => void): void;\r\n public off(eventName: Events.pointerenter, handler?: (event: PointerEvent) => void): void;\r\n public off(eventName: Events.pointerleave, handler?: (event: PointerEvent) => void): void;\r\n public off(eventName: Events.pointermove, handler?: (event: PointerEvent) => void): void;\r\n public off(eventName: Events.pointercancel, handler?: (event: PointerEvent) => void): void;\r\n public off(eventName: Events.pointerwheel, handler?: (event: WheelEvent) => void): void;\r\n public off(eventName: Events.pointerdragstart, handler?: (event: PointerDragEvent) => void): void;\r\n public off(eventName: Events.pointerdragend, handler?: (event: PointerDragEvent) => void): void;\r\n public off(eventName: Events.pointerdragenter, handler?: (event: PointerDragEvent) => void): void;\r\n public off(eventName: Events.pointerdragleave, handler?: (event: PointerDragEvent) => void): void;\r\n public off(eventName: Events.pointerdragmove, handler?: (event: PointerDragEvent) => void): void;\r\n public off(eventName: Events.prekill, handler?: (event: PreKillEvent) => void): void;\r\n public off(eventName: Events.postkill, handler?: (event: PostKillEvent) => void): void;\r\n public off(eventName: Events.initialize, handler?: (event: Events.InitializeEvent<Actor>) => void): void;\r\n public off(eventName: Events.postupdate, handler?: (event: Events.PostUpdateEvent<Actor>) => void): void;\r\n public off(eventName: Events.preupdate, handler?: (event: Events.PreUpdateEvent<Actor>) => void): void;\r\n public off(eventName: Events.postdraw, handler?: (event: Events.PostDrawEvent) => void): void;\r\n public off(eventName: Events.predraw, handler?: (event: Events.PreDrawEvent) => void): void;\r\n public off(eventName: Events.enterviewport, handler?: (event: EnterViewPortEvent) => void): void;\r\n public off(eventName: Events.exitviewport, handler?: (event: ExitViewPortEvent) => void): void;\r\n public off(eventName: string, handler?: (event: GameEvent<Actor>) => void): void;\r\n public off(eventName: string, handler?: (event: any) => void): void {\r\n super.off(eventName, handler);\r\n }\r\n\r\n // #endregion\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _prekill handler for [[onPreKill]] lifecycle event\r\n * @internal\r\n */\r\n public _prekill(_scene: Scene) {\r\n super.emit('prekill', new PreKillEvent(this));\r\n this.onPreKill(_scene);\r\n }\r\n\r\n /**\r\n * Safe to override onPreKill lifecycle event handler. Synonymous with `.on('prekill', (evt) =>{...})`\r\n *\r\n * `onPreKill` is called directly before an actor is killed and removed from its current [[Scene]].\r\n */\r\n public onPreKill(_scene: Scene) {\r\n // Override me\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _prekill handler for [[onPostKill]] lifecycle event\r\n * @internal\r\n */\r\n public _postkill(_scene: Scene) {\r\n super.emit('postkill', new PostKillEvent(this));\r\n this.onPostKill(_scene);\r\n }\r\n\r\n /**\r\n * Safe to override onPostKill lifecycle event handler. Synonymous with `.on('postkill', (evt) => {...})`\r\n *\r\n * `onPostKill` is called directly after an actor is killed and remove from its current [[Scene]].\r\n */\r\n public onPostKill(_scene: Scene) {\r\n // Override me\r\n }\r\n\r\n /**\r\n * If the current actor is a member of the scene, this will remove\r\n * it from the scene graph. It will no longer be drawn or updated.\r\n */\r\n public kill() {\r\n if (this.scene) {\r\n this._prekill(this.scene);\r\n this.emit('kill', new KillEvent(this));\r\n super.kill();\r\n this._postkill(this.scene);\r\n } else {\r\n this.logger.warn('Cannot kill actor, it was never added to the Scene');\r\n }\r\n }\r\n\r\n /**\r\n * If the current actor is killed, it will now not be killed.\r\n */\r\n public unkill() {\r\n this.active = true;\r\n }\r\n\r\n /**\r\n * Indicates wether the actor has been killed.\r\n */\r\n public isKilled(): boolean {\r\n return !this.active;\r\n }\r\n\r\n /**\r\n * Sets the current drawing of the actor to the drawing corresponding to\r\n * the key.\r\n * @param key The key of the drawing\r\n * @deprecated Use [[GraphicsComponent.show|Actor.graphics.show]] or [[GraphicsComponent.use|Actor.graphics.use]]\r\n */\r\n public setDrawing(key: string): void;\r\n /**\r\n * Sets the current drawing of the actor to the drawing corresponding to\r\n * an `enum` key (e.g. `Animations.Left`)\r\n * @param key The `enum` key of the drawing\r\n * @deprecated Use [[GraphicsComponent.show|Actor.graphics.show]] or [[GraphicsComponent.use|Actor.graphics.use]]\r\n */\r\n public setDrawing(key: number): void;\r\n @obsolete({\r\n message: 'Actor.setDrawing will be removed in v0.26.0',\r\n alternateMethod: 'Use Actor.graphics.show() or Actor.graphics.use()'\r\n })\r\n public setDrawing(key: any): void {\r\n key = key.toString();\r\n if (this.currentDrawing !== this.frames[<string>key]) {\r\n if (this.frames[key] != null) {\r\n this.frames[key].reset();\r\n this.currentDrawing = this.frames[key];\r\n } else {\r\n Logger.getInstance().error(`the specified drawing key ${key} does not exist`);\r\n }\r\n }\r\n if (this.currentDrawing && this.currentDrawing instanceof Animation) {\r\n this.currentDrawing.tick(0);\r\n }\r\n }\r\n\r\n /**\r\n * Adds a whole texture as the \"default\" drawing. Set a drawing using [[setDrawing]].\r\n * @deprecated Use [[GraphicsComponent.add|Actor.graphics.add]]\r\n */\r\n public addDrawing(texture: Texture): void;\r\n /**\r\n * Adds a whole sprite as the \"default\" drawing. Set a drawing using [[setDrawing]].\r\n * @deprecated Use [[GraphicsComponent.add|Actor.graphics.add]]\r\n */\r\n public addDrawing(sprite: Sprite): void;\r\n /**\r\n * Adds a drawing to the list of available drawings for an actor. Set a drawing using [[setDrawing]].\r\n * @param key The key to associate with a drawing for this actor\r\n * @param drawing This can be an [[Animation]], [[Sprite]], or [[Polygon]].\r\n * @deprecated Use [[GraphicsComponent.add|Actor.graphics.add]]\r\n */\r\n public addDrawing(key: any, drawing: Drawable): void;\r\n @obsolete({\r\n message: 'Actor.addDrawing will be removed in v0.26.0',\r\n alternateMethod: 'Use Actor.graphics.add()'\r\n })\r\n public addDrawing(): void {\r\n if (arguments.length === 2) {\r\n this.frames[<string>arguments[0]] = arguments[1];\r\n if (!this.currentDrawing) {\r\n this.currentDrawing = arguments[1];\r\n }\r\n } else {\r\n if (arguments[0] instanceof Sprite) {\r\n this.addDrawing('default', arguments[0]);\r\n }\r\n if (arguments[0] instanceof Texture) {\r\n this.addDrawing('default', arguments[0].asSprite());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the z-index of an actor. The z-index determines the relative order an actor is drawn in.\r\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\r\n */\r\n public get z(): number {\r\n return this.get(TransformComponent).z;\r\n }\r\n\r\n /**\r\n * @deprecated Use [[Actor.z]]\r\n */\r\n @obsolete({\r\n message: 'Actor.getZIndex will be removed in v0.26.0',\r\n alternateMethod: 'Use Actor.transform.z or Actor.z'\r\n })\r\n public getZIndex(): number {\r\n return this.get(TransformComponent).z;\r\n }\r\n\r\n /**\r\n * Sets the z-index of an actor and updates it in the drawing list for the scene.\r\n * The z-index determines the relative order an actor is drawn in.\r\n * Actors with a higher z-index are drawn on top of actors with a lower z-index\r\n * @param newZ new z-index to assign\r\n */\r\n public set z(newZ: number) {\r\n this.get(TransformComponent).z = newZ;\r\n }\r\n\r\n /**\r\n * @param newIndex new z-index to assign\r\n * @deprecated Use [[Actor.z]]\r\n */\r\n @obsolete({\r\n message: 'Actor.setZIndex will be removed in v0.26.0',\r\n alternateMethod: 'Use Actor.transform.z or Actor.z'\r\n })\r\n public setZIndex(newIndex: number) {\r\n this.get(TransformComponent).z = newIndex;\r\n }\r\n\r\n /**\r\n * Get the center point of an actor\r\n */\r\n public get center(): Vector {\r\n return new Vector(this.pos.x + this.width / 2 - this.anchor.x * this.width, this.pos.y + this.height / 2 - this.anchor.y * this.height);\r\n }\r\n\r\n public get width() {\r\n return this.collider.localBounds.width * this.getGlobalScale().x;\r\n }\r\n\r\n public get height() {\r\n return this.collider.localBounds.height * this.getGlobalScale().y;\r\n }\r\n\r\n /**\r\n * Gets this actor's rotation taking into account any parent relationships\r\n *\r\n * @returns Rotation angle in radians\r\n */\r\n public getGlobalRotation(): number {\r\n return this.get(TransformComponent).globalRotation;\r\n }\r\n\r\n /**\r\n * Gets an actor's world position taking into account parent relationships, scaling, rotation, and translation\r\n *\r\n * @returns Position in world coordinates\r\n */\r\n public getGlobalPos(): Vector {\r\n return this.get(TransformComponent).globalPos;\r\n }\r\n\r\n /**\r\n * Gets the global scale of the Actor\r\n */\r\n public getGlobalScale(): Vector {\r\n return this.get(TransformComponent).globalScale;\r\n }\r\n\r\n // #region Collision\r\n\r\n /**\r\n * Tests whether the x/y specified are contained in the actor\r\n * @param x X coordinate to test (in world coordinates)\r\n * @param y Y coordinate to test (in world coordinates)\r\n * @param recurse checks whether the x/y are contained in any child actors (if they exist).\r\n */\r\n public contains(x: number, y: number, recurse: boolean = false): boolean {\r\n const point = vec(x, y);\r\n const collider = this.get(ColliderComponent);\r\n collider.update();\r\n const geom = collider.get();\r\n if (!geom) {\r\n return false;\r\n }\r\n const containment = geom.contains(point);\r\n\r\n if (recurse) {\r\n return (\r\n containment ||\r\n this.children.some((child: Actor) => {\r\n return child.contains(x, y, true);\r\n })\r\n );\r\n }\r\n\r\n return containment;\r\n }\r\n\r\n /**\r\n * Returns true if the two actor.collider's surfaces are less than or equal to the distance specified from each other\r\n * @param actor Actor to test\r\n * @param distance Distance in pixels to test\r\n */\r\n public within(actor: Actor, distance: number): boolean {\r\n const collider = this.get(ColliderComponent);\r\n const otherCollider = actor.get(ColliderComponent);\r\n const me = collider.get();\r\n const other = otherCollider.get();\r\n if (me && other) {\r\n return me.getClosestLineBetween(other).getLength() <= distance;\r\n }\r\n return false;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Update\r\n\r\n /**\r\n * Called by the Engine, updates the state of the actor\r\n * @internal\r\n * @param engine The reference to the current game engine\r\n * @param delta The time elapsed since the last update in milliseconds\r\n */\r\n public update(engine: Engine, delta: number) {\r\n this._initialize(engine);\r\n this._preupdate(engine, delta);\r\n\r\n // Tick animations\r\n const drawing = this.currentDrawing;\r\n if (drawing && drawing instanceof Animation) {\r\n drawing.tick(delta, engine.stats.currFrame.id);\r\n }\r\n\r\n // Update actor pipeline (movement, collision detection, event propagation, offscreen culling)\r\n for (const trait of this.traits) {\r\n trait.update(this, engine, delta);\r\n }\r\n\r\n this._postupdate(engine, delta);\r\n }\r\n\r\n /**\r\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPreUpdate` is called directly before an actor is updated.\r\n */\r\n public onPreUpdate(_engine: Engine, _delta: number): void {\r\n // Override me\r\n }\r\n\r\n /**\r\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('postupdate', (evt) =>{...})`\r\n *\r\n * `onPostUpdate` is called directly after an actor is updated.\r\n */\r\n public onPostUpdate(_engine: Engine, _delta: number): void {\r\n // Override me\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _preupdate handler for [[onPreUpdate]] lifecycle event\r\n * @internal\r\n */\r\n public _preupdate(engine: Engine, delta: number): void {\r\n this.emit('preupdate', new PreUpdateEvent(engine, delta, this));\r\n this.onPreUpdate(engine, delta);\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _preupdate handler for [[onPostUpdate]] lifecycle event\r\n * @internal\r\n */\r\n public _postupdate(engine: Engine, delta: number): void {\r\n this.emit('postupdate', new PreUpdateEvent(engine, delta, this));\r\n this.onPostUpdate(engine, delta);\r\n }\r\n\r\n // endregion\r\n\r\n // #region Drawing\r\n /**\r\n * Called by the Engine, draws the actor to the screen\r\n * @param ctx The rendering context\r\n * @param delta The time since the last draw in milliseconds\r\n *\r\n * **Warning** only works with Flags.useLegacyDrawing() enabled\r\n * @deprecated Use Actor.graphics, will be removed in v0.26.0\r\n */\r\n public draw(ctx: CanvasRenderingContext2D, delta: number) {\r\n // translate canvas by anchor offset\r\n ctx.save();\r\n\r\n if (this.currentDrawing) {\r\n ctx.translate(-(this.width * this.anchor.x), -(this.height * this.anchor.y));\r\n\r\n this._predraw(ctx, delta);\r\n const drawing = this.currentDrawing;\r\n // See https://github.com/excaliburjs/Excalibur/pull/619 for discussion on this formula\r\n const offsetX = (this.width - drawing.width * drawing.scale.x) * this.anchor.x;\r\n const offsetY = (this.height - drawing.height * drawing.scale.y) * this.anchor.y;\r\n\r\n this.currentDrawing.draw({ ctx, x: offsetX, y: offsetY, opacity: this.graphics.opacity });\r\n } else {\r\n this._predraw(ctx, delta);\r\n if (this.color && this.collider) {\r\n // update collider geometry based on transform\r\n const collider = this.get(ColliderComponent);\r\n collider.update();\r\n if (collider && !collider.bounds.hasZeroDimensions()) {\r\n // Colliders are already shifted by anchor, unshift\r\n ctx.globalAlpha = this.graphics.opacity;\r\n collider.get()?.draw(ctx, this.color, vec(0, 0));\r\n }\r\n }\r\n }\r\n ctx.restore();\r\n this._postdraw(ctx, delta);\r\n }\r\n\r\n /**\r\n * Safe to override onPreDraw lifecycle event handler. Synonymous with `.on('predraw', (evt) =>{...})`\r\n *\r\n * `onPreDraw` is called directly before an actor is drawn, but after local transforms are made.\r\n *\r\n * **Warning** only works with Flags.useLegacyDrawing() enabled\r\n * @deprecated Use Actor.graphics.onPostDraw, will be removed in v0.26.0\r\n */\r\n public onPreDraw(_ctx: CanvasRenderingContext2D, _delta: number): void {\r\n // Override me\r\n }\r\n\r\n /**\r\n * Safe to override onPostDraw lifecycle event handler. Synonymous with `.on('postdraw', (evt) =>{...})`\r\n *\r\n * `onPostDraw` is called directly after an actor is drawn, and before local transforms are removed.\r\n *\r\n * **Warning** only works with Flags.useLegacyDrawing() enabled\r\n * @deprecated Use Actor.graphics.onPostDraw, will be removed in v0.26.0\r\n */\r\n public onPostDraw(_ctx: CanvasRenderingContext2D, _delta: number): void {\r\n // Override me\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _predraw handler for [[onPreDraw]] lifecycle event\r\n *\r\n * **Warning** only works with Flags.useLegacyDrawing() enabled\r\n * @deprecated Use Actor.graphics.onPreDraw, will be removed in v0.26.0\r\n * @internal\r\n */\r\n public _predraw(ctx: CanvasRenderingContext2D, delta: number): void {\r\n this.emit('predraw', new PreDrawEvent(ctx, delta, this));\r\n this.onPreDraw(ctx, delta);\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _postdraw handler for [[onPostDraw]] lifecycle event\r\n *\r\n * **Warning** only works with Flags.useLegacyDrawing() enabled\r\n * @deprecated Use Actor.graphics.onPostDraw, will be removed in v0.26.0\r\n * @internal\r\n */\r\n public _postdraw(ctx: CanvasRenderingContext2D, delta: number): void {\r\n this.emit('postdraw', new PreDrawEvent(ctx, delta, this));\r\n this.onPostDraw(ctx, delta);\r\n }\r\n\r\n /**\r\n * Called by the Engine, draws the actors debugging to the screen\r\n * @param ctx The rendering context\r\n *\r\n *\r\n * **Warning** only works with Flags.useLegacyDrawing() enabled\r\n * @deprecated Use Actor.graphics.onPostDraw, will be removed in v0.26.0\r\n * @internal\r\n */\r\n /* istanbul ignore next */\r\n public debugDraw(_ctx: CanvasRenderingContext2D) {\r\n // pass\r\n }\r\n // #endregion\r\n}\r\n","import { Vector, vec } from './Math/vector';\r\nimport { Engine } from './Engine';\r\nimport { Actor, ActorArgs } from './Actor';\r\nimport * as Traits from './Traits/Index';\r\nimport { CoordPlane, TransformComponent } from './EntityComponentSystem/Components/TransformComponent';\r\nimport { CollisionType } from './Collision/CollisionType';\r\n\r\n/**\r\n * Helper [[Actor]] primitive for drawing UI's, optimized for UI drawing. Does\r\n * not participate in collisions. Drawn on top of all other actors.\r\n */\r\nexport class ScreenElement extends Actor {\r\n protected _engine: Engine;\r\n\r\n constructor();\r\n constructor(config?: ActorArgs);\r\n\r\n constructor(config?: ActorArgs) {\r\n super({ ...config });\r\n this.get(TransformComponent).coordPlane = CoordPlane.Screen;\r\n this.traits = [];\r\n this.traits.push(new Traits.CapturePointer());\r\n this.anchor = vec(0, 0);\r\n this.body.collisionType = CollisionType.PreventCollision;\r\n this.collider.useBoxCollider(this.width, this.height, this.anchor);\r\n this.enableCapturePointer = true;\r\n }\r\n\r\n public _initialize(engine: Engine) {\r\n this._engine = engine;\r\n super._initialize(engine);\r\n }\r\n\r\n public contains(x: number, y: number, useWorld: boolean = true) {\r\n if (useWorld) {\r\n return super.contains(x, y);\r\n }\r\n\r\n const coords = this._engine.worldToScreenCoordinates(new Vector(x, y));\r\n return super.contains(coords.x, coords.y);\r\n }\r\n}\r\n","import { Scene } from './Scene';\r\nimport { obsolete } from './Util/Decorators';\r\nimport { Logger } from './Util/Log';\r\n\r\nexport interface TimerOptions {\r\n repeats?: boolean;\r\n numberOfRepeats?: number;\r\n fcn?: () => void;\r\n interval: number;\r\n}\r\n\r\n/**\r\n * The Excalibur timer hooks into the internal timer and fires callbacks,\r\n * after a certain interval, optionally repeating.\r\n */\r\nexport class Timer {\r\n private _logger = Logger.getInstance();\r\n private static _MAX_ID: number = 0;\r\n public id: number = 0;\r\n\r\n private _elapsedTime: number = 0;\r\n private _totalTimeAlive: number = 0;\r\n\r\n private _running = false;\r\n\r\n private _numberOfTicks: number = 0;\r\n private _callbacks: Array<() => void>;\r\n\r\n public interval: number = 10;\r\n public repeats: boolean = false;\r\n public maxNumberOfRepeats: number = -1;\r\n\r\n private _complete = false;\r\n public get complete() {\r\n return this._complete;\r\n }\r\n public scene: Scene = null;\r\n\r\n /**\r\n * @param options Options - repeats, numberOfRepeats, fcn, interval\r\n * @param repeats Indicates whether this call back should be fired only once, or repeat after every interval as completed.\r\n * @param numberOfRepeats Specifies a maximum number of times that this timer will execute.\r\n * @param fcn The callback to be fired after the interval is complete.\r\n */\r\n constructor(options: TimerOptions);\r\n constructor(fcn: TimerOptions | (() => void), interval?: number, repeats?: boolean, numberOfRepeats?: number) {\r\n if (typeof fcn !== 'function') {\r\n const options = fcn;\r\n fcn = options.fcn;\r\n interval = options.interval;\r\n repeats = options.repeats;\r\n numberOfRepeats = options.numberOfRepeats;\r\n }\r\n\r\n if (!!numberOfRepeats && numberOfRepeats >= 0) {\r\n this.maxNumberOfRepeats = numberOfRepeats;\r\n if (!repeats) {\r\n throw new Error('repeats must be set to true if numberOfRepeats is set');\r\n }\r\n }\r\n\r\n this.id = Timer._MAX_ID++;\r\n this.interval = interval || this.interval;\r\n this.repeats = repeats || this.repeats;\r\n\r\n this._callbacks = [];\r\n\r\n if (fcn) {\r\n this.on(fcn);\r\n }\r\n }\r\n\r\n /**\r\n * Adds a new callback to be fired after the interval is complete\r\n * @param fcn The callback to be added to the callback list, to be fired after the interval is complete.\r\n */\r\n public on(fcn: () => void) {\r\n this._callbacks.push(fcn);\r\n }\r\n\r\n /**\r\n * Removes a callback from the callback list to be fired after the interval is complete.\r\n * @param fcn The callback to be removed from the callback list, to be fired after the interval is complete.\r\n */\r\n public off(fcn: () => void) {\r\n const index = this._callbacks.indexOf(fcn);\r\n this._callbacks.splice(index, 1);\r\n }\r\n\r\n /**\r\n * Updates the timer after a certain number of milliseconds have elapsed. This is used internally by the engine.\r\n * @param delta Number of elapsed milliseconds since the last update.\r\n */\r\n public update(delta: number) {\r\n if (this._running) {\r\n this._totalTimeAlive += delta;\r\n this._elapsedTime += delta;\r\n\r\n if (this.maxNumberOfRepeats > -1 && this._numberOfTicks >= this.maxNumberOfRepeats) {\r\n this._complete = true;\r\n this._running = false;\r\n this._elapsedTime = 0;\r\n }\r\n\r\n if (!this.complete && this._elapsedTime >= this.interval) {\r\n this._callbacks.forEach((c) => {\r\n c.call(this);\r\n });\r\n\r\n this._numberOfTicks++;\r\n if (this.repeats) {\r\n this._elapsedTime = 0;\r\n } else {\r\n this._complete = true;\r\n this._running = false;\r\n this._elapsedTime = 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the timer so that it can be reused, and optionally reconfigure the timers interval.\r\n *\r\n * Warning** you may need to call `timer.start()` again if the timer had completed\r\n * @param newInterval If specified, sets a new non-negative interval in milliseconds to refire the callback\r\n * @param newNumberOfRepeats If specified, sets a new non-negative upper limit to the number of time this timer executes\r\n */\r\n public reset(newInterval?: number, newNumberOfRepeats?: number) {\r\n if (!!newInterval && newInterval >= 0) {\r\n this.interval = newInterval;\r\n }\r\n\r\n if (!!this.maxNumberOfRepeats && this.maxNumberOfRepeats >= 0) {\r\n this.maxNumberOfRepeats = newNumberOfRepeats;\r\n if (!this.repeats) {\r\n throw new Error('repeats must be set to true if numberOfRepeats is set');\r\n }\r\n }\r\n\r\n this._complete = false;\r\n this._elapsedTime = 0;\r\n this._numberOfTicks = 0;\r\n }\r\n\r\n public get timesRepeated(): number {\r\n return this._numberOfTicks;\r\n }\r\n\r\n public getTimeRunning(): number {\r\n return this._totalTimeAlive;\r\n }\r\n\r\n /**\r\n * @returns milliseconds until the next action callback, if complete will return 0\r\n */\r\n public get timeToNextAction() {\r\n if (this.complete) {\r\n return 0;\r\n }\r\n return this.interval - this._elapsedTime;\r\n }\r\n\r\n /**\r\n * @returns milliseconds elapsed toward the next action\r\n */\r\n public get timeElapsedTowardNextAction() {\r\n return this._elapsedTime;\r\n }\r\n\r\n public get isRunning() {\r\n return this._running;\r\n }\r\n\r\n /**\r\n * Pauses the timer, time will no longer increment towards the next call\r\n */\r\n public pause(): Timer {\r\n this._running = false;\r\n return this;\r\n }\r\n\r\n /**\r\n * Unpauses the timer. Time will now increment towards the next call\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\n @obsolete({ message: 'Will be removed in v0.26.0', alternateMethod: 'Use Timer.resume()' })\r\n public unpause() {\r\n this._running = true;\r\n }\r\n\r\n /**\r\n * Resumes the timer, time will now increment towards the next call.\r\n */\r\n public resume(): Timer {\r\n this._running = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Starts the timer, if the timer was complete it will restart the timer and reset the elapsed time counter\r\n */\r\n public start(): Timer {\r\n if (!this.scene) {\r\n this._logger.warn('Cannot start a timer not part of a scene, timer wont start until added');\r\n }\r\n\r\n this._running = true;\r\n if (this.complete) {\r\n this._complete = false;\r\n this._elapsedTime = 0;\r\n this._numberOfTicks = 0;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stops the timer and resets the elapsed time counter towards the next action invocation\r\n */\r\n public stop(): Timer {\r\n this._running = false;\r\n this._elapsedTime = 0;\r\n this._numberOfTicks = 0;\r\n return this;\r\n }\r\n\r\n /**\r\n * Cancels the timer, preventing any further executions.\r\n */\r\n public cancel() {\r\n this.pause();\r\n if (this.scene) {\r\n this.scene.cancelTimer(this);\r\n }\r\n }\r\n}\r\n","import { BoundingBox } from './Collision/BoundingBox';\r\nimport { Engine } from './Engine';\r\nimport { Vector, vec } from './Math/vector';\r\nimport { Logger } from './Util/Log';\r\nimport { SpriteSheet } from './Drawing/SpriteSheet';\r\nimport * as Events from './Events';\r\nimport { Configurable } from './Configurable';\r\nimport { Entity } from './EntityComponentSystem/Entity';\r\nimport { TransformComponent } from './EntityComponentSystem/Components/TransformComponent';\r\nimport { BodyComponent } from './Collision/BodyComponent';\r\nimport { CollisionType } from './Collision/CollisionType';\r\nimport { Shape } from './Collision/Colliders/Shape';\r\nimport { ExcaliburGraphicsContext, GraphicsComponent, hasGraphicsTick } from './Graphics';\r\nimport * as Graphics from './Graphics';\r\nimport { CanvasDrawComponent, Sprite } from './Drawing/Index';\r\nimport { Sprite as LegacySprite } from './Drawing/Index';\r\nimport { removeItemFromArray } from './Util/Util';\r\nimport { obsolete } from './Util/Decorators';\r\nimport { MotionComponent } from './EntityComponentSystem/Components/MotionComponent';\r\nimport { ColliderComponent } from './Collision/ColliderComponent';\r\nimport { CompositeCollider } from './Collision/Colliders/CompositeCollider';\r\n\r\n/**\r\n * @hidden\r\n */\r\nexport class TileMapImpl extends Entity {\r\n private _token = 0;\r\n private _onScreenXStart: number = 0;\r\n private _onScreenXEnd: number = 9999;\r\n private _onScreenYStart: number = 0;\r\n private _onScreenYEnd: number = 9999;\r\n private _spriteSheets: { [key: string]: Graphics.SpriteSheet } = {};\r\n\r\n private _legacySpriteMap = new Map<Graphics.Sprite, Sprite>();\r\n public logger: Logger = Logger.getInstance();\r\n public readonly data: Cell[] = [];\r\n private _rows: Cell[][] = [];\r\n private _cols: Cell[][] = [];\r\n public visible = true;\r\n public isOffscreen = false;\r\n public readonly cellWidth: number;\r\n public readonly cellHeight: number;\r\n public readonly rows: number;\r\n public readonly cols: number;\r\n\r\n private _dirty = true;\r\n public flagDirty() {\r\n this._dirty = true;\r\n }\r\n private _transform: TransformComponent;\r\n private _motion: MotionComponent;\r\n private _collider: ColliderComponent;\r\n private _composite: CompositeCollider;\r\n\r\n public get x(): number {\r\n return this._transform.pos.x ?? 0;\r\n }\r\n\r\n public set x(val: number) {\r\n if (this._transform?.pos) {\r\n this.get(TransformComponent).pos = vec(val, this.y);\r\n }\r\n }\r\n\r\n public get y(): number {\r\n return this._transform?.pos.y ?? 0;\r\n }\r\n\r\n public set y(val: number) {\r\n if (this._transform?.pos) {\r\n this._transform.pos = vec(this.x, val);\r\n }\r\n }\r\n\r\n public get z(): number {\r\n return this._transform.z ?? 0;\r\n }\r\n\r\n public set z(val: number) {\r\n if (this._transform) {\r\n this._transform.z = val;\r\n }\r\n }\r\n\r\n public get rotation(): number {\r\n return this._transform?.rotation ?? 0;\r\n }\r\n\r\n public set rotation(val: number) {\r\n if (this._transform?.rotation) {\r\n this._transform.rotation = val;\r\n }\r\n }\r\n\r\n public get scale(): Vector {\r\n return this._transform?.scale ?? Vector.One;\r\n }\r\n public set scale(val: Vector) {\r\n if (this._transform?.scale) {\r\n this._transform.scale = val;\r\n }\r\n }\r\n\r\n public get pos(): Vector {\r\n return this._transform.pos;\r\n }\r\n\r\n public set pos(val: Vector) {\r\n this._transform.pos = val;\r\n }\r\n\r\n public get vel(): Vector {\r\n return this._motion.vel;\r\n }\r\n\r\n public set vel(val: Vector) {\r\n this._motion.vel = val;\r\n }\r\n\r\n public on(eventName: Events.preupdate, handler: (event: Events.PreUpdateEvent<TileMap>) => void): void;\r\n public on(eventName: Events.postupdate, handler: (event: Events.PostUpdateEvent<TileMap>) => void): void;\r\n public on(eventName: Events.predraw, handler: (event: Events.PreDrawEvent) => void): void;\r\n public on(eventName: Events.postdraw, handler: (event: Events.PostDrawEvent) => void): void;\r\n public on(eventName: string, handler: (event: Events.GameEvent<any>) => void): void;\r\n public on(eventName: string, handler: (event: any) => void): void {\r\n super.on(eventName, handler);\r\n }\r\n\r\n /**\r\n * @param xOrConfig The x coordinate to anchor the TileMap's upper left corner (should not be changed once set) or TileMap option bag\r\n * @param y The y coordinate to anchor the TileMap's upper left corner (should not be changed once set)\r\n * @param cellWidth The individual width of each cell (in pixels) (should not be changed once set)\r\n * @param cellHeight The individual height of each cell (in pixels) (should not be changed once set)\r\n * @param rows The number of rows in the TileMap (should not be changed once set)\r\n * @param cols The number of cols in the TileMap (should not be changed once set)\r\n */\r\n constructor(xOrConfig: number | TileMapArgs, y: number, cellWidth: number, cellHeight: number, rows: number, cols: number) {\r\n super();\r\n if (xOrConfig && typeof xOrConfig === 'object') {\r\n const config = xOrConfig;\r\n xOrConfig = config.x;\r\n y = config.y;\r\n cellWidth = config.cellWidth;\r\n cellHeight = config.cellHeight;\r\n rows = config.rows;\r\n cols = config.cols;\r\n }\r\n this.addComponent(new TransformComponent());\r\n this.addComponent(new MotionComponent());\r\n this.addComponent(\r\n new BodyComponent({\r\n type: CollisionType.Fixed\r\n })\r\n );\r\n this.addComponent(new CanvasDrawComponent((ctx, delta) => this.draw(ctx, delta)));\r\n this.addComponent(\r\n new GraphicsComponent({\r\n onPostDraw: (ctx, delta) => this.draw(ctx, delta)\r\n })\r\n );\r\n this.addComponent(new ColliderComponent());\r\n this._transform = this.get(TransformComponent);\r\n this._motion = this.get(MotionComponent);\r\n this._collider = this.get(ColliderComponent);\r\n this._composite = this._collider.useCompositeCollider([]);\r\n\r\n this.x = <number>xOrConfig;\r\n this.y = y;\r\n this.cellWidth = cellWidth;\r\n this.cellHeight = cellHeight;\r\n this.rows = rows;\r\n this.cols = cols;\r\n this.data = new Array<Cell>(rows * cols);\r\n this._rows = new Array(rows);\r\n this._cols = new Array(cols);\r\n let currentCol: Cell[] = [];\r\n for (let i = 0; i < cols; i++) {\r\n for (let j = 0; j < rows; j++) {\r\n const cd = new Cell(i * cellWidth + <number>xOrConfig, j * cellHeight + y, cellWidth, cellHeight, i + j * cols);\r\n cd.map = this;\r\n this.data[i + j * cols] = cd;\r\n currentCol.push(cd);\r\n if (!this._rows[j]) {\r\n this._rows[j] = [];\r\n }\r\n this._rows[j].push(cd);\r\n }\r\n this._cols[i] = currentCol;\r\n currentCol = [];\r\n }\r\n\r\n this.get(GraphicsComponent).localBounds = new BoundingBox({\r\n left: 0,\r\n top: 0,\r\n right: this.cols * this.cellWidth,\r\n bottom: this.rows * this.cellHeight\r\n });\r\n }\r\n\r\n public _initialize(engine: Engine) {\r\n super._initialize(engine);\r\n }\r\n\r\n /**\r\n *\r\n * @param key\r\n * @param spriteSheet\r\n * @deprecated No longer used, will be removed in v0.26.0\r\n */\r\n public registerSpriteSheet(key: string, spriteSheet: SpriteSheet): void;\r\n public registerSpriteSheet(key: string, spriteSheet: Graphics.SpriteSheet): void;\r\n @obsolete({ message: 'No longer used, will be removed in v0.26.0' })\r\n public registerSpriteSheet(key: string, spriteSheet: SpriteSheet | Graphics.SpriteSheet): void {\r\n if (spriteSheet instanceof Graphics.SpriteSheet) {\r\n this._spriteSheets[key] = spriteSheet;\r\n } else {\r\n this._spriteSheets[key] = Graphics.SpriteSheet.fromLegacySpriteSheet(spriteSheet);\r\n }\r\n }\r\n\r\n /**\r\n * Tiles colliders based on the solid tiles in the tilemap.\r\n */\r\n private _updateColliders(): void {\r\n this._composite.clearColliders();\r\n const colliders: BoundingBox[] = [];\r\n let current: BoundingBox;\r\n // Bad square tessalation algo\r\n for (let i = 0; i < this.cols; i++) {\r\n // Scan column for colliders\r\n for (let j = 0; j < this.rows; j++) {\r\n // Columns start with a new collider\r\n if (j === 0) {\r\n current = null;\r\n }\r\n const tile = this.data[i + j * this.cols];\r\n // Current tile in column is solid build up current collider\r\n if (tile.solid) {\r\n if (!current) {\r\n current = tile.bounds;\r\n } else {\r\n current = current.combine(tile.bounds);\r\n }\r\n } else {\r\n // Not solid skip and cut off the current collider\r\n if (current) {\r\n colliders.push(current);\r\n }\r\n current = null;\r\n }\r\n }\r\n // After a column is complete check to see if it can be merged into the last one\r\n if (current) {\r\n // if previous is the same combine it\r\n const prev = colliders[colliders.length - 1];\r\n if (prev && prev.top === current.top && prev.bottom === current.bottom) {\r\n colliders[colliders.length - 1] = prev.combine(current);\r\n } else {\r\n // else new collider\r\n colliders.push(current);\r\n }\r\n }\r\n }\r\n this._composite = this._collider.useCompositeCollider([]);\r\n for (const c of colliders) {\r\n const collider = Shape.Box(c.width, c.height, Vector.Zero, vec(c.left - this.pos.x, c.top - this.pos.y));\r\n collider.owner = this;\r\n this._composite.addCollider(collider);\r\n }\r\n this._collider.update();\r\n }\r\n\r\n /**\r\n * Returns the [[Cell]] by index (row major order)\r\n */\r\n public getCellByIndex(index: number): Cell {\r\n return this.data[index];\r\n }\r\n /**\r\n * Returns the [[Cell]] by its x and y coordinates\r\n */\r\n public getCell(x: number, y: number): Cell {\r\n if (x < 0 || y < 0 || x >= this.cols || y >= this.rows) {\r\n return null;\r\n }\r\n return this.data[x + y * this.cols];\r\n }\r\n /**\r\n * Returns the [[Cell]] by testing a point in global coordinates,\r\n * returns `null` if no cell was found.\r\n */\r\n public getCellByPoint(x: number, y: number): Cell {\r\n x = Math.floor((x - this.pos.x) / this.cellWidth);\r\n y = Math.floor((y - this.pos.y) / this.cellHeight);\r\n const cell = this.getCell(x, y);\r\n if (x >= 0 && y >= 0 && x < this.cols && y < this.rows && cell) {\r\n return cell;\r\n }\r\n return null;\r\n }\r\n\r\n public getRows(): readonly Cell[][] {\r\n return this._rows;\r\n }\r\n\r\n public getColumns(): readonly Cell[][] {\r\n return this._cols;\r\n }\r\n\r\n public onPreUpdate(_engine: Engine, _delta: number) {\r\n // Override me\r\n }\r\n\r\n public onPostUpdate(_engine: Engine, _delta: number) {\r\n // Override me\r\n }\r\n\r\n public update(engine: Engine, delta: number) {\r\n this.onPreUpdate(engine, delta);\r\n this.emit('preupdate', new Events.PreUpdateEvent(engine, delta, this));\r\n if (this._dirty) {\r\n this._dirty = false;\r\n this._updateColliders();\r\n }\r\n\r\n this._token++;\r\n const worldBounds = engine.getWorldBounds();\r\n const worldCoordsUpperLeft = vec(worldBounds.left, worldBounds.top);\r\n const worldCoordsLowerRight = vec(worldBounds.right, worldBounds.bottom);\r\n\r\n this._onScreenXStart = Math.max(Math.floor((worldCoordsUpperLeft.x - this.x) / this.cellWidth) - 2, 0);\r\n this._onScreenYStart = Math.max(Math.floor((worldCoordsUpperLeft.y - this.y) / this.cellHeight) - 2, 0);\r\n this._onScreenXEnd = Math.max(Math.floor((worldCoordsLowerRight.x - this.x) / this.cellWidth) + 2, 0);\r\n this._onScreenYEnd = Math.max(Math.floor((worldCoordsLowerRight.y - this.y) / this.cellHeight) + 2, 0);\r\n this._transform.pos = vec(this.x, this.y);\r\n\r\n this.onPostUpdate(engine, delta);\r\n this.emit('postupdate', new Events.PostUpdateEvent(engine, delta, this));\r\n }\r\n\r\n /**\r\n * Draws the tile map to the screen. Called by the [[Scene]].\r\n * @param ctx CanvasRenderingContext2D or ExcaliburGraphicsContext\r\n * @param delta The number of milliseconds since the last draw\r\n */\r\n public draw(ctx: CanvasRenderingContext2D | ExcaliburGraphicsContext, delta: number): void {\r\n this.emit('predraw', new Events.PreDrawEvent(ctx as any, delta, this)); // TODO fix event\r\n\r\n let x = this._onScreenXStart;\r\n const xEnd = Math.min(this._onScreenXEnd, this.cols);\r\n let y = this._onScreenYStart;\r\n const yEnd = Math.min(this._onScreenYEnd, this.rows);\r\n\r\n let graphics: Graphics.Graphic[], graphicsIndex: number, graphicsLen: number;\r\n\r\n for (x; x < xEnd; x++) {\r\n for (y; y < yEnd; y++) {\r\n // get non-negative tile sprites\r\n graphics = this.getCell(x, y).graphics;\r\n\r\n for (graphicsIndex = 0, graphicsLen = graphics.length; graphicsIndex < graphicsLen; graphicsIndex++) {\r\n // draw sprite, warning if sprite doesn't exist\r\n const graphic = graphics[graphicsIndex];\r\n if (graphic) {\r\n if (!(ctx instanceof CanvasRenderingContext2D)) {\r\n if (hasGraphicsTick(graphic)) {\r\n graphic?.tick(delta, this._token);\r\n }\r\n graphic.draw(ctx, x * this.cellWidth, y * this.cellHeight);\r\n } else if (graphic instanceof Graphics.Sprite) {\r\n // TODO legacy drawing mode\r\n if (!this._legacySpriteMap.has(graphic)) {\r\n this._legacySpriteMap.set(graphic, Graphics.Sprite.toLegacySprite(graphic));\r\n }\r\n this._legacySpriteMap.get(graphic).draw(ctx, x * this.cellWidth, y * this.cellHeight);\r\n }\r\n }\r\n }\r\n }\r\n y = this._onScreenYStart;\r\n }\r\n\r\n this.emit('postdraw', new Events.PostDrawEvent(ctx as any, delta, this));\r\n }\r\n}\r\n\r\nexport interface TileMapArgs extends Partial<TileMapImpl> {\r\n x: number;\r\n y: number;\r\n cellWidth: number;\r\n cellHeight: number;\r\n rows: number;\r\n cols: number;\r\n}\r\n\r\n/**\r\n * The [[TileMap]] class provides a lightweight way to do large complex scenes with collision\r\n * without the overhead of actors.\r\n */\r\nexport class TileMap extends Configurable(TileMapImpl) {\r\n constructor(config: TileMapArgs);\r\n constructor(x: number, y: number, cellWidth: number, cellHeight: number, rows: number, cols: number);\r\n constructor(xOrConfig: number | TileMapArgs, y?: number, cellWidth?: number, cellHeight?: number, rows?: number, cols?: number) {\r\n super(xOrConfig, y, cellWidth, cellHeight, rows, cols);\r\n }\r\n}\r\n\r\n/**\r\n * @hidden\r\n */\r\nexport class CellImpl extends Entity {\r\n private _bounds: BoundingBox;\r\n /**\r\n * World space x coordinate of the left of the cell\r\n */\r\n public readonly x: number;\r\n /**\r\n * World space y coordinate of the top of the cell\r\n */\r\n public readonly y: number;\r\n /**\r\n * Width of the cell in pixels\r\n */\r\n public readonly width: number;\r\n /**\r\n * Height of the cell in pixels\r\n */\r\n public readonly height: number;\r\n /**\r\n * Current index in the tilemap\r\n */\r\n public readonly index: number;\r\n\r\n /**\r\n * Reference to the TileMap this Cell is associated with\r\n */\r\n public map: TileMap;\r\n\r\n private _solid = false;\r\n /**\r\n * Wether this cell should be treated as solid by the tilemap\r\n */\r\n public get solid(): boolean {\r\n return this._solid;\r\n }\r\n /**\r\n * Wether this cell should be treated as solid by the tilemap\r\n */\r\n public set solid(val: boolean) {\r\n this.map?.flagDirty();\r\n this._solid = val;\r\n }\r\n /**\r\n * Current list of graphics for this cell\r\n */\r\n public readonly graphics: Graphics.Graphic[] = [];\r\n /**\r\n * Abitrary data storage per cell, useful for any game specific data\r\n */\r\n public data = new Map<string, any>();\r\n\r\n /**\r\n * @param xOrConfig Gets or sets x coordinate of the cell in world coordinates or cell option bag\r\n * @param y Gets or sets y coordinate of the cell in world coordinates\r\n * @param width Gets or sets the width of the cell\r\n * @param height Gets or sets the height of the cell\r\n * @param index The index of the cell in row major order\r\n * @param solid Gets or sets whether this cell is solid\r\n * @param graphics The list of tile graphics to use to draw in this cell (in order)\r\n */\r\n constructor(\r\n xOrConfig: number | CellArgs,\r\n y: number,\r\n width: number,\r\n height: number,\r\n index: number,\r\n solid: boolean = false,\r\n graphics: Graphics.Graphic[] = []\r\n ) {\r\n super();\r\n if (xOrConfig && typeof xOrConfig === 'object') {\r\n const config = xOrConfig;\r\n xOrConfig = config.x;\r\n y = config.y;\r\n width = config.width;\r\n height = config.height;\r\n index = config.index;\r\n solid = config.solid;\r\n graphics = config.sprites;\r\n }\r\n this.x = <number>xOrConfig;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.index = index;\r\n this.solid = solid;\r\n this.graphics = graphics;\r\n this._bounds = new BoundingBox(this.x, this.y, this.x + this.width, this.y + this.height);\r\n }\r\n\r\n public get bounds() {\r\n return this._bounds;\r\n }\r\n\r\n public get center(): Vector {\r\n return new Vector(this.x + this.width / 2, this.y + this.height / 2);\r\n }\r\n\r\n /**\r\n * Add another [[Sprite]] to this cell\r\n * @deprecated Use addSprite, will be removed in v0.26.0\r\n */\r\n @obsolete({ message: 'Will be removed in v0.26.0', alternateMethod: 'addSprite' })\r\n public pushSprite(sprite: Graphics.Sprite | LegacySprite) {\r\n this.addGraphic(sprite);\r\n }\r\n\r\n /**\r\n * Add another [[Graphic]] to this TileMap cell\r\n * @param graphic\r\n */\r\n public addGraphic(graphic: Graphics.Graphic | LegacySprite) {\r\n if (graphic instanceof LegacySprite) {\r\n this.graphics.push(Graphics.Sprite.fromLegacySprite(graphic));\r\n } else {\r\n this.graphics.push(graphic);\r\n }\r\n }\r\n\r\n /**\r\n * Remove an instance of a [[Graphic]] from this cell\r\n */\r\n public removeGraphic(graphic: Graphics.Graphic | LegacySprite) {\r\n removeItemFromArray(graphic, this.graphics);\r\n }\r\n\r\n /**\r\n * Clear all graphis from this cell\r\n */\r\n public clearGraphics() {\r\n this.graphics.length = 0;\r\n }\r\n}\r\n\r\nexport interface CellArgs extends Partial<CellImpl> {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n index: number;\r\n solid?: boolean;\r\n sprites?: Graphics.Sprite[];\r\n}\r\n\r\n/**\r\n * TileMap Cell\r\n *\r\n * A light-weight object that occupies a space in a collision map. Generally\r\n * created by a [[TileMap]].\r\n *\r\n * Cells can draw multiple sprites. Note that the order of drawing is the order\r\n * of the sprites in the array so the last one will be drawn on top. You can\r\n * use transparency to create layers this way.\r\n */\r\nexport class Cell extends Configurable(CellImpl) {\r\n constructor(config: CellArgs);\r\n constructor(x: number, y: number, width: number, height: number, index: number, solid?: boolean, sprites?: Graphics.Sprite[]);\r\n constructor(\r\n xOrConfig: number | CellArgs,\r\n y?: number,\r\n width?: number,\r\n height?: number,\r\n index?: number,\r\n solid?: boolean,\r\n sprites?: Graphics.Sprite[]\r\n ) {\r\n super(xOrConfig, y, width, height, index, solid, sprites);\r\n }\r\n}\r\n","import { Engine } from './Engine';\r\nimport { EasingFunction, EasingFunctions } from './Util/EasingFunctions';\r\nimport { Vector, vec } from './Math/vector';\r\nimport { Actor } from './Actor';\r\nimport { removeItemFromArray } from './Util/Util';\r\nimport { CanUpdate, CanInitialize } from './Interfaces/LifecycleEvents';\r\nimport { PreUpdateEvent, PostUpdateEvent, GameEvent, InitializeEvent } from './Events';\r\nimport { Class } from './Class';\r\nimport { BoundingBox } from './Collision/BoundingBox';\r\nimport { Logger } from './Util/Log';\r\nimport { ExcaliburGraphicsContext } from './Graphics/Context/ExcaliburGraphicsContext';\r\nimport { watchAny } from './Util/Watch';\r\n\r\n/**\r\n * Interface that describes a custom camera strategy for tracking targets\r\n */\r\nexport interface CameraStrategy<T> {\r\n /**\r\n * Target of the camera strategy that will be passed to the action\r\n */\r\n target: T;\r\n\r\n /**\r\n * Camera strategies perform an action to calculate a new focus returned out of the strategy\r\n * @param target The target object to apply this camera strategy (if any)\r\n * @param camera The current camera implementation in excalibur running the game\r\n * @param engine The current engine running the game\r\n * @param delta The elapsed time in milliseconds since the last frame\r\n */\r\n action: (target: T, camera: Camera, engine: Engine, delta: number) => Vector;\r\n}\r\n\r\n/**\r\n * Container to house convenience strategy methods\r\n * @internal\r\n */\r\nexport class StrategyContainer {\r\n constructor(public camera: Camera) {}\r\n\r\n /**\r\n * Creates and adds the [[LockCameraToActorStrategy]] on the current camera.\r\n * @param actor The actor to lock the camera to\r\n */\r\n public lockToActor(actor: Actor) {\r\n this.camera.addStrategy(new LockCameraToActorStrategy(actor));\r\n }\r\n\r\n /**\r\n * Creates and adds the [[LockCameraToActorAxisStrategy]] on the current camera\r\n * @param actor The actor to lock the camera to\r\n * @param axis The axis to follow the actor on\r\n */\r\n public lockToActorAxis(actor: Actor, axis: Axis) {\r\n this.camera.addStrategy(new LockCameraToActorAxisStrategy(actor, axis));\r\n }\r\n\r\n /**\r\n * Creates and adds the [[ElasticToActorStrategy]] on the current camera\r\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\r\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\r\n * correct and bounce around the target\r\n *\r\n * @param actor Target actor to elastically follow\r\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\r\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\r\n */\r\n public elasticToActor(actor: Actor, cameraElasticity: number, cameraFriction: number) {\r\n this.camera.addStrategy(new ElasticToActorStrategy(actor, cameraElasticity, cameraFriction));\r\n }\r\n\r\n /**\r\n * Creates and adds the [[RadiusAroundActorStrategy]] on the current camera\r\n * @param actor Target actor to follow when it is \"radius\" pixels away\r\n * @param radius Number of pixels away before the camera will follow\r\n */\r\n public radiusAroundActor(actor: Actor, radius: number) {\r\n this.camera.addStrategy(new RadiusAroundActorStrategy(actor, radius));\r\n }\r\n\r\n /**\r\n * Creates and adds the [[LimitCameraBoundsStrategy]] on the current camera\r\n * @param box The bounding box to limit the camera to.\r\n */\r\n public limitCameraBounds(box: BoundingBox) {\r\n this.camera.addStrategy(new LimitCameraBoundsStrategy(box));\r\n }\r\n}\r\n\r\n/**\r\n * Camera axis enum\r\n */\r\nexport enum Axis {\r\n X,\r\n Y\r\n}\r\n\r\n/**\r\n * Lock a camera to the exact x/y position of an actor.\r\n */\r\nexport class LockCameraToActorStrategy implements CameraStrategy<Actor> {\r\n constructor(public target: Actor) {}\r\n public action = (target: Actor, _cam: Camera, _eng: Engine, _delta: number) => {\r\n const center = target.center;\r\n return center;\r\n };\r\n}\r\n\r\n/**\r\n * Lock a camera to a specific axis around an actor.\r\n */\r\nexport class LockCameraToActorAxisStrategy implements CameraStrategy<Actor> {\r\n constructor(public target: Actor, public axis: Axis) {}\r\n public action = (target: Actor, cam: Camera, _eng: Engine, _delta: number) => {\r\n const center = target.center;\r\n const currentFocus = cam.getFocus();\r\n if (this.axis === Axis.X) {\r\n return new Vector(center.x, currentFocus.y);\r\n } else {\r\n return new Vector(currentFocus.x, center.y);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Using [Hook's law](https://en.wikipedia.org/wiki/Hooke's_law), elastically move the camera towards the target actor.\r\n */\r\nexport class ElasticToActorStrategy implements CameraStrategy<Actor> {\r\n /**\r\n * If cameraElasticity < cameraFriction < 1.0, the behavior will be a dampened spring that will slowly end at the target without bouncing\r\n * If cameraFriction < cameraElasticity < 1.0, the behavior will be an oscillating spring that will over\r\n * correct and bounce around the target\r\n *\r\n * @param target Target actor to elastically follow\r\n * @param cameraElasticity [0 - 1.0] The higher the elasticity the more force that will drive the camera towards the target\r\n * @param cameraFriction [0 - 1.0] The higher the friction the more that the camera will resist motion towards the target\r\n */\r\n constructor(public target: Actor, public cameraElasticity: number, public cameraFriction: number) {}\r\n public action = (target: Actor, cam: Camera, _eng: Engine, _delta: number) => {\r\n const position = target.center;\r\n let focus = cam.getFocus();\r\n let cameraVel = cam.vel.clone();\r\n\r\n // Calculate the stretch vector, using the spring equation\r\n // F = kX\r\n // https://en.wikipedia.org/wiki/Hooke's_law\r\n // Apply to the current camera velocity\r\n const stretch = position.sub(focus).scale(this.cameraElasticity); // stretch is X\r\n cameraVel = cameraVel.add(stretch);\r\n\r\n // Calculate the friction (-1 to apply a force in the opposition of motion)\r\n // Apply to the current camera velocity\r\n const friction = cameraVel.scale(-1).scale(this.cameraFriction);\r\n cameraVel = cameraVel.add(friction);\r\n\r\n // Update position by velocity deltas\r\n focus = focus.add(cameraVel);\r\n\r\n return focus;\r\n };\r\n}\r\n\r\nexport class RadiusAroundActorStrategy implements CameraStrategy<Actor> {\r\n /**\r\n *\r\n * @param target Target actor to follow when it is \"radius\" pixels away\r\n * @param radius Number of pixels away before the camera will follow\r\n */\r\n constructor(public target: Actor, public radius: number) {}\r\n public action = (target: Actor, cam: Camera, _eng: Engine, _delta: number) => {\r\n const position = target.center;\r\n const focus = cam.getFocus();\r\n\r\n const direction = position.sub(focus);\r\n const distance = direction.size;\r\n if (distance >= this.radius) {\r\n const offset = distance - this.radius;\r\n return focus.add(direction.normalize().scale(offset));\r\n }\r\n return focus;\r\n };\r\n}\r\n\r\n/**\r\n * Prevent a camera from going beyond the given camera dimensions.\r\n */\r\nexport class LimitCameraBoundsStrategy implements CameraStrategy<BoundingBox> {\r\n /**\r\n * Useful for limiting the camera to a [[TileMap]]'s dimensions, or a specific area inside the map.\r\n *\r\n * Note that this strategy does not perform any movement by itself.\r\n * It only sets the camera position to within the given bounds when the camera has gone beyond them.\r\n * Thus, it is a good idea to combine it with other camera strategies and set this strategy as the last one.\r\n *\r\n * Make sure that the camera bounds are at least as large as the viewport size.\r\n *\r\n * @param target The bounding box to limit the camera to\r\n */\r\n\r\n boundSizeChecked: boolean = false; // Check and warn only once\r\n\r\n constructor(public target: BoundingBox) {}\r\n\r\n public action = (target: BoundingBox, cam: Camera, _eng: Engine, _delta: number) => {\r\n const focus = cam.getFocus();\r\n\r\n if (!this.boundSizeChecked) {\r\n if (target.bottom - target.top < _eng.drawHeight || target.right - target.left < _eng.drawWidth) {\r\n Logger.getInstance().warn('Camera bounds should not be smaller than the engine viewport');\r\n }\r\n this.boundSizeChecked = true;\r\n }\r\n\r\n let focusX = focus.x;\r\n let focusY = focus.y;\r\n if (focus.x < target.left + _eng.halfDrawWidth) {\r\n focusX = target.left + _eng.halfDrawWidth;\r\n } else if (focus.x > target.right - _eng.halfDrawWidth) {\r\n focusX = target.right - _eng.halfDrawWidth;\r\n }\r\n\r\n if (focus.y < target.top + _eng.halfDrawHeight) {\r\n focusY = target.top + _eng.halfDrawHeight;\r\n } else if (focus.y > target.bottom - _eng.halfDrawHeight) {\r\n focusY = target.bottom - _eng.halfDrawHeight;\r\n }\r\n\r\n return vec(focusX, focusY);\r\n };\r\n}\r\n\r\n/**\r\n * Cameras\r\n *\r\n * [[Camera]] is the base class for all Excalibur cameras. Cameras are used\r\n * to move around your game and set focus. They are used to determine\r\n * what is \"off screen\" and can be used to scale the game.\r\n *\r\n */\r\nexport class Camera extends Class implements CanUpdate, CanInitialize {\r\n protected _follow: Actor;\r\n\r\n private _cameraStrategies: CameraStrategy<any>[] = [];\r\n\r\n public strategy: StrategyContainer = new StrategyContainer(this);\r\n\r\n /**\r\n * Get or set current zoom of the camera, defaults to 1\r\n */\r\n private _z = 1;\r\n public get zoom(): number {\r\n return this._z;\r\n }\r\n\r\n public set zoom(val: number) {\r\n this._z = val;\r\n if (this._engine) {\r\n this._halfWidth = this._engine.halfDrawWidth;\r\n this._halfHeight = this._engine.halfDrawHeight;\r\n }\r\n }\r\n /**\r\n * Get or set rate of change in zoom, defaults to 0\r\n */\r\n public dz: number = 0;\r\n /**\r\n * Get or set zoom acceleration\r\n */\r\n public az: number = 0;\r\n\r\n /**\r\n * Current rotation of the camera\r\n */\r\n public rotation: number = 0;\r\n\r\n /**\r\n * Current angular velocity\r\n */\r\n public rx: number = 0;\r\n\r\n /**\r\n * Get or set the camera's angular velocity\r\n */\r\n public get angularVelocity(): number {\r\n return this.rx;\r\n }\r\n\r\n public set angularVelocity(value: number) {\r\n this.rx = value;\r\n }\r\n\r\n /**\r\n * Get or set the camera's position\r\n */\r\n private _posChanged = false;\r\n private _pos: Vector = watchAny(Vector.Zero, () => (this._posChanged = true));\r\n public get pos(): Vector {\r\n return this._pos;\r\n }\r\n public set pos(vec: Vector) {\r\n this._pos = watchAny(vec, () => (this._posChanged = true));\r\n this._posChanged = true;\r\n }\r\n\r\n /**\r\n * Get or set the camera's velocity\r\n */\r\n public vel: Vector = Vector.Zero;\r\n\r\n /**\r\n * GEt or set the camera's acceleration\r\n */\r\n public acc: Vector = Vector.Zero;\r\n\r\n private _cameraMoving: boolean = false;\r\n private _currentLerpTime: number = 0;\r\n private _lerpDuration: number = 1000; // 1 second\r\n private _lerpStart: Vector = null;\r\n private _lerpEnd: Vector = null;\r\n private _lerpResolve: (value: Vector) => void;\r\n private _lerpPromise: Promise<Vector>;\r\n\r\n //camera effects\r\n protected _isShaking: boolean = false;\r\n private _shakeMagnitudeX: number = 0;\r\n private _shakeMagnitudeY: number = 0;\r\n private _shakeDuration: number = 0;\r\n private _elapsedShakeTime: number = 0;\r\n private _xShake: number = 0;\r\n private _yShake: number = 0;\r\n\r\n protected _isZooming: boolean = false;\r\n private _zoomStart: number = 1;\r\n private _zoomEnd: number = 1;\r\n private _currentZoomTime: number = 0;\r\n private _zoomDuration: number = 0;\r\n\r\n private _zoomResolve: (val: boolean) => void;\r\n private _zoomPromise: Promise<boolean>;\r\n private _zoomEasing: EasingFunction = EasingFunctions.EaseInOutCubic;\r\n private _easing: EasingFunction = EasingFunctions.EaseInOutCubic;\r\n\r\n private _halfWidth: number = 0;\r\n private _halfHeight: number = 0;\r\n\r\n /**\r\n * Get the camera's x position\r\n */\r\n public get x() {\r\n return this.pos.x;\r\n }\r\n\r\n /**\r\n * Set the camera's x position (cannot be set when following an [[Actor]] or when moving)\r\n */\r\n public set x(value: number) {\r\n if (!this._follow && !this._cameraMoving) {\r\n this.pos = vec(value, this.pos.y);\r\n }\r\n }\r\n\r\n /**\r\n * Get the camera's y position\r\n */\r\n public get y() {\r\n return this.pos.y;\r\n }\r\n\r\n /**\r\n * Set the camera's y position (cannot be set when following an [[Actor]] or when moving)\r\n */\r\n public set y(value: number) {\r\n if (!this._follow && !this._cameraMoving) {\r\n this.pos = vec(this.pos.x, value);\r\n }\r\n }\r\n\r\n /**\r\n * Get or set the camera's x velocity\r\n */\r\n public get dx() {\r\n return this.vel.x;\r\n }\r\n\r\n public set dx(value: number) {\r\n this.vel = vec(value, this.vel.y);\r\n }\r\n\r\n /**\r\n * Get or set the camera's y velocity\r\n */\r\n public get dy() {\r\n return this.vel.y;\r\n }\r\n\r\n public set dy(value: number) {\r\n this.vel = vec(this.vel.x, value);\r\n }\r\n\r\n /**\r\n * Get or set the camera's x acceleration\r\n */\r\n public get ax() {\r\n return this.acc.x;\r\n }\r\n\r\n public set ax(value: number) {\r\n this.acc = vec(value, this.acc.y);\r\n }\r\n\r\n /**\r\n * Get or set the camera's y acceleration\r\n */\r\n public get ay() {\r\n return this.acc.y;\r\n }\r\n\r\n public set ay(value: number) {\r\n this.acc = vec(this.acc.x, value);\r\n }\r\n\r\n /**\r\n * Returns the focal point of the camera, a new point giving the x and y position of the camera\r\n */\r\n public getFocus() {\r\n return this.pos;\r\n }\r\n\r\n /**\r\n * This moves the camera focal point to the specified position using specified easing function. Cannot move when following an Actor.\r\n *\r\n * @param pos The target position to move to\r\n * @param duration The duration in milliseconds the move should last\r\n * @param [easingFn] An optional easing function ([[ex.EasingFunctions.EaseInOutCubic]] by default)\r\n * @returns A [[Promise]] that resolves when movement is finished, including if it's interrupted.\r\n * The [[Promise]] value is the [[Vector]] of the target position. It will be rejected if a move cannot be made.\r\n */\r\n public move(pos: Vector, duration: number, easingFn: EasingFunction = EasingFunctions.EaseInOutCubic): Promise<Vector> {\r\n if (typeof easingFn !== 'function') {\r\n throw 'Please specify an EasingFunction';\r\n }\r\n\r\n // cannot move when following an actor\r\n if (this._follow) {\r\n return Promise.reject(pos);\r\n }\r\n\r\n // resolve existing promise, if any\r\n if (this._lerpPromise && this._lerpResolve) {\r\n this._lerpResolve(pos);\r\n }\r\n\r\n this._lerpPromise = new Promise<Vector>((resolve) => {\r\n this._lerpResolve = resolve;\r\n });\r\n this._lerpStart = this.getFocus().clone();\r\n this._lerpDuration = duration;\r\n this._lerpEnd = pos;\r\n this._currentLerpTime = 0;\r\n this._cameraMoving = true;\r\n this._easing = easingFn;\r\n\r\n return this._lerpPromise;\r\n }\r\n\r\n /**\r\n * Sets the camera to shake at the specified magnitudes for the specified duration\r\n * @param magnitudeX The x magnitude of the shake\r\n * @param magnitudeY The y magnitude of the shake\r\n * @param duration The duration of the shake in milliseconds\r\n */\r\n public shake(magnitudeX: number, magnitudeY: number, duration: number) {\r\n this._isShaking = true;\r\n this._shakeMagnitudeX = magnitudeX;\r\n this._shakeMagnitudeY = magnitudeY;\r\n this._shakeDuration = duration;\r\n }\r\n\r\n /**\r\n * Zooms the camera in or out by the specified scale over the specified duration.\r\n * If no duration is specified, it take effect immediately.\r\n * @param scale The scale of the zoom\r\n * @param duration The duration of the zoom in milliseconds\r\n */\r\n public zoomOverTime(scale: number, duration: number = 0, easingFn: EasingFunction = EasingFunctions.EaseInOutCubic): Promise<boolean> {\r\n this._zoomPromise = new Promise<boolean>((resolve) => {\r\n this._zoomResolve = resolve;\r\n });\r\n\r\n if (duration) {\r\n this._isZooming = true;\r\n this._zoomEasing = easingFn;\r\n this._currentZoomTime = 0;\r\n this._zoomDuration = duration;\r\n this._zoomStart = this.zoom;\r\n this._zoomEnd = scale;\r\n } else {\r\n this._isZooming = false;\r\n this.zoom = scale;\r\n return Promise.resolve(true);\r\n }\r\n\r\n return this._zoomPromise;\r\n }\r\n\r\n private _viewport: BoundingBox = null;\r\n /**\r\n * Gets the bounding box of the viewport of this camera in world coordinates\r\n */\r\n public get viewport(): BoundingBox {\r\n if (this._viewport) {\r\n return this._viewport;\r\n }\r\n\r\n return new BoundingBox(0, 0, 0, 0);\r\n }\r\n\r\n /**\r\n * Adds a new camera strategy to this camera\r\n * @param cameraStrategy Instance of an [[CameraStrategy]]\r\n */\r\n public addStrategy<T>(cameraStrategy: CameraStrategy<T>) {\r\n this._cameraStrategies.push(cameraStrategy);\r\n }\r\n\r\n /**\r\n * Removes a camera strategy by reference\r\n * @param cameraStrategy Instance of an [[CameraStrategy]]\r\n */\r\n public removeStrategy<T>(cameraStrategy: CameraStrategy<T>) {\r\n removeItemFromArray(cameraStrategy, this._cameraStrategies);\r\n }\r\n\r\n /**\r\n * Clears all camera strategies from the camera\r\n */\r\n public clearAllStrategies() {\r\n this._cameraStrategies.length = 0;\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _preupdate handler for [[onPreUpdate]] lifecycle event\r\n * @internal\r\n */\r\n public _preupdate(engine: Engine, delta: number): void {\r\n this.emit('preupdate', new PreUpdateEvent(engine, delta, this));\r\n this.onPreUpdate(engine, delta);\r\n }\r\n\r\n /**\r\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPreUpdate` is called directly before a scene is updated.\r\n */\r\n public onPreUpdate(_engine: Engine, _delta: number): void {\r\n // Overridable\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _preupdate handler for [[onPostUpdate]] lifecycle event\r\n * @internal\r\n */\r\n public _postupdate(engine: Engine, delta: number): void {\r\n this.emit('postupdate', new PostUpdateEvent(engine, delta, this));\r\n this.onPostUpdate(engine, delta);\r\n }\r\n\r\n /**\r\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPostUpdate` is called directly after a scene is updated.\r\n */\r\n public onPostUpdate(_engine: Engine, _delta: number): void {\r\n // Overridable\r\n }\r\n\r\n private _engine: Engine;\r\n private _isInitialized = false;\r\n public get isInitialized() {\r\n return this._isInitialized;\r\n }\r\n\r\n public _initialize(_engine: Engine) {\r\n if (!this.isInitialized) {\r\n this._engine = _engine;\r\n\r\n const currentRes = this._engine.screen.resolution;\r\n let center = vec(currentRes.width / 2, currentRes.height / 2);\r\n if (!this._engine.loadingComplete) {\r\n // If there was a loading screen, we peek the configured resolution\r\n const res = this._engine.screen.peekResolution();\r\n if (res) {\r\n center = vec(res.width / 2, res.height / 2);\r\n }\r\n }\r\n this._halfWidth = center.x;\r\n this._halfHeight = center.x;\r\n\r\n // If the user has not set the camera pos, apply default center screen position\r\n if (!this._posChanged) {\r\n this.pos = center;\r\n }\r\n\r\n this.onInitialize(_engine);\r\n super.emit('initialize', new InitializeEvent(_engine, this));\r\n this._isInitialized = true;\r\n }\r\n }\r\n\r\n /**\r\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPostUpdate` is called directly after a scene is updated.\r\n */\r\n public onInitialize(_engine: Engine) {\r\n // Overridable\r\n }\r\n\r\n public on(eventName: 'initialize', handler: (event: InitializeEvent) => void): void;\r\n public on(eventName: 'preupdate', handler: (event: PreUpdateEvent) => void): void;\r\n public on(eventName: 'postupdate', handler: (event: PostUpdateEvent) => void): void;\r\n public on(eventName: any, handler: any) {\r\n super.on(eventName, handler);\r\n }\r\n\r\n public off(eventName: 'initialize', handler?: (event: InitializeEvent) => void): void;\r\n public off(eventName: 'preupdate', handler?: (event: PreUpdateEvent) => void): void;\r\n public off(eventName: 'postupdate', handler?: (event: PostUpdateEvent) => void): void;\r\n public off(eventName: string, handler: (event: GameEvent<Camera>) => void): void;\r\n public off(eventName: string, handler: (event: any) => void): void {\r\n super.off(eventName, handler);\r\n }\r\n\r\n public once(eventName: 'initialize', handler: (event: InitializeEvent) => void): void;\r\n public once(eventName: 'preupdate', handler: (event: PreUpdateEvent) => void): void;\r\n public once(eventName: 'postupdate', handler: (event: PostUpdateEvent) => void): void;\r\n public once(eventName: string, handler: (event: GameEvent<Camera>) => void): void;\r\n public once(eventName: string, handler: (event: any) => void): void {\r\n super.once(eventName, handler);\r\n }\r\n\r\n public update(_engine: Engine, delta: number) {\r\n this._initialize(_engine);\r\n this._preupdate(_engine, delta);\r\n\r\n // Update placements based on linear algebra\r\n this.pos = this.pos.add(this.vel.scale(delta / 1000));\r\n this.zoom += (this.dz * delta) / 1000;\r\n\r\n this.vel = this.vel.add(this.acc.scale(delta / 1000));\r\n this.dz += (this.az * delta) / 1000;\r\n\r\n this.rotation += (this.angularVelocity * delta) / 1000;\r\n\r\n if (this._isZooming) {\r\n if (this._currentZoomTime < this._zoomDuration) {\r\n const zoomEasing = this._zoomEasing;\r\n const newZoom = zoomEasing(this._currentZoomTime, this._zoomStart, this._zoomEnd, this._zoomDuration);\r\n\r\n this.zoom = newZoom;\r\n this._currentZoomTime += delta;\r\n } else {\r\n this._isZooming = false;\r\n this.zoom = this._zoomEnd;\r\n this._currentZoomTime = 0;\r\n this._zoomResolve(true);\r\n }\r\n }\r\n\r\n if (this._cameraMoving) {\r\n if (this._currentLerpTime < this._lerpDuration) {\r\n const moveEasing = EasingFunctions.CreateVectorEasingFunction(this._easing);\r\n\r\n const lerpPoint = moveEasing(this._currentLerpTime, this._lerpStart, this._lerpEnd, this._lerpDuration);\r\n\r\n this.pos = lerpPoint;\r\n\r\n this._currentLerpTime += delta;\r\n } else {\r\n this.pos = this._lerpEnd;\r\n const end = this._lerpEnd.clone();\r\n\r\n this._lerpStart = null;\r\n this._lerpEnd = null;\r\n this._currentLerpTime = 0;\r\n this._cameraMoving = false;\r\n // Order matters here, resolve should be last so any chain promises have a clean slate\r\n this._lerpResolve(end);\r\n }\r\n }\r\n\r\n if (this._isDoneShaking()) {\r\n this._isShaking = false;\r\n this._elapsedShakeTime = 0;\r\n this._shakeMagnitudeX = 0;\r\n this._shakeMagnitudeY = 0;\r\n this._shakeDuration = 0;\r\n this._xShake = 0;\r\n this._yShake = 0;\r\n } else {\r\n this._elapsedShakeTime += delta;\r\n this._xShake = ((Math.random() * this._shakeMagnitudeX) | 0) + 1;\r\n this._yShake = ((Math.random() * this._shakeMagnitudeY) | 0) + 1;\r\n }\r\n\r\n for (const s of this._cameraStrategies) {\r\n this.pos = s.action.call(s, s.target, this, _engine, delta);\r\n }\r\n\r\n this._viewport = new BoundingBox(\r\n this.x - this._halfWidth,\r\n this.y - this._halfHeight,\r\n this.x + this._halfWidth,\r\n this.y + this._halfHeight\r\n );\r\n\r\n this._postupdate(_engine, delta);\r\n }\r\n\r\n /**\r\n * Applies the relevant transformations to the game canvas to \"move\" or apply effects to the Camera\r\n * @param ctx Canvas context to apply transformations\r\n */\r\n public draw(ctx: CanvasRenderingContext2D): void;\r\n public draw(ctx: ExcaliburGraphicsContext): void;\r\n public draw(ctx: CanvasRenderingContext2D | ExcaliburGraphicsContext): void {\r\n let canvasWidth = 0;\r\n let canvasHeight = 0;\r\n if (ctx instanceof CanvasRenderingContext2D) {\r\n canvasWidth = ctx.canvas.width;\r\n canvasHeight = ctx.canvas.height;\r\n } else {\r\n canvasWidth = ctx.width;\r\n canvasHeight = ctx.height;\r\n }\r\n const focus = this.getFocus();\r\n const pixelRatio = this._engine ? this._engine.pixelRatio : 1;\r\n const zoom = this.zoom;\r\n\r\n const newCanvasWidth = canvasWidth / zoom / pixelRatio;\r\n const newCanvasHeight = canvasHeight / zoom / pixelRatio;\r\n\r\n ctx.scale(zoom, zoom);\r\n ctx.translate(-focus.x + newCanvasWidth / 2 + this._xShake, -focus.y + newCanvasHeight / 2 + this._yShake);\r\n }\r\n\r\n /* istanbul ignore next */\r\n public debugDraw(_ctx: CanvasRenderingContext2D) {\r\n // pass\r\n }\r\n\r\n private _isDoneShaking(): boolean {\r\n return !this._isShaking || this._elapsedShakeTime >= this._shakeDuration;\r\n }\r\n}\r\n","import { Actor } from '../Actor';\r\nimport { ScreenElement } from '../ScreenElement';\r\nimport { Label } from '../Label';\r\nimport { Trigger } from '../Trigger';\r\n\r\n/**\r\n * Type guard to detect if something is an actor\r\n * @deprecated Will be removed in v0.26.0\r\n * @param actor\r\n */\r\nexport function isVanillaActor(actor: Actor) {\r\n return !(actor instanceof ScreenElement) && !(actor instanceof Trigger) && !(actor instanceof Label);\r\n}\r\n\r\n/**\r\n * Type guard to detect a screen element\r\n * @todo move to ScreenElement\r\n */\r\nexport function isScreenElement(actor: Actor) {\r\n return actor instanceof ScreenElement;\r\n}\r\n","import { Color } from './Color';\nimport { Engine } from './Engine';\nimport { EventDispatcher } from './EventDispatcher';\nimport { Vector } from './Math/vector';\nimport { ExitTriggerEvent, EnterTriggerEvent, CollisionEndEvent, CollisionStartEvent } from './Events';\nimport * as Util from './Util/Util';\nimport { CollisionType } from './Collision/CollisionType';\nimport { Entity } from './EntityComponentSystem';\nimport { Actor } from './Actor';\n\n/**\n * ITriggerOptions\n */\nexport interface TriggerOptions {\n // position of the trigger\n pos: Vector;\n // width of the trigger\n width: number;\n // height of the trigger\n height: number;\n // whether the trigger is visible or not\n visible: boolean;\n // action to take when triggered\n action: () => void;\n // if specified the trigger will only fire on a specific actor and overrides any filter\n target: Entity;\n // Returns true if the triggers should fire on the collided actor\n filter: (actor: Entity) => boolean;\n // -1 if it should repeat forever\n repeat: number;\n}\n\nconst triggerDefaults: Partial<TriggerOptions> = {\n pos: Vector.Zero,\n width: 10,\n height: 10,\n visible: false,\n action: () => {\n return;\n },\n filter: () => true,\n repeat: -1\n};\n\n/**\n * Triggers are a method of firing arbitrary code on collision. These are useful\n * as 'buttons', 'switches', or to trigger effects in a game. By default triggers\n * are invisible, and can only be seen when [[Trigger.visible]] is set to `true`.\n */\nexport class Trigger extends Actor {\n private _target: Entity;\n /**\n * Action to fire when triggered by collision\n */\n public action: () => void = () => {\n return;\n };\n /**\n * Filter to add additional granularity to action dispatch, if a filter is specified the action will only fire when\n * filter return true for the collided actor.\n */\n public filter: (actor: Entity) => boolean = () => true;\n /**\n * Number of times to repeat before killing the trigger,\n */\n public repeat: number = -1;\n\n /**\n *\n * @param opts Trigger options\n */\n constructor(opts: Partial<TriggerOptions>) {\n super({ x: opts.pos.x, y: opts.pos.y, width: opts.width, height: opts.height });\n opts = Util.extend({}, triggerDefaults, opts);\n\n this.filter = opts.filter || this.filter;\n this.repeat = opts.repeat || this.repeat;\n this.action = opts.action || this.action;\n if (opts.target) {\n this.target = opts.target;\n }\n\n this.graphics.visible = opts.visible;\n this.body.collisionType = CollisionType.Passive;\n this.eventDispatcher = new EventDispatcher(this);\n\n this.events.on('collisionstart', (evt: CollisionStartEvent<Actor>) => {\n if (this.filter(evt.other)) {\n this.emit('enter', new EnterTriggerEvent(this, evt.other));\n this._dispatchAction();\n // remove trigger if its done, -1 repeat forever\n if (this.repeat === 0) {\n this.kill();\n }\n }\n });\n\n this.events.on('collisionend', (evt: CollisionEndEvent<Actor>) => {\n if (this.filter(evt.other)) {\n this.emit('exit', new ExitTriggerEvent(this, evt.other));\n }\n });\n }\n\n public set target(target: Entity) {\n this._target = target;\n this.filter = (actor: Entity) => actor === target;\n }\n\n public get target() {\n return this._target;\n }\n\n public _initialize(engine: Engine) {\n super._initialize(engine);\n }\n\n private _dispatchAction() {\n if (this.repeat !== 0) {\n this.action.call(this);\n this.repeat--;\n }\n }\n\n /* istanbul ignore next */\n public debugDraw(ctx: CanvasRenderingContext2D) {\n super.debugDraw(ctx);\n // Meant to draw debug information about actors\n ctx.save();\n ctx.translate(this.pos.x, this.pos.y);\n\n const bb = this.collider.bounds;\n const wp = this.getGlobalPos();\n bb.left = bb.left - wp.x;\n bb.right = bb.right - wp.x;\n bb.top = bb.top - wp.y;\n bb.bottom = bb.bottom - wp.y;\n\n ctx.fillStyle = Color.Violet.toString();\n ctx.strokeStyle = Color.Violet.toString();\n ctx.fillText('Trigger', 10, 10);\n bb.debugDraw(ctx);\n\n ctx.restore();\n }\n}\n","import { Entity } from './Entity';\r\nimport { Message, Observer } from '../Util/Observable';\r\nimport { Component } from './Component';\r\nimport { Scene } from '../Scene';\r\n\r\n/**\r\n * Enum that determines whether to run the system in the update or draw phase\r\n */\r\nexport enum SystemType {\r\n Update = 'update',\r\n Draw = 'draw'\r\n}\r\n\r\nexport type SystemTypes<ComponentTypes> = ComponentTypes extends Component<infer TypeName> ? TypeName : never;\r\n\r\n/**\r\n * An Excalibur [[System]] that updates entities of certain types.\r\n * Systems are scene specific\r\n *\r\n * Excalibur Systems currently require at least 1 Component type to operated\r\n *\r\n * Multiple types are declared as a type union\r\n * For example:\r\n *\r\n * ```typescript\r\n * class MySystem extends System<ComponentA | ComponentB> {\r\n * public readonly types = ['a', 'b'] as const;\r\n * public readonly systemType = SystemType.Update;\r\n * public update(entities: Entity<ComponentA | ComponentB>) {\r\n * ...\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport abstract class System<ComponentTypeUnion extends Component = Component, ContextType = Scene>\r\nimplements Observer<AddedEntity | RemovedEntity> {\r\n /**\r\n * The types of entities that this system operates on\r\n * For example ['transform', 'motion']\r\n */\r\n abstract readonly types: readonly SystemTypes<ComponentTypeUnion>[];\r\n\r\n /**\r\n * Determine whether the system is called in the [[SystemType.Update]] or the [[SystemType.Draw]] phase. Update is first, then Draw.\r\n */\r\n abstract readonly systemType: SystemType;\r\n\r\n /**\r\n * System can execute in priority order, by default all systems are priority 0. Lower values indicated higher priority.\r\n * For a system to execute before all other a lower priority value (-1 for example) must be set.\r\n * For a system to exectue after all other a higher priority value (10 for example) must be set.\r\n */\r\n public priority: number = 0;\r\n\r\n /**\r\n * Optionally specify a sort order for entities passed to the your system\r\n * @param a The left entity\r\n * @param b The right entity\r\n */\r\n sort?(a: Entity, b: Entity): number;\r\n\r\n /**\r\n * Optionally specify an initialize handler\r\n * @param scene\r\n */\r\n initialize?(engine: ContextType): void;\r\n\r\n /**\r\n * Update all entities that match this system's types\r\n * @param entities Entities to update that match this system's types\r\n * @param delta Time in milliseconds\r\n */\r\n abstract update(entities: Entity[], delta: number): void;\r\n\r\n /**\r\n * Optionally run a preupdate before the system processes matching entities\r\n * @param engine\r\n * @param elapsedMs Time in milliseconds since the last frame\r\n */\r\n preupdate?(engine: ContextType, elapsedMs: number): void;\r\n\r\n /**\r\n * Optionally run a postupdate after the system processes matching entities\r\n * @param engine\r\n * @param elapsedMs Time in milliseconds since the last frame\r\n */\r\n postupdate?(engine: ContextType, elapsedMs: number): void;\r\n\r\n /**\r\n * Systems observe when entities match their types or no longer match their types, override\r\n * @param _entityAddedOrRemoved\r\n */\r\n public notify(_entityAddedOrRemoved: AddedEntity | RemovedEntity) {\r\n // Override me\r\n }\r\n}\r\n\r\n/**\r\n * An [[Entity]] with [[Component]] types that matches a [[System]] types exists in the current scene.\r\n */\r\nexport class AddedEntity implements Message<Entity> {\r\n readonly type: 'Entity Added' = 'Entity Added';\r\n constructor(public data: Entity) {}\r\n}\r\n\r\n/**\r\n * Type guard to check for AddedEntity messages\r\n * @param x\r\n */\r\nexport function isAddedSystemEntity(x: Message<Entity>): x is AddedEntity {\r\n return !!x && x.type === 'Entity Added';\r\n}\r\n\r\n/**\r\n * An [[Entity]] with [[Component]] types that no longer matches a [[System]] types exists in the current scene.\r\n */\r\nexport class RemovedEntity implements Message<Entity> {\r\n readonly type: 'Entity Removed' = 'Entity Removed';\r\n constructor(public data: Entity) {}\r\n}\r\n\r\n/**\r\n * type guard to check for the RemovedEntity message\r\n */\r\nexport function isRemoveSystemEntity(x: Message<Entity>): x is RemovedEntity {\r\n return !!x && x.type === 'Entity Removed';\r\n}\r\n","import { Entity, RemovedComponent, AddedComponent, isAddedComponent, isRemovedComponent } from './Entity';\r\nimport { Observer } from '../Util/Observable';\r\nimport { World } from './World';\r\nimport { Util } from '..';\r\n\r\n// Add/Remove entitys and components\r\n\r\nexport class EntityManager<ContextType = any> implements Observer<RemovedComponent | AddedComponent> {\r\n public entities: Entity[] = [];\r\n public _entityIndex: { [entityId: string]: Entity } = {};\r\n\r\n constructor(private _world: World<ContextType>) {}\r\n\r\n /**\r\n * Runs the entity lifecycle\r\n * @param _context\r\n */\r\n public updateEntities(_context: ContextType, elapsed: number) {\r\n for (const entity of this.entities) {\r\n // TODO is this right?\r\n entity.update((_context as any).engine, elapsed);\r\n if (!entity.active) {\r\n this.removeEntity(entity);\r\n }\r\n }\r\n }\r\n\r\n public findEntitiesForRemoval() {\r\n for (const entity of this.entities) {\r\n if (!entity.active) {\r\n this.removeEntity(entity);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * EntityManager observes changes on entities\r\n * @param message\r\n */\r\n public notify(message: RemovedComponent | AddedComponent): void {\r\n if (isAddedComponent(message)) {\r\n // we don't need the component, it's already on the entity\r\n this._world.queryManager.addEntity(message.data.entity);\r\n }\r\n\r\n if (isRemovedComponent(message)) {\r\n this._world.queryManager.removeComponent(message.data.entity, message.data.component);\r\n }\r\n }\r\n\r\n /**\r\n * Adds an entity to be tracked by the EntityManager\r\n * @param entity\r\n */\r\n public addEntity(entity: Entity): void {\r\n entity.active = true;\r\n if (entity && !this._entityIndex[entity.id]) {\r\n this._entityIndex[entity.id] = entity;\r\n this.entities.push(entity);\r\n this._world.queryManager.addEntity(entity);\r\n entity.componentAdded$.register(this);\r\n entity.componentRemoved$.register(this);\r\n\r\n // if entity has children\r\n entity.children.forEach((c) => this.addEntity(c));\r\n entity.childrenAdded$.register({\r\n notify: (e) => {\r\n this.addEntity(e);\r\n }\r\n });\r\n entity.childrenRemoved$.register({\r\n notify: (e) => {\r\n this.removeEntity(e, false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n public removeEntity(entity: Entity, deferred?: boolean): void;\r\n public removeEntity(id: number, deferred?: boolean): void;\r\n public removeEntity(idOrEntity: number | Entity, deferred = true): void {\r\n let id = 0;\r\n if (idOrEntity instanceof Entity) {\r\n id = idOrEntity.id;\r\n } else {\r\n id = idOrEntity;\r\n }\r\n const entity = this._entityIndex[id];\r\n if (entity && entity.active) {\r\n entity.kill();\r\n }\r\n\r\n if (entity && deferred) {\r\n this._entitiesToRemove.push(entity);\r\n return;\r\n }\r\n\r\n delete this._entityIndex[id];\r\n if (entity) {\r\n Util.removeItemFromArray(entity, this.entities);\r\n this._world.queryManager.removeEntity(entity);\r\n entity.componentAdded$.unregister(this);\r\n entity.componentRemoved$.unregister(this);\r\n\r\n // if entity has children\r\n entity.children.forEach((c) => this.removeEntity(c, deferred));\r\n entity.childrenAdded$.clear();\r\n entity.childrenRemoved$.clear();\r\n\r\n // stats\r\n if ((this._world.context as any)?.engine) {\r\n (this._world.context as any).engine.stats.currFrame.actors.killed++;\r\n }\r\n }\r\n }\r\n\r\n private _entitiesToRemove: Entity[] = [];\r\n public processEntityRemovals(): void {\r\n for (const entity of this._entitiesToRemove) {\r\n if (entity.active) {\r\n continue;\r\n }\r\n this.removeEntity(entity, false);\r\n }\r\n }\r\n\r\n public processComponentRemovals(): void {\r\n for (const entity of this.entities) {\r\n entity.processComponentRemoval();\r\n }\r\n }\r\n\r\n public getById(id: number): Entity {\r\n return this._entityIndex[id];\r\n }\r\n\r\n public getByName(name: string): Entity[]{\r\n return this.entities.filter(e => e.name === name);\r\n }\r\n\r\n public clear(): void {\r\n for (const entity of this.entities) {\r\n this.removeEntity(entity);\r\n }\r\n }\r\n}\r\n","export const buildTypeKey = (types: readonly string[]) => {\r\n const key = [...types].sort((a, b) => a.localeCompare(b)).join('+');\r\n return key;\r\n};\r\n","import { Entity } from './Entity';\r\nimport { buildTypeKey } from './Util';\r\nimport { Observable } from '../Util/Observable';\r\nimport { Util, Component, ComponentCtor } from '..';\r\nimport { AddedEntity, RemovedEntity } from './System';\r\n\r\n/**\r\n * Represents query for entities that match a list of types that is cached and observable\r\n *\r\n * Queries can be strongly typed by supplying a type union in the optional type parameter\r\n * ```typescript\r\n * const queryAB = new ex.Query<ComponentTypeA | ComponentTypeB>(['A', 'B']);\r\n * ```\r\n */\r\nexport class Query<T extends Component = Component> extends Observable<AddedEntity | RemovedEntity> {\r\n public types: readonly string[];\r\n private _entities: Entity[] = [];\r\n private _key: string;\r\n public get key(): string {\r\n if (this._key) {\r\n return this._key;\r\n }\r\n return (this._key = buildTypeKey(this.types));\r\n }\r\n\r\n constructor(types: readonly string[]);\r\n constructor(types: readonly ComponentCtor<T>[]);\r\n constructor(types: readonly string[] | readonly ComponentCtor<T>[]) {\r\n super();\r\n if (types[0] instanceof Function) {\r\n this.types = (types as ComponentCtor<T>[]).map(T => (new T).type);\r\n } else {\r\n this.types = types as string[];\r\n }\r\n }\r\n\r\n /**\r\n * Returns a list of entities that match the query\r\n *\r\n * @param sort Optional sorting function to sort entities returned from the query\r\n */\r\n public getEntities(sort?: (a: Entity, b: Entity) => number): Entity[] {\r\n if (sort) {\r\n this._entities.sort(sort);\r\n }\r\n return this._entities;\r\n }\r\n\r\n /**\r\n * Add an entity to the query, will only be added if the entity matches the query types\r\n * @param entity\r\n */\r\n public addEntity(entity: Entity): void {\r\n if (!Util.contains(this._entities, entity) && this.matches(entity)) {\r\n this._entities.push(entity);\r\n this.notifyAll(new AddedEntity(entity));\r\n }\r\n }\r\n\r\n /**\r\n * If the entity is part of the query it will be removed regardless of types\r\n * @param entity\r\n */\r\n public removeEntity(entity: Entity): void {\r\n if (Util.removeItemFromArray(entity, this._entities)) {\r\n this.notifyAll(new RemovedEntity(entity));\r\n }\r\n }\r\n\r\n /**\r\n * Removes all entities and observers from the query\r\n */\r\n public clear(): void {\r\n this._entities.length = 0;\r\n for (const observer of this.observers) {\r\n this.unregister(observer);\r\n }\r\n }\r\n\r\n /**\r\n * Returns whether the entity's types match query\r\n * @param entity\r\n */\r\n public matches(entity: Entity): boolean;\r\n\r\n /**\r\n * Returns whether the list of ComponentTypes have at least the same types as the query\r\n * @param types\r\n */\r\n public matches(types: string[]): boolean;\r\n public matches(typesOrEntity: string[] | Entity): boolean {\r\n let types: string[] = [];\r\n if (typesOrEntity instanceof Entity) {\r\n types = typesOrEntity.types;\r\n } else {\r\n types = typesOrEntity;\r\n }\r\n\r\n let matches = true;\r\n for (const type of this.types) {\r\n matches = matches && types.indexOf(type) > -1;\r\n if (!matches) {\r\n return false;\r\n }\r\n }\r\n return matches;\r\n }\r\n\r\n public contain(type: string) {\r\n return this.types.indexOf(type) > -1;\r\n }\r\n}\r\n","import { Entity } from './Entity';\r\nimport { buildTypeKey } from './Util';\r\nimport { Query } from './Query';\r\nimport { Component } from './Component';\r\nimport { World } from './World';\r\n\r\n/**\r\n * The query manager is responsible for updating all queries when entities/components change\r\n */\r\nexport class QueryManager {\r\n private _queries: { [entityComponentKey: string]: Query<any> } = {};\r\n\r\n constructor(private _world: World<any>) {}\r\n\r\n /**\r\n * Adds a query to the manager and populates with any entities that match\r\n * @param query\r\n */\r\n private _addQuery(query: Query<any>) {\r\n this._queries[buildTypeKey(query.types)] = query;\r\n for (const entity of this._world.entityManager.entities) {\r\n query.addEntity(entity);\r\n }\r\n }\r\n\r\n /**\r\n * Removes the query if there are no observers left\r\n * @param query\r\n */\r\n public maybeRemoveQuery(query: Query): void {\r\n if (query.observers.length === 0) {\r\n query.clear();\r\n delete this._queries[buildTypeKey(query.types)];\r\n }\r\n }\r\n\r\n /**\r\n * Adds the entity to any matching query in the query manage\r\n * @param entity\r\n */\r\n public addEntity(entity: Entity) {\r\n for (const queryType in this._queries) {\r\n if (this._queries[queryType]) {\r\n this._queries[queryType].addEntity(entity);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes an entity from queries if the removed component disqualifies it\r\n * @param entity\r\n * @param component\r\n */\r\n public removeComponent(entity: Entity, component: Component) {\r\n for (const queryType in this._queries) {\r\n // If the component being removed from an entity is a part of a query,\r\n // it is now disqualified from that query, remove it\r\n if (this._queries[queryType].contain(component.type)) {\r\n this._queries[queryType].removeEntity(entity);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes an entity from all queries it is currently a part of\r\n * @param entity\r\n */\r\n public removeEntity(entity: Entity) {\r\n for (const queryType in this._queries) {\r\n this._queries[queryType].removeEntity(entity);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a populated query and returns, if the query already exists that will be returned instead of a new instance\r\n * @param types\r\n */\r\n public createQuery<T extends Component = Component>(types: readonly string[]): Query<T> {\r\n const maybeExistingQuery = this.getQuery<T>(types);\r\n if (maybeExistingQuery) {\r\n return maybeExistingQuery;\r\n }\r\n const query = new Query<T>(types);\r\n this._addQuery(query);\r\n return query;\r\n }\r\n\r\n /**\r\n * Retrieves an existing query by types if it exists otherwise returns null\r\n * @param types\r\n */\r\n public getQuery<T extends Component = Component>(types: readonly string[]): Query<T> {\r\n const key = buildTypeKey(types);\r\n if (this._queries[key]) {\r\n return this._queries[key] as Query<T>;\r\n }\r\n return null;\r\n }\r\n}\r\n","import { System, SystemType } from './System';\r\nimport { Scene, Util } from '..';\r\nimport { World } from './World';\r\n\r\nexport interface SystemCtor<T extends System> {\r\n new (): T;\r\n}\r\n\r\n/**\r\n * The SystemManager is responsible for keeping track of all systems in a scene.\r\n * Systems are scene specific\r\n */\r\nexport class SystemManager<ContextType> {\r\n /**\r\n * List of systems, to add a new system call [[SystemManager.addSystem]]\r\n */\r\n public systems: System<any, ContextType>[] = [];\r\n public _keyToSystem: { [key: string]: System<any, ContextType> };\r\n public initialized = false;\r\n constructor(private _world: World<ContextType>) {}\r\n\r\n /**\r\n * Get a system registered in the manager by type\r\n * @param systemType\r\n * @returns\r\n */\r\n public get<T extends System>(systemType: SystemCtor<T>): T | null {\r\n return this.systems.find((s) => s instanceof systemType) as unknown as T;\r\n }\r\n\r\n /**\r\n * Adds a system to the manager, it will now be updated every frame\r\n * @param system\r\n */\r\n public addSystem(system: System<any, ContextType>): void {\r\n // validate system has types\r\n if (!system.types || system.types.length === 0) {\r\n throw new Error(`Attempted to add a System without any types`);\r\n }\r\n\r\n const query = this._world.queryManager.createQuery(system.types);\r\n this.systems.push(system);\r\n this.systems.sort((a, b) => a.priority - b.priority);\r\n query.register(system);\r\n if (this.initialized && system.initialize) {\r\n system.initialize(this._world.context);\r\n }\r\n }\r\n\r\n /**\r\n * Removes a system from the manager, it will no longer be updated\r\n * @param system\r\n */\r\n public removeSystem(system: System<any, ContextType>) {\r\n Util.removeItemFromArray(system, this.systems);\r\n const query = this._world.queryManager.getQuery(system.types);\r\n if (query) {\r\n query.unregister(system);\r\n this._world.queryManager.maybeRemoveQuery(query);\r\n }\r\n }\r\n\r\n /**\r\n * Updates all systems\r\n * @param type whether this is an update or draw system\r\n * @param context context reference\r\n * @param delta time in milliseconds\r\n */\r\n public updateSystems(type: SystemType, context: ContextType, delta: number) {\r\n if (!this.initialized) {\r\n this.initialized = true;\r\n for (const s of this.systems) {\r\n if (s.initialize) {\r\n s.initialize(this._world.context);\r\n }\r\n }\r\n }\r\n\r\n const systems = this.systems.filter((s) => s.systemType === type);\r\n for (const s of systems) {\r\n if (s.preupdate) {\r\n s.preupdate(context, delta);\r\n }\r\n }\r\n\r\n for (const s of systems) {\r\n // Get entities that match the system types, pre-sort\r\n const entities = this._world.queryManager.getQuery(s.types).getEntities(s.sort);\r\n // Initialize entities if needed\r\n if (context instanceof Scene) {\r\n for (const entity of entities) {\r\n entity._initialize(context?.engine);\r\n }\r\n }\r\n s.update(entities, delta);\r\n }\r\n\r\n for (const s of systems) {\r\n if (s.postupdate) {\r\n s.postupdate(context, delta);\r\n }\r\n }\r\n }\r\n\r\n public clear(): void {\r\n for (const system of this.systems) {\r\n this.removeSystem(system);\r\n }\r\n }\r\n}\r\n","import { Entity } from './Entity';\r\nimport { EntityManager } from './EntityManager';\r\nimport { QueryManager } from './QueryManager';\r\nimport { System, SystemType } from './System';\r\nimport { SystemManager } from './SystemManager';\r\n\r\n/**\r\n * The World is a self-contained entity component system for a particular context.\r\n */\r\nexport class World<ContextType> {\r\n public queryManager: QueryManager = new QueryManager(this);\r\n public entityManager: EntityManager<ContextType> = new EntityManager<ContextType>(this);\r\n public systemManager: SystemManager<ContextType> = new SystemManager<ContextType>(this);\r\n\r\n /**\r\n * The context type is passed to the system updates\r\n * @param context\r\n */\r\n constructor(public context: ContextType) {}\r\n\r\n /**\r\n * Update systems by type and time elapsed in milliseconds\r\n */\r\n update(type: SystemType, delta: number) {\r\n if (type === SystemType.Update) {\r\n this.entityManager.updateEntities(this.context, delta);\r\n }\r\n this.systemManager.updateSystems(type, this.context, delta);\r\n this.entityManager.findEntitiesForRemoval();\r\n this.entityManager.processComponentRemovals();\r\n this.entityManager.processEntityRemovals();\r\n }\r\n\r\n /**\r\n * Add an entity to the ECS world\r\n * @param entity\r\n */\r\n add(entity: Entity): void;\r\n /**\r\n * Add a system to the ECS world\r\n * @param system\r\n */\r\n add(system: System<any, ContextType>): void;\r\n add(entityOrSystem: Entity | System<any, ContextType>): void {\r\n if (entityOrSystem instanceof Entity) {\r\n this.entityManager.addEntity(entityOrSystem);\r\n }\r\n\r\n if (entityOrSystem instanceof System) {\r\n this.systemManager.addSystem(entityOrSystem);\r\n }\r\n }\r\n\r\n /**\r\n * Remove an entity from the ECS world\r\n * @param entity\r\n */\r\n remove(entity: Entity, deferred?: boolean): void;\r\n /**\r\n * Remove a system from the ECS world\r\n * @param system\r\n */\r\n remove(system: System<any, ContextType>): void;\r\n remove(entityOrSystem: Entity | System<any, ContextType>, deferred = true): void {\r\n if (entityOrSystem instanceof Entity) {\r\n this.entityManager.removeEntity(entityOrSystem, deferred);\r\n }\r\n\r\n if (entityOrSystem instanceof System) {\r\n this.systemManager.removeSystem(entityOrSystem);\r\n }\r\n }\r\n\r\n clearEntities(): void {\r\n this.entityManager.clear();\r\n }\r\n\r\n clearSystems(): void {\r\n this.systemManager.clear();\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\nimport { TransformComponent } from '../EntityComponentSystem';\nimport { MotionComponent } from '../EntityComponentSystem/Components/MotionComponent';\n\nexport class EulerIntegrator {\n static integrate(transform: TransformComponent, motion: MotionComponent, totalAcc: Vector, elapsedMs: number): void {\n const seconds = elapsedMs / 1000;\n motion.vel.addEqual(totalAcc.scale(seconds));\n transform.pos.addEqual(motion.vel.scale(seconds)).addEqual(totalAcc.scale(0.5 * seconds * seconds));\n\n motion.angularVelocity += motion.torque * (1.0 / motion.inertia) * seconds;\n transform.rotation += motion.angularVelocity * seconds;\n\n transform.scale.addEqual(motion.scaleFactor.scale(seconds));\n }\n}\n","import { Entity } from '../EntityComponentSystem';\r\nimport { MotionComponent } from '../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../EntityComponentSystem/Components/TransformComponent';\r\nimport { System, SystemType } from '../EntityComponentSystem/System';\r\nimport { Physics } from './Physics';\r\nimport { BodyComponent } from './BodyComponent';\r\nimport { CollisionType } from './CollisionType';\r\nimport { EulerIntegrator } from './Integrator';\r\n\r\nexport class MotionSystem extends System<TransformComponent | MotionComponent> {\r\n public readonly types = ['ex.transform', 'ex.motion'] as const;\r\n public systemType = SystemType.Update;\r\n public priority = -1;\r\n\r\n update(_entities: Entity[], elapsedMs: number): void {\r\n let transform: TransformComponent;\r\n let motion: MotionComponent;\r\n for (const entity of _entities) {\r\n transform = entity.get(TransformComponent);\r\n motion = entity.get(MotionComponent);\r\n\r\n const optionalBody = entity.get(BodyComponent);\r\n if (optionalBody?.sleeping) {\r\n continue;\r\n }\r\n\r\n const totalAcc = motion.acc.clone();\r\n if (optionalBody?.collisionType === CollisionType.Active && optionalBody?.useGravity) {\r\n totalAcc.addEqual(Physics.gravity);\r\n }\r\n optionalBody?.captureOldTransform();\r\n\r\n // Update transform and motion based on Euler linear algebra\r\n EulerIntegrator.integrate(transform, motion, totalAcc, elapsedMs);\r\n }\r\n }\r\n\r\n debugDraw(_ctx: CanvasRenderingContext2D) {\r\n // pass\r\n }\r\n}\r\n","import { CollisionContact } from '../Detection/CollisionContact';\r\n\r\n/**\r\n * A collision solver figures out how to position colliders such that they are no longer overlapping\r\n *\r\n * Solvers are executed in the order\r\n *\r\n * 1. preSolve\r\n * 2. solveVelocity\r\n * 3. solvePosition\r\n * 4. postSolve\r\n * @inheritdoc\r\n */\r\nexport abstract class CollisionSolver {\r\n /**\r\n * Pre-solve is fired on contacts before any resolution is started. It is used for any setup work before collision resolution\r\n * can proceed. Optionally contacts can be \"opted out\" of any collision processing by calling `contact.cancel()`\r\n * @param contacts\r\n * @inheritdoc\r\n */\r\n abstract preSolve(contacts: CollisionContact[]): void;\r\n\r\n /**\r\n * Post-solve is fired after all resolution is complete\r\n * @param contacts\r\n * @inheritdoc\r\n */\r\n abstract postSolve(contacts: CollisionContact[]): void;\r\n\r\n /**\r\n * Solve velocity adjusts the velocity of colliders so that they are not overlapping or will not be overlapping from velocity\r\n * @param contacts\r\n * @inheritdoc\r\n */\r\n abstract solveVelocity(contacts: CollisionContact[]): void;\r\n\r\n /**\r\n * Solve position adjust the position of collders so that they are not overlapping\r\n * @param contacts\r\n * @inheritdoc\r\n */\r\n abstract solvePosition(contacts: CollisionContact[]): void;\r\n\r\n /**\r\n * Solves overlapping contact in\r\n *\r\n * Solvers are executed in the order\r\n * 1. preSolve\r\n * 2. solveVelocity\r\n * 3. solvePosition\r\n * 4. postSolve\r\n * @param contacts\r\n */\r\n public solve(contacts: CollisionContact[]): CollisionContact[] {\r\n // Events and init\r\n this.preSolve(contacts);\r\n\r\n // Remove any canceled contacts\r\n contacts = contacts.filter(c => !c.isCanceled());\r\n\r\n // Solve velocity first\r\n this.solveVelocity(contacts);\r\n\r\n // Solve position last because non-overlap is the most important\r\n this.solvePosition(contacts);\r\n\r\n // Events and any contact house-keeping the solver needs\r\n this.postSolve(contacts);\r\n\r\n return contacts;\r\n }\r\n}","import { PostCollisionEvent, PreCollisionEvent } from '../../Events';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { CollisionType } from '../CollisionType';\r\nimport { Side } from '../Side';\r\nimport { CollisionSolver } from './Solver';\r\nimport { BodyComponent } from '../BodyComponent';\r\n\r\n/**\r\n * ArcadeSolver is the default in Excalibur. It solves collisions so that there is no overlap between contacts,\r\n * and negates velocity along the collision normal.\r\n *\r\n * This is usually the type of collisions used for 2D games that don't need a more realistic collision simulation.\r\n *\r\n */\r\nexport class ArcadeSolver extends CollisionSolver {\r\n public preSolve(contacts: CollisionContact[]) {\r\n for (const contact of contacts) {\r\n const side = Side.fromDirection(contact.mtv);\r\n const mtv = contact.mtv.negate();\r\n // Publish collision events on both participants\r\n contact.colliderA.events.emit('precollision', new PreCollisionEvent(contact.colliderA, contact.colliderB, side, mtv));\r\n contact.colliderB.events.emit(\r\n 'precollision',\r\n new PreCollisionEvent(contact.colliderB, contact.colliderA, Side.getOpposite(side), mtv.negate())\r\n );\r\n }\r\n }\r\n\r\n public postSolve(contacts: CollisionContact[]) {\r\n for (const contact of contacts) {\r\n const colliderA = contact.colliderA;\r\n const colliderB = contact.colliderB;\r\n const bodyA = colliderA.owner?.get(BodyComponent);\r\n const bodyB = colliderB.owner?.get(BodyComponent);\r\n if (bodyA && bodyB) {\r\n if (bodyA.collisionType === CollisionType.Passive || bodyB.collisionType === CollisionType.Passive) {\r\n continue;\r\n }\r\n }\r\n const side = Side.fromDirection(contact.mtv);\r\n const mtv = contact.mtv.negate();\r\n // Publish collision events on both participants\r\n contact.colliderA.events.emit('postcollision', new PostCollisionEvent(contact.colliderA, contact.colliderB, side, mtv));\r\n contact.colliderB.events.emit(\r\n 'postcollision',\r\n new PostCollisionEvent(contact.colliderB, contact.colliderA, Side.getOpposite(side), mtv.negate())\r\n );\r\n }\r\n }\r\n\r\n public solvePosition(contacts: CollisionContact[]) {\r\n for (const contact of contacts) {\r\n let mtv = contact.mtv;\r\n const colliderA = contact.colliderA;\r\n const colliderB = contact.colliderB;\r\n const bodyA = colliderA.owner?.get(BodyComponent);\r\n const bodyB = colliderB.owner?.get(BodyComponent);\r\n if (bodyA && bodyB) {\r\n if (bodyA.collisionType === CollisionType.Passive || bodyB.collisionType === CollisionType.Passive) {\r\n continue;\r\n }\r\n\r\n if (bodyA.collisionType === CollisionType.Active && bodyB.collisionType === CollisionType.Active) {\r\n // split overlaps if both are Active\r\n mtv = mtv.scale(0.5);\r\n }\r\n\r\n // Resolve overlaps\r\n if (bodyA.collisionType === CollisionType.Active) {\r\n bodyA.pos.x -= mtv.x;\r\n bodyA.pos.y -= mtv.y;\r\n }\r\n\r\n if (bodyB.collisionType === CollisionType.Active) {\r\n bodyB.pos.x += mtv.x;\r\n bodyB.pos.y += mtv.y;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public solveVelocity(contacts: CollisionContact[]) {\r\n for (const contact of contacts) {\r\n const colliderA = contact.colliderA;\r\n const colliderB = contact.colliderB;\r\n const bodyA = colliderA.owner?.get(BodyComponent);\r\n const bodyB = colliderB.owner?.get(BodyComponent);\r\n\r\n if (bodyA && bodyB) {\r\n\r\n if (bodyA.collisionType === CollisionType.Passive || bodyB.collisionType === CollisionType.Passive) {\r\n continue;\r\n }\r\n\r\n const normal = contact.normal;\r\n const opposite = normal.negate();\r\n\r\n // Cancel out velocity opposite direction of collision normal\r\n if (bodyA.collisionType === CollisionType.Active) {\r\n const velAdj = normal.scale(normal.dot(bodyA.vel.negate()));\r\n bodyA.vel = bodyA.vel.add(velAdj);\r\n }\r\n\r\n if (bodyB.collisionType === CollisionType.Active) {\r\n const velAdj = opposite.scale(opposite.dot(bodyB.vel.negate()));\r\n bodyB.vel = bodyB.vel.add(velAdj);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { Vector } from '../../Math/vector';\nimport { BodyComponent } from '../BodyComponent';\nimport { CollisionContact } from '../Detection/CollisionContact';\n\n/**\n * Holds information about contact points, meant to be reused over multiple frames of contact\n */\nexport class ContactConstraintPoint {\n constructor(public point: Vector, public local: Vector, public contact: CollisionContact) {\n this.update();\n }\n\n /**\n * Updates the contact information\n */\n update() {\n const bodyA = this.contact.colliderA.owner?.get(BodyComponent);\n const bodyB = this.contact.colliderB.owner?.get(BodyComponent);\n\n if (bodyA && bodyB) {\n const normal = this.contact.normal;\n const tangent = this.contact.tangent;\n\n this.aToContact = this.point.sub(bodyA.pos);\n this.bToContact = this.point.sub(bodyB.pos);\n\n const aToContactNormal = this.aToContact.cross(normal);\n const bToContactNormal = this.bToContact.cross(normal);\n\n this.normalMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\n\n const aToContactTangent = this.aToContact.cross(tangent);\n const bToContactTangent = this.bToContact.cross(tangent);\n\n this.tangentMass =\n bodyA.inverseMass +\n bodyB.inverseMass +\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\n }\n\n return this;\n }\n\n /**\n * Returns the relative velocity betwen bodyA and bodyB\n */\n public getRelativeVelocity() {\n const bodyA = this.contact.colliderA.owner?.get(BodyComponent);\n const bodyB = this.contact.colliderB.owner?.get(BodyComponent);\n if (bodyA && bodyB) {\n // Relative velocity in linear terms\n // Angular to linear velocity formula -> omega = velocity/radius so omega x radius = velocity\n const velA = bodyA.vel.add(Vector.cross(bodyA.angularVelocity, this.aToContact));\n const velB = bodyB.vel.add(Vector.cross(bodyB.angularVelocity, this.bToContact));\n return velB.sub(velA);\n }\n return Vector.Zero;\n }\n\n /**\n * Impulse accumulated over time in normal direction\n */\n public normalImpulse: number = 0;\n\n /**\n * Impulse accumulated over time in the tangent direction\n */\n public tangentImpulse: number = 0;\n\n /**\n * Effective mass seen in the normal direction\n */\n public normalMass: number = 0;\n\n /**\n * Effective mass seen in the tangent direction\n */\n public tangentMass: number = 0;\n\n /**\n * Direction from center of mass of bodyA to contact point\n */\n public aToContact: Vector = new Vector(0, 0);\n\n /**\n * Direction from center of mass of bodyB to contact point\n */\n public bToContact: Vector = new Vector(0, 0);\n}\n","import { CollisionPostSolveEvent, CollisionPreSolveEvent, PostCollisionEvent, PreCollisionEvent } from '../../Events';\r\nimport { clamp } from '../../Util/Util';\r\nimport { CollisionContact } from '../Detection/CollisionContact';\r\nimport { CollisionType } from '../CollisionType';\r\nimport { ContactConstraintPoint } from './ContactConstraintPoint';\r\nimport { Side } from '../Side';\r\nimport { Physics } from '../Physics';\r\nimport { CollisionSolver } from './Solver';\r\nimport { BodyComponent } from '../BodyComponent';\r\nimport { CollisionJumpTable } from '../Colliders/CollisionJumpTable';\r\n\r\nexport class RealisticSolver extends CollisionSolver {\r\n lastFrameContacts: Map<string, CollisionContact> = new Map();\r\n\r\n // map contact id to contact points\r\n idToContactConstraint: Map<string, ContactConstraintPoint[]> = new Map();\r\n\r\n getContactConstraints(id: string) {\r\n return this.idToContactConstraint.get(id) ?? [];\r\n }\r\n\r\n preSolve(contacts: CollisionContact[]) {\r\n for (const contact of contacts) {\r\n // Publish collision events on both participants\r\n const side = Side.fromDirection(contact.mtv);\r\n contact.colliderA.events.emit('precollision', new PreCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv));\r\n contact.colliderA.events.emit(\r\n 'beforecollisionresolve',\r\n new CollisionPreSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact) as any\r\n );\r\n contact.colliderB.events.emit(\r\n 'precollision',\r\n new PreCollisionEvent(contact.colliderB, contact.colliderA, Side.getOpposite(side), contact.mtv.negate())\r\n );\r\n contact.colliderB.events.emit(\r\n 'beforecollisionresolve',\r\n new CollisionPreSolveEvent(contact.colliderB, contact.colliderA, Side.getOpposite(side), contact.mtv.negate(), contact) as any\r\n );\r\n\r\n // Match awake state for sleeping\r\n contact.matchAwake();\r\n }\r\n\r\n // Keep track of contacts that done\r\n const finishedContactIds = Array.from(this.idToContactConstraint.keys());\r\n for (const contact of contacts) {\r\n // Remove all current contacts that are not done\r\n const index = finishedContactIds.indexOf(contact.id);\r\n if (index > -1) {\r\n finishedContactIds.splice(index, 1);\r\n }\r\n const contactPoints = this.idToContactConstraint.get(contact.id) ?? [];\r\n\r\n let pointIndex = 0;\r\n const bodyA = contact.colliderA.owner.get(BodyComponent);\r\n const bodyB = contact.colliderB.owner.get(BodyComponent);\r\n if (bodyA && bodyB) {\r\n for (const point of contact.points) {\r\n const normal = contact.normal;\r\n const tangent = contact.tangent;\r\n\r\n const aToContact = point.sub(bodyA.pos);\r\n const bToContact = point.sub(bodyB.pos);\r\n\r\n const aToContactNormal = aToContact.cross(normal);\r\n const bToContactNormal = bToContact.cross(normal);\r\n\r\n const normalMass =\r\n bodyA.inverseMass +\r\n bodyB.inverseMass +\r\n bodyA.inverseInertia * aToContactNormal * aToContactNormal +\r\n bodyB.inverseInertia * bToContactNormal * bToContactNormal;\r\n\r\n const aToContactTangent = aToContact.cross(tangent);\r\n const bToContactTangent = bToContact.cross(tangent);\r\n\r\n const tangentMass =\r\n bodyA.inverseMass +\r\n bodyB.inverseMass +\r\n bodyA.inverseInertia * aToContactTangent * aToContactTangent +\r\n bodyB.inverseInertia * bToContactTangent * bToContactTangent;\r\n\r\n // Preserve normal/tangent impulse by re-using the contact point if it's close\r\n if (contactPoints[pointIndex] && contactPoints[pointIndex]?.point?.squareDistance(point) < 4) {\r\n contactPoints[pointIndex].point = point;\r\n contactPoints[pointIndex].local = contact.localPoints[pointIndex];\r\n } else {\r\n // new contact if it's not close or doesn't exist\r\n contactPoints[pointIndex] = new ContactConstraintPoint(point, contact.localPoints[pointIndex], contact);\r\n }\r\n\r\n // Update contact point calculations\r\n contactPoints[pointIndex].aToContact = aToContact;\r\n contactPoints[pointIndex].bToContact = bToContact;\r\n contactPoints[pointIndex].normalMass = normalMass;\r\n contactPoints[pointIndex].tangentMass = tangentMass;\r\n\r\n pointIndex++;\r\n }\r\n }\r\n this.idToContactConstraint.set(contact.id, contactPoints);\r\n }\r\n\r\n // Clean up any contacts that did not occur last frame\r\n for (const id of finishedContactIds) {\r\n this.idToContactConstraint.delete(id);\r\n }\r\n\r\n // Warm contacts with accumulated impulse\r\n // Useful for tall stacks\r\n if (Physics.warmStart) {\r\n this.warmStart(contacts);\r\n } else {\r\n for (const contact of contacts) {\r\n const contactPoints = this.getContactConstraints(contact.id);\r\n for (const point of contactPoints) {\r\n point.normalImpulse = 0;\r\n point.tangentImpulse = 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n postSolve(contacts: CollisionContact[]) {\r\n for (const contact of contacts) {\r\n const bodyA = contact.colliderA.owner.get(BodyComponent);\r\n const bodyB = contact.colliderB.owner.get(BodyComponent);\r\n\r\n if (bodyA && bodyB) {\r\n // Skip post solve for active+passive collisions\r\n if (bodyA.collisionType === CollisionType.Passive || bodyB.collisionType === CollisionType.Passive) {\r\n continue;\r\n }\r\n\r\n // Update motion values for sleeping\r\n bodyA.updateMotion();\r\n bodyB.updateMotion();\r\n }\r\n\r\n // Publish collision events on both participants\r\n const side = Side.fromDirection(contact.mtv);\r\n contact.colliderA.events.emit('postcollision', new PostCollisionEvent(contact.colliderA, contact.colliderB, side, contact.mtv));\r\n contact.colliderA.events.emit(\r\n 'aftercollisionresolve',\r\n new CollisionPostSolveEvent(contact.colliderA, contact.colliderB, side, contact.mtv, contact) as any\r\n );\r\n contact.colliderB.events.emit(\r\n 'postcollision',\r\n new PostCollisionEvent(contact.colliderB, contact.colliderA, Side.getOpposite(side), contact.mtv.negate())\r\n );\r\n contact.colliderB.events.emit(\r\n 'aftercollisionresolve',\r\n new CollisionPostSolveEvent(contact.colliderB, contact.colliderA, Side.getOpposite(side), contact.mtv.negate(), contact) as any\r\n );\r\n }\r\n\r\n // Store contacts\r\n this.lastFrameContacts.clear();\r\n for (const c of contacts) {\r\n this.lastFrameContacts.set(c.id, c);\r\n }\r\n }\r\n\r\n /**\r\n * Warm up body's based on previous frame contact points\r\n * @param contacts\r\n */\r\n warmStart(contacts: CollisionContact[]) {\r\n for (const contact of contacts) {\r\n const bodyA = contact.colliderA.owner?.get(BodyComponent);\r\n const bodyB = contact.colliderB.owner?.get(BodyComponent);\r\n if (bodyA && bodyB) {\r\n const contactPoints = this.idToContactConstraint.get(contact.id) ?? [];\r\n for (const point of contactPoints) {\r\n if (Physics.warmStart) {\r\n const normalImpulse = contact.normal.scale(point.normalImpulse);\r\n const tangentImpulse = contact.tangent.scale(point.tangentImpulse);\r\n const impulse = normalImpulse.add(tangentImpulse);\r\n\r\n bodyA.applyImpulse(point.point, impulse.negate());\r\n bodyB.applyImpulse(point.point, impulse);\r\n } else {\r\n point.normalImpulse = 0;\r\n point.tangentImpulse = 0;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Iteratively solve the position overlap constraint\r\n * @param contacts\r\n */\r\n solvePosition(contacts: CollisionContact[]) {\r\n for (let i = 0; i < Physics.positionIterations; i++) {\r\n for (const contact of contacts) {\r\n const bodyA = contact.colliderA.owner?.get(BodyComponent);\r\n const bodyB = contact.colliderB.owner?.get(BodyComponent);\r\n\r\n if (bodyA && bodyB) {\r\n // Skip solving active+passive\r\n if (bodyA.collisionType === CollisionType.Passive || bodyB.collisionType === CollisionType.Passive) {\r\n continue;\r\n }\r\n\r\n const constraints = this.idToContactConstraint.get(contact.id) ?? [];\r\n for (const point of constraints) {\r\n const normal = contact.normal;\r\n const separation = CollisionJumpTable.FindContactSeparation(contact, point.local);\r\n\r\n const steeringConstant = Physics.steeringFactor; //0.2;\r\n const maxCorrection = -5;\r\n const slop = Physics.slop; //1;\r\n\r\n // Clamp to avoid over-correction\r\n // Remember that we are shooting for 0 overlap in the end\r\n const steeringForce = clamp(steeringConstant * (separation + slop), maxCorrection, 0);\r\n const impulse = normal.scale(-steeringForce / point.normalMass);\r\n\r\n // This is a pseudo impulse, meaning we aren't doing a real impulse calculation\r\n // We adjust position and rotation instead of doing the velocity\r\n if (bodyA.collisionType === CollisionType.Active) {\r\n bodyA.pos = bodyA.pos.add(impulse.negate().scale(bodyA.inverseMass));\r\n bodyA.rotation -= point.aToContact.cross(impulse) * bodyA.inverseInertia;\r\n }\r\n\r\n if (bodyB.collisionType === CollisionType.Active) {\r\n bodyB.pos = bodyB.pos.add(impulse.scale(bodyB.inverseMass));\r\n bodyB.rotation += point.bToContact.cross(impulse) * bodyB.inverseInertia;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n solveVelocity(contacts: CollisionContact[]) {\r\n for (let i = 0; i < Physics.velocityIterations; i++) {\r\n for (const contact of contacts) {\r\n const bodyA = contact.colliderA.owner?.get(BodyComponent);\r\n const bodyB = contact.colliderB.owner?.get(BodyComponent);\r\n\r\n if (bodyA && bodyB) {\r\n // Skip solving active+passive\r\n if (bodyA.collisionType === CollisionType.Passive || bodyB.collisionType === CollisionType.Passive) {\r\n continue;\r\n }\r\n\r\n const restitution = bodyA.bounciness * bodyB.bounciness;\r\n const friction = Math.min(bodyA.friction, bodyB.friction);\r\n\r\n const constraints = this.idToContactConstraint.get(contact.id) ?? [];\r\n\r\n for (const point of constraints) {\r\n const relativeVelocity = point.getRelativeVelocity();\r\n\r\n // Negate velocity in tangent direction to simulate friction\r\n const tangentVelocity = -relativeVelocity.dot(contact.tangent);\r\n let impulseDelta = tangentVelocity / point.tangentMass;\r\n\r\n // Clamping based in Erin Catto's GDC 2006 talk\r\n // Correct clamping https://github.com/erincatto/box2d-lite/blob/master/docs/GDC2006_Catto_Erin_PhysicsTutorial.pdf\r\n // Accumulated fiction impulse is always between -uMaxFriction < dT < uMaxFriction\r\n // But deltas can vary\r\n const maxFriction = friction * point.normalImpulse;\r\n const newImpulse = clamp(point.tangentImpulse + impulseDelta, -maxFriction, maxFriction);\r\n impulseDelta = newImpulse - point.tangentImpulse;\r\n point.tangentImpulse = newImpulse;\r\n\r\n const impulse = contact.tangent.scale(impulseDelta);\r\n bodyA.applyImpulse(point.point, impulse.negate());\r\n bodyB.applyImpulse(point.point, impulse);\r\n }\r\n\r\n for (const point of constraints) {\r\n // Need to recalc relative velocity because the previous step could have changed vel\r\n const relativeVelocity = point.getRelativeVelocity();\r\n\r\n // Compute impulse in normal direction\r\n const normalVelocity = relativeVelocity.dot(contact.normal);\r\n // See https://en.wikipedia.org/wiki/Collision_response\r\n let impulseDelta = (-(1 + restitution) * normalVelocity) / point.normalMass;\r\n\r\n // Clamping based in Erin Catto's GDC 2014 talk\r\n // Accumulated impulse stored in the contact is always positive (dV > 0)\r\n // But deltas can be negative\r\n const newImpulse = Math.max(point.normalImpulse + impulseDelta, 0);\r\n impulseDelta = newImpulse - point.normalImpulse;\r\n point.normalImpulse = newImpulse;\r\n\r\n const impulse = contact.normal.scale(impulseDelta);\r\n bodyA.applyImpulse(point.point, impulse.negate());\r\n bodyB.applyImpulse(point.point, impulse);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { Entity } from '../EntityComponentSystem';\r\nimport { MotionComponent } from '../EntityComponentSystem/Components/MotionComponent';\r\nimport { TransformComponent } from '../EntityComponentSystem/Components/TransformComponent';\r\nimport { AddedEntity, isAddedSystemEntity, RemovedEntity, System, SystemType } from '../EntityComponentSystem/System';\r\nimport { CollisionEndEvent, CollisionStartEvent, ContactEndEvent, ContactStartEvent } from '../Events';\r\nimport { CollisionResolutionStrategy, Physics } from './Physics';\r\nimport { ArcadeSolver } from './Solver/ArcadeSolver';\r\nimport { Collider } from './Colliders/Collider';\r\nimport { CollisionContact } from './Detection/CollisionContact';\r\nimport { DynamicTreeCollisionProcessor } from './Detection/DynamicTreeCollisionProcessor';\r\nimport { RealisticSolver } from './Solver/RealisticSolver';\r\nimport { CollisionSolver } from './Solver/Solver';\r\nimport { ColliderComponent } from './ColliderComponent';\r\nimport { CompositeCollider } from './Colliders/CompositeCollider';\r\nimport { Engine, ExcaliburGraphicsContext, Scene } from '..';\r\n\r\nexport class CollisionSystem extends System<TransformComponent | MotionComponent | ColliderComponent> {\r\n public readonly types = ['ex.transform', 'ex.motion', 'ex.collider'] as const;\r\n public systemType = SystemType.Update;\r\n public priority = -1;\r\n\r\n private _engine: Engine;\r\n private _realisticSolver = new RealisticSolver();\r\n private _arcadeSolver = new ArcadeSolver();\r\n private _processor = new DynamicTreeCollisionProcessor();\r\n private _lastFrameContacts = new Map<string, CollisionContact>();\r\n private _currentFrameContacts = new Map<string, CollisionContact>();\r\n\r\n private _trackCollider = (c: Collider) => this._processor.track(c);\r\n private _untrackCollider = (c: Collider) => this._processor.untrack(c);\r\n\r\n notify(message: AddedEntity | RemovedEntity) {\r\n if (isAddedSystemEntity(message)) {\r\n const colliderComponent = message.data.get(ColliderComponent);\r\n colliderComponent.$colliderAdded.subscribe(this._trackCollider);\r\n colliderComponent.$colliderRemoved.subscribe(this._untrackCollider);\r\n const collider = colliderComponent.get();\r\n if (collider) {\r\n this._processor.track(collider);\r\n }\r\n } else {\r\n const colliderComponent = message.data.get(ColliderComponent);\r\n const collider = colliderComponent.get();\r\n if (colliderComponent && collider) {\r\n this._processor.untrack(collider);\r\n }\r\n }\r\n }\r\n\r\n initialize(scene: Scene) {\r\n this._engine = scene.engine;\r\n }\r\n\r\n update(_entities: Entity[], elapsedMs: number): void {\r\n if (!Physics.enabled) {\r\n return;\r\n }\r\n\r\n // Collect up all the colliders\r\n let colliders: Collider[] = [];\r\n for (const entity of _entities) {\r\n const colliderComp = entity.get(ColliderComponent);\r\n const collider = colliderComp?.get();\r\n if (colliderComp && colliderComp.owner?.active && collider) {\r\n colliderComp.update();\r\n if (collider instanceof CompositeCollider) {\r\n colliders = colliders.concat(collider.getColliders());\r\n } else {\r\n colliders.push(collider);\r\n }\r\n }\r\n }\r\n\r\n // Update the spatial partitioning data structures\r\n // TODO if collider invalid it will break the processor\r\n // TODO rename \"update\" to something more specific\r\n this._processor.update(colliders);\r\n\r\n // Run broadphase on all colliders and locates potential collisions\r\n const pairs = this._processor.broadphase(colliders, elapsedMs);\r\n\r\n this._currentFrameContacts.clear();\r\n\r\n // Given possible pairs find actual contacts\r\n let contacts = this._processor.narrowphase(pairs, this._engine.debug.stats.currFrame);\r\n\r\n const solver: CollisionSolver = this.getSolver();\r\n\r\n // Solve, this resolves the position/velocity so entities arent overlapping\r\n contacts = solver.solve(contacts);\r\n\r\n // Record contacts\r\n contacts.forEach((c) => this._currentFrameContacts.set(c.id, c));\r\n\r\n // Emit contact start/end events\r\n this.runContactStartEnd();\r\n\r\n // reset the last frame cache\r\n this._lastFrameContacts.clear();\r\n\r\n // Keep track of collisions contacts that have started or ended\r\n this._lastFrameContacts = new Map(this._currentFrameContacts);\r\n }\r\n\r\n getSolver(): CollisionSolver {\r\n return Physics.collisionResolutionStrategy === CollisionResolutionStrategy.Realistic ? this._realisticSolver : this._arcadeSolver;\r\n }\r\n\r\n debug(ex: ExcaliburGraphicsContext) {\r\n this._processor.debug(ex);\r\n }\r\n\r\n public runContactStartEnd() {\r\n for (const [id, c] of this._currentFrameContacts) {\r\n // find all new contacts\r\n if (!this._lastFrameContacts.has(id)) {\r\n const colliderA = c.colliderA;\r\n const colliderB = c.colliderB;\r\n colliderA.events.emit('collisionstart', new CollisionStartEvent(colliderA, colliderB, c));\r\n colliderA.events.emit('contactstart', new ContactStartEvent(colliderA, colliderB, c) as any);\r\n colliderB.events.emit('collisionstart', new CollisionStartEvent(colliderB, colliderA, c));\r\n colliderB.events.emit('contactstart', new ContactStartEvent(colliderB, colliderA, c) as any);\r\n }\r\n }\r\n\r\n // find all contacts taht have ceased\r\n for (const [id, c] of this._lastFrameContacts) {\r\n if (!this._currentFrameContacts.has(id)) {\r\n const colliderA = c.colliderA;\r\n const colliderB = c.colliderB;\r\n colliderA.events.emit('collisionend', new CollisionEndEvent(colliderA, colliderB));\r\n colliderA.events.emit('contactend', new ContactEndEvent(colliderA, colliderB) as any);\r\n colliderB.events.emit('collisionend', new CollisionEndEvent(colliderB, colliderA));\r\n colliderB.events.emit('contactend', new ContactEndEvent(colliderB, colliderA) as any);\r\n }\r\n }\r\n }\r\n}\r\n","import { Graphic, GraphicOptions } from './Graphic';\r\nimport { clamp } from '../Util/Util';\r\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\r\nimport { EventDispatcher } from '../EventDispatcher';\r\nimport { SpriteSheet } from './SpriteSheet';\r\nimport { Logger } from '../Util/Log';\r\nimport { Engine, LegacyDrawing } from '..';\r\nimport { Sprite } from '.';\r\n\r\nexport interface HasTick {\r\n /**\r\n *\r\n * @param elapsedMilliseconds The amount of real world time in milliseconds that has elapsed that must be updated in the animation\r\n * @param idempotencyToken Optional idempotencyToken prevents a ticking animation from updating twice per frame\r\n */\r\n tick(elapsedMilliseconds: number, idempotencyToken?: number): void;\r\n}\r\n\r\nexport enum AnimationDirection {\r\n /**\r\n * Animation is playing forwards\r\n */\r\n Forward = 'forward',\r\n /**\r\n * Animation is play backwards\r\n */\r\n Backward = 'backward'\r\n}\r\n\r\nexport enum AnimationStrategy {\r\n /**\r\n * Animation ends without displaying anything\r\n */\r\n End = 'end',\r\n /**\r\n * Animation loops to the first frame after the last frame\r\n */\r\n Loop = 'loop',\r\n /**\r\n * Animation plays to the last frame, then backwards to the first frame, then repeats\r\n */\r\n PingPong = 'pingpong',\r\n /**\r\n * Animation ends stopping on the last frame\r\n */\r\n Freeze = 'freeze'\r\n}\r\n\r\n/**\r\n * Frame of animation\r\n */\r\nexport interface Frame {\r\n /**\r\n * Optionally specify a graphic to show, no graphic shows an empty frame\r\n */\r\n graphic?: Graphic;\r\n /**\r\n * Optionally specify the number of ms the frame should be visible, overrids the animation duration (default 100 ms)\r\n */\r\n duration?: number;\r\n}\r\n\r\n/**\r\n * Animation options for building an animation via constructor.\r\n */\r\nexport interface AnimationOptions {\r\n /**\r\n * List of frames in the order you wish to play them\r\n */\r\n frames: Frame[];\r\n /**\r\n * Optionally reverse the direction of play\r\n */\r\n reverse?: boolean;\r\n /**\r\n * Optionally specify a default frame duration in ms (Default is 1000)\r\n */\r\n frameDuration?: number;\r\n /**\r\n * Optionally specify a total duration of the animation in ms to calculate each frame's duration\r\n */\r\n totalDuration?: number;\r\n /**\r\n * Optionally specify the [[AnimationStrategy]] for the Animation\r\n */\r\n strategy?: AnimationStrategy;\r\n}\r\n\r\n// TODO wire up to new Emitter\r\nexport type AnimationEvents = {\r\n frame: Frame;\r\n loop: Animation;\r\n ended: Animation;\r\n};\r\n\r\n/**\r\n * Create an Animation given a list of [[Frame|frames]] in [[AnimationOptions]]\r\n *\r\n * To create an Animation from a [[SpriteSheet]], use [[Animation.fromSpriteSheet]]\r\n */\r\nexport class Animation extends Graphic implements HasTick {\r\n private static _LOGGER = Logger.getInstance();\r\n public events = new EventDispatcher<any>(this); // TODO replace with new Emitter\r\n public frames: Frame[] = [];\r\n public strategy: AnimationStrategy = AnimationStrategy.Loop;\r\n public frameDuration: number = 100;\r\n public timeScale: number = 1;\r\n\r\n private _idempotencyToken = -1;\r\n\r\n private _firstTick = true;\r\n private _currentFrame = 0;\r\n private _timeLeftInFrame = 0;\r\n private _direction = 1; // TODO only used in ping-pong\r\n private _done = false;\r\n private _playing = true;\r\n\r\n constructor(options: GraphicOptions & AnimationOptions) {\r\n super(options);\r\n this.frames = options.frames;\r\n this.strategy = options.strategy ?? this.strategy;\r\n this.frameDuration = options.totalDuration ? options.totalDuration / this.frames.length : options.frameDuration ?? this.frameDuration;\r\n if (options.reverse) {\r\n this.reverse();\r\n }\r\n this.goToFrame(0);\r\n }\r\n\r\n public clone(): Animation {\r\n return new Animation({\r\n frames: this.frames.map((f) => ({ ...f })),\r\n frameDuration: this.frameDuration,\r\n reverse: this._reversed,\r\n strategy: this.strategy,\r\n ...this.cloneGraphicOptions()\r\n });\r\n }\r\n\r\n /**\r\n * Create an Animation from a [[SpriteSheet]], a list of indices into the sprite sheet, a duration per frame\r\n * and optional [[AnimationStrategy]]\r\n *\r\n * Example:\r\n * ```typescript\r\n * const spriteSheet = SpriteSheet.fromImageSource({...});\r\n *\r\n * const anim = Animation.fromSpriteSheet(spriteSheet, range(0, 5), 200, AnimationStrategy.Loop);\r\n * ```\r\n *\r\n * @param spriteSheet\r\n * @param frameIndices\r\n * @param durationPerFrameMs\r\n * @param strategy\r\n */\r\n public static fromSpriteSheet(\r\n spriteSheet: SpriteSheet,\r\n frameIndices: number[],\r\n durationPerFrameMs: number,\r\n strategy: AnimationStrategy = AnimationStrategy.Loop\r\n ): Animation {\r\n const maxIndex = spriteSheet.sprites.length - 1;\r\n const invalidIndices = frameIndices.filter((index) => index < 0 || index > maxIndex);\r\n if (invalidIndices.length) {\r\n Animation._LOGGER.warn(\r\n `Indices into SpriteSheet were provided that don\\'t exist: ${invalidIndices.join(',')} no frame will be shown`\r\n );\r\n }\r\n return new Animation({\r\n frames: spriteSheet.sprites\r\n .filter((_, index) => frameIndices.indexOf(index) > -1)\r\n .map((f) => ({\r\n graphic: f,\r\n duration: durationPerFrameMs\r\n })),\r\n strategy: strategy\r\n });\r\n }\r\n\r\n /**\r\n * Converts an animation to a legacy animation\r\n * @deprecated\r\n * @param engine\r\n * @param animation\r\n * @returns LegacyDrawing.Animation\r\n */\r\n public static toLegacyAnimation(engine: Engine, animation: Animation): LegacyDrawing.Animation {\r\n const legacySprites = animation.frames.map(f => Sprite.toLegacySprite(f.graphic as Sprite));\r\n return new LegacyDrawing.Animation({\r\n sprites: legacySprites,\r\n loop: animation.strategy === AnimationStrategy.Loop,\r\n freezeFrame: animation.strategy === AnimationStrategy.Freeze ? legacySprites.length - 1 : undefined,\r\n speed: animation.frameDuration,\r\n engine: engine\r\n });\r\n }\r\n\r\n /**\r\n * Returns the current Frame of the animation\r\n */\r\n public get currentFrame(): Frame | null {\r\n if (this._currentFrame >= 0 && this._currentFrame < this.frames.length) {\r\n return this.frames[this._currentFrame];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the current frame index of the animation\r\n */\r\n public get currentFrameIndex(): number {\r\n return this._currentFrame;\r\n }\r\n\r\n /**\r\n * Returns `true` if the animation is playing\r\n */\r\n public get isPlaying(): boolean {\r\n return this._playing;\r\n }\r\n\r\n private _reversed = false;\r\n /**\r\n * Reverses the play direction of the Animation, this preserves the current frame\r\n */\r\n public reverse(): void {\r\n // Don't mutate with the original frame list, create a copy\r\n this.frames = this.frames.slice().reverse();\r\n this._reversed = !this._reversed;\r\n }\r\n\r\n /**\r\n * Returns the current play direction of the animation\r\n */\r\n public get direction(): AnimationDirection {\r\n // Keep logically consistent with ping-pong direction\r\n // If ping-pong is forward = 1 and reversed is true then we are logically reversed\r\n const reversed = (this._reversed && this._direction === 1) ? true : false;\r\n return reversed ? AnimationDirection.Backward : AnimationDirection.Forward;\r\n }\r\n\r\n /**\r\n * Plays or resumes the animation from the current frame\r\n */\r\n public play(): void {\r\n this._playing = true;\r\n }\r\n\r\n /**\r\n * Pauses the animation on the current frame\r\n */\r\n public pause(): void {\r\n this._playing = false;\r\n this._firstTick = true; // firstTick must be set to emit the proper frame event\r\n }\r\n\r\n /**\r\n * Reset the animation back to the beginning, including if the animation were done\r\n */\r\n public reset(): void {\r\n this._done = false;\r\n this._firstTick = true;\r\n this._currentFrame = 0;\r\n }\r\n\r\n /**\r\n * Returns `true` if the animation can end\r\n */\r\n public get canFinish(): boolean {\r\n switch (this.strategy) {\r\n case AnimationStrategy.End:\r\n case AnimationStrategy.Freeze: {\r\n return true;\r\n }\r\n default: {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns `true` if the animation is done, for looping type animations\r\n * `ex.AnimationStrategy.PingPong` and `ex.AnimationStrategy.Loop` this will always return `false`\r\n *\r\n * See the `ex.Animation.canFinish()` method to know if an animation type can end\r\n */\r\n public get done(): boolean {\r\n return this._done;\r\n }\r\n\r\n /**\r\n * Jump the animation immediately to a specific frame if it exists\r\n * @param frameNumber\r\n */\r\n public goToFrame(frameNumber: number) {\r\n this._currentFrame = frameNumber;\r\n this._timeLeftInFrame = this.frameDuration;\r\n const maybeFrame = this.frames[this._currentFrame];\r\n if (maybeFrame && !this._done) {\r\n this._timeLeftInFrame = maybeFrame?.duration || this.frameDuration;\r\n this.width = maybeFrame.graphic?.width;\r\n this.height = maybeFrame.graphic?.height;\r\n this.events.emit('frame', maybeFrame as any);\r\n }\r\n }\r\n\r\n private _nextFrame(): number {\r\n const currentFrame = this._currentFrame;\r\n if (this._done) {\r\n return currentFrame;\r\n }\r\n let next = -1;\r\n\r\n switch (this.strategy) {\r\n case AnimationStrategy.Loop: {\r\n next = (currentFrame + 1) % this.frames.length;\r\n if (next === 0) {\r\n this.events.emit('loop', this as any);\r\n }\r\n break;\r\n }\r\n case AnimationStrategy.End: {\r\n next = currentFrame + 1;\r\n if (next >= this.frames.length) {\r\n this._done = true;\r\n this._currentFrame = this.frames.length;\r\n this.events.emit('end', this as any);\r\n }\r\n break;\r\n }\r\n case AnimationStrategy.Freeze: {\r\n next = clamp(currentFrame + 1, 0, this.frames.length - 1);\r\n if (next >= this.frames.length - 1) {\r\n this._done = true;\r\n this.events.emit('end', this as any);\r\n }\r\n break;\r\n }\r\n case AnimationStrategy.PingPong: {\r\n if (currentFrame + this._direction >= this.frames.length) {\r\n this._direction = -1;\r\n this.events.emit('loop', this as any);\r\n }\r\n\r\n if (currentFrame + this._direction < 0) {\r\n this._direction = 1;\r\n this.events.emit('loop', this as any);\r\n }\r\n\r\n next = currentFrame + (this._direction % this.frames.length);\r\n break;\r\n }\r\n }\r\n return next;\r\n }\r\n\r\n /**\r\n * Called internally by Excalibur to update the state of the animation potential update the current frame\r\n * @param elapsedMilliseconds Milliseconds elapsed\r\n * @param idempotencyToken Prevents double ticking in a frame by passing a unique token to the frame\r\n */\r\n public tick(elapsedMilliseconds: number, idempotencyToken: number = 0): void {\r\n if (this._idempotencyToken === idempotencyToken) {\r\n return;\r\n }\r\n this._idempotencyToken = idempotencyToken;\r\n if (!this._playing) {\r\n return;\r\n }\r\n\r\n // if it's the first frame emit frame event\r\n if (this._firstTick) {\r\n this._firstTick = false;\r\n this.events.emit('frame', this.currentFrame as any);\r\n }\r\n\r\n this._timeLeftInFrame -= elapsedMilliseconds * this.timeScale;\r\n if (this._timeLeftInFrame <= 0) {\r\n this.goToFrame(this._nextFrame());\r\n }\r\n this._updateDimensions();\r\n }\r\n\r\n private _updateDimensions() {\r\n if (this.currentFrame) {\r\n this.width = this.currentFrame.graphic?.width;\r\n this.height = this.currentFrame.graphic?.height;\r\n }\r\n }\r\n\r\n protected _drawImage(ctx: ExcaliburGraphicsContext, x: number, y: number) {\r\n if (this.currentFrame) {\r\n this.currentFrame.graphic.draw(ctx, x, y);\r\n }\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\nimport { Graphic, GraphicOptions } from './Graphic';\nimport { Animation, HasTick } from './Animation';\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\nimport { BoundingBox } from '../Collision/Index';\n\nexport interface GraphicsGroupingOptions {\n members: GraphicsGrouping[];\n}\n\nexport interface GraphicsGrouping {\n pos: Vector;\n graphic: Graphic;\n}\n\nexport class GraphicsGroup extends Graphic implements HasTick {\n public members: GraphicsGrouping[] = [];\n\n constructor(options: GraphicsGroupingOptions & GraphicOptions) {\n super(options);\n this.members = options.members;\n this._updateDimensions();\n }\n\n public clone(): GraphicsGroup {\n return new GraphicsGroup({\n members: [...this.members],\n ...this.cloneGraphicOptions()\n });\n }\n\n private _updateDimensions(): BoundingBox {\n let bb = new BoundingBox();\n for (const { graphic, pos } of this.members) {\n bb = graphic.localBounds.translate(pos).combine(bb);\n }\n\n this.width = bb.width;\n this.height = bb.height;\n\n return bb;\n }\n\n public get localBounds(): BoundingBox {\n let bb = new BoundingBox();\n for (const { graphic, pos } of this.members) {\n bb = graphic.localBounds.translate(pos).combine(bb);\n }\n return bb;\n }\n\n private _isAnimationOrGroup(graphic: Graphic): graphic is Animation | GraphicsGroup {\n return graphic instanceof Animation || graphic instanceof GraphicsGroup;\n }\n\n public tick(elapsedMilliseconds: number, idempotencyToken?: number) {\n for (const member of this.members) {\n const maybeAnimation = member.graphic;\n if (this._isAnimationOrGroup(maybeAnimation)) {\n maybeAnimation.tick(elapsedMilliseconds, idempotencyToken);\n }\n }\n }\n\n public reset() {\n for (const member of this.members) {\n const maybeAnimation = member.graphic;\n if (this._isAnimationOrGroup(maybeAnimation)) {\n maybeAnimation.reset();\n }\n }\n }\n\n protected _preDraw(ex: ExcaliburGraphicsContext, x: number, y: number) {\n this._updateDimensions();\n super._preDraw(ex, x, y);\n }\n\n protected _drawImage(ex: ExcaliburGraphicsContext, x: number, y: number) {\n for (const member of this.members) {\n ex.save();\n ex.translate(x, y);\n member.graphic.draw(ex, member.pos.x, member.pos.y);\n if (this.showDebug) {\n /* istanbul ignore next */\n ex.debug.drawRect(0, 0, this.width, this.height);\n }\n ex.restore();\n }\n }\n}\n","import { Engine } from './Engine';\r\nimport { Actor } from './Actor';\r\nimport { Color } from './Color';\r\nimport { Vector, vec } from './Math/vector';\r\nimport * as Util from './Util/Util';\r\nimport * as DrawUtil from './Util/DrawUtil';\r\nimport * as Traits from './Traits/Index';\r\nimport { Configurable } from './Configurable';\r\nimport { Random } from './Math/Random';\r\nimport { CollisionType } from './Collision/CollisionType';\r\nimport { TransformComponent } from './EntityComponentSystem/Components/TransformComponent';\r\nimport { GraphicsComponent } from './Graphics/GraphicsComponent';\r\nimport { Entity } from './EntityComponentSystem/Entity';\r\nimport { CanvasDrawComponent } from './Drawing/Index';\r\nimport { Sprite } from './Graphics/Sprite';\r\nimport { LegacyDrawing } from '.';\r\n\r\n/**\r\n * An enum that represents the types of emitter nozzles\r\n */\r\nexport enum EmitterType {\r\n /**\r\n * Constant for the circular emitter type\r\n */\r\n Circle,\r\n /**\r\n * Constant for the rectangular emitter type\r\n */\r\n Rectangle\r\n}\r\n\r\n/**\r\n * @hidden\r\n */\r\nexport class ParticleImpl extends Entity {\r\n public position: Vector = new Vector(0, 0);\r\n public velocity: Vector = new Vector(0, 0);\r\n public acceleration: Vector = new Vector(0, 0);\r\n public particleRotationalVelocity: number = 0;\r\n public currentRotation: number = 0;\r\n\r\n public focus: Vector = null;\r\n public focusAccel: number = 0;\r\n public opacity: number = 1;\r\n public beginColor: Color = Color.White;\r\n public endColor: Color = Color.White;\r\n\r\n // Life is counted in ms\r\n public life: number = 300;\r\n public fadeFlag: boolean = false;\r\n\r\n // Color transitions\r\n private _rRate: number = 1;\r\n private _gRate: number = 1;\r\n private _bRate: number = 1;\r\n private _aRate: number = 0;\r\n private _currentColor: Color = Color.White;\r\n\r\n public emitter: ParticleEmitter = null;\r\n public particleSize: number = 5;\r\n public particleSprite: LegacyDrawing.Sprite = null;\r\n\r\n public startSize: number;\r\n public endSize: number;\r\n public sizeRate: number = 0;\r\n public elapsedMultiplier: number = 0;\r\n\r\n public visible = true;\r\n public isOffscreen = false;\r\n\r\n public transform: TransformComponent;\r\n public graphics: GraphicsComponent;\r\n\r\n constructor(\r\n emitterOrConfig: ParticleEmitter | ParticleArgs,\r\n life?: number,\r\n opacity?: number,\r\n beginColor?: Color,\r\n endColor?: Color,\r\n position?: Vector,\r\n velocity?: Vector,\r\n acceleration?: Vector,\r\n startSize?: number,\r\n endSize?: number\r\n ) {\r\n super();\r\n let emitter = emitterOrConfig;\r\n if (emitter && !(emitterOrConfig instanceof ParticleEmitter)) {\r\n const config = emitterOrConfig;\r\n emitter = config.emitter;\r\n life = config.life;\r\n opacity = config.opacity;\r\n endColor = config.endColor;\r\n beginColor = config.beginColor;\r\n position = config.position;\r\n velocity = config.velocity;\r\n acceleration = config.acceleration;\r\n startSize = config.startSize;\r\n endSize = config.endSize;\r\n }\r\n this.emitter = <ParticleEmitter>emitter;\r\n this.life = life || this.life;\r\n this.opacity = opacity || this.opacity;\r\n this.endColor = endColor || this.endColor.clone();\r\n this.beginColor = beginColor || this.beginColor.clone();\r\n this._currentColor = this.beginColor.clone();\r\n this.position = (position || this.position).add(this.emitter.pos);\r\n this.velocity = velocity || this.velocity;\r\n this.acceleration = acceleration || this.acceleration;\r\n this._rRate = (this.endColor.r - this.beginColor.r) / this.life;\r\n this._gRate = (this.endColor.g - this.beginColor.g) / this.life;\r\n this._bRate = (this.endColor.b - this.beginColor.b) / this.life;\r\n this._aRate = this.opacity / this.life;\r\n\r\n this.startSize = startSize || 0;\r\n this.endSize = endSize || 0;\r\n\r\n if (this.endSize > 0 && this.startSize > 0) {\r\n this.sizeRate = (this.endSize - this.startSize) / this.life;\r\n this.particleSize = this.startSize;\r\n }\r\n\r\n this.addComponent((this.transform = new TransformComponent()));\r\n this.addComponent(new CanvasDrawComponent((ctx) => this.draw(ctx)));\r\n this.addComponent((this.graphics = new GraphicsComponent()));\r\n\r\n this.transform.pos = this.position;\r\n this.transform.rotation = this.currentRotation;\r\n this.transform.scale = vec(1, 1); // TODO wut\r\n if (this.particleSprite) {\r\n this.graphics.opacity = this.opacity;\r\n this.graphics.use(Sprite.fromLegacySprite(this.particleSprite));\r\n } else {\r\n this.graphics.onPostDraw = (ctx) => {\r\n ctx.save();\r\n this.graphics.opacity = this.opacity;\r\n const tmpColor = this._currentColor.clone();\r\n tmpColor.a = 1;\r\n ctx.debug.drawPoint(vec(0, 0), { color: tmpColor, size: this.particleSize });\r\n ctx.restore();\r\n };\r\n }\r\n }\r\n\r\n public kill() {\r\n this.emitter.removeParticle(this);\r\n }\r\n\r\n public update(_engine: Engine, delta: number) {\r\n this.life = this.life - delta;\r\n this.elapsedMultiplier = this.elapsedMultiplier + delta;\r\n\r\n if (this.life < 0) {\r\n this.kill();\r\n }\r\n\r\n if (this.fadeFlag) {\r\n this.opacity = Util.clamp(this._aRate * this.life, 0.0001, 1);\r\n }\r\n\r\n if (this.startSize > 0 && this.endSize > 0) {\r\n this.particleSize = Util.clamp(\r\n this.sizeRate * delta + this.particleSize,\r\n Math.min(this.startSize, this.endSize),\r\n Math.max(this.startSize, this.endSize)\r\n );\r\n }\r\n\r\n this._currentColor.r = Util.clamp(this._currentColor.r + this._rRate * delta, 0, 255);\r\n this._currentColor.g = Util.clamp(this._currentColor.g + this._gRate * delta, 0, 255);\r\n this._currentColor.b = Util.clamp(this._currentColor.b + this._bRate * delta, 0, 255);\r\n this._currentColor.a = Util.clamp(this.opacity, 0.0001, 1);\r\n\r\n if (this.focus) {\r\n const accel = this.focus\r\n .sub(this.position)\r\n .normalize()\r\n .scale(this.focusAccel)\r\n .scale(delta / 1000);\r\n this.velocity = this.velocity.add(accel);\r\n } else {\r\n this.velocity = this.velocity.add(this.acceleration.scale(delta / 1000));\r\n }\r\n this.position = this.position.add(this.velocity.scale(delta / 1000));\r\n\r\n if (this.particleRotationalVelocity) {\r\n this.currentRotation = (this.currentRotation + (this.particleRotationalVelocity * delta) / 1000) % (2 * Math.PI);\r\n }\r\n\r\n this.transform.pos = this.position;\r\n this.transform.rotation = this.currentRotation;\r\n this.transform.scale = vec(1, 1); // todo wut\r\n this.graphics.opacity = this.opacity;\r\n }\r\n\r\n public draw(ctx: CanvasRenderingContext2D) {\r\n if (this.particleSprite) {\r\n this.particleSprite.opacity(this.opacity);\r\n this.particleSprite.draw(ctx, 0, 0);\r\n return;\r\n }\r\n\r\n ctx.save();\r\n this._currentColor.a = Util.clamp(this.opacity, 0.0001, 1);\r\n ctx.fillStyle = this._currentColor.toString();\r\n ctx.beginPath();\r\n ctx.arc(0, 0, this.particleSize, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.closePath();\r\n ctx.restore();\r\n }\r\n}\r\n\r\nexport interface ParticleArgs extends Partial<ParticleImpl> {\r\n emitter: ParticleEmitter;\r\n position?: Vector;\r\n velocity?: Vector;\r\n acceleration?: Vector;\r\n particleRotationalVelocity?: number;\r\n currentRotation?: number;\r\n particleSize?: number;\r\n particleSprite?: LegacyDrawing.Sprite;\r\n}\r\n\r\n/**\r\n * Particle is used in a [[ParticleEmitter]]\r\n */\r\nexport class Particle extends Configurable(ParticleImpl) {\r\n constructor(config: ParticleArgs);\r\n constructor(\r\n emitter: ParticleEmitter,\r\n life?: number,\r\n opacity?: number,\r\n beginColor?: Color,\r\n endColor?: Color,\r\n position?: Vector,\r\n velocity?: Vector,\r\n acceleration?: Vector,\r\n startSize?: number,\r\n endSize?: number\r\n );\r\n constructor(\r\n emitterOrConfig: ParticleEmitter | ParticleArgs,\r\n life?: number,\r\n opacity?: number,\r\n beginColor?: Color,\r\n endColor?: Color,\r\n position?: Vector,\r\n velocity?: Vector,\r\n acceleration?: Vector,\r\n startSize?: number,\r\n endSize?: number\r\n ) {\r\n super(emitterOrConfig, life, opacity, beginColor, endColor, position, velocity, acceleration, startSize, endSize);\r\n }\r\n}\r\n\r\nexport interface ParticleEmitterArgs {\r\n x?: number;\r\n y?: number;\r\n pos?: Vector;\r\n width?: number;\r\n height?: number;\r\n isEmitting?: boolean;\r\n minVel?: number;\r\n maxVel?: number;\r\n acceleration?: Vector;\r\n minAngle?: number;\r\n maxAngle?: number;\r\n emitRate?: number;\r\n particleLife?: number;\r\n opacity?: number;\r\n fadeFlag?: boolean;\r\n focus?: Vector;\r\n focusAccel?: number;\r\n startSize?: number;\r\n endSize?: number;\r\n minSize?: number;\r\n maxSize?: number;\r\n beginColor?: Color;\r\n endColor?: Color;\r\n particleSprite?: LegacyDrawing.Sprite;\r\n emitterType?: EmitterType;\r\n radius?: number;\r\n particleRotationalVelocity?: number;\r\n randomRotation?: boolean;\r\n random?: Random;\r\n}\r\n\r\n/**\r\n * Using a particle emitter is a great way to create interesting effects\r\n * in your game, like smoke, fire, water, explosions, etc. `ParticleEmitter`\r\n * extend [[Actor]] allowing you to use all of the features that come with.\r\n */\r\nexport class ParticleEmitter extends Actor {\r\n private _particlesToEmit: number = 0;\r\n\r\n public numParticles: number = 0;\r\n\r\n /**\r\n * Random number generator\r\n */\r\n public random: Random;\r\n\r\n /**\r\n * Gets or sets the isEmitting flag\r\n */\r\n public isEmitting: boolean = true;\r\n /**\r\n * Gets or sets the backing particle collection\r\n */\r\n public particles: Particle[] = [];\r\n\r\n /**\r\n * Gets or sets the backing deadParticle collection\r\n */\r\n public deadParticles: Particle[] = [];\r\n\r\n /**\r\n * Gets or sets the minimum particle velocity\r\n */\r\n public minVel: number = 0;\r\n /**\r\n * Gets or sets the maximum particle velocity\r\n */\r\n public maxVel: number = 0;\r\n\r\n /**\r\n * Gets or sets the acceleration vector for all particles\r\n */\r\n public acceleration: Vector = new Vector(0, 0);\r\n\r\n /**\r\n * Gets or sets the minimum angle in radians\r\n */\r\n public minAngle: number = 0;\r\n /**\r\n * Gets or sets the maximum angle in radians\r\n */\r\n public maxAngle: number = 0;\r\n\r\n /**\r\n * Gets or sets the emission rate for particles (particles/sec)\r\n */\r\n public emitRate: number = 1; //particles/sec\r\n /**\r\n * Gets or sets the life of each particle in milliseconds\r\n */\r\n public particleLife: number = 2000;\r\n /**\r\n * Gets the opacity of each particle from 0 to 1.0\r\n */\r\n public get opacity(): number {\r\n return super.graphics.opacity;\r\n }\r\n /**\r\n * Gets the opacity of each particle from 0 to 1.0\r\n */\r\n public set opacity(opacity: number) {\r\n super.graphics.opacity = opacity;\r\n }\r\n /**\r\n * Gets or sets the fade flag which causes particles to gradually fade out over the course of their life.\r\n */\r\n public fadeFlag: boolean = false;\r\n\r\n /**\r\n * Gets or sets the optional focus where all particles should accelerate towards\r\n */\r\n public focus: Vector = null;\r\n /**\r\n * Gets or sets the acceleration for focusing particles if a focus has been specified\r\n */\r\n public focusAccel: number = null;\r\n /**\r\n * Gets or sets the optional starting size for the particles\r\n */\r\n public startSize: number = null;\r\n /**\r\n * Gets or sets the optional ending size for the particles\r\n */\r\n public endSize: number = null;\r\n\r\n /**\r\n * Gets or sets the minimum size of all particles\r\n */\r\n public minSize: number = 5;\r\n /**\r\n * Gets or sets the maximum size of all particles\r\n */\r\n public maxSize: number = 5;\r\n\r\n /**\r\n * Gets or sets the beginning color of all particles\r\n */\r\n public beginColor: Color = Color.White;\r\n /**\r\n * Gets or sets the ending color of all particles\r\n */\r\n public endColor: Color = Color.White;\r\n\r\n private _og: LegacyDrawing.Sprite = null;\r\n private _sprite: Sprite = null;\r\n /**\r\n * Gets or sets the sprite that a particle should use\r\n */\r\n public get particleSprite(): LegacyDrawing.Sprite {\r\n return this._og;\r\n }\r\n\r\n public set particleSprite(val: LegacyDrawing.Sprite) {\r\n this._og = val;\r\n if (val) {\r\n this._sprite = Sprite.fromLegacySprite(val);\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the emitter type for the particle emitter\r\n */\r\n public emitterType: EmitterType = EmitterType.Rectangle;\r\n\r\n /**\r\n * Gets or sets the emitter radius, only takes effect when the [[emitterType]] is [[EmitterType.Circle]]\r\n */\r\n public radius: number = 0;\r\n\r\n /**\r\n * Gets or sets the particle rotational speed velocity\r\n */\r\n public particleRotationalVelocity: number = 0;\r\n\r\n /**\r\n * Indicates whether particles should start with a random rotation\r\n */\r\n public randomRotation: boolean = false;\r\n\r\n /**\r\n * @param config particle emitter options bag\r\n */\r\n constructor(config: ParticleEmitterArgs) {\r\n super({ width: config.width ?? 0, height: config.height ?? 0 });\r\n\r\n const {\r\n x,\r\n y,\r\n pos,\r\n isEmitting,\r\n minVel,\r\n maxVel,\r\n acceleration,\r\n minAngle,\r\n maxAngle,\r\n emitRate,\r\n particleLife,\r\n opacity,\r\n fadeFlag,\r\n focus,\r\n focusAccel,\r\n startSize,\r\n endSize,\r\n minSize,\r\n maxSize,\r\n beginColor,\r\n endColor,\r\n particleSprite,\r\n emitterType,\r\n radius,\r\n particleRotationalVelocity,\r\n randomRotation,\r\n random\r\n } = { ...config };\r\n\r\n this.pos = pos ?? vec(x ?? 0, y ?? 0);\r\n this.isEmitting = isEmitting ?? this.isEmitting;\r\n this.minVel = minVel ?? this.minVel;\r\n this.maxVel = maxVel ?? this.maxVel;\r\n this.acceleration = acceleration ?? this.acceleration;\r\n this.minAngle = minAngle ?? this.minAngle;\r\n this.maxAngle = maxAngle ?? this.maxAngle;\r\n this.emitRate = emitRate ?? this.emitRate;\r\n this.particleLife = particleLife ?? this.particleLife;\r\n this.opacity = opacity ?? this.opacity;\r\n this.fadeFlag = fadeFlag ?? this.fadeFlag;\r\n this.focus = focus ?? this.focus;\r\n this.focusAccel = focusAccel ?? this.focusAccel;\r\n this.startSize = startSize ?? this.startSize;\r\n this.endSize = endSize ?? this.endSize;\r\n this.minSize = minSize ?? this.minSize;\r\n this.maxSize = maxSize ?? this.maxSize;\r\n this.beginColor = beginColor ?? this.beginColor;\r\n this.endColor = endColor ?? this.endColor;\r\n this.particleSprite = particleSprite ?? this.particleSprite;\r\n this.emitterType = emitterType ?? this.emitterType;\r\n this.radius = radius ?? this.radius;\r\n this.particleRotationalVelocity = particleRotationalVelocity ?? this.particleRotationalVelocity;\r\n this.randomRotation = randomRotation ?? this.randomRotation;\r\n\r\n this.body.collisionType = CollisionType.PreventCollision;\r\n\r\n this.random = random ?? new Random();\r\n\r\n // Remove offscreen culling from particle emitters\r\n for (let i = 0; i < this.traits.length; i++) {\r\n if (this.traits[i] instanceof Traits.OffscreenCulling) {\r\n this.traits.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n public removeParticle(particle: Particle) {\r\n this.deadParticles.push(particle);\r\n }\r\n\r\n /**\r\n * Causes the emitter to emit particles\r\n * @param particleCount Number of particles to emit right now\r\n */\r\n public emitParticles(particleCount: number) {\r\n for (let i = 0; i < particleCount; i++) {\r\n const p = this._createParticle();\r\n this.particles.push(p);\r\n if (this?.scene?.world) {\r\n this.scene.world.add(p);\r\n }\r\n }\r\n }\r\n\r\n public clearParticles() {\r\n this.particles.length = 0;\r\n }\r\n\r\n // Creates a new particle given the constraints of the emitter\r\n private _createParticle(): Particle {\r\n // todo implement emitter constraints;\r\n let ranX = 0;\r\n let ranY = 0;\r\n\r\n const angle = Util.randomInRange(this.minAngle, this.maxAngle, this.random);\r\n const vel = Util.randomInRange(this.minVel, this.maxVel, this.random);\r\n const size = this.startSize || Util.randomInRange(this.minSize, this.maxSize, this.random);\r\n const dx = vel * Math.cos(angle);\r\n const dy = vel * Math.sin(angle);\r\n\r\n if (this.emitterType === EmitterType.Rectangle) {\r\n ranX = Util.randomInRange(0, this.width, this.random);\r\n ranY = Util.randomInRange(0, this.height, this.random);\r\n } else if (this.emitterType === EmitterType.Circle) {\r\n const radius = Util.randomInRange(0, this.radius, this.random);\r\n ranX = radius * Math.cos(angle);\r\n ranY = radius * Math.sin(angle);\r\n }\r\n\r\n const p = new Particle(\r\n this,\r\n this.particleLife,\r\n this.opacity,\r\n this.beginColor,\r\n this.endColor,\r\n new Vector(ranX, ranY),\r\n new Vector(dx, dy),\r\n this.acceleration,\r\n this.startSize,\r\n this.endSize\r\n );\r\n p.fadeFlag = this.fadeFlag;\r\n p.particleSize = size;\r\n if (this.particleSprite) {\r\n p.particleSprite = this.particleSprite;\r\n p.graphics.opacity = this.opacity;\r\n p.graphics.use(this._sprite);\r\n }\r\n p.particleRotationalVelocity = this.particleRotationalVelocity;\r\n if (this.randomRotation) {\r\n p.currentRotation = Util.randomInRange(0, Math.PI * 2, this.random);\r\n }\r\n if (this.focus) {\r\n p.focus = this.focus.add(new Vector(this.pos.x, this.pos.y));\r\n p.focusAccel = this.focusAccel;\r\n }\r\n return p;\r\n }\r\n\r\n public update(engine: Engine, delta: number) {\r\n super.update(engine, delta);\r\n\r\n if (this.isEmitting) {\r\n this._particlesToEmit += this.emitRate * (delta / 1000);\r\n if (this._particlesToEmit > 1.0) {\r\n this.emitParticles(Math.floor(this._particlesToEmit));\r\n this._particlesToEmit = this._particlesToEmit - Math.floor(this._particlesToEmit);\r\n }\r\n }\r\n\r\n // deferred removal\r\n for (let i = 0; i < this.deadParticles.length; i++) {\r\n Util.removeItemFromArray(this.deadParticles[i], this.particles);\r\n if (this?.scene?.world) {\r\n this.scene.world.remove(this.deadParticles[i], false);\r\n }\r\n }\r\n this.deadParticles.length = 0;\r\n }\r\n\r\n public draw(ctx: CanvasRenderingContext2D) {\r\n // todo is there a more efficient to draw\r\n // possibly use a webgl offscreen canvas and shaders to do particles?\r\n this.particles.forEach((p) => p.draw(ctx));\r\n }\r\n\r\n public debugDraw(ctx: CanvasRenderingContext2D) {\r\n super.debugDraw(ctx);\r\n ctx.fillStyle = Color.Black.toString();\r\n ctx.fillText('Particles: ' + this.particles.length, this.pos.x, this.pos.y + 20);\r\n\r\n if (this.focus) {\r\n ctx.fillRect(this.focus.x + this.pos.x, this.focus.y + this.pos.y, 3, 3);\r\n DrawUtil.line(ctx, Color.Yellow, this.focus.x + this.pos.x, this.focus.y + this.pos.y, this.center.x, this.center.y);\r\n ctx.fillText('Focus', this.focus.x + this.pos.x, this.focus.y + this.pos.y);\r\n }\r\n }\r\n}\r\n","import { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\r\nimport { Scene } from '../Scene';\r\nimport { GraphicsComponent } from './GraphicsComponent';\r\nimport { vec } from '../Math/vector';\r\nimport { CoordPlane, TransformComponent } from '../EntityComponentSystem/Components/TransformComponent';\r\nimport { Entity } from '../EntityComponentSystem/Entity';\r\nimport { Camera } from '../Camera';\r\nimport { System, SystemType, TagComponent } from '../EntityComponentSystem';\r\nimport { Engine } from '../Engine';\r\nimport { GraphicsDiagnostics } from './GraphicsDiagnostics';\r\nimport { EnterViewPortEvent, ExitViewPortEvent } from '../Events';\r\nimport { GraphicsGroup } from '.';\r\nimport { Particle } from '../Particles';\r\n\r\nexport class GraphicsSystem extends System<TransformComponent | GraphicsComponent> {\r\n public readonly types = ['ex.transform', 'ex.graphics'] as const;\r\n public readonly systemType = SystemType.Draw;\r\n public priority = 0;\r\n private _token = 0;\r\n private _graphicsContext: ExcaliburGraphicsContext;\r\n private _camera: Camera;\r\n private _engine: Engine;\r\n\r\n public initialize(scene: Scene): void {\r\n this._graphicsContext = scene.engine.graphicsContext;\r\n this._camera = scene.camera;\r\n this._engine = scene.engine;\r\n }\r\n\r\n public sort(a: Entity, b: Entity) {\r\n return a.get(TransformComponent).z - b.get(TransformComponent).z;\r\n }\r\n\r\n public update(entities: Entity[], delta: number): void {\r\n this._clearScreen();\r\n this._token++;\r\n let transform: TransformComponent;\r\n let graphics: GraphicsComponent;\r\n\r\n for (const entity of entities) {\r\n transform = entity.get(TransformComponent);\r\n graphics = entity.get(GraphicsComponent);\r\n\r\n // Figure out if entities are offscreen\r\n const entityOffscreen = this._isOffscreen(transform, graphics);\r\n if (entityOffscreen && !entity.hasTag('offscreen')) {\r\n entity.eventDispatcher.emit('exitviewport', new ExitViewPortEvent(entity));\r\n entity.addComponent(new TagComponent('offscreen'));\r\n }\r\n\r\n if (!entityOffscreen && entity.hasTag('offscreen')) {\r\n entity.eventDispatcher.emit('enterviewport', new EnterViewPortEvent(entity));\r\n entity.removeComponent('offscreen');\r\n }\r\n // Skip entities that have graphics offscreen\r\n if (entityOffscreen) {\r\n continue;\r\n }\r\n\r\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\r\n this._pushCameraTransform(transform);\r\n\r\n this._graphicsContext.save();\r\n\r\n // Tick any graphics state (but only once) for animations and graphics groups\r\n graphics.update(delta, this._token);\r\n\r\n // Position the entity\r\n this._applyTransform(entity);\r\n\r\n // Optionally run the onPreDraw graphics lifecycle draw\r\n if (graphics.onPreDraw) {\r\n graphics.onPreDraw(this._graphicsContext, delta);\r\n }\r\n\r\n // TODO remove this hack on the particle redo\r\n const particleOpacity = (entity instanceof Particle) ? entity.opacity : 1;\r\n this._graphicsContext.opacity = graphics.opacity * particleOpacity;\r\n\r\n // Draw the graphics component\r\n this._drawGraphicsComponent(graphics);\r\n\r\n // Optionally run the onPostDraw graphics lifecycle draw\r\n if (graphics.onPostDraw) {\r\n graphics.onPostDraw(this._graphicsContext, delta);\r\n }\r\n\r\n this._graphicsContext.restore();\r\n\r\n // Reset the transform back to the original\r\n this._popCameraTransform(transform);\r\n }\r\n\r\n this._graphicsContext.flush();\r\n this._engine.stats.currFrame.graphics.drawnImages = GraphicsDiagnostics.DrawnImagesCount;\r\n this._engine.stats.currFrame.graphics.drawCalls = GraphicsDiagnostics.DrawCallCount;\r\n }\r\n\r\n private _clearScreen(): void {\r\n this._graphicsContext.clear();\r\n }\r\n\r\n private _isOffscreen(transform: TransformComponent, graphics: GraphicsComponent) {\r\n if (transform.coordPlane === CoordPlane.World) {\r\n const graphicsOffscreen = !this._camera.viewport.intersect(graphics.localBounds.transform(transform.getGlobalMatrix()));\r\n return graphicsOffscreen;\r\n } else {\r\n // TODO sceen coordinates\r\n return false;\r\n }\r\n }\r\n\r\n private _drawGraphicsComponent(graphicsComponent: GraphicsComponent) {\r\n if (graphicsComponent.visible) {\r\n // this should be moved to the graphics system\r\n for (const layer of graphicsComponent.layers.get()) {\r\n for (const { graphic, options } of layer.graphics) {\r\n let anchor = graphicsComponent.anchor;\r\n let offset = graphicsComponent.offset;\r\n if (options?.anchor) {\r\n anchor = options.anchor;\r\n }\r\n if (options?.offset) {\r\n offset = options.offset;\r\n }\r\n // See https://github.com/excaliburjs/Excalibur/pull/619 for discussion on this formula\r\n const offsetX = -graphic.width * anchor.x + offset.x;\r\n const offsetY = -graphic.height * anchor.y + offset.y;\r\n\r\n graphic?.draw(this._graphicsContext, offsetX + layer.offset.x, offsetY + layer.offset.y);\r\n\r\n if (this._engine?.isDebug && this._engine.debug.graphics.showBounds) {\r\n const offset = vec(offsetX + layer.offset.x, offsetY + layer.offset.y);\r\n if (graphic instanceof GraphicsGroup) {\r\n for (const g of graphic.members) {\r\n g.graphic?.localBounds.translate(offset.add(g.pos)).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\r\n }\r\n } else {\r\n /* istanbul ignore next */\r\n graphic?.localBounds.translate(offset).draw(this._graphicsContext, this._engine.debug.graphics.boundsColor);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This applies the current entity transform to the graphics context\r\n * @param entity\r\n */\r\n private _applyTransform(entity: Entity): void {\r\n const ancestors = entity.getAncestors();\r\n for (const ancestor of ancestors) {\r\n const transform = ancestor?.get(TransformComponent);\r\n if (transform) {\r\n this._graphicsContext.translate(transform.pos.x, transform.pos.y);\r\n this._graphicsContext.scale(transform.scale.x, transform.scale.y);\r\n this._graphicsContext.rotate(transform.rotation);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Applies the current camera transform if in world coordinates\r\n * @param transform\r\n */\r\n private _pushCameraTransform(transform: TransformComponent) {\r\n // Establish camera offset per entity\r\n if (transform.coordPlane === CoordPlane.World) {\r\n this._graphicsContext.save();\r\n if (this._camera) {\r\n this._camera.draw(this._graphicsContext);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the current camera transform if in world coordinates\r\n * @param transform\r\n */\r\n private _popCameraTransform(transform: TransformComponent) {\r\n if (transform.coordPlane === CoordPlane.World) {\r\n // Apply camera world offset\r\n this._graphicsContext.restore();\r\n }\r\n }\r\n}\r\n","import { Engine } from '../Engine';\r\nimport { Actor } from '../Actor';\r\nimport { Entity, System, SystemType } from '../EntityComponentSystem';\r\nimport { CanvasDrawComponent } from './CanvasDrawComponent';\r\nimport { Scene } from '../Scene';\r\nimport { Camera } from '../Camera';\r\nimport { CoordPlane, TransformComponent } from '../EntityComponentSystem/Components/TransformComponent';\r\nimport { GraphicsDiagnostics } from '../Graphics/GraphicsDiagnostics';\r\n\r\n/**\r\n * Draws anything with a transform and a \"draw\" method\r\n * @deprecated Shim for canvas drawing, will be removed v0.26.0\r\n */\r\nexport class CanvasDrawingSystem extends System<TransformComponent | CanvasDrawComponent> {\r\n public readonly types = ['ex.transform', 'ex.canvas'] as const;\r\n public systemType = SystemType.Draw;\r\n public priority = -1;\r\n\r\n private _ctx: CanvasRenderingContext2D;\r\n private _camera: Camera;\r\n private _engine: Engine;\r\n\r\n public initialize(scene: Scene): void {\r\n this._ctx = scene.engine.ctx;\r\n this._engine = scene.engine;\r\n this._camera = scene.camera;\r\n }\r\n\r\n public sort(a: Entity, b: Entity) {\r\n return a.get(TransformComponent).z - b.get(TransformComponent).z;\r\n }\r\n\r\n public update(entities: Entity[], delta: number) {\r\n this._clearScreen();\r\n\r\n let transform: TransformComponent;\r\n let canvasdraw: CanvasDrawComponent;\r\n const length = entities.length;\r\n for (let i = 0; i < length; i++) {\r\n const visible = (entities[i] as Actor)?.graphics?.visible ?? true;\r\n const offscreen = (entities[i] as Actor).isOffScreen;\r\n if (visible && !offscreen) {\r\n transform = entities[i].get(TransformComponent);\r\n canvasdraw = entities[i].get(CanvasDrawComponent);\r\n\r\n this._ctx.save();\r\n this._pushCameraTransform(transform);\r\n\r\n this._ctx.save();\r\n this._applyTransform(entities[i]);\r\n canvasdraw.draw(this._ctx, delta);\r\n this._ctx.restore();\r\n\r\n this._popCameraTransform(transform);\r\n this._ctx.restore();\r\n }\r\n\r\n if (this._engine.isDebug) {\r\n this._ctx.save();\r\n this._pushCameraTransform(transform);\r\n this._ctx.strokeStyle = 'yellow';\r\n (entities[i] as unknown as Actor).debugDraw(this._ctx);\r\n this._popCameraTransform(transform);\r\n this._ctx.restore();\r\n }\r\n }\r\n if (this._engine.isDebug) {\r\n this._ctx.save();\r\n this._camera.draw(this._ctx);\r\n this._camera.debugDraw(this._ctx);\r\n this._ctx.restore();\r\n }\r\n\r\n this._engine.stats.currFrame.graphics.drawnImages = GraphicsDiagnostics.DrawnImagesCount;\r\n this._engine.stats.currFrame.graphics.drawCalls = GraphicsDiagnostics.DrawCallCount;\r\n }\r\n\r\n private _applyTransform(entity: Entity) {\r\n const ancestors = entity.getAncestors();\r\n for (const ancestor of ancestors) {\r\n const transform = ancestor?.get(TransformComponent);\r\n if (transform) {\r\n this._ctx.translate(transform.pos.x, transform.pos.y);\r\n this._ctx.rotate(transform.rotation);\r\n this._ctx.scale(transform.scale.x, transform.scale.y);\r\n }\r\n }\r\n }\r\n\r\n private _clearScreen(): void {\r\n this._ctx.clearRect(0, 0, this._ctx.canvas.width, this._ctx.canvas.height);\r\n this._ctx.fillStyle = this._engine.backgroundColor.toString();\r\n this._ctx.fillRect(0, 0, this._ctx.canvas.width, this._ctx.canvas.height);\r\n }\r\n\r\n private _pushCameraTransform(transform: TransformComponent) {\r\n if (transform.coordPlane === CoordPlane.World) {\r\n // Apply camera transform to place entity in world space\r\n this._ctx.save();\r\n if (this._camera) {\r\n this._camera.draw(this._ctx);\r\n }\r\n }\r\n }\r\n\r\n private _popCameraTransform(transform: TransformComponent) {\r\n if (transform.coordPlane === CoordPlane.World) {\r\n // Restore back to screen space from world space if we were drawing an entity there\r\n this._ctx.restore();\r\n }\r\n }\r\n}\r\n","import { Engine } from '../Engine';\r\nimport { Scene } from '../Scene';\r\nimport { Camera } from '../Camera';\r\nimport { MotionComponent } from '../EntityComponentSystem/Components/MotionComponent';\r\nimport { ColliderComponent } from '../Collision/ColliderComponent';\r\nimport { CoordPlane, Entity, TransformComponent } from '../EntityComponentSystem';\r\nimport { System, SystemType } from '../EntityComponentSystem/System';\r\nimport { ExcaliburGraphicsContext } from '../Graphics/Context/ExcaliburGraphicsContext';\r\nimport { vec, Vector } from '../Math/vector';\r\nimport { BodyComponent, CollisionSystem, CompositeCollider, GraphicsComponent, Particle, Util } from '..';\r\n\r\nexport class DebugSystem extends System<TransformComponent> {\r\n public readonly types = ['ex.transform'] as const;\r\n public readonly systemType = SystemType.Draw;\r\n public priority = 999; // lowest priority\r\n private _graphicsContext: ExcaliburGraphicsContext;\r\n private _collisionSystem: CollisionSystem;\r\n private _camera: Camera;\r\n private _engine: Engine;\r\n\r\n public initialize(scene: Scene): void {\r\n this._graphicsContext = scene.engine.graphicsContext;\r\n this._camera = scene.camera;\r\n this._engine = scene.engine;\r\n this._collisionSystem = scene.world.systemManager.get(CollisionSystem);\r\n }\r\n\r\n update(entities: Entity[], _delta: number): void {\r\n if (!this._engine.isDebug) {\r\n return;\r\n }\r\n\r\n const filterSettings = this._engine.debug.filter;\r\n\r\n let id: number;\r\n let name: string;\r\n const entitySettings = this._engine.debug.entity;\r\n\r\n let tx: TransformComponent;\r\n const txSettings = this._engine.debug.transform;\r\n\r\n let motion: MotionComponent;\r\n const motionSettings = this._engine.debug.motion;\r\n\r\n let colliderComp: ColliderComponent;\r\n const colliderSettings = this._engine.debug.collider;\r\n\r\n const physicsSettings = this._engine.debug.physics;\r\n\r\n let graphics: GraphicsComponent;\r\n const graphicsSettings = this._engine.debug.graphics;\r\n\r\n let body: BodyComponent;\r\n const bodySettings = this._engine.debug.body;\r\n\r\n const cameraSettings = this._engine.debug.camera;\r\n for (const entity of entities) {\r\n if (entity.hasTag('offscreen')) {\r\n // skip offscreen entities\r\n continue;\r\n }\r\n if (entity instanceof Particle) {\r\n // Particles crush the renderer :(\r\n continue;\r\n }\r\n if (filterSettings.useFilter) {\r\n const allIds = filterSettings.ids.length === 0;\r\n const idMatch = allIds || filterSettings.ids.includes(entity.id);\r\n if (!idMatch) {\r\n continue;\r\n }\r\n const allNames = filterSettings.nameQuery === '';\r\n const nameMatch = allNames || entity.name.includes(filterSettings.nameQuery);\r\n if (!nameMatch) {\r\n continue;\r\n }\r\n }\r\n\r\n let cursor = Vector.Zero;\r\n const lineHeight = vec(0, 16);\r\n id = entity.id;\r\n name = entity.name;\r\n tx = entity.get(TransformComponent);\r\n\r\n // This optionally sets our camera based on the entity coord plan (world vs. screen)\r\n this._pushCameraTransform(tx);\r\n\r\n this._graphicsContext.save();\r\n\r\n this._applyTransform(entity);\r\n if (tx) {\r\n if (txSettings.showAll || txSettings.showPosition) {\r\n this._graphicsContext.debug.drawPoint(Vector.Zero, { size: 2, color: txSettings.positionColor });\r\n this._graphicsContext.debug.drawText(`pos${tx.pos.toString(2)}`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (entitySettings.showAll || entitySettings.showId) {\r\n this._graphicsContext.debug.drawText(`id(${id}) ${tx.parent ? 'child of id(' + tx.parent?.owner?.id + ')' : ''}`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (entitySettings.showAll || entitySettings.showName) {\r\n this._graphicsContext.debug.drawText(`name(${name})`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (txSettings.showAll || txSettings.showRotation) {\r\n this._graphicsContext.drawLine(\r\n Vector.Zero,\r\n Vector.fromAngle(tx.rotation).scale(50).add(Vector.Zero),\r\n txSettings.rotationColor,\r\n 2\r\n );\r\n this._graphicsContext.debug.drawText(`rot deg(${Util.toDegrees(tx.rotation).toFixed(2)})`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (txSettings.showAll || txSettings.showScale) {\r\n this._graphicsContext.drawLine(Vector.Zero, tx.scale.add(Vector.Zero), txSettings.scaleColor, 2);\r\n }\r\n }\r\n\r\n graphics = entity.get(GraphicsComponent);\r\n if (graphics) {\r\n if (graphicsSettings.showAll || graphicsSettings.showBounds) {\r\n const bounds = graphics.localBounds;\r\n bounds.draw(this._graphicsContext, graphicsSettings.boundsColor);\r\n }\r\n }\r\n\r\n body = entity.get(BodyComponent);\r\n if (body) {\r\n if (bodySettings.showAll || bodySettings.showCollisionGroup) {\r\n this._graphicsContext.debug.drawText(`collision group(${body.group.name})`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (bodySettings.showAll || bodySettings.showCollisionType) {\r\n this._graphicsContext.debug.drawText(`collision type(${body.collisionType})`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (bodySettings.showAll || bodySettings.showMass) {\r\n this._graphicsContext.debug.drawText(`mass(${body.mass})`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (bodySettings.showAll || bodySettings.showMotion) {\r\n this._graphicsContext.debug.drawText(`motion(${body.sleepMotion})`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (bodySettings.showAll || bodySettings.showSleeping) {\r\n this._graphicsContext.debug.drawText(`sleeping(${body.canSleep ? body.sleeping: 'cant sleep'})`, cursor);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n }\r\n\r\n this._graphicsContext.restore();\r\n\r\n motion = entity.get(MotionComponent);\r\n if (motion) {\r\n if (motionSettings.showAll || motionSettings.showVelocity) {\r\n this._graphicsContext.debug.drawText(`vel${motion.vel.toString(2)}`, cursor.add(tx.globalPos));\r\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.vel), motionSettings.velocityColor, 2);\r\n cursor = cursor.add(lineHeight);\r\n }\r\n\r\n if (motionSettings.showAll || motionSettings.showAcceleration) {\r\n this._graphicsContext.drawLine(tx.globalPos, tx.globalPos.add(motion.acc), motionSettings.accelerationColor, 2);\r\n }\r\n }\r\n\r\n // Colliders live in world space already so after the restore()\r\n colliderComp = entity.get(ColliderComponent);\r\n if (colliderComp) {\r\n const collider = colliderComp.get();\r\n if ((colliderSettings.showAll || colliderSettings.showGeometry) && collider) {\r\n collider.debug(this._graphicsContext, colliderSettings.geometryColor);\r\n }\r\n if (colliderSettings.showAll || colliderSettings.showBounds) {\r\n if (collider instanceof CompositeCollider) {\r\n const colliders = collider.getColliders();\r\n for (const collider of colliders) {\r\n const bounds = collider.bounds;\r\n const pos = vec(bounds.left, bounds.top);\r\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\r\n if (colliderSettings.showAll || colliderSettings.showOwner) {\r\n this._graphicsContext.debug.drawText(`owner id(${collider.owner.id})`, pos);\r\n }\r\n }\r\n colliderComp.bounds.draw(this._graphicsContext, colliderSettings.boundsColor);\r\n } else if (collider) {\r\n const bounds = colliderComp.bounds;\r\n const pos = vec(bounds.left, bounds.top);\r\n this._graphicsContext.debug.drawRect(pos.x, pos.y, bounds.width, bounds.height, { color: colliderSettings.boundsColor });\r\n if (colliderSettings.showAll || colliderSettings.showOwner) {\r\n this._graphicsContext.debug.drawText(`owner id(${colliderComp.owner.id})`, pos);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._popCameraTransform(tx);\r\n }\r\n\r\n this._graphicsContext.save();\r\n this._camera.draw(this._graphicsContext);\r\n if (physicsSettings.showAll || physicsSettings.showBroadphaseSpacePartitionDebug) {\r\n this._collisionSystem.debug(this._graphicsContext);\r\n }\r\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts || physicsSettings.showCollisionNormals) {\r\n for (const [_, contact] of this._engine.debug.stats.currFrame.physics.contacts) {\r\n if (physicsSettings.showAll || physicsSettings.showCollisionContacts) {\r\n for (const point of contact.points) {\r\n this._graphicsContext.debug.drawPoint(point, { size: 5, color: physicsSettings.collisionContactColor });\r\n }\r\n }\r\n\r\n if (physicsSettings.showAll || physicsSettings.showCollisionNormals) {\r\n for (const point of contact.points) {\r\n this._graphicsContext.debug.drawLine(point, contact.normal.scale(30).add(point), {\r\n color: physicsSettings.collisionNormalColor\r\n });\r\n }\r\n }\r\n }\r\n }\r\n this._graphicsContext.restore();\r\n\r\n if (cameraSettings) {\r\n this._graphicsContext.save();\r\n this._camera.draw(this._graphicsContext);\r\n if (cameraSettings.showAll || cameraSettings.showFocus) {\r\n this._graphicsContext.drawCircle(this._camera.pos, 4, cameraSettings.focusColor);\r\n }\r\n if (cameraSettings.showAll || cameraSettings.showZoom) {\r\n this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`, this._camera.pos);\r\n }\r\n this._graphicsContext.restore();\r\n }\r\n\r\n this._graphicsContext.flush();\r\n }\r\n\r\n /**\r\n * This applies the current entity transform to the graphics context\r\n * @param entity\r\n */\r\n private _applyTransform(entity: Entity): void {\r\n const ancestors = entity.getAncestors();\r\n for (const ancestor of ancestors) {\r\n const transform = ancestor?.get(TransformComponent);\r\n if (transform) {\r\n this._graphicsContext.translate(transform.pos.x, transform.pos.y);\r\n this._graphicsContext.scale(transform.scale.x, transform.scale.y);\r\n this._graphicsContext.rotate(transform.rotation);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Applies the current camera transform if in world coordinates\r\n * @param transform\r\n */\r\n private _pushCameraTransform(transform: TransformComponent) {\r\n // Establish camera offset per entity\r\n if (transform.coordPlane === CoordPlane.World) {\r\n this._graphicsContext.save();\r\n if (this._camera) {\r\n this._camera.draw(this._graphicsContext);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the current camera transform if in world coordinates\r\n * @param transform\r\n */\r\n private _popCameraTransform(transform: TransformComponent) {\r\n if (transform.coordPlane === CoordPlane.World) {\r\n // Apply camera world offset\r\n this._graphicsContext.restore();\r\n }\r\n }\r\n}\r\n","import { Entity } from '../EntityComponentSystem';\r\nimport { System, SystemType } from '../EntityComponentSystem/System';\r\nimport { ActionsComponent } from './ActionsComponent';\r\n\r\n\r\nexport class ActionsSystem extends System<ActionsComponent> {\r\n public readonly types = ['ex.actions'] as const;\r\n systemType = SystemType.Update;\r\n priority = -1;\r\n\r\n update(entities: Entity[], delta: number): void {\r\n let actions: ActionsComponent;\r\n for (const entity of entities) {\r\n actions = entity.get(ActionsComponent);\r\n actions.update(delta);\r\n }\r\n }\r\n}","import { ScreenElement } from './ScreenElement';\r\nimport {\r\n InitializeEvent,\r\n ActivateEvent,\r\n DeactivateEvent,\r\n PreUpdateEvent,\r\n PostUpdateEvent,\r\n PreDrawEvent,\r\n PostDrawEvent,\r\n PreDebugDrawEvent,\r\n PostDebugDrawEvent,\r\n GameEvent\r\n} from './Events';\r\nimport { Logger } from './Util/Log';\r\nimport { Timer } from './Timer';\r\nimport { Engine } from './Engine';\r\nimport { TileMap } from './TileMap';\r\nimport { Camera } from './Camera';\r\nimport { Actor } from './Actor';\r\nimport { Class } from './Class';\r\nimport { CanInitialize, CanActivate, CanDeactivate, CanUpdate, CanDraw } from './Interfaces/LifecycleEvents';\r\nimport * as Util from './Util/Util';\r\nimport * as Events from './Events';\r\nimport * as ActorUtils from './Util/Actors';\r\nimport { Trigger } from './Trigger';\r\nimport { SystemType } from './EntityComponentSystem/System';\r\nimport { obsolete } from './Util/Decorators';\r\nimport { World } from './EntityComponentSystem/World';\r\nimport { MotionSystem } from './Collision/MotionSystem';\r\nimport { CollisionSystem } from './Collision/CollisionSystem';\r\nimport { Entity } from './EntityComponentSystem/Entity';\r\nimport { GraphicsSystem } from './Graphics/GraphicsSystem';\r\nimport { CanvasDrawingSystem } from './Drawing/CanvasDrawingSystem';\r\nimport { Flags, Legacy } from './Flags';\r\nimport { DebugSystem } from './Debug/DebugSystem';\r\nimport { ActionsSystem } from './Actions/ActionsSystem';\r\n/**\r\n * [[Actor|Actors]] are composed together into groupings called Scenes in\r\n * Excalibur. The metaphor models the same idea behind real world\r\n * actors in a scene. Only actors in scenes will be updated and drawn.\r\n *\r\n * Typical usages of a scene include: levels, menus, loading screens, etc.\r\n */\r\nexport class Scene extends Class implements CanInitialize, CanActivate, CanDeactivate, CanUpdate, CanDraw {\r\n private _logger: Logger = Logger.getInstance();\r\n /**\r\n * Gets or sets the current camera for the scene\r\n */\r\n public camera: Camera = new Camera();\r\n\r\n /**\r\n * The ECS world for the scene\r\n */\r\n public world = new World(this);\r\n\r\n /**\r\n * The actors in the current scene\r\n */\r\n public get actors(): Actor[] {\r\n return this.world.entityManager.entities.filter((e) => {\r\n return e instanceof Actor;\r\n }) as Actor[];\r\n }\r\n\r\n /**\r\n * The entities in the current scene\r\n */\r\n public get entities(): Entity[] {\r\n return this.world.entityManager.entities;\r\n }\r\n\r\n /**\r\n * The triggers in the current scene\r\n */\r\n public get triggers(): Trigger[] {\r\n return this.world.entityManager.entities.filter((e) => {\r\n return e instanceof Trigger;\r\n }) as Trigger[];\r\n }\r\n\r\n /**\r\n * The [[TileMap]]s in the scene, if any\r\n */\r\n public get tileMaps(): TileMap[] {\r\n return this.world.entityManager.entities.filter((e) => {\r\n return e instanceof TileMap;\r\n }) as TileMap[];\r\n }\r\n\r\n /**\r\n * Access to the Excalibur engine\r\n */\r\n public engine: Engine;\r\n\r\n /**\r\n * The [[ScreenElement]]s in a scene, if any; these are drawn last\r\n * @deprecated Use [[Scene.actors]]\r\n */\r\n @obsolete({\r\n message: 'Will be removed in excalibur v0.26.0',\r\n alternateMethod: 'ScreenElements now are normal actors with a Transform Coordinate Plane of Screen'\r\n })\r\n public get screenElements(): ScreenElement[] {\r\n return this.actors.filter((a) => a instanceof ScreenElement) as ScreenElement[];\r\n }\r\n\r\n private _isInitialized: boolean = false;\r\n private _timers: Timer[] = [];\r\n private _cancelQueue: Timer[] = [];\r\n\r\n constructor() {\r\n super();\r\n // TODO how to people do there own systems\r\n // Initialize systems\r\n this.world.add(new ActionsSystem());\r\n this.world.add(new MotionSystem());\r\n this.world.add(new CollisionSystem());\r\n if (Flags.isEnabled(Legacy.LegacyDrawing)) {\r\n this.world.add(new CanvasDrawingSystem());\r\n } else {\r\n this.world.add(new GraphicsSystem());\r\n }\r\n this.world.add(new DebugSystem());\r\n }\r\n\r\n public on(eventName: Events.initialize, handler: (event: InitializeEvent<Scene>) => void): void;\r\n public on(eventName: Events.activate, handler: (event: ActivateEvent) => void): void;\r\n public on(eventName: Events.deactivate, handler: (event: DeactivateEvent) => void): void;\r\n public on(eventName: Events.preupdate, handler: (event: PreUpdateEvent<Scene>) => void): void;\r\n public on(eventName: Events.postupdate, handler: (event: PostUpdateEvent<Scene>) => void): void;\r\n public on(eventName: Events.predraw, handler: (event: PreDrawEvent) => void): void;\r\n public on(eventName: Events.postdraw, handler: (event: PostDrawEvent) => void): void;\r\n public on(eventName: Events.predebugdraw, handler: (event: PreDebugDrawEvent) => void): void;\r\n public on(eventName: Events.postdebugdraw, handler: (event: PostDebugDrawEvent) => void): void;\r\n public on(eventName: string, handler: (event: GameEvent<any>) => void): void;\r\n public on(eventName: string, handler: (event: any) => void): void {\r\n super.on(eventName, handler);\r\n }\r\n\r\n public once(eventName: Events.initialize, handler: (event: InitializeEvent<Scene>) => void): void;\r\n public once(eventName: Events.activate, handler: (event: ActivateEvent) => void): void;\r\n public once(eventName: Events.deactivate, handler: (event: DeactivateEvent) => void): void;\r\n public once(eventName: Events.preupdate, handler: (event: PreUpdateEvent<Scene>) => void): void;\r\n public once(eventName: Events.postupdate, handler: (event: PostUpdateEvent<Scene>) => void): void;\r\n public once(eventName: Events.predraw, handler: (event: PreDrawEvent) => void): void;\r\n public once(eventName: Events.postdraw, handler: (event: PostDrawEvent) => void): void;\r\n public once(eventName: Events.predebugdraw, handler: (event: PreDebugDrawEvent) => void): void;\r\n public once(eventName: Events.postdebugdraw, handler: (event: PostDebugDrawEvent) => void): void;\r\n public once(eventName: string, handler: (event: GameEvent<any>) => void): void;\r\n public once(eventName: string, handler: (event: any) => void): void {\r\n super.once(eventName, handler);\r\n }\r\n\r\n public off(eventName: Events.initialize, handler?: (event: InitializeEvent<Scene>) => void): void;\r\n public off(eventName: Events.activate, handler?: (event: ActivateEvent) => void): void;\r\n public off(eventName: Events.deactivate, handler?: (event: DeactivateEvent) => void): void;\r\n public off(eventName: Events.preupdate, handler?: (event: PreUpdateEvent<Scene>) => void): void;\r\n public off(eventName: Events.postupdate, handler?: (event: PostUpdateEvent<Scene>) => void): void;\r\n public off(eventName: Events.predraw, handler?: (event: PreDrawEvent) => void): void;\r\n public off(eventName: Events.postdraw, handler?: (event: PostDrawEvent) => void): void;\r\n public off(eventName: Events.predebugdraw, handler?: (event: PreDebugDrawEvent) => void): void;\r\n public off(eventName: Events.postdebugdraw, handler?: (event: PostDebugDrawEvent) => void): void;\r\n public off(eventName: string, handler?: (event: GameEvent<any>) => void): void;\r\n public off(eventName: string, handler?: (event: any) => void): void {\r\n super.off(eventName, handler);\r\n }\r\n\r\n /**\r\n * This is called before the first update of the [[Scene]]. Initializes scene members like the camera. This method is meant to be\r\n * overridden. This is where initialization of child actors should take place.\r\n */\r\n public onInitialize(_engine: Engine): void {\r\n // will be overridden\r\n }\r\n\r\n /**\r\n * This is called when the scene is made active and started. It is meant to be overridden,\r\n * this is where you should setup any DOM UI or event handlers needed for the scene.\r\n */\r\n public onActivate(_oldScene: Scene, _newScene: Scene): void {\r\n // will be overridden\r\n }\r\n\r\n /**\r\n * This is called when the scene is made transitioned away from and stopped. It is meant to be overridden,\r\n * this is where you should cleanup any DOM UI or event handlers needed for the scene.\r\n */\r\n public onDeactivate(_oldScene: Scene, _newScene: Scene): void {\r\n // will be overridden\r\n }\r\n\r\n /**\r\n * Safe to override onPreUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPreUpdate` is called directly before a scene is updated.\r\n */\r\n public onPreUpdate(_engine: Engine, _delta: number): void {\r\n // will be overridden\r\n }\r\n\r\n /**\r\n * Safe to override onPostUpdate lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPostUpdate` is called directly after a scene is updated.\r\n */\r\n public onPostUpdate(_engine: Engine, _delta: number): void {\r\n // will be overridden\r\n }\r\n\r\n /**\r\n * Safe to override onPreDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPreDraw` is called directly before a scene is drawn.\r\n */\r\n public onPreDraw(_ctx: CanvasRenderingContext2D, _delta: number): void {\r\n // will be overridden\r\n }\r\n\r\n /**\r\n * Safe to override onPostDraw lifecycle event handler. Synonymous with `.on('preupdate', (evt) =>{...})`\r\n *\r\n * `onPostDraw` is called directly after a scene is drawn.\r\n */\r\n public onPostDraw(_ctx: CanvasRenderingContext2D, _delta: number): void {\r\n // will be overridden\r\n }\r\n\r\n /**\r\n * Initializes actors in the scene\r\n */\r\n private _initializeChildren(): void {\r\n for (const child of this.entities) {\r\n child._initialize(this.engine);\r\n }\r\n }\r\n\r\n /**\r\n * Gets whether or not the [[Scene]] has been initialized\r\n */\r\n public get isInitialized(): boolean {\r\n return this._isInitialized;\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Initializes the scene before the first update, meant to be called by engine not by users of\r\n * Excalibur\r\n * @internal\r\n */\r\n public _initialize(engine: Engine) {\r\n if (!this.isInitialized) {\r\n this.engine = engine;\r\n // Initialize camera first\r\n this.camera._initialize(engine);\r\n\r\n // This order is important! we want to be sure any custom init that add actors\r\n // fire before the actor init\r\n this.onInitialize.call(this, engine);\r\n this._initializeChildren();\r\n\r\n this._logger.debug('Scene.onInitialize', this, engine);\r\n this.eventDispatcher.emit('initialize', new InitializeEvent(engine, this));\r\n this._isInitialized = true;\r\n }\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Activates the scene with the base behavior, then calls the overridable `onActivate` implementation.\r\n * @internal\r\n */\r\n public _activate(oldScene: Scene, newScene: Scene): void {\r\n this._logger.debug('Scene.onActivate', this);\r\n this.onActivate(oldScene, newScene);\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Deactivates the scene with the base behavior, then calls the overridable `onDeactivate` implementation.\r\n * @internal\r\n */\r\n public _deactivate(oldScene: Scene, newScene: Scene): void {\r\n this._logger.debug('Scene.onDeactivate', this);\r\n this.onDeactivate(oldScene, newScene);\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _preupdate handler for [[onPreUpdate]] lifecycle event\r\n * @internal\r\n */\r\n public _preupdate(_engine: Engine, delta: number): void {\r\n this.emit('preupdate', new PreUpdateEvent(_engine, delta, this));\r\n this.onPreUpdate(_engine, delta);\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _preupdate handler for [[onPostUpdate]] lifecycle event\r\n * @internal\r\n */\r\n public _postupdate(_engine: Engine, delta: number): void {\r\n this.emit('postupdate', new PostUpdateEvent(_engine, delta, this));\r\n this.onPostUpdate(_engine, delta);\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _predraw handler for [[onPreDraw]] lifecycle event\r\n *\r\n * @internal\r\n */\r\n public _predraw(_ctx: CanvasRenderingContext2D, _delta: number): void {\r\n this.emit('predraw', new PreDrawEvent(_ctx, _delta, this));\r\n this.onPreDraw(_ctx, _delta);\r\n }\r\n\r\n /**\r\n * It is not recommended that internal excalibur methods be overridden, do so at your own risk.\r\n *\r\n * Internal _postdraw handler for [[onPostDraw]] lifecycle event\r\n *\r\n * @internal\r\n */\r\n public _postdraw(_ctx: CanvasRenderingContext2D, _delta: number): void {\r\n this.emit('postdraw', new PostDrawEvent(_ctx, _delta, this));\r\n this.onPostDraw(_ctx, _delta);\r\n }\r\n\r\n /**\r\n * Updates all the actors and timers in the scene. Called by the [[Engine]].\r\n * @param engine Reference to the current Engine\r\n * @param delta The number of milliseconds since the last update\r\n */\r\n public update(engine: Engine, delta: number) {\r\n this._preupdate(engine, delta);\r\n if (this.camera) {\r\n this.camera.update(engine, delta);\r\n }\r\n // TODO differed entity removal for timers\r\n let i: number, len: number;\r\n // Remove timers in the cancel queue before updating them\r\n for (i = 0, len = this._cancelQueue.length; i < len; i++) {\r\n this.removeTimer(this._cancelQueue[i]);\r\n }\r\n this._cancelQueue.length = 0;\r\n\r\n // Cycle through timers updating timers\r\n for (const timer of this._timers) {\r\n timer.update(delta);\r\n }\r\n\r\n this.world.update(SystemType.Update, delta);\r\n\r\n this._collectActorStats(engine);\r\n\r\n engine.input.pointers.dispatchPointerEvents();\r\n\r\n this._postupdate(engine, delta);\r\n }\r\n\r\n /**\r\n * Draws all the actors in the Scene. Called by the [[Engine]].\r\n * @param ctx The current rendering context\r\n * @param delta The number of milliseconds since the last draw\r\n */\r\n public draw(ctx: CanvasRenderingContext2D, delta: number) {\r\n this._predraw(ctx, delta);\r\n\r\n this.world.update(SystemType.Draw, delta);\r\n\r\n if (this.engine?.isDebug) {\r\n this.debugDraw(ctx);\r\n }\r\n this._postdraw(ctx, delta);\r\n }\r\n\r\n /**\r\n * Draws all the actors' debug information in the Scene. Called by the [[Engine]].\r\n * @param ctx The current rendering context\r\n * @deprecated\r\n */\r\n /* istanbul ignore next */\r\n public debugDraw(ctx: CanvasRenderingContext2D) {\r\n this.emit('predebugdraw', new PreDebugDrawEvent(ctx, this));\r\n // pass\r\n this.emit('postdebugdraw', new PostDebugDrawEvent(ctx, this));\r\n }\r\n\r\n /**\r\n * Checks whether an actor is contained in this scene or not\r\n */\r\n public contains(actor: Actor): boolean {\r\n return this.actors.indexOf(actor) > -1;\r\n }\r\n\r\n /**\r\n * Adds a [[Timer]] to the current [[Scene]].\r\n * @param timer The timer to add to the current [[Scene]].\r\n */\r\n public add(timer: Timer): void;\r\n\r\n /**\r\n * Adds a [[TileMap]] to the [[Scene]], once this is done the [[TileMap]] will be drawn and updated.\r\n */\r\n public add(tileMap: TileMap): void;\r\n\r\n /**\r\n * Adds a [[Trigger]] to the [[Scene]], once this is done the [[Trigger]] will listen for interactions with other actors.\r\n * @param trigger\r\n */\r\n public add(trigger: Trigger): void;\r\n\r\n /**\r\n * Adds an actor to the scene, once this is done the [[Actor]] will be drawn and updated.\r\n * @param actor The actor to add to the current scene\r\n */\r\n public add(actor: Actor): void;\r\n\r\n public add(entity: Entity): void;\r\n\r\n /**\r\n * Adds a [[ScreenElement]] to the scene.\r\n * @param screenElement The ScreenElement to add to the current scene\r\n */\r\n public add(screenElement: ScreenElement): void;\r\n public add(entity: any): void {\r\n this.emit('entityadded', { target: entity } as any);\r\n this.world.add(entity);\r\n entity.scene = this;\r\n if (entity instanceof Timer) {\r\n if (!Util.contains(this._timers, entity)) {\r\n this.addTimer(entity);\r\n }\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Removes a [[Timer]] from the current scene, it will no longer be updated.\r\n * @param timer The timer to remove to the current scene.\r\n */\r\n public remove(timer: Timer): void;\r\n\r\n /**\r\n * Removes a [[TileMap]] from the scene, it will no longer be drawn or updated.\r\n * @param tileMap {TileMap}\r\n */\r\n public remove(tileMap: TileMap): void;\r\n\r\n /**\r\n * Removes an actor from the scene, it will no longer be drawn or updated.\r\n * @param actor The actor to remove from the current scene.\r\n */\r\n public remove(actor: Actor): void;\r\n\r\n public remove(entity: Entity): void;\r\n\r\n /**\r\n * Removes a [[ScreenElement]] to the scene, it will no longer be drawn or updated\r\n * @param screenElement The ScreenElement to remove from the current scene\r\n */\r\n public remove(screenElement: ScreenElement): void;\r\n public remove(entity: any): void {\r\n if (entity instanceof Entity) {\r\n this.emit('entityremoved', { target: entity } as any);\r\n this.world.remove(entity);\r\n }\r\n if (entity instanceof Timer) {\r\n this.removeTimer(entity);\r\n }\r\n }\r\n\r\n /**\r\n * Adds (any) actor to act as a piece of UI, meaning it is always positioned\r\n * in screen coordinates. UI actors do not participate in collisions.\r\n * @todo Should this be `ScreenElement` only?\r\n * @deprecated Use [[Scene.add]]\r\n */\r\n @obsolete({ message: 'Will be removed in excalibur v0.26.0', alternateMethod: 'Use Scene.add' })\r\n public addScreenElement(actor: Actor) {\r\n this.add(actor);\r\n }\r\n\r\n /**\r\n * Removes an actor as a piece of UI\r\n * @deprecated Use [[Scene.remove]]\r\n */\r\n @obsolete({ message: 'Will be removed in excalibur v0.26.0', alternateMethod: 'Use Scene.remove' })\r\n public removeScreenElement(actor: Actor) {\r\n this.remove(actor);\r\n }\r\n\r\n /**\r\n * Adds a [[TileMap]] to the scene, once this is done the TileMap will be drawn and updated.\r\n * @deprecated Use [[Scene.add]]\r\n */\r\n @obsolete({ message: 'Will be removed in excalibur v0.26.0', alternateMethod: 'Use Scene.add' })\r\n public addTileMap(tileMap: TileMap) {\r\n this.world.add(tileMap);\r\n }\r\n\r\n /**\r\n * Removes a [[TileMap]] from the scene, it will no longer be drawn or updated.\r\n * @deprecated Use [[Scene.remove]]\r\n */\r\n @obsolete({ message: 'Will be removed in excalibur v0.26.0', alternateMethod: 'Use Scene.remove' })\r\n public removeTileMap(tileMap: TileMap) {\r\n this.world.remove(tileMap);\r\n }\r\n\r\n /**\r\n * Adds a [[Timer]] to the scene\r\n * @param timer The timer to add\r\n */\r\n public addTimer(timer: Timer): Timer {\r\n this._timers.push(timer);\r\n timer.scene = this;\r\n return timer;\r\n }\r\n\r\n /**\r\n * Removes a [[Timer]] from the scene.\r\n * @warning Can be dangerous, use [[cancelTimer]] instead\r\n * @param timer The timer to remove\r\n */\r\n public removeTimer(timer: Timer): Timer {\r\n const i = this._timers.indexOf(timer);\r\n if (i !== -1) {\r\n this._timers.splice(i, 1);\r\n }\r\n return timer;\r\n }\r\n\r\n /**\r\n * Cancels a [[Timer]], removing it from the scene nicely\r\n * @param timer The timer to cancel\r\n */\r\n public cancelTimer(timer: Timer): Timer {\r\n this._cancelQueue.push(timer);\r\n return timer;\r\n }\r\n\r\n /**\r\n * Tests whether a [[Timer]] is active in the scene\r\n */\r\n public isTimerActive(timer: Timer): boolean {\r\n return this._timers.indexOf(timer) > -1 && !timer.complete;\r\n }\r\n\r\n public isCurrentScene(): boolean {\r\n if (this.engine) {\r\n return this.engine.currentScene === this;\r\n }\r\n return false;\r\n }\r\n\r\n private _collectActorStats(engine: Engine) {\r\n const screenElements = this.actors.filter((a) => a instanceof ScreenElement) as ScreenElement[];\r\n for (const _ui of screenElements) {\r\n engine.stats.currFrame.actors.ui++;\r\n }\r\n\r\n for (const actor of this.actors) {\r\n engine.stats.currFrame.actors.alive++;\r\n for (const child of actor.children) {\r\n if (ActorUtils.isScreenElement(child as Actor)) {\r\n // TODO not true\r\n engine.stats.currFrame.actors.ui++;\r\n } else {\r\n engine.stats.currFrame.actors.alive++;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { Logger } from './../Util/Log';\r\nimport { PostProcessor } from './PostProcessor';\r\nimport { Engine } from '../Engine';\r\n\r\nexport enum ColorBlindness {\r\n Protanope,\r\n Deuteranope,\r\n Tritanope\r\n}\r\n\r\n/**\r\n * This post processor can correct colors and simulate color blindness.\r\n * It is possible to use this on every game, but the game's performance\r\n * will suffer measurably. It's better to use it as a helpful tool while developing your game.\r\n * Remember, the best practice is to design with color blindness in mind.\r\n */\r\nexport class ColorBlindCorrector implements PostProcessor {\r\n /*eslint-disable */\r\n private _vertexShader =\r\n '' +\r\n 'attribute vec2 a_position;' +\r\n 'attribute vec2 a_texCoord;' +\r\n 'uniform vec2 u_resolution;' +\r\n 'varying vec2 v_texCoord;' +\r\n 'void main() {' +\r\n // convert the rectangle from pixels to 0.0 to 1.0\r\n 'vec2 zeroToOne = a_position / u_resolution;' +\r\n // convert from 0->1 to 0->2\r\n 'vec2 zeroToTwo = zeroToOne * 2.0;' +\r\n // convert from 0->2 to -1->+1 (clipspace)\r\n 'vec2 clipSpace = zeroToTwo - 1.0;' +\r\n 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' +\r\n // pass the texCoord to the fragment shader\r\n // The GPU will interpolate this value between points.\r\n 'v_texCoord = a_texCoord;' +\r\n '}';\r\n\r\n private _fragmentShader =\r\n 'precision mediump float;' +\r\n // our texture\r\n 'uniform sampler2D u_image;' +\r\n // the texCoords passed in from the vertex shader.\r\n 'varying vec2 v_texCoord;' +\r\n // Color blind conversions\r\n /*'mat3 m[9] =' +\r\n '{' +\r\n 'mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 ),' + // normal\r\n 'mat3(0.567, 0.433, 0.0, 0.558, 0.442, 0.0, 0.0, 0.242, 0.758),' + // protanopia\r\n 'mat3(0.817, 0.183, 0.0, 0.333, 0.667, 0.0, 0.0, 0.125,0.875),' + // protanomaly\r\n 'mat3(0.625, 0.375, 0.0, 0.7, 0.3, 0.0, 0.0, 0.3,0.7 ),' + // deuteranopia\r\n 'mat3(0.8, 0.2, 0.0, 0.258, 0.742, 0.0, 0.0, 0.142,0.858),' + // deuteranomaly\r\n 'mat3(0.95, 0.05, 0.0, 0.0, 0.433, 0.567, 0.0, 0.475,0.525),' + // tritanopia\r\n 'mat3(0.967, 0.033, 0.0, 0.0, 0.733, 0.267, 0.0, 0.183,0.817),' + // tritanomaly\r\n 'mat3(0.299, 0.587, 0.114, 0.299, 0.587, 0.114, 0.299, 0.587,0.114),' + // achromatopsia\r\n 'mat3(0.618, 0.320, 0.062, 0.163, 0.775, 0.062, 0.163, 0.320,0.516)' + // achromatomaly\r\n '};' +*/\r\n\r\n 'void main() {' +\r\n 'vec4 o = texture2D(u_image, v_texCoord);' +\r\n // RGB to LMS matrix conversion\r\n 'float L = (17.8824 * o.r) + (43.5161 * o.g) + (4.11935 * o.b);' +\r\n 'float M = (3.45565 * o.r) + (27.1554 * o.g) + (3.86714 * o.b);' +\r\n 'float S = (0.0299566 * o.r) + (0.184309 * o.g) + (1.46709 * o.b);' +\r\n // Simulate color blindness\r\n\r\n '//MODE CODE//' +\r\n /* Deuteranope for testing\r\n 'float l = 1.0 * L + 0.0 * M + 0.0 * S;' +\r\n 'float m = 0.494207 * L + 0.0 * M + 1.24827 * S;' +\r\n 'float s = 0.0 * L + 0.0 * M + 1.0 * S;' +*/\r\n\r\n // LMS to RGB matrix conversion\r\n 'vec4 error;' +\r\n 'error.r = (0.0809444479 * l) + (-0.130504409 * m) + (0.116721066 * s);' +\r\n 'error.g = (-0.0102485335 * l) + (0.0540193266 * m) + (-0.113614708 * s);' +\r\n 'error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + (0.693511405 * s);' +\r\n 'error.a = 1.0;' +\r\n 'vec4 diff = o - error;' +\r\n 'vec4 correction;' +\r\n 'correction.r = 0.0;' +\r\n 'correction.g = (diff.r * 0.7) + (diff.g * 1.0);' +\r\n 'correction.b = (diff.r * 0.7) + (diff.b * 1.0);' +\r\n 'correction = o + correction;' +\r\n 'correction.a = o.a;' +\r\n '//SIMULATE//' +\r\n '}';\r\n\r\n /*eslint-enable */\r\n private _internalCanvas: HTMLCanvasElement;\r\n private _gl: WebGLRenderingContext;\r\n private _program: WebGLProgram;\r\n\r\n constructor(public engine: Engine, public simulate: boolean = false, public colorMode: ColorBlindness = ColorBlindness.Protanope) {\r\n this._internalCanvas = document.createElement('canvas');\r\n this._internalCanvas.width = engine.drawWidth;\r\n this._internalCanvas.height = engine.drawHeight;\r\n\r\n // eslint-disable-next-line\r\n this._gl = <WebGLRenderingContext>this._internalCanvas.getContext('webgl', { preserveDrawingBuffer: true });\r\n\r\n this._program = this._gl.createProgram();\r\n const fragmentShader = this._getShader('Fragment', this._getFragmentShaderByMode(colorMode));\r\n const vertextShader = this._getShader('Vertex', this._vertexShader);\r\n\r\n this._gl.attachShader(this._program, vertextShader);\r\n this._gl.attachShader(this._program, fragmentShader);\r\n this._gl.linkProgram(this._program);\r\n\r\n if (!this._gl.getProgramParameter(this._program, this._gl.LINK_STATUS)) {\r\n Logger.getInstance().error('Unable to link shader program!');\r\n }\r\n\r\n this._gl.useProgram(this._program);\r\n }\r\n\r\n private _getFragmentShaderByMode(colorMode: ColorBlindness) {\r\n let code = '';\r\n if (colorMode === ColorBlindness.Protanope) {\r\n code =\r\n 'float l = 0.0 * L + 2.02344 * M + -2.52581 * S;' +\r\n 'float m = 0.0 * L + 1.0 * M + 0.0 * S;' +\r\n 'float s = 0.0 * L + 0.0 * M + 1.0 * S;';\r\n } else if (colorMode === ColorBlindness.Deuteranope) {\r\n code =\r\n 'float l = 1.0 * L + 0.0 * M + 0.0 * S;' +\r\n 'float m = 0.494207 * L + 0.0 * M + 1.24827 * S;' +\r\n 'float s = 0.0 * L + 0.0 * M + 1.0 * S;';\r\n } else if (colorMode === ColorBlindness.Tritanope) {\r\n code =\r\n 'float l = 1.0 * L + 0.0 * M + 0.0 * S;' +\r\n 'float m = 0.0 * L + 1.0 * M + 0.0 * S;' +\r\n 'float s = -0.395913 * L + 0.801109 * M + 0.0 * S;';\r\n }\r\n\r\n if (this.simulate) {\r\n this._fragmentShader = this._fragmentShader.replace('//SIMULATE//', 'gl_FragColor = error.rgba;');\r\n } else {\r\n this._fragmentShader = this._fragmentShader.replace('//SIMULATE//', 'gl_FragColor = correction.rgba;');\r\n }\r\n\r\n return this._fragmentShader.replace('//MODE CODE//', code);\r\n }\r\n\r\n private _setRectangle(x: number, y: number, width: number, height: number) {\r\n const x1 = x;\r\n const x2 = x + width;\r\n const y1 = y;\r\n const y2 = y + height;\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array([x1, y1, x2, y1, x1, y2, x1, y2, x2, y1, x2, y2]), this._gl.STATIC_DRAW);\r\n }\r\n\r\n private _getShader(type: string, program: string): WebGLShader {\r\n let shader: WebGLShader;\r\n if (type === 'Fragment') {\r\n shader = this._gl.createShader(this._gl.FRAGMENT_SHADER);\r\n } else if (type === 'Vertex') {\r\n shader = this._gl.createShader(this._gl.VERTEX_SHADER);\r\n } else {\r\n Logger.getInstance().error('Error unknown shader type', type);\r\n }\r\n\r\n this._gl.shaderSource(shader, program);\r\n this._gl.compileShader(shader);\r\n\r\n if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\r\n Logger.getInstance().error('Unable to compile shader!', this._gl.getShaderInfoLog(shader));\r\n return null;\r\n }\r\n\r\n return shader;\r\n }\r\n\r\n public process(image: ImageData, out: CanvasRenderingContext2D) {\r\n // look up where the vertex data needs to go.\r\n const positionLocation = this._gl.getAttribLocation(this._program, 'a_position');\r\n const texCoordLocation = this._gl.getAttribLocation(this._program, 'a_texCoord');\r\n\r\n const texCoordBuffer = this._gl.createBuffer();\r\n this._gl.bindBuffer(this._gl.ARRAY_BUFFER, texCoordBuffer);\r\n this._gl.bufferData(\r\n this._gl.ARRAY_BUFFER,\r\n new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]),\r\n this._gl.STATIC_DRAW\r\n );\r\n this._gl.enableVertexAttribArray(texCoordLocation);\r\n this._gl.vertexAttribPointer(texCoordLocation, 2, this._gl.FLOAT, false, 0, 0);\r\n\r\n // Create a texture.\r\n const texture = this._gl.createTexture();\r\n this._gl.bindTexture(this._gl.TEXTURE_2D, texture);\r\n\r\n // Set the parameters so we can render any size image.\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST);\r\n this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST);\r\n // Flip the texture when unpacking into the gl context, gl reads textures in the opposite order as everything else :/\r\n this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, 1);\r\n // Upload the image into the texture.\r\n this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA, this._gl.RGBA, this._gl.UNSIGNED_BYTE, image);\r\n\r\n // lookup uniforms\r\n const resolutionLocation = this._gl.getUniformLocation(this._program, 'u_resolution');\r\n\r\n // set the resolution\r\n this._gl.uniform2f(resolutionLocation, this._internalCanvas.width, this._internalCanvas.height);\r\n\r\n // Create a buffer for the position of the rectangle corners.\r\n const positionBuffer = this._gl.createBuffer();\r\n this._gl.bindBuffer(this._gl.ARRAY_BUFFER, positionBuffer);\r\n this._gl.enableVertexAttribArray(positionLocation);\r\n this._gl.vertexAttribPointer(positionLocation, 2, this._gl.FLOAT, false, 0, 0);\r\n\r\n // Set a rectangle the same size as the image.\r\n this._setRectangle(0, 0, image.width, image.height);\r\n\r\n // Draw the rectangle.\r\n this._gl.drawArrays(this._gl.TRIANGLES, 0, 6);\r\n\r\n // Grab transformed image from internal canvas\r\n const pixelData = new Uint8Array(image.width * image.height * 4);\r\n this._gl.readPixels(0, 0, image.width, image.height, this._gl.RGBA, this._gl.UNSIGNED_BYTE, pixelData);\r\n\r\n (<any>image.data).set(pixelData);\r\n\r\n out.putImageData(image, 0, 0);\r\n }\r\n}\r\n","import { Engine } from '../Engine';\r\nimport { ColorBlindCorrector, ColorBlindness } from '../PostProcessing/Index';\r\n\r\nexport interface DebugFlags {\r\n colorBlindMode: ColorBlindFlags;\r\n}\r\n\r\nexport class ColorBlindFlags {\r\n private _engine: Engine;\r\n\r\n constructor(engine: Engine) {\r\n this._engine = engine;\r\n }\r\n\r\n public correct(colorBlindness: ColorBlindness) {\r\n this._engine.postProcessors.push(new ColorBlindCorrector(this._engine, false, colorBlindness));\r\n }\r\n\r\n public simulate(colorBlindness: ColorBlindness) {\r\n this._engine.postProcessors.push(new ColorBlindCorrector(this._engine, true, colorBlindness));\r\n }\r\n}\r\n","import { DebugFlags, ColorBlindFlags } from './DebugFlags';\r\nimport { Engine } from '../Engine';\r\nimport { Color } from '../Color';\r\nimport { CollisionContact } from '../Collision/Detection/CollisionContact';\r\n\r\n/**\r\n * Debug stats containing current and previous frame statistics\r\n */\r\nexport interface DebugStats {\r\n currFrame: FrameStats;\r\n prevFrame: FrameStats;\r\n}\r\n\r\n/**\r\n * Represents a frame's individual statistics\r\n */\r\nexport interface FrameStatistics {\r\n /**\r\n * The number of the frame\r\n */\r\n id: number;\r\n\r\n /**\r\n * Gets the frame's delta (time since last frame scaled by [[Engine.timescale]]) (in ms)\r\n */\r\n delta: number;\r\n\r\n /**\r\n * Gets the frame's frames-per-second (FPS)\r\n */\r\n fps: number;\r\n\r\n /**\r\n * Duration statistics (in ms)\r\n */\r\n duration: FrameDurationStats;\r\n\r\n /**\r\n * Actor statistics\r\n */\r\n actors: FrameActorStats;\r\n\r\n /**\r\n * Physics statistics\r\n */\r\n physics: PhysicsStatistics;\r\n\r\n /**\r\n * Graphics statistics\r\n */\r\n graphics: GraphicsStatistics;\r\n}\r\n\r\n/**\r\n * Represents actor stats for a frame\r\n */\r\nexport interface FrameActorStats {\r\n /**\r\n * Gets the frame's number of actors (alive)\r\n */\r\n alive: number;\r\n\r\n /**\r\n * Gets the frame's number of actors (killed)\r\n */\r\n killed: number;\r\n\r\n /**\r\n * Gets the frame's number of remaining actors (alive - killed)\r\n */\r\n remaining: number;\r\n\r\n /**\r\n * Gets the frame's number of UI actors\r\n */\r\n ui: number;\r\n\r\n /**\r\n * Gets the frame's number of total actors (remaining + UI)\r\n */\r\n total: number;\r\n}\r\n\r\n/**\r\n * Represents duration stats for a frame\r\n */\r\nexport interface FrameDurationStats {\r\n /**\r\n * Gets the frame's total time to run the update function (in ms)\r\n */\r\n update: number;\r\n\r\n /**\r\n * Gets the frame's total time to run the draw function (in ms)\r\n */\r\n draw: number;\r\n\r\n /**\r\n * Gets the frame's total render duration (update + draw duration) (in ms)\r\n */\r\n total: number;\r\n}\r\n\r\n/**\r\n * Represents physics stats for the current frame\r\n */\r\nexport interface PhysicsStatistics {\r\n /**\r\n * Gets the number of broadphase collision pairs which\r\n */\r\n pairs: number;\r\n\r\n /**\r\n * Gets the number of actual collisions\r\n */\r\n collisions: number;\r\n\r\n /**\r\n * Copy of the current frame contacts (only updated if debug is toggled on)\r\n */\r\n contacts: Map<string, CollisionContact>;\r\n\r\n /**\r\n * Gets the number of fast moving bodies using raycast continuous collisions in the scene\r\n */\r\n fastBodies: number;\r\n\r\n /**\r\n * Gets the number of bodies that had a fast body collision resolution\r\n */\r\n fastBodyCollisions: number;\r\n\r\n /**\r\n * Gets the time it took to calculate the broadphase pairs\r\n */\r\n broadphase: number;\r\n\r\n /**\r\n * Gets the time it took to calculate the narrowphase\r\n */\r\n narrowphase: number;\r\n}\r\n\r\nexport interface GraphicsStatistics {\r\n drawCalls: number;\r\n drawnImages: number;\r\n}\r\n\r\n/**\r\n * Debug statistics and flags for Excalibur. If polling these values, it would be\r\n * best to do so on the `postupdate` event for [[Engine]], after all values have been\r\n * updated during a frame.\r\n */\r\nexport class Debug implements DebugFlags {\r\n private _engine: Engine;\r\n\r\n constructor(engine: Engine) {\r\n this._engine = engine;\r\n\r\n this.colorBlindMode = new ColorBlindFlags(this._engine);\r\n }\r\n\r\n /**\r\n * Performance statistics\r\n */\r\n public stats: DebugStats = {\r\n /**\r\n * Current frame statistics. Engine reuses this instance, use [[FrameStats.clone]] to copy frame stats.\r\n * Best accessed on [[postframe]] event. See [[FrameStats]]\r\n */\r\n currFrame: new FrameStats(),\r\n\r\n /**\r\n * Previous frame statistics. Engine reuses this instance, use [[FrameStats.clone]] to copy frame stats.\r\n * Best accessed on [[preframe]] event. Best inspected on engine event `preframe`. See [[FrameStats]]\r\n */\r\n prevFrame: new FrameStats()\r\n };\r\n\r\n /**\r\n * Correct or simulate color blindness using [[ColorBlindness]] post processor.\r\n * @warning Will reduce FPS.\r\n */\r\n public colorBlindMode: ColorBlindFlags;\r\n\r\n /**\r\n * Filter debug context to named entities or entity ids\r\n */\r\n public filter: { useFilter: boolean; nameQuery: string; ids: number[] } = {\r\n /**\r\n * Toggle filter on or off (default off) must be on for DebugDraw to use filters\r\n */\r\n useFilter: false,\r\n /**\r\n * Query for entities by name, if the entity name contains `nameQuery` it will be included\r\n */\r\n nameQuery: '',\r\n /**\r\n * Query for Entity ids, if the id matches it will be included\r\n */\r\n ids: []\r\n };\r\n\r\n /**\r\n * Entity debug settings\r\n */\r\n public entity = {\r\n showAll: false,\r\n showId: true,\r\n showName: false\r\n };\r\n\r\n /**\r\n * Transform component debug settings\r\n */\r\n public transform = {\r\n showAll: false,\r\n\r\n showPosition: false,\r\n positionColor: Color.Yellow,\r\n\r\n showScale: false,\r\n scaleColor: Color.Green,\r\n\r\n showRotation: false,\r\n rotationColor: Color.Blue\r\n };\r\n\r\n /**\r\n * Graphics component debug settings\r\n */\r\n public graphics = {\r\n showAll: false,\r\n\r\n showBounds: true,\r\n boundsColor: Color.Yellow\r\n };\r\n\r\n /**\r\n * Collider component debug settings\r\n */\r\n public collider = {\r\n showAll: false,\r\n\r\n showBounds: true,\r\n boundsColor: Color.Blue,\r\n\r\n showOwner: false,\r\n\r\n showGeometry: true,\r\n geometryColor: Color.Green\r\n };\r\n\r\n /**\r\n * Physics simulation debug settings\r\n */\r\n public physics = {\r\n showAll: false,\r\n\r\n showBroadphaseSpacePartitionDebug: false,\r\n\r\n showCollisionNormals: false,\r\n collisionNormalColor: Color.Cyan,\r\n\r\n showCollisionContacts: true,\r\n collisionContactColor: Color.Red\r\n };\r\n\r\n /**\r\n * Motion component debug settings\r\n */\r\n public motion = {\r\n showAll: false,\r\n\r\n showVelocity: false,\r\n velocityColor: Color.Yellow,\r\n\r\n showAcceleration: false,\r\n accelerationColor: Color.Red\r\n };\r\n\r\n /**\r\n * Body component debug settings\r\n */\r\n public body = {\r\n showAll: false,\r\n\r\n showCollisionGroup: false,\r\n showCollisionType: false,\r\n showSleeping: false,\r\n showMotion: false,\r\n showMass: false\r\n };\r\n\r\n /**\r\n * Camera debug settings\r\n */\r\n public camera = {\r\n showAll: false,\r\n\r\n showFocus: false,\r\n focusColor: Color.Red,\r\n\r\n showZoom: false\r\n };\r\n}\r\n\r\n/**\r\n * Implementation of a frame's stats. Meant to have values copied via [[FrameStats.reset]], avoid\r\n * creating instances of this every frame.\r\n */\r\nexport class FrameStats implements FrameStatistics {\r\n private _id: number = 0;\r\n private _delta: number = 0;\r\n private _fps: number = 0;\r\n private _actorStats: FrameActorStats = {\r\n alive: 0,\r\n killed: 0,\r\n ui: 0,\r\n get remaining() {\r\n return this.alive - this.killed;\r\n },\r\n get total() {\r\n return this.remaining + this.ui;\r\n }\r\n };\r\n private _durationStats: FrameDurationStats = {\r\n update: 0,\r\n draw: 0,\r\n get total() {\r\n return this.update + this.draw;\r\n }\r\n };\r\n\r\n private _physicsStats: PhysicsStats = new PhysicsStats();\r\n\r\n private _graphicsStats: GraphicsStatistics = {\r\n drawCalls: 0,\r\n drawnImages: 0\r\n };\r\n\r\n /**\r\n * Zero out values or clone other IFrameStat stats. Allows instance reuse.\r\n *\r\n * @param [otherStats] Optional stats to clone\r\n */\r\n public reset(otherStats?: FrameStatistics) {\r\n if (otherStats) {\r\n this.id = otherStats.id;\r\n this.delta = otherStats.delta;\r\n this.fps = otherStats.fps;\r\n this.actors.alive = otherStats.actors.alive;\r\n this.actors.killed = otherStats.actors.killed;\r\n this.actors.ui = otherStats.actors.ui;\r\n this.duration.update = otherStats.duration.update;\r\n this.duration.draw = otherStats.duration.draw;\r\n this._physicsStats.reset(otherStats.physics);\r\n this.graphics.drawCalls = otherStats.graphics.drawCalls;\r\n this.graphics.drawnImages = otherStats.graphics.drawnImages;\r\n } else {\r\n this.id = this.delta = this.fps = 0;\r\n this.actors.alive = this.actors.killed = this.actors.ui = 0;\r\n this.duration.update = this.duration.draw = 0;\r\n this._physicsStats.reset();\r\n this.graphics.drawnImages = this.graphics.drawCalls = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Provides a clone of this instance.\r\n */\r\n public clone(): FrameStats {\r\n const fs = new FrameStats();\r\n\r\n fs.reset(this);\r\n\r\n return fs;\r\n }\r\n\r\n /**\r\n * Gets the frame's id\r\n */\r\n public get id() {\r\n return this._id;\r\n }\r\n\r\n /**\r\n * Sets the frame's id\r\n */\r\n public set id(value: number) {\r\n this._id = value;\r\n }\r\n\r\n /**\r\n * Gets the frame's delta (time since last frame)\r\n */\r\n public get delta() {\r\n return this._delta;\r\n }\r\n\r\n /**\r\n * Sets the frame's delta (time since last frame). Internal use only.\r\n * @internal\r\n */\r\n public set delta(value: number) {\r\n this._delta = value;\r\n }\r\n\r\n /**\r\n * Gets the frame's frames-per-second (FPS)\r\n */\r\n public get fps() {\r\n return this._fps;\r\n }\r\n\r\n /**\r\n * Sets the frame's frames-per-second (FPS). Internal use only.\r\n * @internal\r\n */\r\n public set fps(value: number) {\r\n this._fps = value;\r\n }\r\n\r\n /**\r\n * Gets the frame's actor statistics\r\n */\r\n public get actors() {\r\n return this._actorStats;\r\n }\r\n\r\n /**\r\n * Gets the frame's duration statistics\r\n */\r\n public get duration() {\r\n return this._durationStats;\r\n }\r\n\r\n /**\r\n * Gets the frame's physics statistics\r\n */\r\n public get physics() {\r\n return this._physicsStats;\r\n }\r\n\r\n /**\r\n * Gets the frame's graphics statistics\r\n */\r\n public get graphics() {\r\n return this._graphicsStats;\r\n }\r\n}\r\n\r\nexport class PhysicsStats implements PhysicsStatistics {\r\n private _pairs: number = 0;\r\n private _collisions: number = 0;\r\n private _contacts: Map<string, CollisionContact> = new Map();\r\n private _fastBodies: number = 0;\r\n private _fastBodyCollisions: number = 0;\r\n private _broadphase: number = 0;\r\n private _narrowphase: number = 0;\r\n\r\n /**\r\n * Zero out values or clone other IPhysicsStats stats. Allows instance reuse.\r\n *\r\n * @param [otherStats] Optional stats to clone\r\n */\r\n public reset(otherStats?: PhysicsStatistics) {\r\n if (otherStats) {\r\n this.pairs = otherStats.pairs;\r\n this.collisions = otherStats.collisions;\r\n this.contacts = otherStats.contacts;\r\n this.fastBodies = otherStats.fastBodies;\r\n this.fastBodyCollisions = otherStats.fastBodyCollisions;\r\n this.broadphase = otherStats.broadphase;\r\n this.narrowphase = otherStats.narrowphase;\r\n } else {\r\n this.pairs = this.collisions = this.fastBodies = 0;\r\n this.fastBodyCollisions = this.broadphase = this.narrowphase = 0;\r\n this.contacts.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Provides a clone of this instance.\r\n */\r\n public clone(): PhysicsStatistics {\r\n const ps = new PhysicsStats();\r\n\r\n ps.reset(this);\r\n\r\n return ps;\r\n }\r\n\r\n public get pairs(): number {\r\n return this._pairs;\r\n }\r\n\r\n public set pairs(value: number) {\r\n this._pairs = value;\r\n }\r\n\r\n public get collisions(): number {\r\n return this._collisions;\r\n }\r\n\r\n public set collisions(value: number) {\r\n this._collisions = value;\r\n }\r\n\r\n public get contacts(): Map<string, CollisionContact> {\r\n return this._contacts;\r\n }\r\n\r\n public set contacts(contacts: Map<string, CollisionContact>) {\r\n this._contacts = contacts;\r\n }\r\n\r\n public get fastBodies(): number {\r\n return this._fastBodies;\r\n }\r\n\r\n public set fastBodies(value: number) {\r\n this._fastBodies = value;\r\n }\r\n\r\n public get fastBodyCollisions(): number {\r\n return this._fastBodyCollisions;\r\n }\r\n\r\n public set fastBodyCollisions(value: number) {\r\n this._fastBodyCollisions = value;\r\n }\r\n\r\n public get broadphase(): number {\r\n return this._broadphase;\r\n }\r\n\r\n public set broadphase(value: number) {\r\n this._broadphase = value;\r\n }\r\n\r\n public get narrowphase(): number {\r\n return this._narrowphase;\r\n }\r\n\r\n public set narrowphase(value: number) {\r\n this._narrowphase = value;\r\n }\r\n}\r\n","import { Logger } from '../Util/Log';\r\nimport { Class } from '../Class';\r\nimport * as Events from '../Events';\r\n\r\n/**\r\n * Enum representing physical input key codes\r\n */\r\nexport enum Keys {\r\n // NUMPAD\r\n Num0 = 'Numpad0',\r\n Num1 = 'Numpad1',\r\n Num2 = 'Numpad2',\r\n Num3 = 'Numpad3',\r\n Num4 = 'Numpad4',\r\n Num5 = 'Numpad5',\r\n Num6 = 'Numpad6',\r\n Num7 = 'Numpad7',\r\n Num8 = 'Numpad8',\r\n Num9 = 'Numpad9',\r\n NumAdd = 'NumpadAdd',\r\n NumSubtract = 'NumpadSubtract',\r\n NumMultiply = 'NumpadMultiply',\r\n NumDivide = 'NumpadDivide',\r\n // NumComma = 'NumpadComma', // not x-browser\r\n NumDecimal = 'NumpadDecimal',\r\n Numpad0 = 'Numpad0',\r\n Numpad1 = 'Numpad1',\r\n Numpad2 = 'Numpad2',\r\n Numpad3 = 'Numpad3',\r\n Numpad4 = 'Numpad4',\r\n Numpad5 = 'Numpad5',\r\n Numpad6 = 'Numpad6',\r\n Numpad7 = 'Numpad7',\r\n Numpad8 = 'Numpad8',\r\n Numpad9 = 'Numpad9',\r\n NumpadAdd = 'NumpadAdd',\r\n NumpadSubtract = 'NumpadSubtract',\r\n NumpadMultiply = 'NumpadMultiply',\r\n NumpadDivide = 'NumpadDivide',\r\n // NumpadComma = 'NumpadComma', // not x-browser\r\n NumpadDecimal = 'NumpadDecimal',\r\n\r\n // MODIFIERS\r\n NumLock = 'NumLock',\r\n ShiftLeft = 'ShiftLeft',\r\n ShiftRight = 'ShiftRight',\r\n AltLeft = 'AltLeft',\r\n AltRight = 'AltRight',\r\n\r\n // NUMBERS\r\n Key0 = 'Digit0',\r\n Key1 = 'Digit1',\r\n Key2 = 'Digit2',\r\n Key3 = 'Digit3',\r\n Key4 = 'Digit4',\r\n Key5 = 'Digit5',\r\n Key6 = 'Digit6',\r\n Key7 = 'Digit7',\r\n Key8 = 'Digit8',\r\n Key9 = 'Digit9',\r\n Digit0 = 'Digit0',\r\n Digit1 = 'Digit1',\r\n Digit2 = 'Digit2',\r\n Digit3 = 'Digit3',\r\n Digit4 = 'Digit4',\r\n Digit5 = 'Digit5',\r\n Digit6 = 'Digit6',\r\n Digit7 = 'Digit7',\r\n Digit8 = 'Digit8',\r\n Digit9 = 'Digit9',\r\n\r\n // LETTERS\r\n A = 'KeyA',\r\n B = 'KeyB',\r\n C = 'KeyC',\r\n D = 'KeyD',\r\n E = 'KeyE',\r\n F = 'KeyF',\r\n G = 'KeyG',\r\n H = 'KeyH',\r\n I = 'KeyI',\r\n J = 'KeyJ',\r\n K = 'KeyK',\r\n L = 'KeyL',\r\n M = 'KeyM',\r\n N = 'KeyN',\r\n O = 'KeyO',\r\n P = 'KeyP',\r\n Q = 'KeyQ',\r\n R = 'KeyR',\r\n S = 'KeyS',\r\n T = 'KeyT',\r\n U = 'KeyU',\r\n V = 'KeyV',\r\n W = 'KeyW',\r\n X = 'KeyX',\r\n Y = 'KeyY',\r\n Z = 'KeyZ',\r\n KeyA = 'KeyA',\r\n KeyB = 'KeyB',\r\n KeyC = 'KeyC',\r\n KeyD = 'KeyD',\r\n KeyE = 'KeyE',\r\n KeyF = 'KeyF',\r\n KeyG = 'KeyG',\r\n KeyH = 'KeyH',\r\n KeyI = 'KeyI',\r\n KeyJ = 'KeyJ',\r\n KeyK = 'KeyK',\r\n KeyL = 'KeyL',\r\n KeyM = 'KeyM',\r\n KeyN = 'KeyN',\r\n KeyO = 'KeyO',\r\n KeyP = 'KeyP',\r\n KeyQ = 'KeyQ',\r\n KeyR = 'KeyR',\r\n KeyS = 'KeyS',\r\n KeyT = 'KeyT',\r\n KeyU = 'KeyU',\r\n KeyV = 'KeyV',\r\n KeyW = 'KeyW',\r\n KeyX = 'KeyX',\r\n KeyY = 'KeyY',\r\n KeyZ = 'KeyZ',\r\n\r\n // SYMBOLS\r\n Semicolon = 'Semicolon',\r\n Quote = 'Quote',\r\n Comma = 'Comma',\r\n Minus = 'Minus',\r\n Period = 'Period',\r\n Slash = 'Slash',\r\n Equal = 'Equal',\r\n BracketLeft = 'BracketLeft',\r\n Backslash = 'Backslash',\r\n BracketRight = 'BracketRight',\r\n Backquote = 'Backquote',\r\n\r\n // DIRECTIONS\r\n Up = 'ArrowUp',\r\n Down = 'ArrowDown',\r\n Left = 'ArrowLeft',\r\n Right = 'ArrowRight',\r\n ArrowUp = 'ArrowUp',\r\n ArrowDown = 'ArrowDown',\r\n ArrowLeft = 'ArrowLeft',\r\n ArrowRight = 'ArrowRight',\r\n\r\n // OTHER\r\n Space = 'Space',\r\n Esc = 'Escape',\r\n Escape = 'Escape'\r\n}\r\n\r\n/**\r\n * Event thrown on a game object for a key event\r\n */\r\nexport class KeyEvent extends Events.GameEvent<any> {\r\n /**\r\n * @param key The key responsible for throwing the event\r\n * @param value The key's typed value the browser detected\r\n * @param originalEvent The original keyboard event that Excalibur handled\r\n */\r\n constructor(public key: Keys, public value?: string, public originalEvent?: KeyboardEvent) {\r\n super();\r\n }\r\n}\r\n\r\n/**\r\n * Provides keyboard support for Excalibur.\r\n */\r\nexport class Keyboard extends Class {\r\n private _keys: Keys[] = [];\r\n private _keysUp: Keys[] = [];\r\n private _keysDown: Keys[] = [];\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public on(eventName: Events.press, handler: (event: KeyEvent) => void): void;\r\n public on(eventName: Events.release, handler: (event: KeyEvent) => void): void;\r\n public on(eventName: Events.hold, handler: (event: KeyEvent) => void): void;\r\n public on(eventName: string, handler: (event: Events.GameEvent<any>) => void): void;\r\n public on(eventName: string, handler: (event: any) => void): void {\r\n super.on(eventName, handler);\r\n }\r\n\r\n /**\r\n * Initialize Keyboard event listeners\r\n */\r\n init(global?: GlobalEventHandlers): void {\r\n if (!global) {\r\n try {\r\n // Try and listen to events on top window frame if within an iframe.\r\n //\r\n // See https://github.com/excaliburjs/Excalibur/issues/1294\r\n //\r\n // Attempt to add an event listener, which triggers a DOMException on\r\n // cross-origin iframes\r\n const noop = () => {\r\n return;\r\n };\r\n window.top.addEventListener('blur', noop);\r\n window.top.removeEventListener('blur', noop);\r\n\r\n // this will be the same as window if not embedded within an iframe\r\n global = window.top;\r\n } catch {\r\n // fallback to current frame\r\n global = window;\r\n\r\n Logger.getInstance().warn(\r\n 'Failed to bind to keyboard events to top frame. ' +\r\n 'If you are trying to embed Excalibur in a cross-origin iframe, keyboard events will not fire.'\r\n );\r\n }\r\n }\r\n\r\n global.addEventListener('blur', () => {\r\n this._keys.length = 0; // empties array efficiently\r\n });\r\n\r\n // key up is on window because canvas cannot have focus\r\n global.addEventListener('keyup', (ev: KeyboardEvent) => {\r\n const code = ev.code as Keys;\r\n const key = this._keys.indexOf(code);\r\n this._keys.splice(key, 1);\r\n this._keysUp.push(code);\r\n const keyEvent = new KeyEvent(code, ev.key, ev);\r\n\r\n // alias the old api, we may want to deprecate this in the future\r\n this.eventDispatcher.emit('up', keyEvent);\r\n this.eventDispatcher.emit('release', keyEvent);\r\n });\r\n\r\n // key down is on window because canvas cannot have focus\r\n global.addEventListener('keydown', (ev: KeyboardEvent) => {\r\n const code = ev.code as Keys;\r\n if (this._keys.indexOf(code) === -1) {\r\n this._keys.push(code);\r\n this._keysDown.push(code);\r\n const keyEvent = new KeyEvent(code, ev.key, ev);\r\n this.eventDispatcher.emit('down', keyEvent);\r\n this.eventDispatcher.emit('press', keyEvent);\r\n }\r\n });\r\n }\r\n\r\n public update() {\r\n // Reset keysDown and keysUp after update is complete\r\n this._keysDown.length = 0;\r\n this._keysUp.length = 0;\r\n\r\n // Emit synthetic \"hold\" event\r\n for (let i = 0; i < this._keys.length; i++) {\r\n this.eventDispatcher.emit('hold', new KeyEvent(this._keys[i]));\r\n }\r\n }\r\n\r\n /**\r\n * Gets list of keys being pressed down\r\n */\r\n public getKeys(): Keys[] {\r\n return this._keys;\r\n }\r\n\r\n /**\r\n * Tests if a certain key was just pressed this frame. This is cleared at the end of the update frame.\r\n * @param key Test whether a key was just pressed\r\n */\r\n public wasPressed(key: Keys): boolean {\r\n return this._keysDown.indexOf(key) > -1;\r\n }\r\n\r\n /**\r\n * Tests if a certain key is held down. This is persisted between frames.\r\n * @param key Test whether a key is held down\r\n */\r\n public isHeld(key: Keys): boolean {\r\n return this._keys.indexOf(key) > -1;\r\n }\r\n\r\n /**\r\n * Tests if a certain key was just released this frame. This is cleared at the end of the update frame.\r\n * @param key Test whether a key was just released\r\n */\r\n public wasReleased(key: Keys): boolean {\r\n return this._keysUp.indexOf(key) > -1;\r\n }\r\n}\r\n","import { Actor } from '../Actor';\r\nimport { Vector } from '../Math/vector';\r\nimport { Class } from '../Class';\r\nimport * as Actors from '../Util/Actors';\r\nimport { removeItemFromArray } from '../Util/Util';\r\nimport { PointerMoveEvent, PointerDownEvent, PointerUpEvent, WheelEvent } from './PointerEvents';\r\n\r\nexport interface ActorsUnderPointer {\r\n [ActorId: number]: Actor;\r\n length: number;\r\n}\r\n\r\n/**\r\n * The type of pointer for a [[PointerEvent]].\r\n */\r\nexport enum PointerType {\r\n Touch = 'Touch',\r\n Mouse = 'Mouse',\r\n Pen = 'Pen',\r\n Unknown = 'Unknown'\r\n}\r\n\r\n/**\r\n * Determines the scope of handling mouse/touch events. See [[Pointers]] for more information.\r\n */\r\nexport enum PointerScope {\r\n /**\r\n * Handle events on the `canvas` element only. Events originating outside the\r\n * `canvas` will not be handled.\r\n */\r\n Canvas = 'Canvas',\r\n\r\n /**\r\n * Handles events on the entire document. All events will be handled by Excalibur.\r\n */\r\n Document = 'Document'\r\n}\r\n\r\n/**\r\n * Captures and dispatches PointerEvents\r\n */\r\nexport class Pointer extends Class {\r\n private static _MAX_ID = 0;\r\n public readonly id = Pointer._MAX_ID++;\r\n private _isDown: boolean = false;\r\n private _wasDown: boolean = false;\r\n\r\n private _actorsUnderPointer: ActorsUnderPointer = { length: 0 };\r\n\r\n private _actors: Actor[] = [];\r\n private _actorsLastFrame: Actor[] = [];\r\n private _actorsNoLongerUnderPointer: Actor[] = [];\r\n\r\n private _actorSortingFcn = (a: Actor, b: Actor) => {\r\n if (a.z === b.z) {\r\n return b.id - a.id;\r\n }\r\n return b.z - a.z;\r\n };\r\n\r\n /**\r\n * Whether the Pointer is currently dragging.\r\n */\r\n public get isDragging(): boolean {\r\n return this._isDown;\r\n }\r\n\r\n /**\r\n * Whether the Pointer just started dragging.\r\n */\r\n public get isDragStart(): boolean {\r\n return !this._wasDown && this._isDown;\r\n }\r\n\r\n /**\r\n * Whether the Pointer just ended dragging.\r\n */\r\n public get isDragEnd(): boolean {\r\n return this._wasDown && !this._isDown;\r\n }\r\n\r\n /**\r\n * Returns true if pointer has any actors under\r\n */\r\n public get hasActorsUnderPointer(): boolean {\r\n return !!this._actorsUnderPointer.length;\r\n }\r\n\r\n /**\r\n * The last position on the document this pointer was at. Can be `null` if pointer was never active.\r\n */\r\n public lastPagePos: Vector = null;\r\n\r\n /**\r\n * The last position on the screen this pointer was at. Can be `null` if pointer was never active.\r\n */\r\n public lastScreenPos: Vector = null;\r\n\r\n /**\r\n * The last position in the game world coordinates this pointer was at. Can be `null` if pointer was never active.\r\n */\r\n public lastWorldPos: Vector = null;\r\n\r\n /**\r\n * Returns the currently dragging target or null if it isn't exist\r\n */\r\n public dragTarget: Actor = null;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.on('move', this._onPointerMove);\r\n this.on('down', this._onPointerDown);\r\n this.on('up', this._onPointerUp);\r\n }\r\n\r\n on(event: 'move', handler: (event: PointerMoveEvent) => void): void;\r\n on(event: 'down', handler: (event: PointerDownEvent) => void): void;\r\n on(event: 'up', handler: (event: PointerUpEvent) => void): void;\r\n on(event: 'wheel', handler: (event: WheelEvent) => void): void;\r\n on(event: string, handler: (event: any) => void): void {\r\n super.on(event, handler);\r\n }\r\n\r\n once(event: 'move', handler: (event: PointerMoveEvent) => void): void;\r\n once(event: 'down', handler: (event: PointerDownEvent) => void): void;\r\n once(event: 'up', handler: (event: PointerUpEvent) => void): void;\r\n once(event: 'wheel', handler: (event: WheelEvent) => void): void;\r\n once(event: string, handler: (event: any) => void): void {\r\n super.once(event, handler);\r\n }\r\n\r\n off(event: 'move', handler?: (event: PointerMoveEvent) => void): void;\r\n off(event: 'down', handler?: (event: PointerDownEvent) => void): void;\r\n off(event: 'up', handler?: (event: PointerUpEvent) => void): void;\r\n off(event: 'wheel', handler?: (event: WheelEvent) => void): void;\r\n off(event: string, handler?: (event: any) => void): void {\r\n super.off(event, handler);\r\n }\r\n\r\n /**\r\n * Update the state of current pointer, meant to be called a the end of frame\r\n */\r\n public update(): void {\r\n if (this._wasDown && !this._isDown) {\r\n this._wasDown = false;\r\n } else if (!this._wasDown && this._isDown) {\r\n this._wasDown = true;\r\n }\r\n this._actorsLastFrame = [...this._actors];\r\n this._actorsNoLongerUnderPointer = [];\r\n }\r\n\r\n /**\r\n * Adds an Actor to actorsUnderPointer object.\r\n * @param actor An Actor to be added;\r\n */\r\n public addActorUnderPointer(actor: Actor): void {\r\n if (!this.isActorAliveUnderPointer(actor)) {\r\n this._actorsUnderPointer[actor.id] = actor;\r\n this._actorsUnderPointer.length += 1;\r\n this._actors.push(actor);\r\n }\r\n\r\n // Actors are processed in z-order highest z to lowest\r\n // ties are broken by id highest id (newest) to lowest id (oldest)\r\n this._actors.sort(this._actorSortingFcn);\r\n }\r\n\r\n /**\r\n * Removes an Actor from actorsUnderPointer object.\r\n * @param actor An Actor to be removed;\r\n */\r\n public removeActorUnderPointer(actor: Actor): void {\r\n if (this.isActorAliveUnderPointer(actor)) {\r\n delete this._actorsUnderPointer[actor.id];\r\n this._actorsUnderPointer.length -= 1;\r\n removeItemFromArray(actor, this._actors);\r\n this._actorsNoLongerUnderPointer.push(actor);\r\n }\r\n }\r\n\r\n /**\r\n * Returns all actors under this pointer this frame\r\n */\r\n public getActorsUnderPointer(): Actor[] {\r\n return this._actors;\r\n }\r\n\r\n /**\r\n * Returns all actors that are no longer under the pointer this frame\r\n */\r\n public getActorsUnderPointerLastFrame(): Actor[] {\r\n return this._actorsLastFrame;\r\n }\r\n\r\n /**\r\n * Returns all actors relevant for events to pointer this frame\r\n */\r\n public getActorsForEvents(): Actor[] {\r\n return this._actors\r\n .concat(this._actorsLastFrame)\r\n .filter((actor, i, self) => {\r\n return self.indexOf(actor) === i; // de-dup\r\n })\r\n .sort(this._actorSortingFcn); // sort by z\r\n }\r\n\r\n /**\r\n * Checks if Pointer location has a specific Actor bounds contained underneath.\r\n * @param actor An Actor for check;\r\n */\r\n public checkActorUnderPointer(actor: Actor): boolean {\r\n if (this.lastWorldPos) {\r\n return actor.contains(this.lastWorldPos.x, this.lastWorldPos.y, !Actors.isScreenElement(actor));\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if an actor was under the pointer last frame\r\n * @param actor\r\n */\r\n public wasActorUnderPointer(actor: Actor): boolean {\r\n return this._actorsLastFrame.indexOf(actor) > -1;\r\n }\r\n\r\n /**\r\n * Checks if Pointer has a specific Actor in ActorsUnderPointer list.\r\n * @param actor An Actor for check;\r\n */\r\n public isActorAliveUnderPointer(actor: Actor): boolean {\r\n return !!(!actor.isKilled() && actor.scene && this._actorsUnderPointer.hasOwnProperty(actor.id.toString()));\r\n }\r\n\r\n private _onPointerMove(ev: PointerMoveEvent): void {\r\n this.lastPagePos = new Vector(ev.pagePos.x, ev.pagePos.y);\r\n this.lastScreenPos = new Vector(ev.screenPos.x, ev.screenPos.y);\r\n this.lastWorldPos = new Vector(ev.worldPos.x, ev.worldPos.y);\r\n }\r\n\r\n private _onPointerDown(ev: PointerDownEvent): void {\r\n this.lastPagePos = new Vector(ev.pagePos.x, ev.pagePos.y);\r\n this.lastScreenPos = new Vector(ev.screenPos.x, ev.screenPos.y);\r\n this.lastWorldPos = new Vector(ev.worldPos.x, ev.worldPos.y);\r\n this._isDown = true;\r\n }\r\n\r\n private _onPointerUp(_ev: PointerUpEvent): void {\r\n this._isDown = false;\r\n this.dragTarget = null;\r\n }\r\n}\r\n","import { Actor } from '../Actor';\r\nimport { GlobalCoordinates } from '../Math/global-coordinates';\r\nimport { Vector } from '../Math/vector';\r\nimport { Pointer, PointerType } from './Pointer';\r\nimport { GameEvent } from '../Events';\r\n\r\n/**\r\n * Native browser button enumeration\r\n */\r\nexport enum NativePointerButton {\r\n NoButton = -1,\r\n Left = 0,\r\n Middle = 1,\r\n Right = 2,\r\n Unknown = 3\r\n}\r\n\r\n/**\r\n * The mouse button being pressed.\r\n */\r\nexport enum PointerButton {\r\n Left = 'Left',\r\n Middle = 'Middle',\r\n Right = 'Right',\r\n Unknown = 'Unknown',\r\n NoButton = 'NoButton'\r\n}\r\n\r\nexport enum WheelDeltaMode {\r\n Pixel = 'Pixel',\r\n Line = 'Line',\r\n Page = 'Page'\r\n}\r\n\r\n/**\r\n * Type that indicates Excalibur's valid synthetic pointer events\r\n */\r\nexport type PointerEventName =\r\n | 'pointerdragstart'\r\n | 'pointerdragend'\r\n | 'pointerdragmove'\r\n | 'pointerdragenter'\r\n | 'pointerdragleave'\r\n | 'pointermove'\r\n | 'pointerenter'\r\n | 'pointerleave'\r\n | 'pointerup'\r\n | 'pointerdown';\r\n\r\n/**\r\n * Pointer events\r\n *\r\n * Represents a mouse, touch, or stylus event. See [[Pointers]] for more information on\r\n * handling pointer input.\r\n *\r\n * For mouse-based events, you can inspect [[PointerEvent.button]] to see what button was pressed.\r\n */\r\nexport class PointerEvent extends GameEvent<Actor> {\r\n protected _name: string;\r\n\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n /** The world coordinates of the event. */\r\n public get worldPos(): Vector {\r\n return this.coordinates.worldPos.clone();\r\n }\r\n\r\n /** The page coordinates of the event. */\r\n public get pagePos(): Vector {\r\n return this.coordinates.pagePos.clone();\r\n }\r\n\r\n /** The screen coordinates of the event. */\r\n public get screenPos(): Vector {\r\n return this.coordinates.screenPos.clone();\r\n }\r\n\r\n /**\r\n * @param coordinates The [[GlobalCoordinates]] of the event\r\n * @param pointer The [[Pointer]] of the event\r\n * @param index The index of the pointer (zero-based)\r\n * @param pointerType The type of pointer\r\n * @param button The button pressed (if [[PointerType.Mouse]])\r\n * @param ev The raw DOM event being handled\r\n */\r\n constructor(\r\n protected coordinates: GlobalCoordinates,\r\n public pointer: Pointer,\r\n public index: number,\r\n public pointerType: PointerType,\r\n public button: PointerButton,\r\n public ev: any\r\n ) {\r\n super();\r\n }\r\n\r\n public get pos(): Vector {\r\n return this.coordinates.worldPos.clone();\r\n }\r\n\r\n public _canceled = false;\r\n\r\n /**\r\n * Cancels pointer event propogation, event will not be transmitted to any other actors\r\n */\r\n public cancel() {\r\n this._canceled = true;\r\n }\r\n\r\n /**\r\n *\r\n * @returns If the event is canceled it will no longer be transmitted to any other actors\r\n */\r\n public isCanceled() {\r\n return this._canceled;\r\n }\r\n\r\n public propagate(actor: Actor): void {\r\n this.doAction(actor);\r\n\r\n if (this.bubbles && !this.isCanceled() && actor.parent) {\r\n this.propagate(actor.parent as Actor); // TODO not true\r\n }\r\n }\r\n\r\n /**\r\n * Action, that calls when event happens\r\n */\r\n public doAction(actor: Actor): void {\r\n if (actor) {\r\n this._onActionStart(actor);\r\n actor.emit(this._name, this);\r\n this._onActionEnd(actor);\r\n }\r\n }\r\n\r\n protected _onActionStart(_actor?: Actor) {\r\n // to be rewritten\r\n }\r\n\r\n protected _onActionEnd(_actor?: Actor) {\r\n // to be rewritten\r\n }\r\n}\r\n\r\nexport class PointerEventFactory<T extends PointerEvent> {\r\n constructor(\r\n protected _pointerEventType: new (\r\n coordinates: GlobalCoordinates,\r\n pointer: Pointer,\r\n index: number,\r\n pointerType: PointerType,\r\n button: PointerButton,\r\n ev: any\r\n ) => T\r\n ) {}\r\n\r\n /**\r\n * Create specific PointerEvent\r\n */\r\n public create(\r\n coordinates: GlobalCoordinates,\r\n pointer: Pointer,\r\n index: number,\r\n pointerType: PointerType,\r\n button: PointerButton,\r\n ev: any\r\n ): T {\r\n return new this._pointerEventType(coordinates, pointer, index, pointerType, button, ev);\r\n }\r\n}\r\n\r\nexport class PointerDragEvent extends PointerEvent {}\r\n\r\nexport class PointerUpEvent extends PointerEvent {\r\n protected _name = 'pointerup';\r\n\r\n protected _onActionEnd(actor: Actor) {\r\n const pointer = this.pointer;\r\n\r\n if (pointer.isDragEnd && actor.capturePointer.captureDragEvents) {\r\n actor.eventDispatcher.emit('pointerdragend', this);\r\n }\r\n }\r\n}\r\n\r\nexport class PointerDownEvent extends PointerEvent {\r\n protected _name = 'pointerdown';\r\n\r\n protected _onActionEnd(actor: Actor) {\r\n if (this.pointer.isDragStart && actor.capturePointer.captureDragEvents) {\r\n actor.eventDispatcher.emit('pointerdragstart', this);\r\n }\r\n }\r\n}\r\n\r\nexport class PointerMoveEvent extends PointerEvent {\r\n protected _name = 'pointermove';\r\n\r\n public propagate(actor: Actor): void {\r\n // If the actor was under the pointer last frame, but not this one it left\r\n // if (this.pointer.wasActorUnderPointer(actor) && !this.pointer.isActorUnderPointer(actor)) {\r\n // this._onActorLeave(actor);\r\n // return;\r\n // }\r\n\r\n if (this.pointer.isActorAliveUnderPointer(actor)) {\r\n this.doAction(actor);\r\n\r\n if (this.bubbles && !this.isCanceled() && actor.parent) {\r\n this.propagate(actor.parent as Actor); // TODO not true\r\n }\r\n }\r\n }\r\n\r\n protected _onActionStart(actor: Actor) {\r\n if (!actor.capturePointer.captureMoveEvents) {\r\n return;\r\n }\r\n\r\n // In the case this is new\r\n // if (this.pointer.checkActorUnderPointer(actor) && !this.pointer.wasActorUnderPointer(actor)) {\r\n // this._onActorEnter(actor);\r\n // }\r\n\r\n if (this.pointer.isDragging && actor.capturePointer.captureDragEvents) {\r\n actor.eventDispatcher.emit('pointerdragmove', this);\r\n }\r\n }\r\n\r\n // private _onActorEnter(actor: Actor) {\r\n // const pe = createPointerEventByName('enter', this.coordinates, this.pointer, this.index, this.pointerType, this.button, this.ev);\r\n // pe.propagate(actor);\r\n // this.pointer.addActorUnderPointer(actor);\r\n\r\n // if (this.pointer.isDragging) {\r\n // this.pointer.dragTarget = actor;\r\n // }\r\n // }\r\n\r\n // private _onActorLeave(actor: Actor) {\r\n // const pe = createPointerEventByName('leave', this.coordinates, this.pointer, this.index, this.pointerType, this.button, this.ev);\r\n // pe.propagate(actor);\r\n // this.pointer.removeActorUnderPointer(actor);\r\n // }\r\n}\r\n\r\nexport class PointerEnterEvent extends PointerEvent {\r\n protected _name = 'pointerenter';\r\n\r\n protected _onActionStart(actor: Actor) {\r\n if (!actor.capturePointer.captureMoveEvents) {\r\n return;\r\n }\r\n }\r\n\r\n protected _onActionEnd(actor: Actor) {\r\n const pointer = this.pointer;\r\n\r\n if (pointer.isDragging && actor.capturePointer.captureDragEvents) {\r\n actor.eventDispatcher.emit('pointerdragenter', this);\r\n }\r\n }\r\n}\r\n\r\nexport class PointerLeaveEvent extends PointerEvent {\r\n protected _name = 'pointerleave';\r\n\r\n protected _onActionStart(actor: Actor) {\r\n if (!actor.capturePointer.captureMoveEvents) {\r\n return;\r\n }\r\n }\r\n\r\n protected _onActionEnd(actor: Actor) {\r\n const pointer = this.pointer;\r\n\r\n if (pointer.isDragging && actor.capturePointer.captureDragEvents) {\r\n actor.eventDispatcher.emit('pointerdragleave', this);\r\n }\r\n }\r\n}\r\n\r\nexport class PointerCancelEvent extends PointerEvent {\r\n protected _name = 'pointercancel';\r\n}\r\n/**\r\n * Wheel Events\r\n *\r\n * Represents a mouse wheel event. See [[Pointers]] for more information on\r\n * handling point input.\r\n */\r\nexport class WheelEvent extends GameEvent<Actor> {\r\n /**\r\n * @param x The `x` coordinate of the event (in world coordinates)\r\n * @param y The `y` coordinate of the event (in world coordinates)\r\n * @param pageX The `x` coordinate of the event (in document coordinates)\r\n * @param pageY The `y` coordinate of the event (in document coordinates)\r\n * @param screenX The `x` coordinate of the event (in screen coordinates)\r\n * @param screenY The `y` coordinate of the event (in screen coordinates)\r\n * @param index The index of the pointer (zero-based)\r\n * @param deltaX The type of pointer\r\n * @param deltaY The type of pointer\r\n * @param deltaZ The type of pointer\r\n * @param deltaMode The type of movement [[WheelDeltaMode]]\r\n * @param ev The raw DOM event being handled\r\n */\r\n constructor(\r\n public x: number,\r\n public y: number,\r\n public pageX: number,\r\n public pageY: number,\r\n public screenX: number,\r\n public screenY: number,\r\n public index: number,\r\n public deltaX: number,\r\n public deltaY: number,\r\n public deltaZ: number,\r\n public deltaMode: WheelDeltaMode,\r\n public ev: any\r\n ) {\r\n super();\r\n }\r\n\r\n private _isCanceled = false;\r\n\r\n /**\r\n * Cancels pointer event propogation, event will not be transmitted to any other actors\r\n */\r\n public cancel() {\r\n this._isCanceled = true;\r\n }\r\n\r\n /**\r\n *\r\n * @returns If the event is canceled it will no longer be transmitted to any other actors\r\n */\r\n public isCanceled() {\r\n return this._isCanceled;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function createPointerEventByName(\r\n eventName: string,\r\n coordinates: GlobalCoordinates,\r\n pointer: Pointer,\r\n index: number,\r\n pointerType: PointerType,\r\n button: PointerButton,\r\n ev: any\r\n) {\r\n let factory: PointerEventFactory<PointerEvent>;\r\n\r\n switch (eventName) {\r\n case 'up':\r\n factory = new PointerEventFactory(<any>PointerUpEvent);\r\n break;\r\n case 'down':\r\n factory = new PointerEventFactory(<any>PointerDownEvent);\r\n break;\r\n case 'move':\r\n factory = new PointerEventFactory(<any>PointerMoveEvent);\r\n break;\r\n case 'cancel':\r\n factory = new PointerEventFactory(<any>PointerCancelEvent);\r\n break;\r\n case 'enter':\r\n factory = new PointerEventFactory(<any>PointerEnterEvent);\r\n break;\r\n case 'leave':\r\n factory = new PointerEventFactory(<any>PointerLeaveEvent);\r\n break;\r\n }\r\n\r\n return factory.create(coordinates, pointer, index, pointerType, button, ev);\r\n}\r\n","import { Engine } from '../Engine';\nimport { Vector } from './vector';\n\nexport class GlobalCoordinates {\n public static fromPagePosition(x: number, y: number, engine: Engine): GlobalCoordinates;\n public static fromPagePosition(pos: Vector, engine: Engine): GlobalCoordinates;\n public static fromPagePosition(xOrPos: number | Vector, yOrEngine: number | Engine, engineOrUndefined?: Engine): GlobalCoordinates {\n let pageX: number;\n let pageY: number;\n let pagePos: Vector;\n let engine: Engine;\n\n if (arguments.length === 3) {\n pageX = <number>xOrPos;\n pageY = <number>yOrEngine;\n pagePos = new Vector(pageX, pageY);\n engine = engineOrUndefined;\n } else {\n pagePos = <Vector>xOrPos;\n pageX = pagePos.x;\n pageY = pagePos.y;\n engine = <Engine>yOrEngine;\n }\n\n const screenPos = engine.screen.pageToScreenCoordinates(pagePos);\n const worldPos = engine.screen.screenToWorldCoordinates(screenPos);\n\n return new GlobalCoordinates(worldPos, pagePos, screenPos);\n }\n\n constructor(public worldPos: Vector, public pagePos: Vector, public screenPos: Vector) {}\n}\n","import { Class } from '../Class';\r\nimport { Engine, ScrollPreventionMode } from '../Engine';\r\nimport { Pointer, PointerType } from './Pointer';\r\nimport {\r\n PointerEvent,\r\n WheelEvent,\r\n NativePointerButton,\r\n PointerButton,\r\n WheelDeltaMode,\r\n createPointerEventByName,\r\n PointerLeaveEvent,\r\n PointerEnterEvent\r\n} from './PointerEvents';\r\nimport { GameEvent } from '../Events';\r\n\r\nimport * as Events from '../Events';\r\nimport * as Util from '../Util/Util';\r\nimport { vec } from '../Math/vector';\r\nimport { GlobalCoordinates } from '../Math/global-coordinates';\r\nimport { Vector } from '../Math/vector';\r\nimport { CapturePointer } from '../Traits/CapturePointer';\r\nimport { Actor } from '../Actor';\r\n\r\nexport type DOMPointerEvent = globalThis.PointerEvent;\r\nexport type DOMWheelEvent = globalThis.WheelEvent;\r\n\r\ninterface TouchEvent extends Event {\r\n altKey: boolean;\r\n changedTouches: Touch[];\r\n ctrlKey: boolean;\r\n metaKey: boolean;\r\n shiftKey: boolean;\r\n targetTouches: Touch[];\r\n touches: Touch[];\r\n type: string;\r\n target: Element;\r\n}\r\n\r\ninterface Touch {\r\n identifier: number;\r\n screenX: number;\r\n screenY: number;\r\n clientX: number;\r\n clientY: number;\r\n pageX: number;\r\n pageY: number;\r\n radiusX: number;\r\n radiusY: number;\r\n rotationAngle: number;\r\n force: number;\r\n target: Element;\r\n}\r\n\r\n/**\r\n * A constant used to normalize wheel events across different browsers\r\n *\r\n * This normalization factor is pulled from https://developer.mozilla.org/en-US/docs/Web/Events/wheel#Listening_to_this_event_across_browser\r\n */\r\nconst ScrollWheelNormalizationFactor = -1 / 40;\r\n\r\n/**\r\n * Handles pointer events (mouse, touch, stylus, etc.) and normalizes to\r\n * [W3C Pointer Events](http://www.w3.org/TR/pointerevents/).\r\n */\r\nexport class Pointers extends Class {\r\n private _engine: Engine;\r\n\r\n private _pointerDown: PointerEvent[] = [];\r\n private _pointerUp: PointerEvent[] = [];\r\n private _pointerMove: PointerEvent[] = [];\r\n private _pointerCancel: PointerEvent[] = [];\r\n private _wheel: WheelEvent[] = [];\r\n private _pointers: Pointer[] = [];\r\n private _activePointers: number[] = [];\r\n\r\n constructor(engine: Engine) {\r\n super();\r\n\r\n this._engine = engine;\r\n this._pointers.push(new Pointer());\r\n this._activePointers = [-1];\r\n this.primary = this._pointers[0];\r\n }\r\n\r\n public on(eventName: Events.up, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.down, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.move, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.enter, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.leave, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.cancel, handler: (event: PointerEvent) => void): void;\r\n public on(eventName: Events.wheel, handler: (event: WheelEvent) => void): void;\r\n public on(eventName: string, handler: (event: GameEvent<any>) => void): void;\r\n public on(eventName: string, handler: (event: any) => void): void {\r\n super.on(eventName, handler);\r\n }\r\n\r\n /**\r\n * Primary pointer (mouse, 1 finger, stylus, etc.)\r\n */\r\n public primary: Pointer;\r\n\r\n /**\r\n * Initializes pointer event listeners\r\n */\r\n public init(target?: GlobalEventHandlers): void {\r\n target = target || this._engine.canvas;\r\n\r\n // Touch Events\r\n target.addEventListener('touchstart', this._handleTouchEvent('down', this._pointerDown));\r\n target.addEventListener('touchend', this._handleTouchEvent('up', this._pointerUp));\r\n target.addEventListener('touchmove', this._handleTouchEvent('move', this._pointerMove));\r\n target.addEventListener('touchcancel', this._handleTouchEvent('cancel', this._pointerCancel));\r\n\r\n // W3C Pointer Events\r\n // Current: IE11, IE10\r\n if ((<any>window).PointerEvent) {\r\n // IE11\r\n this._engine.canvas.style.touchAction = 'none';\r\n target.addEventListener('pointerdown', this._handlePointerEvent('down', this._pointerDown));\r\n target.addEventListener('pointerup', this._handlePointerEvent('up', this._pointerUp));\r\n target.addEventListener('pointermove', this._handlePointerEvent('move', this._pointerMove));\r\n target.addEventListener('pointercancel', this._handlePointerEvent('cancel', this._pointerCancel));\r\n } else if ((<any>window).MSPointerEvent) {\r\n // IE10\r\n (this._engine.canvas.style as any).msTouchAction = 'none';\r\n target.addEventListener('MSPointerDown', this._handlePointerEvent('down', this._pointerDown));\r\n target.addEventListener('MSPointerUp', this._handlePointerEvent('up', this._pointerUp));\r\n target.addEventListener('MSPointerMove', this._handlePointerEvent('move', this._pointerMove));\r\n target.addEventListener('MSPointerCancel', this._handlePointerEvent('cancel', this._pointerCancel));\r\n } else {\r\n // Mouse Events\r\n target.addEventListener('mousedown', this._handleMouseEvent('down', this._pointerDown));\r\n target.addEventListener('mouseup', this._handleMouseEvent('up', this._pointerUp));\r\n target.addEventListener('mousemove', this._handleMouseEvent('move', this._pointerMove));\r\n }\r\n\r\n // MDN MouseWheelEvent\r\n const wheelOptions = {\r\n passive: !(\r\n this._engine.pageScrollPreventionMode === ScrollPreventionMode.All ||\r\n this._engine.pageScrollPreventionMode === ScrollPreventionMode.Canvas\r\n )\r\n };\r\n if ('onwheel' in document.createElement('div')) {\r\n // Modern Browsers\r\n target.addEventListener('wheel', this._handleWheelEvent('wheel', this._wheel), wheelOptions);\r\n } else if (document.onmousewheel !== undefined) {\r\n // Webkit and IE\r\n target.addEventListener('mousewheel', this._handleWheelEvent('wheel', this._wheel), wheelOptions);\r\n } else {\r\n // Remaining browser and older Firefox\r\n target.addEventListener('MozMousePixelScroll', this._handleWheelEvent('wheel', this._wheel), wheelOptions);\r\n }\r\n }\r\n\r\n /**\r\n * Synthesize a pointer event that looks like a real browser event to excalibur\r\n * @param eventName\r\n * @param pos\r\n */\r\n public triggerEvent(\r\n eventName: 'up' | 'down' | 'move' | 'cancel' | 'wheel',\r\n pos: Vector | GlobalCoordinates,\r\n button: NativePointerButton = NativePointerButton.Left,\r\n pointerType: 'mouse' | 'touch' | 'pen' = 'mouse',\r\n pointerId: number = 0\r\n ): void {\r\n let x = 0;\r\n let y = 0;\r\n let coords: GlobalCoordinates;\r\n if (pos instanceof GlobalCoordinates) {\r\n x = pos.pagePos.x;\r\n y = pos.pagePos.y;\r\n coords = pos;\r\n } else {\r\n x = pos.x;\r\n y = pos.y;\r\n coords = new GlobalCoordinates(pos.clone(), pos.clone(), pos.clone());\r\n }\r\n\r\n const eventish = {\r\n pageX: x,\r\n pageY: y,\r\n pointerId: pointerId,\r\n pointerType: pointerType,\r\n button: button,\r\n preventDefault: () => {\r\n /* do nothing */\r\n }\r\n };\r\n\r\n switch (eventName) {\r\n case 'move':\r\n this._handlePointerEvent(eventName, this._pointerMove, coords)(eventish as DOMPointerEvent);\r\n break;\r\n case 'down':\r\n this._handlePointerEvent(eventName, this._pointerDown, coords)(eventish as DOMPointerEvent);\r\n break;\r\n case 'up':\r\n this._handlePointerEvent(eventName, this._pointerUp, coords)(eventish as DOMPointerEvent);\r\n break;\r\n case 'cancel':\r\n this._handlePointerEvent(eventName, this._pointerCancel, coords)(eventish as DOMPointerEvent);\r\n break;\r\n }\r\n for (const actor of this._engine.currentScene.actors) {\r\n const capturePointer = actor.traits.filter((t) => t instanceof CapturePointer)[0];\r\n if (capturePointer) {\r\n capturePointer.update(actor, this._engine, 1);\r\n }\r\n }\r\n this.dispatchPointerEvents();\r\n this.update();\r\n }\r\n\r\n /**\r\n * Update all pointer events and pointers, meant to be called at the end of frame\r\n */\r\n public update(): void {\r\n this._pointerUp.length = 0;\r\n this._pointerDown.length = 0;\r\n this._pointerMove.length = 0;\r\n this._pointerCancel.length = 0;\r\n this._wheel.length = 0;\r\n\r\n for (let i = 0; i < this._pointers.length; i++) {\r\n this._pointers[i].update();\r\n }\r\n }\r\n\r\n /**\r\n * Safely gets a Pointer at a specific index and initializes one if it doesn't yet exist\r\n * @param index The pointer index to retrieve\r\n */\r\n public at(index: number): Pointer {\r\n if (index >= this._pointers.length) {\r\n // Ensure there is a pointer to retrieve\r\n for (let i = this._pointers.length - 1, max = index; i < max; i++) {\r\n this._pointers.push(new Pointer());\r\n this._activePointers.push(-1);\r\n }\r\n }\r\n\r\n return this._pointers[index];\r\n }\r\n\r\n /**\r\n * Get number of pointers being watched\r\n */\r\n public count(): number {\r\n return this._pointers.length;\r\n }\r\n\r\n public checkAndUpdateActorUnderPointer(actor: Actor) {\r\n for (const pointer of this._pointers) {\r\n if (pointer.checkActorUnderPointer(actor)) {\r\n pointer.addActorUnderPointer(actor);\r\n } else {\r\n pointer.removeActorUnderPointer(actor);\r\n }\r\n }\r\n }\r\n\r\n private _dispatchWithBubble(events: PointerEvent[]) {\r\n for (const evt of events) {\r\n for (const actor of evt.pointer.getActorsForEvents()) {\r\n if (!evt.isCanceled()) {\r\n evt.propagate(actor);\r\n }\r\n if (!evt.bubbles || evt.isCanceled()) {\r\n // if the event stops bubbling part way stop processing\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _dispatchPointerLeaveEvents() {\r\n const lastMoveEventPerPointerPerActor: { [pointerId: string]: PointerEvent } = {};\r\n const pointerLeave: PointerLeaveEvent[] = [];\r\n\r\n for (const evt of this._pointerMove) {\r\n for (const actor of evt.pointer.getActorsForEvents()) {\r\n // If the actor was under the pointer last frame, but not this this frame, pointer left\r\n if (\r\n !lastMoveEventPerPointerPerActor[evt.pointer.id + '+' + actor.id] &&\r\n evt.pointer.wasActorUnderPointer(actor) &&\r\n !evt.pointer.isActorAliveUnderPointer(actor) &&\r\n !evt.isCanceled()\r\n ) {\r\n lastMoveEventPerPointerPerActor[evt.pointer.id + '+' + actor.id] = evt;\r\n const pe = createPointerEventByName(\r\n 'leave',\r\n new GlobalCoordinates(evt.worldPos, evt.pagePos, evt.screenPos),\r\n evt.pointer,\r\n evt.index,\r\n evt.pointerType,\r\n evt.button,\r\n evt.ev\r\n );\r\n\r\n pe.propagate(actor);\r\n pointerLeave.push(<PointerLeaveEvent>pe);\r\n }\r\n }\r\n }\r\n return pointerLeave;\r\n }\r\n\r\n private _dispatchPointerEnterEvents() {\r\n const lastMoveEventPerPointer: { [pointerId: number]: PointerEvent } = {};\r\n const pointerEnter: PointerEnterEvent[] = [];\r\n\r\n for (const evt of this._pointerMove) {\r\n for (const actor of evt.pointer.getActorsForEvents()) {\r\n // If the actor was not under the pointer last frame, but it is this frame, pointer entered\r\n if (\r\n !lastMoveEventPerPointer[evt.pointer.id] &&\r\n !evt.pointer.wasActorUnderPointer(actor) &&\r\n evt.pointer.isActorAliveUnderPointer(actor) &&\r\n !evt.isCanceled()\r\n ) {\r\n lastMoveEventPerPointer[evt.pointer.id] = evt;\r\n const pe = createPointerEventByName(\r\n 'enter',\r\n new GlobalCoordinates(evt.worldPos, evt.pagePos, evt.screenPos),\r\n evt.pointer,\r\n evt.index,\r\n evt.pointerType,\r\n evt.button,\r\n evt.ev\r\n );\r\n pe.propagate(actor);\r\n pointerEnter.push(<PointerEnterEvent>pe);\r\n // if pointer is dragging set the drag target\r\n if (evt.pointer.isDragging) {\r\n evt.pointer.dragTarget = actor;\r\n }\r\n }\r\n }\r\n }\r\n return pointerEnter;\r\n }\r\n\r\n public dispatchPointerEvents() {\r\n this._dispatchWithBubble(this._pointerDown);\r\n this._dispatchWithBubble(this._pointerUp);\r\n this._dispatchWithBubble(this._pointerMove);\r\n this._dispatchPointerLeaveEvents();\r\n this._dispatchPointerEnterEvents();\r\n this._dispatchWithBubble(this._pointerCancel);\r\n\r\n // TODO some duplication here\r\n for (const evt of this._wheel) {\r\n for (const actor of this._pointers[evt.index].getActorsUnderPointer()) {\r\n this._propagateWheelPointerEvent(actor, evt);\r\n if (!evt.bubbles || evt.isCanceled()) {\r\n // if the event stops bubbling part way stop processing\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _propagateWheelPointerEvent(actor: Actor, wheelEvent: WheelEvent) {\r\n actor.emit('pointerwheel', wheelEvent);\r\n\r\n // Recurse and propagate\r\n if (wheelEvent.bubbles && !wheelEvent.isCanceled() && actor.parent) {\r\n this._propagateWheelPointerEvent(actor.parent as Actor, wheelEvent); // TODO not true\r\n }\r\n }\r\n\r\n private _handleMouseEvent(eventName: string, eventArr: PointerEvent[]) {\r\n return (e: MouseEvent) => {\r\n e.preventDefault();\r\n\r\n const pointer = this.at(0);\r\n const coordinates = GlobalCoordinates.fromPagePosition(e.pageX, e.pageY, this._engine);\r\n const pe = createPointerEventByName(\r\n eventName,\r\n coordinates,\r\n pointer,\r\n 0,\r\n PointerType.Mouse,\r\n this._nativeButtonToPointerButton(e.button),\r\n e\r\n );\r\n\r\n eventArr.push(pe);\r\n pointer.eventDispatcher.emit(eventName, pe);\r\n };\r\n }\r\n\r\n private _handleTouchEvent(eventName: string, eventArr: PointerEvent[]) {\r\n return (e: TouchEvent) => {\r\n e.preventDefault();\r\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\r\n const index = this._pointers.length > 1 ? this._getPointerIndex(e.changedTouches[i].identifier) : 0;\r\n if (index === -1) {\r\n continue;\r\n }\r\n\r\n const pointer = this.at(index);\r\n const coordinates = GlobalCoordinates.fromPagePosition(e.changedTouches[i].pageX, e.changedTouches[i].pageY, this._engine);\r\n const pe = createPointerEventByName(eventName, coordinates, pointer, index, PointerType.Touch, PointerButton.Unknown, e);\r\n\r\n eventArr.push(pe);\r\n pointer.eventDispatcher.emit(eventName, pe);\r\n this.emit(eventName, pe);\r\n // only with multi-pointer\r\n if (this._pointers.length > 1) {\r\n if (eventName === 'up') {\r\n // remove pointer ID from pool when pointer is lifted\r\n this._activePointers[index] = -1;\r\n } else if (eventName === 'down') {\r\n // set pointer ID to given index\r\n this._activePointers[index] = e.changedTouches[i].identifier;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n private _handlePointerEvent(eventName: string, eventArr: PointerEvent[], coords?: GlobalCoordinates) {\r\n return (e: DOMPointerEvent) => {\r\n e.preventDefault();\r\n\r\n // get the index for this pointer ID if multi-pointer is asked for\r\n const index = this._pointers.length > 1 ? this._getPointerIndex(e.pointerId) : 0;\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n const pointer = this.at(index);\r\n const coordinates = coords || GlobalCoordinates.fromPagePosition(e.pageX, e.pageY, this._engine);\r\n const pe = createPointerEventByName(\r\n eventName,\r\n coordinates,\r\n pointer,\r\n index,\r\n this._stringToPointerType(e.pointerType),\r\n this._nativeButtonToPointerButton(e.button),\r\n e\r\n );\r\n\r\n eventArr.push(pe);\r\n pointer.eventDispatcher.emit(eventName, pe);\r\n this.emit(eventName, pe);\r\n\r\n // only with multi-pointer\r\n if (this._pointers.length > 1) {\r\n if (eventName === 'up') {\r\n // remove pointer ID from pool when pointer is lifted\r\n this._activePointers[index] = -1;\r\n } else if (eventName === 'down') {\r\n // set pointer ID to given index\r\n this._activePointers[index] = e.pointerId;\r\n }\r\n }\r\n };\r\n }\r\n\r\n private _handleWheelEvent(eventName: string, eventArr: WheelEvent[]) {\r\n return (e: DOMWheelEvent) => {\r\n // Should we prevent page scroll because of this event\r\n if (\r\n this._engine.pageScrollPreventionMode === ScrollPreventionMode.All ||\r\n (this._engine.pageScrollPreventionMode === ScrollPreventionMode.Canvas && e.target === this._engine.canvas)\r\n ) {\r\n e.preventDefault();\r\n }\r\n const screen = this._engine.screen.pageToScreenCoordinates(vec(e.pageX, e.pageY));\r\n const world = this._engine.screen.screenToWorldCoordinates(screen);\r\n\r\n // deltaX, deltaY, and deltaZ are the standard modern properties\r\n // wheelDeltaX, wheelDeltaY, are legacy properties in webkit browsers and older IE\r\n // e.detail is only used in opera\r\n\r\n const deltaX = e.deltaX || e.wheelDeltaX * ScrollWheelNormalizationFactor || 0;\r\n const deltaY =\r\n e.deltaY || e.wheelDeltaY * ScrollWheelNormalizationFactor || e.wheelDelta * ScrollWheelNormalizationFactor || e.detail || 0;\r\n const deltaZ = e.deltaZ || 0;\r\n let deltaMode = WheelDeltaMode.Pixel;\r\n\r\n if (e.deltaMode) {\r\n if (e.deltaMode === 1) {\r\n deltaMode = WheelDeltaMode.Line;\r\n } else if (e.deltaMode === 2) {\r\n deltaMode = WheelDeltaMode.Page;\r\n }\r\n }\r\n\r\n const we = new WheelEvent(world.x, world.y, e.pageX, e.pageY, screen.x, screen.y, 0, deltaX, deltaY, deltaZ, deltaMode, e);\r\n\r\n eventArr.push(we);\r\n this.at(0).eventDispatcher.emit(eventName, we);\r\n this.emit(eventName, we);\r\n };\r\n }\r\n\r\n /**\r\n * Gets the index of the pointer specified for the given pointer ID or finds the next empty pointer slot available.\r\n * This is required because IE10/11 uses incrementing pointer IDs so we need to store a mapping of ID => idx\r\n */\r\n private _getPointerIndex(pointerId: number) {\r\n let idx;\r\n if ((idx = this._activePointers.indexOf(pointerId)) > -1) {\r\n return idx;\r\n }\r\n\r\n for (let i = 0; i < this._activePointers.length; i++) {\r\n if (this._activePointers[i] === -1) {\r\n return i;\r\n }\r\n }\r\n\r\n // ignore pointer because game isn't watching\r\n return -1;\r\n }\r\n\r\n private _nativeButtonToPointerButton(s: NativePointerButton): PointerButton {\r\n switch (s) {\r\n case NativePointerButton.NoButton:\r\n return PointerButton.NoButton;\r\n case NativePointerButton.Left:\r\n return PointerButton.Left;\r\n case NativePointerButton.Middle:\r\n return PointerButton.Middle;\r\n case NativePointerButton.Right:\r\n return PointerButton.Right;\r\n case NativePointerButton.Unknown:\r\n return PointerButton.Unknown;\r\n default:\r\n return Util.fail(s);\r\n }\r\n }\r\n\r\n private _stringToPointerType(s: string) {\r\n switch (s) {\r\n case 'touch':\r\n return PointerType.Touch;\r\n case 'mouse':\r\n return PointerType.Mouse;\r\n case 'pen':\r\n return PointerType.Pen;\r\n default:\r\n return PointerType.Unknown;\r\n }\r\n }\r\n}\r\n","import { Class } from './../Class';\r\nimport { GameEvent, GamepadConnectEvent, GamepadDisconnectEvent, GamepadButtonEvent, GamepadAxisEvent } from '../Events';\r\nimport * as Events from '../Events';\r\n\r\n/**\r\n * Excalibur leverages the HTML5 Gamepad API [where it is supported](http://caniuse.com/#feat=gamepad)\r\n * to provide controller support for your games.\r\n */\r\nexport class Gamepads extends Class {\r\n /**\r\n * Whether or not to poll for Gamepad input (default: `false`)\r\n */\r\n public enabled = false;\r\n\r\n /**\r\n * Whether or not Gamepad API is supported\r\n */\r\n public supported = !!(<any>navigator).getGamepads;\r\n\r\n /**\r\n * The minimum value an axis has to move before considering it a change\r\n */\r\n public static MinAxisMoveThreshold = 0.05;\r\n\r\n private _gamePadTimeStamps = [0, 0, 0, 0];\r\n private _oldPads: Gamepad[] = [];\r\n private _pads: Gamepad[] = [];\r\n private _initSuccess: boolean = false;\r\n private _navigator: NavigatorGamepads = <any>navigator;\r\n private _minimumConfiguration: GamepadConfiguration = null;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public init() {\r\n if (!this.supported) {\r\n return;\r\n }\r\n if (this._initSuccess) {\r\n return;\r\n }\r\n\r\n // In Chrome, this will return 4 undefined items until a button is pressed\r\n // In FF, this will not return any items until a button is pressed\r\n this._oldPads = this._clonePads(this._navigator.getGamepads());\r\n if (this._oldPads.length && this._oldPads[0]) {\r\n this._initSuccess = true;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the minimum gamepad configuration, for example {axis: 4, buttons: 4} means\r\n * this game requires at minimum 4 axis inputs and 4 buttons, this is not restrictive\r\n * all other controllers with more axis or buttons are valid as well. If no minimum\r\n * configuration is set all pads are valid.\r\n */\r\n public setMinimumGamepadConfiguration(config: GamepadConfiguration): void {\r\n this._enableAndUpdate(); // if config is used, implicitly enable\r\n this._minimumConfiguration = config;\r\n }\r\n\r\n /**\r\n * When implicitly enabled, set the enabled flag and run an update so information is updated\r\n */\r\n private _enableAndUpdate() {\r\n if (!this.enabled) {\r\n this.enabled = true;\r\n this.update();\r\n }\r\n }\r\n\r\n /**\r\n * Checks a navigator gamepad against the minimum configuration if present.\r\n */\r\n private _isGamepadValid(pad: NavigatorGamepad): boolean {\r\n if (!this._minimumConfiguration) {\r\n return true;\r\n }\r\n if (!pad) {\r\n return false;\r\n }\r\n const axesLength = pad.axes.filter((value) => {\r\n return typeof value !== undefined;\r\n }).length;\r\n\r\n const buttonLength = pad.buttons.filter((value) => {\r\n return typeof value !== undefined;\r\n }).length;\r\n return axesLength >= this._minimumConfiguration.axis && buttonLength >= this._minimumConfiguration.buttons && pad.connected;\r\n }\r\n\r\n public on(eventName: Events.connect, handler: (event: GamepadConnectEvent) => void): void;\r\n public on(eventName: Events.disconnect, handler: (event: GamepadDisconnectEvent) => void): void;\r\n public on(eventName: Events.button, handler: (event: GamepadButtonEvent) => void): void;\r\n public on(eventName: Events.axis, handler: (event: GamepadAxisEvent) => void): void;\r\n public on(eventName: string, handler: (event: GameEvent<any>) => void): void;\r\n public on(eventName: string, handler: (event: any) => void): void {\r\n this._enableAndUpdate(); // implicitly enable\r\n super.on(eventName, handler);\r\n }\r\n\r\n public off(eventName: string, handler?: (event: GameEvent<any>) => void) {\r\n this._enableAndUpdate(); // implicitly enable\r\n super.off(eventName, handler);\r\n }\r\n\r\n /**\r\n * Updates Gamepad state and publishes Gamepad events\r\n */\r\n public update() {\r\n if (!this.enabled || !this.supported) {\r\n return;\r\n }\r\n this.init();\r\n\r\n const gamepads = this._navigator.getGamepads();\r\n\r\n for (let i = 0; i < gamepads.length; i++) {\r\n if (!gamepads[i]) {\r\n const gamepad = this.at(i);\r\n // If was connected, but now isn't emit the disconnect event\r\n if (gamepad.connected) {\r\n this.eventDispatcher.emit('disconnect', new GamepadDisconnectEvent(i, gamepad));\r\n }\r\n // Reset connection status\r\n gamepad.connected = false;\r\n continue;\r\n } else {\r\n if (!this.at(i).connected && this._isGamepadValid(gamepads[i])) {\r\n this.eventDispatcher.emit('connect', new GamepadConnectEvent(i, this.at(i)));\r\n }\r\n // Set connection status\r\n this.at(i).connected = true;\r\n }\r\n\r\n // Only supported in Chrome\r\n if (gamepads[i].timestamp && gamepads[i].timestamp === this._gamePadTimeStamps[i]) {\r\n continue;\r\n }\r\n\r\n this._gamePadTimeStamps[i] = gamepads[i].timestamp;\r\n\r\n // Add reference to navigator gamepad\r\n this.at(i).navigatorGamepad = gamepads[i];\r\n\r\n // Buttons\r\n let b: string, bi: number, a: string, ai: number, value: number;\r\n\r\n for (b in Buttons) {\r\n bi = <any>Buttons[b];\r\n if (typeof bi === 'number') {\r\n if (gamepads[i].buttons[bi]) {\r\n value = gamepads[i].buttons[bi].value;\r\n if (value !== this._oldPads[i].getButton(bi)) {\r\n if (gamepads[i].buttons[bi].pressed) {\r\n this.at(i).updateButton(bi, value);\r\n this.at(i).eventDispatcher.emit('button', new GamepadButtonEvent(bi, value, this.at(i)));\r\n } else {\r\n this.at(i).updateButton(bi, 0);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Axes\r\n for (a in Axes) {\r\n ai = <any>Axes[a];\r\n if (typeof ai === 'number') {\r\n value = gamepads[i].axes[ai];\r\n if (value !== this._oldPads[i].getAxes(ai)) {\r\n this.at(i).updateAxes(ai, value);\r\n this.at(i).eventDispatcher.emit('axis', new GamepadAxisEvent(ai, value, this.at(i)));\r\n }\r\n }\r\n }\r\n\r\n this._oldPads[i] = this._clonePad(gamepads[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Safely retrieves a Gamepad at a specific index and creates one if it doesn't yet exist\r\n */\r\n public at(index: number): Gamepad {\r\n this._enableAndUpdate(); // implicitly enable gamepads when at() is called\r\n if (index >= this._pads.length) {\r\n // Ensure there is a pad to retrieve\r\n for (let i = this._pads.length - 1, max = index; i < max; i++) {\r\n this._pads.push(new Gamepad());\r\n this._oldPads.push(new Gamepad());\r\n }\r\n }\r\n\r\n return this._pads[index];\r\n }\r\n\r\n /**\r\n * Returns a list of all valid gamepads that meet the minimum configuration requirement.\r\n */\r\n public getValidGamepads(): Gamepad[] {\r\n this._enableAndUpdate();\r\n const result: Gamepad[] = [];\r\n for (let i = 0; i < this._pads.length; i++) {\r\n if (this._isGamepadValid(this.at(i).navigatorGamepad) && this.at(i).connected) {\r\n result.push(this.at(i));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the number of connected gamepads\r\n */\r\n public count() {\r\n return this._pads.filter((p) => p.connected).length;\r\n }\r\n\r\n private _clonePads(pads: NavigatorGamepad[]): Gamepad[] {\r\n const arr = [];\r\n for (let i = 0, len = pads.length; i < len; i++) {\r\n arr.push(this._clonePad(pads[i]));\r\n }\r\n return arr;\r\n }\r\n\r\n /**\r\n * Fastest way to clone a known object is to do it yourself\r\n */\r\n private _clonePad(pad: NavigatorGamepad): Gamepad {\r\n let i, len;\r\n const clonedPad = new Gamepad();\r\n\r\n if (!pad) {\r\n return clonedPad;\r\n }\r\n\r\n for (i = 0, len = pad.buttons.length; i < len; i++) {\r\n if (pad.buttons[i]) {\r\n clonedPad.updateButton(i, pad.buttons[i].value);\r\n }\r\n }\r\n for (i = 0, len = pad.axes.length; i < len; i++) {\r\n clonedPad.updateAxes(i, pad.axes[i]);\r\n }\r\n\r\n return clonedPad;\r\n }\r\n}\r\n\r\n/**\r\n * Gamepad holds state information for a connected controller. See [[Gamepads]]\r\n * for more information on handling controller input.\r\n */\r\nexport class Gamepad extends Class {\r\n public connected = false;\r\n public navigatorGamepad: NavigatorGamepad;\r\n private _buttons: number[] = new Array(16);\r\n private _axes: number[] = new Array(4);\r\n\r\n constructor() {\r\n super();\r\n\r\n for (let i = 0; i < this._buttons.length; i++) {\r\n this._buttons[i] = 0;\r\n }\r\n for (let i = 0; i < this._axes.length; i++) {\r\n this._axes[i] = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Whether or not the given button is pressed\r\n * @param button The button to query\r\n * @param threshold The threshold over which the button is considered to be pressed\r\n */\r\n public isButtonPressed(button: Buttons, threshold: number = 1) {\r\n return this._buttons[button] >= threshold;\r\n }\r\n\r\n /**\r\n * Gets the given button value between 0 and 1\r\n */\r\n public getButton(button: Buttons) {\r\n return this._buttons[button];\r\n }\r\n\r\n /**\r\n * Gets the given axis value between -1 and 1. Values below\r\n * [[MinAxisMoveThreshold]] are considered 0.\r\n */\r\n public getAxes(axes: Axes) {\r\n const value = this._axes[axes];\r\n\r\n if (Math.abs(value) < Gamepads.MinAxisMoveThreshold) {\r\n return 0;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n public updateButton(buttonIndex: number, value: number) {\r\n this._buttons[buttonIndex] = value;\r\n }\r\n\r\n public updateAxes(axesIndex: number, value: number) {\r\n this._axes[axesIndex] = value;\r\n }\r\n}\r\n\r\n/**\r\n * Gamepad Buttons enumeration\r\n */\r\nexport enum Buttons {\r\n /**\r\n * Face 1 button (e.g. A)\r\n */\r\n Face1 = 0,\r\n /**\r\n * Face 2 button (e.g. B)\r\n */\r\n Face2 = 1,\r\n /**\r\n * Face 3 button (e.g. X)\r\n */\r\n Face3 = 2,\r\n /**\r\n * Face 4 button (e.g. Y)\r\n */\r\n Face4 = 3,\r\n /**\r\n * Left bumper button\r\n */\r\n LeftBumper = 4,\r\n /**\r\n * Right bumper button\r\n */\r\n RightBumper = 5,\r\n /**\r\n * Left trigger button\r\n */\r\n LeftTrigger = 6,\r\n /**\r\n * Right trigger button\r\n */\r\n RightTrigger = 7,\r\n /**\r\n * Select button\r\n */\r\n Select = 8,\r\n /**\r\n * Start button\r\n */\r\n Start = 9,\r\n /**\r\n * Left analog stick press (e.g. L3)\r\n */\r\n LeftStick = 10,\r\n /**\r\n * Right analog stick press (e.g. R3)\r\n */\r\n RightStick = 11,\r\n /**\r\n * D-pad up\r\n */\r\n DpadUp = 12,\r\n /**\r\n * D-pad down\r\n */\r\n DpadDown = 13,\r\n /**\r\n * D-pad left\r\n */\r\n DpadLeft = 14,\r\n /**\r\n * D-pad right\r\n */\r\n DpadRight = 15\r\n}\r\n\r\n/**\r\n * Gamepad Axes enumeration\r\n */\r\nexport enum Axes {\r\n /**\r\n * Left analogue stick X direction\r\n */\r\n LeftStickX = 0,\r\n /**\r\n * Left analogue stick Y direction\r\n */\r\n LeftStickY = 1,\r\n /**\r\n * Right analogue stick X direction\r\n */\r\n RightStickX = 2,\r\n /**\r\n * Right analogue stick Y direction\r\n */\r\n RightStickY = 3\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface NavigatorGamepads {\r\n getGamepads(): NavigatorGamepad[];\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface NavigatorGamepad {\r\n axes: number[];\r\n buttons: NavigatorGamepadButton[];\r\n connected: boolean;\r\n id: string;\r\n index: number;\r\n mapping: string;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface NavigatorGamepadButton {\r\n pressed: boolean;\r\n value: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface NavigatorGamepadEvent {\r\n gamepad: NavigatorGamepad;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface GamepadConfiguration {\r\n axis: number;\r\n buttons: number;\r\n}\r\n","export interface NativeEventable {\r\n addEventListener(name: string, handler: (...any: any[]) => any): any;\r\n removeEventListener(name: string, handler: (...any: any[]) => any): any;\r\n}\r\n\r\nexport class BrowserComponent<T extends NativeEventable> {\r\n private _paused = false;\r\n private _nativeHandlers: { [key: string]: (handler: any) => void } = {};\r\n\r\n on(eventName: string, handler: (evt: any) => void): void {\r\n if (this._nativeHandlers[eventName]) {\r\n this.off(eventName, this._nativeHandlers[eventName]);\r\n }\r\n this._nativeHandlers[eventName] = this._decorate(handler);\r\n this.nativeComponent.addEventListener(eventName, this._nativeHandlers[eventName]);\r\n }\r\n off(eventName: string, handler?: (event: any) => void): void {\r\n if (!handler) {\r\n handler = this._nativeHandlers[eventName];\r\n }\r\n this.nativeComponent.removeEventListener(eventName, handler);\r\n this._nativeHandlers[eventName] = null;\r\n }\r\n\r\n private _decorate(handler: (evt: any) => void): (evt: any) => void {\r\n return (evt: any) => {\r\n if (!this._paused) {\r\n handler(evt);\r\n }\r\n };\r\n }\r\n\r\n public pause() {\r\n this._paused = true;\r\n }\r\n\r\n public resume() {\r\n this._paused = false;\r\n }\r\n\r\n public clear() {\r\n for (const event in this._nativeHandlers) {\r\n this.off(event);\r\n }\r\n }\r\n\r\n constructor(public nativeComponent: T) {}\r\n}\r\n\r\nexport class BrowserEvents {\r\n private _windowComponent: BrowserComponent<Window>;\r\n private _documentComponent: BrowserComponent<Document>;\r\n constructor(private _windowGlobal: Window, private _documentGlobal: Document) {\r\n this._windowComponent = new BrowserComponent(this._windowGlobal);\r\n this._documentComponent = new BrowserComponent(this._documentGlobal);\r\n }\r\n\r\n public get window(): BrowserComponent<Window> {\r\n return this._windowComponent;\r\n }\r\n\r\n public get document(): BrowserComponent<Document> {\r\n return this._documentComponent;\r\n }\r\n\r\n public pause() {\r\n this.window.pause();\r\n this.document.pause();\r\n }\r\n\r\n public resume() {\r\n this.window.resume();\r\n this.document.resume();\r\n }\r\n\r\n public clear() {\r\n this.window.clear();\r\n this.document.clear();\r\n }\r\n}\r\n","import {\r\n ExcaliburGraphicsContext,\r\n LineGraphicsOptions,\r\n PointGraphicsOptions,\r\n ExcaliburGraphicsContextOptions,\r\n DebugDraw,\r\n HTMLImageSource\r\n} from './ExcaliburGraphicsContext';\r\nimport { Vector } from '../../Math/vector';\r\nimport { Color } from '../../Color';\r\nimport { StateStack } from './state-stack';\r\nimport { GraphicsDiagnostics } from '../GraphicsDiagnostics';\r\nimport { DebugText } from './debug-text';\r\n\r\nclass ExcaliburGraphicsContext2DCanvasDebug implements DebugDraw {\r\n private _debugText = new DebugText();\r\n constructor(private _ex: ExcaliburGraphicsContext2DCanvas) {}\r\n /**\r\n * Draw a debug rectangle to the context\r\n * @param x\r\n * @param y\r\n * @param width\r\n * @param height\r\n */\r\n drawRect(x: number, y: number, width: number, height: number): void {\r\n this._ex.__ctx.save();\r\n this._ex.__ctx.strokeStyle = 'red';\r\n this._ex.__ctx.strokeRect(\r\n this._ex.snapToPixel ? ~~x : x,\r\n this._ex.snapToPixel ? ~~y : y,\r\n this._ex.snapToPixel ? ~~width : width,\r\n this._ex.snapToPixel ? ~~height : height\r\n );\r\n this._ex.__ctx.restore();\r\n }\r\n\r\n drawLine(start: Vector, end: Vector, lineOptions: LineGraphicsOptions = { color: Color.Black }): void {\r\n this._ex.__ctx.save();\r\n this._ex.__ctx.beginPath();\r\n this._ex.__ctx.strokeStyle = lineOptions.color.toString();\r\n this._ex.__ctx.moveTo(this._ex.snapToPixel ? ~~start.x : start.x, this._ex.snapToPixel ? ~~start.y : start.y);\r\n this._ex.__ctx.lineTo(this._ex.snapToPixel ? ~~end.x : end.x, this._ex.snapToPixel ? ~~end.y : end.y);\r\n this._ex.__ctx.lineWidth = 2;\r\n this._ex.__ctx.stroke();\r\n this._ex.__ctx.closePath();\r\n this._ex.__ctx.restore();\r\n }\r\n\r\n drawPoint(point: Vector, pointOptions: PointGraphicsOptions = { color: Color.Black, size: 5 }): void {\r\n this._ex.__ctx.save();\r\n this._ex.__ctx.beginPath();\r\n this._ex.__ctx.fillStyle = pointOptions.color.toString();\r\n this._ex.__ctx.arc(\r\n this._ex.snapToPixel ? ~~point.x : point.x,\r\n this._ex.snapToPixel ? ~~point.y : point.y,\r\n pointOptions.size,\r\n 0,\r\n Math.PI * 2\r\n );\r\n this._ex.__ctx.fill();\r\n this._ex.__ctx.closePath();\r\n this._ex.__ctx.restore();\r\n }\r\n\r\n drawText(text: string, pos: Vector) {\r\n this._debugText.write(this._ex, text, pos);\r\n }\r\n}\r\n\r\nexport class ExcaliburGraphicsContext2DCanvas implements ExcaliburGraphicsContext {\r\n /**\r\n * Meant for internal use only. Access the internal context at your own risk and no guarantees this will exist in the future.\r\n * @internal\r\n */\r\n public __ctx: CanvasRenderingContext2D;\r\n public get width() {\r\n return this.__ctx.canvas.width;\r\n }\r\n\r\n public get height() {\r\n return this.__ctx.canvas.height;\r\n }\r\n\r\n public backgroundColor: Color = Color.ExcaliburBlue;\r\n\r\n private _state = new StateStack();\r\n\r\n public get opacity(): number {\r\n return this._state.current.opacity;\r\n }\r\n\r\n public set opacity(value: number) {\r\n this._state.current.opacity = value;\r\n }\r\n\r\n public snapToPixel: boolean = true;\r\n\r\n public get smoothing(): boolean {\r\n return this.__ctx.imageSmoothingEnabled;\r\n }\r\n\r\n public set smoothing(value: boolean) {\r\n this.__ctx.imageSmoothingEnabled = value;\r\n }\r\n\r\n constructor(options: ExcaliburGraphicsContextOptions) {\r\n const { canvasElement, enableTransparency, snapToPixel, smoothing, backgroundColor } = options;\r\n this.__ctx = canvasElement.getContext('2d', {\r\n alpha: enableTransparency ?? true\r\n });\r\n this.backgroundColor = backgroundColor ?? this.backgroundColor;\r\n this.snapToPixel = snapToPixel ?? this.snapToPixel;\r\n this.smoothing = smoothing ?? this.smoothing;\r\n }\r\n\r\n public resetTransform(): void {\r\n this.__ctx.resetTransform();\r\n }\r\n\r\n public updateViewport(): void {\r\n // pass\r\n }\r\n\r\n /**\r\n * Draw an image to the Excalibur Graphics context at an x and y coordinate using the images width and height\r\n */\r\n drawImage(image: HTMLImageSource, x: number, y: number): void;\r\n /**\r\n *\r\n * Draw an image to the Excalibur Graphics context at an x and y coordinate with a specific width and height\r\n */\r\n drawImage(image: HTMLImageSource, x: number, y: number, width: number, height: number): void;\r\n /**\r\n *\r\n * Draw an image to the Excalibur Graphics context specifying the source image coordinates (sx, sy, swidth, sheight)\r\n * and to a specific destination on the context (dx, dy, dwidth, dheight)\r\n */\r\n drawImage(\r\n image: HTMLImageSource,\r\n sx: number,\r\n sy: number,\r\n swidth?: number,\r\n sheight?: number,\r\n dx?: number,\r\n dy?: number,\r\n dwidth?: number,\r\n dheight?: number\r\n ): void;\r\n\r\n drawImage(\r\n image: HTMLImageSource,\r\n sx: number,\r\n sy: number,\r\n swidth?: number,\r\n sheight?: number,\r\n dx?: number,\r\n dy?: number,\r\n dwidth?: number,\r\n dheight?: number\r\n ): void {\r\n if (swidth === 0 || sheight === 0) {\r\n return; // zero dimension dest exit early\r\n } else if (dwidth === 0 || dheight === 0) {\r\n return; // zero dimension dest exit early\r\n } else if (image.width === 0 || image.height === 0) {\r\n return; // zero dimension source exit early\r\n }\r\n\r\n this.__ctx.globalAlpha = this.opacity;\r\n const args = [image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight]\r\n .filter((a) => a !== undefined)\r\n .map((a) => (typeof a === 'number' && this.snapToPixel ? ~~a : a));\r\n this.__ctx.drawImage.apply(this.__ctx, args);\r\n GraphicsDiagnostics.DrawCallCount++;\r\n GraphicsDiagnostics.DrawnImagesCount = 1;\r\n }\r\n\r\n public drawLine(start: Vector, end: Vector, color: Color, thickness = 1) {\r\n this.__ctx.save();\r\n this.__ctx.beginPath();\r\n this.__ctx.strokeStyle = color.toString();\r\n this.__ctx.moveTo(this.snapToPixel ? ~~start.x : start.x, this.snapToPixel ? ~~start.y : start.y);\r\n this.__ctx.lineTo(this.snapToPixel ? ~~end.x : end.x, this.snapToPixel ? ~~end.y : end.y);\r\n this.__ctx.lineWidth = thickness;\r\n this.__ctx.stroke();\r\n this.__ctx.closePath();\r\n this.__ctx.restore();\r\n }\r\n\r\n public drawRectangle(pos: Vector, width: number, height: number, color: Color) {\r\n this.__ctx.save();\r\n this.__ctx.fillStyle = color.toString();\r\n this.__ctx.fillRect(\r\n this.snapToPixel ? ~~pos.x : pos.x,\r\n this.snapToPixel ? ~~pos.y : pos.y,\r\n this.snapToPixel ? ~~width : width,\r\n this.snapToPixel ? ~~height : height\r\n );\r\n this.__ctx.restore();\r\n }\r\n\r\n public drawCircle(pos: Vector, radius: number, color: Color) {\r\n this.__ctx.save();\r\n this.__ctx.beginPath();\r\n this.__ctx.fillStyle = color.toString();\r\n this.__ctx.arc(this.snapToPixel ? ~~pos.x : pos.x, this.snapToPixel ? ~~pos.y : pos.y, radius, 0, Math.PI * 2);\r\n this.__ctx.fill();\r\n this.__ctx.closePath();\r\n this.__ctx.restore();\r\n }\r\n\r\n debug = new ExcaliburGraphicsContext2DCanvasDebug(this);\r\n\r\n /**\r\n * Save the current state of the canvas to the stack (transforms and opacity)\r\n */\r\n save(): void {\r\n this.__ctx.save();\r\n }\r\n\r\n /**\r\n * Restore the state of the canvas from the stack\r\n */\r\n restore(): void {\r\n this.__ctx.restore();\r\n }\r\n\r\n /**\r\n * Translate the origin of the context by an x and y\r\n * @param x\r\n * @param y\r\n */\r\n translate(x: number, y: number): void {\r\n this.__ctx.translate(this.snapToPixel ? ~~x : x, this.snapToPixel ? ~~y : y);\r\n }\r\n\r\n /**\r\n * Rotate the context about the current origin\r\n */\r\n rotate(angle: number): void {\r\n this.__ctx.rotate(angle);\r\n }\r\n\r\n /**\r\n * Scale the context by an x and y factor\r\n * @param x\r\n * @param y\r\n */\r\n scale(x: number, y: number): void {\r\n this.__ctx.scale(x, y);\r\n }\r\n\r\n clear(): void {\r\n // Clear frame\r\n this.__ctx.clearRect(0, 0, this.width, this.height);\r\n this.__ctx.fillStyle = this.backgroundColor.toString();\r\n this.__ctx.fillRect(0, 0, this.width, this.height);\r\n GraphicsDiagnostics.clear();\r\n }\r\n\r\n /**\r\n * Flushes the batched draw calls to the screen\r\n */\r\n flush(): void {\r\n // pass\r\n }\r\n}\r\n","import { EX_VERSION } from './';\r\nimport { Flags, Legacy } from './Flags';\r\nimport { polyfill } from './Polyfill';\r\npolyfill();\r\nimport { CanUpdate, CanDraw, CanInitialize } from './Interfaces/LifecycleEvents';\r\nimport { Loadable } from './Interfaces/Loadable';\r\nimport { Vector } from './Math/vector';\r\nimport { Screen, DisplayMode, AbsolutePosition, ScreenDimension, Resolution } from './Screen';\r\nimport { ScreenElement } from './ScreenElement';\r\nimport { Actor } from './Actor';\r\nimport { Timer } from './Timer';\r\nimport { TileMap } from './TileMap';\r\nimport { Animation } from './Drawing/Animation';\r\nimport { Loader } from './Loader';\r\nimport { Detector } from './Util/Detector';\r\nimport {\r\n VisibleEvent,\r\n HiddenEvent,\r\n GameStartEvent,\r\n GameStopEvent,\r\n PreUpdateEvent,\r\n PostUpdateEvent,\r\n PreFrameEvent,\r\n PostFrameEvent,\r\n GameEvent,\r\n DeactivateEvent,\r\n ActivateEvent,\r\n PreDrawEvent,\r\n PostDrawEvent,\r\n InitializeEvent\r\n} from './Events';\r\nimport { Logger, LogLevel } from './Util/Log';\r\nimport { Color } from './Color';\r\nimport { Scene } from './Scene';\r\nimport { Entity } from './EntityComponentSystem/Entity';\r\nimport { PostProcessor } from './PostProcessing/PostProcessor';\r\nimport { Debug, DebugStats } from './Debug/Debug';\r\nimport { Class } from './Class';\r\nimport * as Input from './Input/Index';\r\nimport * as Events from './Events';\r\nimport { BrowserEvents } from './Util/Browser';\r\nimport { obsolete } from './Util/Decorators';\r\nimport { ExcaliburGraphicsContext, ExcaliburGraphicsContext2DCanvas, ExcaliburGraphicsContextWebGL } from './Graphics';\r\n\r\n/**\r\n * Enum representing the different mousewheel event bubble prevention\r\n */\r\nexport enum ScrollPreventionMode {\r\n /**\r\n * Do not prevent any page scrolling\r\n */\r\n None,\r\n /**\r\n * Prevent page scroll if mouse is over the game canvas\r\n */\r\n Canvas,\r\n /**\r\n * Prevent all page scrolling via mouse wheel\r\n */\r\n All\r\n}\r\n\r\n/**\r\n * Defines the available options to configure the Excalibur engine at constructor time.\r\n */\r\nexport interface EngineOptions {\r\n /**\r\n * Optionally configure the width of the viewport in css pixels\r\n */\r\n width?: number;\r\n\r\n /**\r\n * Optionally configure the height of the viewport in css pixels\r\n */\r\n height?: number;\r\n\r\n /**\r\n * Optionally configure the width & height of the viewport in css pixels.\r\n * Use `viewport` instead of [[EngineOptions.width]] and [[EngineOptions.height]], or vice versa.\r\n */\r\n viewport?: ScreenDimension;\r\n\r\n /**\r\n * Optionally specify the size the logical pixel resolution, if not specified it will be width x height.\r\n * See [[Resolution]] for common presets.\r\n */\r\n resolution?: ScreenDimension;\r\n\r\n /**\r\n * Optionally specify antialiasing (smoothing), by default true (smooth pixels)\r\n */\r\n antialiasing?: boolean;\r\n\r\n /**\r\n * Optionally configure the native canvas transparent backdrop\r\n */\r\n enableCanvasTransparency?: boolean;\r\n\r\n /**\r\n * Optionally specify the target canvas DOM element to render the game in\r\n */\r\n canvasElementId?: string;\r\n\r\n /**\r\n * Optionally specify the target canvas DOM element directly\r\n */\r\n canvasElement?: HTMLCanvasElement;\r\n\r\n /**\r\n * Optionally snap drawings to nearest pixel\r\n */\r\n snapToPixel?: boolean;\r\n\r\n /**\r\n * The [[DisplayMode]] of the game, by default [[DisplayMode.FitScreen]] with aspect ratio 4:3 (800x600).\r\n * Depending on this value, [[width]] and [[height]] may be ignored.\r\n */\r\n displayMode?: DisplayMode;\r\n\r\n /**\r\n * Configures the pointer scope. Pointers scoped to the 'Canvas' can only fire events within the canvas viewport; whereas, 'Document'\r\n * (default) scoped will fire anywhere on the page.\r\n */\r\n pointerScope?: Input.PointerScope;\r\n\r\n /**\r\n * Suppress boot up console message, which contains the \"powered by Excalibur message\"\r\n */\r\n suppressConsoleBootMessage?: boolean;\r\n\r\n /**\r\n * Suppress minimum browser feature detection, it is not recommended users of excalibur switch this off. This feature ensures that\r\n * the currently running browser meets the minimum requirements for running excalibur. This can be useful if running on non-standard\r\n * browsers or if there is a bug in excalibur preventing execution.\r\n */\r\n suppressMinimumBrowserFeatureDetection?: boolean;\r\n\r\n /**\r\n * Suppress HiDPI auto detection and scaling, it is not recommended users of excalibur switch off this feature. This feature detects\r\n * and scales the drawing canvas appropriately to accommodate HiDPI screens.\r\n */\r\n suppressHiDPIScaling?: boolean;\r\n\r\n /**\r\n * Suppress play button, it is not recommended users of excalibur switch this feature. Some browsers require a user gesture (like a click)\r\n * for certain browser features to work like web audio.\r\n */\r\n suppressPlayButton?: boolean;\r\n\r\n /**\r\n * Specify how the game window is to be positioned when the [[DisplayMode.Position]] is chosen. This option MUST be specified\r\n * if the DisplayMode is set as [[DisplayMode.Position]]. The position can be either a string or an [[AbsolutePosition]].\r\n * String must be in the format of css style background-position. The vertical position must precede the horizontal position in strings.\r\n *\r\n * Valid String examples: \"top left\", \"top\", \"bottom\", \"middle\", \"middle center\", \"bottom right\"\r\n * Valid [[AbsolutePosition]] examples: `{top: 5, right: 10%}`, `{bottom: 49em, left: 10px}`, `{left: 10, bottom: 40}`\r\n */\r\n position?: string | AbsolutePosition;\r\n\r\n /**\r\n * Scroll prevention method.\r\n */\r\n scrollPreventionMode?: ScrollPreventionMode;\r\n\r\n /**\r\n * Optionally set the background color\r\n */\r\n backgroundColor?: Color;\r\n}\r\n\r\n/**\r\n * The Excalibur Engine\r\n *\r\n * The [[Engine]] is the main driver for a game. It is responsible for\r\n * starting/stopping the game, maintaining state, transmitting events,\r\n * loading resources, and managing the scene.\r\n */\r\nexport class Engine extends Class implements CanInitialize, CanUpdate, CanDraw {\r\n /**\r\n *\r\n */\r\n public browser: BrowserEvents;\r\n\r\n /**\r\n * Screen abstraction\r\n */\r\n public screen: Screen;\r\n\r\n /**\r\n * Direct access to the engine's canvas element\r\n */\r\n public canvas: HTMLCanvasElement;\r\n\r\n /**\r\n * Direct access to the engine's 2D rendering context\r\n */\r\n public ctx: CanvasRenderingContext2D;\r\n\r\n public graphicsContext: ExcaliburGraphicsContext;\r\n\r\n /**\r\n * Direct access to the canvas element ID, if an ID exists\r\n */\r\n public canvasElementId: string;\r\n\r\n /**\r\n * The width of the game canvas in pixels (physical width component of the\r\n * resolution of the canvas element)\r\n */\r\n public get canvasWidth(): number {\r\n return this.screen.canvasWidth;\r\n }\r\n\r\n /**\r\n * Returns half width of the game canvas in pixels (half physical width component)\r\n */\r\n public get halfCanvasWidth(): number {\r\n return this.screen.halfCanvasWidth;\r\n }\r\n\r\n /**\r\n * The height of the game canvas in pixels, (physical height component of\r\n * the resolution of the canvas element)\r\n */\r\n public get canvasHeight(): number {\r\n return this.screen.canvasHeight;\r\n }\r\n\r\n /**\r\n * Returns half height of the game canvas in pixels (half physical height component)\r\n */\r\n public get halfCanvasHeight(): number {\r\n return this.screen.halfCanvasHeight;\r\n }\r\n\r\n /**\r\n * Returns the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\r\n */\r\n public get drawWidth(): number {\r\n return this.screen.drawWidth;\r\n }\r\n\r\n /**\r\n * Returns half the width of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\r\n */\r\n public get halfDrawWidth(): number {\r\n return this.screen.halfDrawWidth;\r\n }\r\n\r\n /**\r\n * Returns the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\r\n */\r\n public get drawHeight(): number {\r\n return this.screen.drawHeight;\r\n }\r\n\r\n /**\r\n * Returns half the height of the engine's visible drawing surface in pixels including zoom and device pixel ratio.\r\n */\r\n public get halfDrawHeight(): number {\r\n return this.screen.halfDrawHeight;\r\n }\r\n\r\n /**\r\n * Returns whether excalibur detects the current screen to be HiDPI\r\n */\r\n public get isHiDpi(): boolean {\r\n return this.screen.isHiDpi;\r\n }\r\n\r\n /**\r\n * Access engine input like pointer, keyboard, or gamepad\r\n */\r\n public input: Input.EngineInput;\r\n\r\n private _hasStarted: boolean = false;\r\n\r\n /**\r\n * Access Excalibur debugging functionality.\r\n */\r\n public debug: Debug;\r\n\r\n /**\r\n * Access [[stats]] that holds frame statistics.\r\n */\r\n public get stats(): DebugStats {\r\n return this.debug.stats;\r\n }\r\n\r\n /**\r\n * Gets or sets the list of post processors to apply at the end of drawing a frame (such as [[ColorBlindCorrector]])\r\n */\r\n public postProcessors: PostProcessor[] = [];\r\n\r\n /**\r\n * The current [[Scene]] being drawn and updated on screen\r\n */\r\n public currentScene: Scene;\r\n\r\n /**\r\n * The default [[Scene]] of the game, use [[Engine.goToScene]] to transition to different scenes.\r\n */\r\n public readonly rootScene: Scene;\r\n\r\n /**\r\n * Contains all the scenes currently registered with Excalibur\r\n */\r\n public readonly scenes: { [key: string]: Scene } = {};\r\n\r\n /**\r\n * @hidden\r\n * @deprecated\r\n */\r\n private _animations: AnimationNode[] = [];\r\n\r\n /**\r\n * Indicates whether the engine is set to fullscreen or not\r\n */\r\n public get isFullscreen(): boolean {\r\n return this.screen.isFullScreen;\r\n }\r\n\r\n /**\r\n * Indicates the current [[DisplayMode]] of the engine.\r\n */\r\n public get displayMode(): DisplayMode {\r\n return this.screen.displayMode;\r\n }\r\n\r\n private _suppressPlayButton: boolean = false;\r\n /**\r\n * Returns the calculated pixel ration for use in rendering\r\n */\r\n public get pixelRatio(): number {\r\n return this.screen.pixelRatio;\r\n }\r\n\r\n /**\r\n * Indicates the current position of the engine. Valid only when DisplayMode is DisplayMode.Position\r\n */\r\n public position: string | AbsolutePosition;\r\n /**\r\n * Indicates whether audio should be paused when the game is no longer visible.\r\n */\r\n public pauseAudioWhenHidden: boolean = true;\r\n\r\n /**\r\n * Indicates whether the engine should draw with debug information\r\n */\r\n private _isDebug: boolean = false;\r\n public get isDebug(): boolean {\r\n return this._isDebug;\r\n }\r\n public debugColor: Color = new Color(255, 255, 255);\r\n /**\r\n * Sets the background color for the engine.\r\n */\r\n public backgroundColor: Color;\r\n\r\n /**\r\n * Sets the Transparency for the engine.\r\n */\r\n public enableCanvasTransparency: boolean = true;\r\n\r\n /**\r\n * The action to take when a fatal exception is thrown\r\n */\r\n public onFatalException = (e: any) => {\r\n Logger.getInstance().fatal(e);\r\n };\r\n\r\n /**\r\n * The mouse wheel scroll prevention mode\r\n */\r\n public pageScrollPreventionMode: ScrollPreventionMode;\r\n\r\n private _logger: Logger;\r\n\r\n // this is a reference to the current requestAnimationFrame return value\r\n private _requestId: number;\r\n\r\n // this determines whether excalibur is compatible with your browser\r\n private _compatible: boolean;\r\n\r\n private _timescale: number = 1.0;\r\n\r\n // loading\r\n private _loader: Loader;\r\n private _isLoading: boolean = false;\r\n\r\n private _isInitialized: boolean = false;\r\n\r\n private _deferredGoTo: string = null;\r\n\r\n public on(eventName: Events.initialize, handler: (event: Events.InitializeEvent<Engine>) => void): void;\r\n public on(eventName: Events.visible, handler: (event: VisibleEvent) => void): void;\r\n public on(eventName: Events.hidden, handler: (event: HiddenEvent) => void): void;\r\n public on(eventName: Events.start, handler: (event: GameStartEvent) => void): void;\r\n public on(eventName: Events.stop, handler: (event: GameStopEvent) => void): void;\r\n public on(eventName: Events.preupdate, handler: (event: PreUpdateEvent<Engine>) => void): void;\r\n public on(eventName: Events.postupdate, handler: (event: PostUpdateEvent<Engine>) => void): void;\r\n public on(eventName: Events.preframe, handler: (event: PreFrameEvent) => void): void;\r\n public on(eventName: Events.postframe, handler: (event: PostFrameEvent) => void): void;\r\n public on(eventName: Events.predraw, handler: (event: PreDrawEvent) => void): void;\r\n public on(eventName: Events.postdraw, handler: (event: PostDrawEvent) => void): void;\r\n public on(eventName: string, handler: (event: GameEvent<any>) => void): void;\r\n public on(eventName: string, handler: (event: any) => void): void {\r\n super.on(eventName, handler);\r\n }\r\n\r\n public once(eventName: Events.initialize, handler: (event: Events.InitializeEvent<Engine>) => void): void;\r\n public once(eventName: Events.visible, handler: (event: VisibleEvent) => void): void;\r\n public once(eventName: Events.hidden, handler: (event: HiddenEvent) => void): void;\r\n public once(eventName: Events.start, handler: (event: GameStartEvent) => void): void;\r\n public once(eventName: Events.stop, handler: (event: GameStopEvent) => void): void;\r\n public once(eventName: Events.preupdate, handler: (event: PreUpdateEvent<Engine>) => void): void;\r\n public once(eventName: Events.postupdate, handler: (event: PostUpdateEvent<Engine>) => void): void;\r\n public once(eventName: Events.preframe, handler: (event: PreFrameEvent) => void): void;\r\n public once(eventName: Events.postframe, handler: (event: PostFrameEvent) => void): void;\r\n public once(eventName: Events.predraw, handler: (event: PreDrawEvent) => void): void;\r\n public once(eventName: Events.postdraw, handler: (event: PostDrawEvent) => void): void;\r\n public once(eventName: string, handler: (event: GameEvent<any>) => void): void;\r\n public once(eventName: string, handler: (event: any) => void): void {\r\n super.once(eventName, handler);\r\n }\r\n\r\n public off(eventName: Events.initialize, handler?: (event: Events.InitializeEvent<Engine>) => void): void;\r\n public off(eventName: Events.visible, handler?: (event: VisibleEvent) => void): void;\r\n public off(eventName: Events.hidden, handler?: (event: HiddenEvent) => void): void;\r\n public off(eventName: Events.start, handler?: (event: GameStartEvent) => void): void;\r\n public off(eventName: Events.stop, handler?: (event: GameStopEvent) => void): void;\r\n public off(eventName: Events.preupdate, handler?: (event: PreUpdateEvent<Engine>) => void): void;\r\n public off(eventName: Events.postupdate, handler?: (event: PostUpdateEvent<Engine>) => void): void;\r\n public off(eventName: Events.preframe, handler?: (event: PreFrameEvent) => void): void;\r\n public off(eventName: Events.postframe, handler?: (event: PostFrameEvent) => void): void;\r\n public off(eventName: Events.predraw, handler?: (event: PreDrawEvent) => void): void;\r\n public off(eventName: Events.postdraw, handler?: (event: PostDrawEvent) => void): void;\r\n public off(eventName: string, handler?: (event: GameEvent<any>) => void): void;\r\n public off(eventName: string, handler?: (event: any) => void): void {\r\n super.off(eventName, handler);\r\n }\r\n\r\n /**\r\n * Default [[EngineOptions]]\r\n */\r\n private static _DEFAULT_ENGINE_OPTIONS: EngineOptions = {\r\n width: 0,\r\n height: 0,\r\n enableCanvasTransparency: true,\r\n canvasElementId: '',\r\n canvasElement: undefined,\r\n snapToPixel: false,\r\n pointerScope: Input.PointerScope.Canvas,\r\n suppressConsoleBootMessage: null,\r\n suppressMinimumBrowserFeatureDetection: null,\r\n suppressHiDPIScaling: null,\r\n suppressPlayButton: null,\r\n scrollPreventionMode: ScrollPreventionMode.Canvas,\r\n backgroundColor: Color.fromHex('#2185d0') // Excalibur blue\r\n };\r\n\r\n /**\r\n * Creates a new game using the given [[EngineOptions]]. By default, if no options are provided,\r\n * the game will be rendered full screen (taking up all available browser window space).\r\n * You can customize the game rendering through [[EngineOptions]].\r\n *\r\n * Example:\r\n *\r\n * ```js\r\n * var game = new ex.Engine({\r\n * width: 0, // the width of the canvas\r\n * height: 0, // the height of the canvas\r\n * enableCanvasTransparency: true, // the transparencySection of the canvas\r\n * canvasElementId: '', // the DOM canvas element ID, if you are providing your own\r\n * displayMode: ex.DisplayMode.FullScreen, // the display mode\r\n * pointerScope: ex.Input.PointerScope.Document, // the scope of capturing pointer (mouse/touch) events\r\n * backgroundColor: ex.Color.fromHex('#2185d0') // background color of the engine\r\n * });\r\n *\r\n * // call game.start, which is a Promise\r\n * game.start().then(function () {\r\n * // ready, set, go!\r\n * });\r\n * ```\r\n */\r\n constructor(options?: EngineOptions) {\r\n super();\r\n\r\n options = { ...Engine._DEFAULT_ENGINE_OPTIONS, ...options };\r\n\r\n Flags.freeze();\r\n\r\n // Initialize browser events facade\r\n this.browser = new BrowserEvents(window, document);\r\n\r\n // Check compatibility\r\n const detector = new Detector();\r\n if (!options.suppressMinimumBrowserFeatureDetection && !(this._compatible = detector.test())) {\r\n const message = document.createElement('div');\r\n message.innerText = 'Sorry, your browser does not support all the features needed for Excalibur';\r\n document.body.appendChild(message);\r\n\r\n detector.failedTests.forEach(function (test) {\r\n const testMessage = document.createElement('div');\r\n testMessage.innerText = 'Browser feature missing ' + test;\r\n document.body.appendChild(testMessage);\r\n });\r\n\r\n if (options.canvasElementId) {\r\n const canvas = document.getElementById(options.canvasElementId);\r\n if (canvas) {\r\n canvas.parentElement.removeChild(canvas);\r\n }\r\n }\r\n\r\n return;\r\n } else {\r\n this._compatible = true;\r\n }\r\n\r\n // Use native console API for color fun\r\n // eslint-disable-next-line no-console\r\n if (console.log && !options.suppressConsoleBootMessage) {\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `%cPowered by Excalibur.js (v${EX_VERSION})`,\r\n 'background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;'\r\n );\r\n // eslint-disable-next-line no-console\r\n console.log('\\n\\\r\n /| ________________\\n\\\r\nO|===|* >________________>\\n\\\r\n \\\\|');\r\n // eslint-disable-next-line no-console\r\n console.log('Visit', 'http://excaliburjs.com', 'for more information');\r\n }\r\n\r\n // Suppress play button\r\n if (options.suppressPlayButton) {\r\n this._suppressPlayButton = true;\r\n }\r\n\r\n this._logger = Logger.getInstance();\r\n\r\n // If debug is enabled, let's log browser features to the console.\r\n if (this._logger.defaultLevel === LogLevel.Debug) {\r\n detector.logBrowserFeatures();\r\n }\r\n\r\n this._logger.debug('Building engine...');\r\n\r\n this.canvasElementId = options.canvasElementId;\r\n\r\n if (options.canvasElementId) {\r\n this._logger.debug('Using Canvas element specified: ' + options.canvasElementId);\r\n this.canvas = <HTMLCanvasElement>document.getElementById(options.canvasElementId);\r\n } else if (options.canvasElement) {\r\n this._logger.debug('Using Canvas element specified:', options.canvasElement);\r\n this.canvas = options.canvasElement;\r\n } else {\r\n this._logger.debug('Using generated canvas element');\r\n this.canvas = <HTMLCanvasElement>document.createElement('canvas');\r\n }\r\n\r\n let displayMode = options.displayMode ?? DisplayMode.Fixed;\r\n if ((options.width && options.height) || options.viewport) {\r\n if (options.displayMode === undefined) {\r\n displayMode = DisplayMode.Fixed;\r\n }\r\n this._logger.debug('Engine viewport is size ' + options.width + ' x ' + options.height);\r\n } else if (!options.displayMode) {\r\n this._logger.debug('Engine viewport is fit');\r\n displayMode = DisplayMode.FitScreen;\r\n }\r\n\r\n if (Flags.isEnabled(Legacy.Canvas)) {\r\n const ex2dCtx = new ExcaliburGraphicsContext2DCanvas({\r\n canvasElement: this.canvas,\r\n enableTransparency: this.enableCanvasTransparency,\r\n smoothing: options.antialiasing,\r\n backgroundColor: options.backgroundColor,\r\n snapToPixel: options.snapToPixel\r\n });\r\n this.graphicsContext = ex2dCtx;\r\n this.ctx = ex2dCtx.__ctx;\r\n } else {\r\n const exWebglCtx = new ExcaliburGraphicsContextWebGL({\r\n canvasElement: this.canvas,\r\n enableTransparency: this.enableCanvasTransparency,\r\n smoothing: options.antialiasing,\r\n backgroundColor: options.backgroundColor,\r\n snapToPixel: options.snapToPixel\r\n });\r\n this.graphicsContext = exWebglCtx;\r\n this.ctx = exWebglCtx.__ctx;\r\n }\r\n\r\n this.screen = new Screen({\r\n canvas: this.canvas,\r\n context: this.graphicsContext,\r\n antialiasing: options.antialiasing ?? true,\r\n browser: this.browser,\r\n viewport: options.viewport ?? (options.width && options.height ? { width: options.width, height: options.height } : Resolution.SVGA),\r\n resolution: options.resolution,\r\n displayMode,\r\n position: options.position,\r\n pixelRatio: options.suppressHiDPIScaling ? 1 : null\r\n });\r\n\r\n if (options.backgroundColor) {\r\n this.backgroundColor = options.backgroundColor.clone();\r\n }\r\n\r\n this.enableCanvasTransparency = options.enableCanvasTransparency;\r\n\r\n this._loader = new Loader();\r\n this.debug = new Debug(this);\r\n\r\n this._initialize(options);\r\n\r\n this.rootScene = this.currentScene = new Scene();\r\n\r\n this.addScene('root', this.rootScene);\r\n }\r\n\r\n /**\r\n * Returns a BoundingBox of the top left corner of the screen\r\n * and the bottom right corner of the screen.\r\n */\r\n public getWorldBounds() {\r\n return this.screen.getWorldBounds();\r\n }\r\n\r\n /**\r\n * Gets the current engine timescale factor (default is 1.0 which is 1:1 time)\r\n */\r\n public get timescale() {\r\n return this._timescale;\r\n }\r\n\r\n /**\r\n * Sets the current engine timescale factor. Useful for creating slow-motion effects or fast-forward effects\r\n * when using time-based movement.\r\n */\r\n public set timescale(value: number) {\r\n if (value <= 0) {\r\n Logger.getInstance().error('Cannot set engine.timescale to a value of 0 or less than 0.');\r\n return;\r\n }\r\n\r\n this._timescale = value;\r\n }\r\n\r\n /**\r\n * Plays a sprite animation on the screen at the specified `x` and `y`\r\n * (in game coordinates, not screen pixels). These animations play\r\n * independent of actors, and will be cleaned up internally as soon\r\n * as they are complete. Note animations that loop will never be\r\n * cleaned up.\r\n *\r\n * @param animation Animation to play\r\n * @param x x game coordinate to play the animation\r\n * @param y y game coordinate to play the animation\r\n * @deprecated\r\n */\r\n @obsolete({ message: 'Will be removed in excalibur v0.26.0', alternateMethod: 'Use Actor.graphics' })\r\n public playAnimation(animation: Animation, x: number, y: number) {\r\n this._animations.push(new AnimationNode(animation, x, y));\r\n }\r\n\r\n /**\r\n * Adds a [[TileMap]] to the [[currentScene]], once this is done the TileMap\r\n * will be drawn and updated.\r\n */\r\n public addTileMap(tileMap: TileMap) {\r\n this.currentScene.addTileMap(tileMap);\r\n }\r\n\r\n /**\r\n * Removes a [[TileMap]] from the [[currentScene]], it will no longer be drawn or updated.\r\n */\r\n public removeTileMap(tileMap: TileMap) {\r\n this.currentScene.removeTileMap(tileMap);\r\n }\r\n\r\n /**\r\n * Adds a [[Timer]] to the [[currentScene]].\r\n * @param timer The timer to add to the [[currentScene]].\r\n */\r\n public addTimer(timer: Timer): Timer {\r\n return this.currentScene.addTimer(timer);\r\n }\r\n\r\n /**\r\n * Removes a [[Timer]] from the [[currentScene]].\r\n * @param timer The timer to remove to the [[currentScene]].\r\n */\r\n public removeTimer(timer: Timer): Timer {\r\n return this.currentScene.removeTimer(timer);\r\n }\r\n\r\n /**\r\n * Adds a [[Scene]] to the engine, think of scenes in Excalibur as you\r\n * would levels or menus.\r\n *\r\n * @param key The name of the scene, must be unique\r\n * @param scene The scene to add to the engine\r\n */\r\n public addScene(key: string, scene: Scene) {\r\n if (this.scenes[key]) {\r\n this._logger.warn('Scene', key, 'already exists overwriting');\r\n }\r\n this.scenes[key] = scene;\r\n }\r\n\r\n /**\r\n * Removes a [[Scene]] instance from the engine\r\n * @param scene The scene to remove\r\n */\r\n public removeScene(scene: Scene): void;\r\n /**\r\n * Removes a scene from the engine by key\r\n * @param key The scene key to remove\r\n */\r\n public removeScene(key: string): void;\r\n /**\r\n * @internal\r\n */\r\n public removeScene(entity: any): void {\r\n if (entity instanceof Scene) {\r\n // remove scene\r\n for (const key in this.scenes) {\r\n if (this.scenes.hasOwnProperty(key)) {\r\n if (this.scenes[key] === entity) {\r\n delete this.scenes[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (typeof entity === 'string') {\r\n // remove scene\r\n delete this.scenes[entity];\r\n }\r\n }\r\n\r\n /**\r\n * Adds a [[Scene]] to the engine, think of scenes in Excalibur as you\r\n * would levels or menus.\r\n * @param sceneKey The key of the scene, must be unique\r\n * @param scene The scene to add to the engine\r\n */\r\n public add(sceneKey: string, scene: Scene): void;\r\n /**\r\n * Adds a [[Timer]] to the [[currentScene]].\r\n * @param timer The timer to add to the [[currentScene]].\r\n */\r\n public add(timer: Timer): void;\r\n /**\r\n * Adds a [[TileMap]] to the [[currentScene]], once this is done the TileMap\r\n * will be drawn and updated.\r\n */\r\n public add(tileMap: TileMap): void;\r\n /**\r\n * Adds an actor to the [[currentScene]] of the game. This is synonymous\r\n * to calling `engine.currentScene.add(actor)`.\r\n *\r\n * Actors can only be drawn if they are a member of a scene, and only\r\n * the [[currentScene]] may be drawn or updated.\r\n *\r\n * @param actor The actor to add to the [[currentScene]]\r\n */\r\n public add(actor: Actor): void;\r\n\r\n /**\r\n * Adds a [[ScreenElement]] to the [[currentScene]] of the game,\r\n * ScreenElements do not participate in collisions, instead the\r\n * remain in the same place on the screen.\r\n * @param screenElement The ScreenElement to add to the [[currentScene]]\r\n */\r\n public add(screenElement: ScreenElement): void;\r\n public add(entity: any): void {\r\n if (arguments.length === 2) {\r\n this.addScene(<string>arguments[0], <Scene>arguments[1]);\r\n return;\r\n }\r\n if (this._deferredGoTo && this.scenes[this._deferredGoTo]) {\r\n this.scenes[this._deferredGoTo].add(entity);\r\n } else {\r\n this.currentScene.add(entity);\r\n }\r\n }\r\n\r\n /**\r\n * Removes a scene instance from the engine\r\n * @param scene The scene to remove\r\n */\r\n public remove(scene: Scene): void;\r\n /**\r\n * Removes a scene from the engine by key\r\n * @param sceneKey The scene to remove\r\n */\r\n public remove(sceneKey: string): void;\r\n /**\r\n * Removes a [[Timer]] from the [[currentScene]].\r\n * @param timer The timer to remove to the [[currentScene]].\r\n */\r\n public remove(timer: Timer): void;\r\n /**\r\n * Removes a [[TileMap]] from the [[currentScene]], it will no longer be drawn or updated.\r\n */\r\n public remove(tileMap: TileMap): void;\r\n /**\r\n * Removes an actor from the [[currentScene]] of the game. This is synonymous\r\n * to calling `engine.currentScene.removeChild(actor)`.\r\n * Actors that are removed from a scene will no longer be drawn or updated.\r\n *\r\n * @param actor The actor to remove from the [[currentScene]].\r\n */\r\n public remove(actor: Actor): void;\r\n /**\r\n * Removes a [[ScreenElement]] to the scene, it will no longer be drawn or updated\r\n * @param screenElement The ScreenElement to remove from the [[currentScene]]\r\n */\r\n public remove(screenElement: ScreenElement): void;\r\n public remove(entity: any): void {\r\n if (entity instanceof Entity) {\r\n this.currentScene.remove(entity);\r\n }\r\n\r\n if (entity instanceof Scene) {\r\n this.removeScene(entity);\r\n }\r\n\r\n if (typeof entity === 'string') {\r\n this.removeScene(entity);\r\n }\r\n }\r\n\r\n /**\r\n * Changes the currently updating and drawing scene to a different,\r\n * named scene. Calls the [[Scene]] lifecycle events.\r\n * @param key The key of the scene to transition to.\r\n */\r\n public goToScene(key: string): void {\r\n // if not yet initialized defer goToScene\r\n if (!this.isInitialized) {\r\n this._deferredGoTo = key;\r\n return;\r\n }\r\n\r\n if (this.scenes[key]) {\r\n const oldScene = this.currentScene;\r\n const newScene = this.scenes[key];\r\n\r\n this._logger.debug('Going to scene:', key);\r\n\r\n // only deactivate when initialized\r\n if (this.currentScene.isInitialized) {\r\n this.currentScene._deactivate.apply(this.currentScene, [oldScene, newScene]);\r\n this.currentScene.eventDispatcher.emit('deactivate', new DeactivateEvent(newScene, this.currentScene));\r\n }\r\n\r\n // set current scene to new one\r\n this.currentScene = newScene;\r\n this.screen.setCurrentCamera(newScene.camera);\r\n\r\n // initialize the current scene if has not been already\r\n this.currentScene._initialize(this);\r\n\r\n this.currentScene._activate.apply(this.currentScene, [oldScene, newScene]);\r\n this.currentScene.eventDispatcher.emit('activate', new ActivateEvent(oldScene, this.currentScene));\r\n } else {\r\n this._logger.error('Scene', key, 'does not exist!');\r\n }\r\n }\r\n\r\n /**\r\n * Transforms the current x, y from screen coordinates to world coordinates\r\n * @param point Screen coordinate to convert\r\n */\r\n public screenToWorldCoordinates(point: Vector): Vector {\r\n return this.screen.screenToWorldCoordinates(point);\r\n }\r\n\r\n /**\r\n * Transforms a world coordinate, to a screen coordinate\r\n * @param point World coordinate to convert\r\n */\r\n public worldToScreenCoordinates(point: Vector): Vector {\r\n return this.screen.worldToScreenCoordinates(point);\r\n }\r\n\r\n /**\r\n * Initializes the internal canvas, rendering context, display mode, and native event listeners\r\n */\r\n private _initialize(options?: EngineOptions) {\r\n this.pageScrollPreventionMode = options.scrollPreventionMode;\r\n\r\n // initialize inputs\r\n this.input = {\r\n keyboard: new Input.Keyboard(),\r\n pointers: new Input.Pointers(this),\r\n gamepads: new Input.Gamepads()\r\n };\r\n this.input.keyboard.init();\r\n this.input.pointers.init(options && options.pointerScope === Input.PointerScope.Document ? document : this.canvas);\r\n this.input.gamepads.init();\r\n\r\n // Issue #385 make use of the visibility api\r\n // https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API\r\n\r\n let hidden: keyof HTMLDocument, visibilityChange: string;\r\n if (typeof document.hidden !== 'undefined') {\r\n // Opera 12.10 and Firefox 18 and later support\r\n hidden = 'hidden';\r\n visibilityChange = 'visibilitychange';\r\n } else if ('msHidden' in document) {\r\n hidden = <keyof HTMLDocument>'msHidden';\r\n visibilityChange = 'msvisibilitychange';\r\n } else if ('webkitHidden' in document) {\r\n hidden = <keyof HTMLDocument>'webkitHidden';\r\n visibilityChange = 'webkitvisibilitychange';\r\n }\r\n\r\n this.browser.document.on(visibilityChange, () => {\r\n if (document[hidden]) {\r\n this.eventDispatcher.emit('hidden', new HiddenEvent(this));\r\n this._logger.debug('Window hidden');\r\n } else {\r\n this.eventDispatcher.emit('visible', new VisibleEvent(this));\r\n this._logger.debug('Window visible');\r\n }\r\n });\r\n\r\n if (!this.canvasElementId && !options.canvasElement) {\r\n document.body.appendChild(this.canvas);\r\n }\r\n }\r\n\r\n public onInitialize(_engine: Engine) {\r\n // Override me\r\n }\r\n\r\n /**\r\n * If supported by the browser, this will set the antialiasing flag on the\r\n * canvas. Set this to `false` if you want a 'jagged' pixel art look to your\r\n * image resources.\r\n * @param isSmooth Set smoothing to true or false\r\n */\r\n public setAntialiasing(isSmooth: boolean) {\r\n this.screen.antialiasing = isSmooth;\r\n }\r\n\r\n /**\r\n * Return the current smoothing status of the canvas\r\n */\r\n public getAntialiasing(): boolean {\r\n return this.screen.antialiasing;\r\n }\r\n\r\n /**\r\n * Gets whether the actor is Initialized\r\n */\r\n public get isInitialized(): boolean {\r\n return this._isInitialized;\r\n }\r\n\r\n private _overrideInitialize(engine: Engine) {\r\n if (!this.isInitialized) {\r\n this.onInitialize(engine);\r\n super.emit('initialize', new InitializeEvent(engine, this));\r\n this._isInitialized = true;\r\n if (this._deferredGoTo) {\r\n this.goToScene(this._deferredGoTo);\r\n } else {\r\n this.goToScene('root');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Updates the entire state of the game\r\n * @param delta Number of milliseconds elapsed since the last update.\r\n */\r\n private _update(delta: number) {\r\n if (this._isLoading) {\r\n // suspend updates until loading is finished\r\n this._loader.update(this, delta);\r\n // Update input listeners\r\n this.input.keyboard.update();\r\n this.input.pointers.update();\r\n this.input.gamepads.update();\r\n return;\r\n }\r\n\r\n this._overrideInitialize(this);\r\n\r\n // Publish preupdate events\r\n this._preupdate(delta);\r\n\r\n // process engine level events\r\n this.currentScene.update(this, delta);\r\n\r\n // update animations\r\n // TODO remove\r\n this._animations = this._animations.filter(function (a) {\r\n return !a.animation.isDone();\r\n });\r\n\r\n // Update input listeners\r\n this.input.keyboard.update();\r\n this.input.pointers.update();\r\n this.input.gamepads.update();\r\n\r\n // Publish update event\r\n this._postupdate(delta);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _preupdate(delta: number) {\r\n this.emit('preupdate', new PreUpdateEvent(this, delta, this));\r\n this.onPreUpdate(this, delta);\r\n }\r\n\r\n public onPreUpdate(_engine: Engine, _delta: number) {\r\n // Override me\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _postupdate(delta: number) {\r\n this.emit('postupdate', new PostUpdateEvent(this, delta, this));\r\n this.onPostUpdate(this, delta);\r\n }\r\n\r\n public onPostUpdate(_engine: Engine, _delta: number) {\r\n // Override me\r\n }\r\n\r\n /**\r\n * Draws the entire game\r\n * @param delta Number of milliseconds elapsed since the last draw.\r\n */\r\n private _draw(delta: number) {\r\n const ctx = this.ctx;\r\n this._predraw(ctx, delta);\r\n\r\n if (this._isLoading) {\r\n this._loader.canvas.draw(this.graphicsContext, 0, 0);\r\n this.graphicsContext.flush();\r\n // Drawing nothing else while loading\r\n return;\r\n }\r\n\r\n // TODO move to graphics systems?\r\n this.graphicsContext.backgroundColor = this.backgroundColor;\r\n\r\n this.currentScene.draw(this.ctx, delta);\r\n\r\n // todo needs to be a better way of doing this\r\n let a = 0;\r\n const len = this._animations.length;\r\n for (a; a < len; a++) {\r\n this._animations[a].animation.draw(ctx, this._animations[a].x, this._animations[a].y);\r\n }\r\n\r\n // Draw debug information\r\n // TODO don't access ctx directly\r\n if (this.isDebug) {\r\n this.ctx.font = 'Consolas';\r\n this.ctx.fillStyle = this.debugColor.toString();\r\n const keys = this.input.keyboard.getKeys();\r\n for (let j = 0; j < keys.length; j++) {\r\n this.ctx.fillText(keys[j].toString() + ' : ' + (Input.Keys[keys[j]] ? Input.Keys[keys[j]] : 'Not Mapped'), 100, 10 * j + 10);\r\n }\r\n\r\n this.ctx.fillText('FPS:' + this.stats.currFrame.fps.toFixed(2).toString(), 10, 10);\r\n }\r\n\r\n // Post processing\r\n for (let i = 0; i < this.postProcessors.length; i++) {\r\n this.postProcessors[i].process(this.ctx.getImageData(0, 0, this.canvasWidth, this.canvasHeight), this.ctx);\r\n }\r\n\r\n this._postdraw(ctx, delta);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _predraw(_ctx: CanvasRenderingContext2D, delta: number) {\r\n this.emit('predraw', new PreDrawEvent(_ctx, delta, this));\r\n this.onPreDraw(_ctx, delta);\r\n }\r\n\r\n public onPreDraw(_ctx: CanvasRenderingContext2D, _delta: number) {\r\n // Override me\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _postdraw(_ctx: CanvasRenderingContext2D, delta: number) {\r\n this.emit('postdraw', new PostDrawEvent(_ctx, delta, this));\r\n this.onPostDraw(_ctx, delta);\r\n }\r\n\r\n public onPostDraw(_ctx: CanvasRenderingContext2D, _delta: number) {\r\n // Override me\r\n }\r\n\r\n /**\r\n * Enable or disable Excalibur debugging functionality.\r\n * @param toggle a value that debug drawing will be changed to\r\n */\r\n public showDebug(toggle: boolean): void {\r\n this._isDebug = toggle;\r\n }\r\n\r\n /**\r\n * Toggle Excalibur debugging functionality.\r\n */\r\n public toggleDebug(): boolean {\r\n this._isDebug = !this._isDebug;\r\n return this._isDebug;\r\n }\r\n\r\n private _loadingComplete: boolean = false;\r\n /**\r\n * Returns true when loading is totally complete and the player has clicked start\r\n */\r\n public get loadingComplete() {\r\n return this._loadingComplete;\r\n }\r\n /**\r\n * Starts the internal game loop for Excalibur after loading\r\n * any provided assets.\r\n * @param loader Optional [[Loader]] to use to load resources. The default loader is [[Loader]], override to provide your own\r\n * custom loader.\r\n */\r\n public start(loader?: Loader): Promise<void> {\r\n if (!this._compatible) {\r\n return Promise.reject('Excalibur is incompatible with your browser');\r\n }\r\n let loadingComplete: Promise<void>;\r\n // Push the current user entered resolution/viewport\r\n this.screen.pushResolutionAndViewport();\r\n // Configure resolution for loader\r\n this.screen.resolution = this.screen.viewport;\r\n this.screen.applyResolutionAndViewport();\r\n this.graphicsContext.updateViewport();\r\n if (loader) {\r\n this._loader = loader;\r\n this._loader.suppressPlayButton = this._suppressPlayButton || this._loader.suppressPlayButton;\r\n this._loader.wireEngine(this);\r\n loadingComplete = this.load(this._loader);\r\n } else {\r\n loadingComplete = Promise.resolve();\r\n }\r\n\r\n loadingComplete.then(() => {\r\n this.screen.popResolutionAndViewport();\r\n this.screen.applyResolutionAndViewport();\r\n this.graphicsContext.updateViewport();\r\n this.emit('start', new GameStartEvent(this));\r\n this._loadingComplete = true;\r\n });\r\n\r\n if (!this._hasStarted) {\r\n // has started is a slight misnomer, it's really mainloop started\r\n this._hasStarted = true;\r\n this._logger.debug('Starting game...');\r\n this.browser.resume();\r\n Engine.createMainLoop(this, window.requestAnimationFrame, Date.now)();\r\n this._logger.debug('Game started');\r\n } else {\r\n // Game already started;\r\n }\r\n return loadingComplete;\r\n }\r\n\r\n public static createMainLoop(game: Engine, raf: (func: Function) => number, nowFn: () => number) {\r\n let lastTime = nowFn();\r\n\r\n return function mainloop() {\r\n if (!game._hasStarted) {\r\n return;\r\n }\r\n try {\r\n game._requestId = raf(mainloop);\r\n game.emit('preframe', new PreFrameEvent(game, game.stats.prevFrame));\r\n\r\n // Get the time to calculate time-elapsed\r\n const now = nowFn();\r\n let elapsed = Math.floor(now - lastTime) || 1;\r\n // Resolves issue #138 if the game has been paused, or blurred for\r\n // more than a 200 milliseconds, reset elapsed time to 1. This improves reliability\r\n // and provides more expected behavior when the engine comes back\r\n // into focus\r\n if (elapsed > 200) {\r\n elapsed = 1;\r\n }\r\n const delta = elapsed * game.timescale;\r\n\r\n // reset frame stats (reuse existing instances)\r\n const frameId = game.stats.prevFrame.id + 1;\r\n game.stats.currFrame.reset();\r\n game.stats.currFrame.id = frameId;\r\n game.stats.currFrame.delta = delta;\r\n game.stats.currFrame.fps = 1.0 / (delta / 1000);\r\n\r\n const beforeUpdate = nowFn();\r\n game._update(delta);\r\n const afterUpdate = nowFn();\r\n game._draw(delta);\r\n const afterDraw = nowFn();\r\n\r\n game.stats.currFrame.duration.update = afterUpdate - beforeUpdate;\r\n game.stats.currFrame.duration.draw = afterDraw - afterUpdate;\r\n\r\n lastTime = now;\r\n\r\n game.emit('postframe', new PostFrameEvent(game, game.stats.currFrame));\r\n game.stats.prevFrame.reset(game.stats.currFrame);\r\n } catch (e) {\r\n window.cancelAnimationFrame(game._requestId);\r\n game.stop();\r\n game.onFatalException(e);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Stops Excalibur's main loop, useful for pausing the game.\r\n */\r\n public stop() {\r\n if (this._hasStarted) {\r\n this.emit('stop', new GameStopEvent(this));\r\n this.browser.pause();\r\n this._hasStarted = false;\r\n this._logger.debug('Game stopped');\r\n }\r\n }\r\n\r\n /**\r\n * Returns the Engine's Running status, Useful for checking whether engine is running or paused.\r\n */\r\n public isPaused(): boolean {\r\n return !this._hasStarted;\r\n }\r\n\r\n /**\r\n * Takes a screen shot of the current viewport and returns it as an\r\n * HTML Image Element.\r\n */\r\n public screenshot(): HTMLImageElement {\r\n const result = new Image();\r\n const raw = this.canvas.toDataURL('image/png');\r\n result.src = raw;\r\n return result;\r\n }\r\n\r\n /**\r\n * Another option available to you to load resources into the game.\r\n * Immediately after calling this the game will pause and the loading screen\r\n * will appear.\r\n * @param loader Some [[Loadable]] such as a [[Loader]] collection, [[Sound]], or [[Texture]].\r\n */\r\n public load(loader: Loadable<any>): Promise<void> {\r\n const complete = new Promise<void>((resolve) => {\r\n this._isLoading = true;\r\n\r\n loader.load().then(() => {\r\n if (this._suppressPlayButton) {\r\n setTimeout(() => {\r\n this._isLoading = false;\r\n resolve();\r\n // Delay is to give the logo a chance to show, otherwise don't delay\r\n }, 500);\r\n } else {\r\n this._isLoading = false;\r\n resolve();\r\n }\r\n });\r\n });\r\n\r\n return complete;\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n * @deprecated\r\n */\r\n@obsolete({ message: 'Will be removed in excalibur v0.26.0' })\r\nclass AnimationNode {\r\n constructor(public animation: Animation, public x: number, public y: number) {}\r\n}\r\n","export * from './vector';\nexport * from './vector-view';\nexport * from './matrix';\nexport * from './Random';\nexport * from './global-coordinates';\nexport * from './line';\nexport * from './projection';\nexport * from './ray';\n","export * from './Debug';\r\nexport * from './DebugFlags';\r\nexport * from './DebugSystem';\r\n","import { GameEvent } from '../Events';\r\nimport { Sound } from '../Resources/Sound/Sound';\r\nimport { Actor } from '../Actor';\r\nimport { WebAudioInstance } from '../Resources/Sound/WebAudioInstance';\r\n\r\nexport class MediaEvent extends GameEvent<Sound> {\r\n /**\r\n * Media event cannot bubble\r\n */\r\n public set bubbles(_value: boolean) {\r\n // stubbed\r\n }\r\n /**\r\n * Media event cannot bubble\r\n */\r\n public get bubbles(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Media event cannot bubble, so they have no path\r\n */\r\n protected get _path(): Actor[] {\r\n return null;\r\n }\r\n /**\r\n * Media event cannot bubble, so they have no path\r\n */\r\n protected set _path(_val: Actor[]) {\r\n // stubbed\r\n }\r\n\r\n constructor(public target: Sound, protected _name: string = 'MediaEvent') {\r\n super();\r\n }\r\n\r\n /**\r\n * Prevents event from bubbling\r\n */\r\n public stopPropagation(): void {\r\n /**\r\n * Stub\r\n */\r\n }\r\n /**\r\n * Action, that calls when event happens\r\n */\r\n public action(): void {\r\n /**\r\n * Stub\r\n */\r\n }\r\n /**\r\n * Propagate event further through event path\r\n */\r\n public propagate(): void {\r\n /**\r\n * Stub\r\n */\r\n }\r\n\r\n public layPath(_actor: Actor): void {\r\n /**\r\n * Stub\r\n */\r\n }\r\n}\r\n\r\nexport class NativeSoundEvent extends MediaEvent {\r\n constructor(target: Sound, public track?: WebAudioInstance) {\r\n super(target, 'NativeSoundEvent');\r\n }\r\n}\r\n\r\nexport class NativeSoundProcessedEvent extends MediaEvent {\r\n public data: string | AudioBuffer;\r\n\r\n constructor(target: Sound, private _processedData: string | AudioBuffer) {\r\n super(target, 'NativeSoundProcessedEvent');\r\n\r\n this.data = this._processedData;\r\n }\r\n}\r\n","import { Vector } from '../Math/vector';\nimport { BoundingBox } from '../Collision/Index';\nimport { Color } from '../Color';\nimport { line } from '../Util/DrawUtil';\nimport { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\nimport { BaseAlign, Direction, FontOptions, FontStyle, FontUnit, TextAlign, FontRenderer } from './FontCommon';\nimport { Raster, RasterOptions } from './Raster';\n\nexport class Font extends Raster implements FontRenderer {\n constructor(options: FontOptions & RasterOptions = {}) {\n super(options);\n this.family = options?.family ?? this.family;\n this.style = options?.style ?? this.style;\n this.bold = options?.bold ?? this.bold;\n this.size = options?.size ?? this.size;\n this.unit = options?.unit ?? this.unit;\n this.textAlign = options?.textAlign ?? this.textAlign;\n this.baseAlign = options?.baseAlign ?? this.baseAlign;\n this.direction = options?.direction ?? this.direction;\n this.quality = options?.quality ?? this.quality;\n if (options?.shadow) {\n this.shadow = {};\n this.shadow.blur = options.shadow.blur ?? this.shadow.blur;\n this.shadow.offset = options.shadow.offset ?? this.shadow.offset;\n this.shadow.color = options.shadow.color ?? this.shadow.color;\n }\n this.flagDirty();\n }\n\n public clone() {\n return new Font({\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions(),\n size: this.size,\n unit: this.unit,\n family: this.family,\n style: this.style,\n bold: this.bold,\n textAlign: this.textAlign,\n baseAlign: this.baseAlign,\n direction: this.direction,\n shadow: this.shadow\n ? {\n blur: this.shadow.blur,\n offset: this.shadow.offset,\n color: this.shadow.color\n }\n : null\n });\n }\n\n /**\n * Font quality determines the size of the underlying rastered text, higher quality means less jagged edges.\n * If quality is set to 1, then just enough raster bitmap is generated to render the text.\n *\n * You can think of quality as how zoomed in to the text you can get before seeing jagged edges.\n *\n * (Default 4)\n */\n public quality = 2;\n\n public family: string = 'sans-serif';\n public style: FontStyle = FontStyle.Normal;\n public bold: boolean = false;\n public unit: FontUnit = FontUnit.Px;\n public textAlign: TextAlign = TextAlign.Left;\n public baseAlign: BaseAlign = BaseAlign.Alphabetic;\n public direction: Direction = Direction.LeftToRight;\n public size: number = 10;\n public shadow: { blur?: number; offset?: Vector; color?: Color } = null;\n\n public get fontString() {\n return `${this.style} ${this.bold ? 'bold' : ''} ${this.size}${this.unit} ${this.family}`;\n }\n\n private _text: string;\n private _lines: string[];\n private _textBounds: BoundingBox = new BoundingBox();\n private _textWidth: number = 0;\n private _textHeight: number = 0;\n\n public get width() {\n return this._textWidth;\n }\n\n public set width(value: number) {\n this._textWidth = value;\n }\n\n public get height() {\n const numLines = this._lines?.length ?? 1;\n return this._textHeight * numLines;\n }\n\n public set height(value: number) {\n const numLines = this._lines?.length ?? 1;\n this._textHeight = value / numLines;\n }\n\n private get _rasterWidth() {\n return this._bitmap.width;\n }\n\n private get _rasterHeight() {\n return this._bitmap.height;\n }\n\n private get _halfRasterWidth() {\n return Math.floor(this._bitmap.width / 2);\n }\n\n private get _halfRasterHeight() {\n return Math.floor(this._bitmap.height / 2);\n }\n\n public get localBounds(): BoundingBox {\n return this._textBounds;\n }\n\n protected _drawImage(ex: ExcaliburGraphicsContext, x: number, y: number) {\n if (this.dirty) {\n this.rasterize();\n }\n\n ex.drawImage(\n this._bitmap,\n 0,\n 0,\n this._rasterWidth,\n this._rasterHeight,\n x - this._rasterWidth / this.quality / 2,\n y - this._rasterHeight / this.quality / 2,\n this._rasterWidth / this.quality,\n this._rasterHeight / this.quality\n );\n }\n\n protected _rotate(ex: ExcaliburGraphicsContext) {\n // TODO this needs to change depending on the bounding box...\n const origin = this.origin ?? this._textBounds.center;\n ex.translate(origin.x, origin.y);\n ex.rotate(this.rotation);\n ex.translate(-origin.x, -origin.y);\n }\n\n protected _flip(ex: ExcaliburGraphicsContext) {\n if (this.flipHorizontal) {\n ex.translate(this._textBounds.width / this.scale.x, 0);\n ex.scale(-1, 1);\n }\n\n if (this.flipVertical) {\n ex.translate(0, -this._textBounds.height / 2 / this.scale.y);\n ex.scale(1, -1);\n }\n }\n\n public updateText(text: string) {\n if (this._text !== text) {\n this._text = text;\n this._lines = this._text.split('\\n');\n this._updateDimensions();\n this.flagDirty();\n }\n }\n\n private _updateDimensions() {\n if (this._text) {\n this._applyFont(this._ctx);\n const maxWidthLine = this._lines.reduce((a, b) => {\n return a.length > b.length ? a : b;\n });\n const metrics = this._ctx.measureText(maxWidthLine);\n this._textWidth = Math.abs(metrics.actualBoundingBoxLeft) + Math.abs(metrics.actualBoundingBoxRight);\n this._textHeight = Math.abs(metrics.actualBoundingBoxAscent) + Math.abs(metrics.actualBoundingBoxDescent);\n\n // TODO lineheight makes the text bounds wonky\n const lineAdjustedHeight = this._textHeight * this._lines.length;\n // this._textHeight = lineAdjustedHeight;\n // Changing the width and height clears the context properties\n // We double the bitmap width to account for alignment\n // We scale by \"quality\" so we render text without jaggies\n this._bitmap.width = (this._textWidth + this.padding * 2) * 2 * this.quality;\n this._bitmap.height = (lineAdjustedHeight + this.padding * 2) * 2 * this.quality;\n\n // These bounds exist in raster bitmap space where the top left corner is the corder of the bitmap\n const x = 0;\n const y = 0;\n const bottomBounds = lineAdjustedHeight - Math.abs(metrics.actualBoundingBoxAscent);\n this._textBounds = new BoundingBox({\n left: x - Math.abs(metrics.actualBoundingBoxLeft) - this.padding,\n top: y - Math.abs(metrics.actualBoundingBoxAscent) - this.padding,\n bottom: y + bottomBounds + this.padding,\n right: x + Math.abs(metrics.actualBoundingBoxRight) + this.padding\n });\n }\n }\n\n protected _preDraw(ex: ExcaliburGraphicsContext, x: number, y: number): void {\n if (this.dirty) {\n this._updateDimensions();\n }\n super._preDraw(ex, x, y);\n }\n\n protected _postDraw(ex: ExcaliburGraphicsContext): void {\n if (this.showDebug) {\n /* istanbul ignore next */\n ex.debug.drawRect(-this._halfRasterWidth, -this._halfRasterHeight, this._rasterWidth, this._rasterHeight);\n }\n ex.restore();\n }\n\n private _applyFont(ctx: CanvasRenderingContext2D) {\n ctx.translate(this.padding + this._halfRasterWidth, this.padding + this._halfRasterHeight);\n ctx.scale(this.quality, this.quality);\n ctx.textAlign = this.textAlign;\n ctx.textBaseline = this.baseAlign;\n ctx.font = this.fontString;\n ctx.direction = this.direction;\n\n if (this.shadow) {\n ctx.shadowColor = this.shadow.color.toString();\n ctx.shadowBlur = this.shadow.blur;\n ctx.shadowOffsetX = this.shadow.offset.x;\n ctx.shadowOffsetY = this.shadow.offset.y;\n }\n }\n\n execute(ctx: CanvasRenderingContext2D): void {\n if (this._text) {\n // The reason we need to re-apply the font is setting raster properties (like width/height) can reset the context props\n this._applyRasterProperites(ctx);\n this._applyFont(ctx);\n\n const lineHeight = this._textHeight; // TODO user specified line height\n for (let i = 0; i < this._lines.length; i++) {\n const line = this._lines[i];\n if (this.color) {\n ctx.fillText(line, 0, i * lineHeight);\n }\n\n if (this.strokeColor) {\n ctx.strokeText(line, 0, i * lineHeight);\n }\n }\n\n if (this.showDebug) {\n // Horizontal line\n /* istanbul ignore next */\n line(ctx, Color.Red, -this._halfRasterWidth, 0, this._halfRasterWidth, 0, 2);\n // Vertical line\n /* istanbul ignore next */\n line(ctx, Color.Red, 0, -this._halfRasterHeight, 0, this._halfRasterHeight, 2);\n }\n }\n }\n\n public render(ex: ExcaliburGraphicsContext, text: string, x: number, y: number) {\n this.updateText(text);\n this.draw(ex, x, y);\n }\n}\n","import { ExcaliburGraphicsContext } from './Context/ExcaliburGraphicsContext';\r\nimport { BoundingBox } from '../Collision/BoundingBox';\r\nimport { SpriteFont } from './SpriteFont';\r\nimport { Graphic, GraphicOptions } from './Graphic';\r\nimport { Color } from '../Color';\r\nimport { Font } from './Font';\r\nimport { watch } from '../Util/Watch';\r\n\r\nexport interface TextOptions {\r\n text: string;\r\n color?: Color;\r\n font?: Font | SpriteFont;\r\n}\r\n\r\nexport class Text extends Graphic {\r\n constructor(options: TextOptions & GraphicOptions) {\r\n super(options);\r\n // This order is important font, color, then text\r\n this.font = options.font ?? new Font();\r\n this.color = options.color ?? this.color;\r\n this.text = options.text;\r\n }\r\n\r\n public clone(): Text {\r\n return new Text({\r\n text: this.text.slice(),\r\n color: this.color.clone(),\r\n font: this.font.clone()\r\n });\r\n }\r\n\r\n private _text: string = '';\r\n public get text() {\r\n return this._text;\r\n }\r\n\r\n public set text(value: string) {\r\n this._text = value;\r\n this.font.updateText(value);\r\n }\r\n\r\n // TODO SpriteFont doesn't support a color yet :(\r\n public get color() {\r\n if (this.font instanceof Font) {\r\n return this.font.color;\r\n }\r\n return Color.Black;\r\n }\r\n\r\n public set color(color: Color) {\r\n if (this.font instanceof Font) {\r\n this.font.color = color;\r\n }\r\n }\r\n\r\n private _font: Font | SpriteFont;\r\n public get font(): Font | SpriteFont {\r\n return this._font;\r\n }\r\n public set font(font: Font | SpriteFont) {\r\n if (font instanceof Font) {\r\n this._font = watch(font, (font) => font.flagDirty());\r\n } else {\r\n this._font = font;\r\n }\r\n }\r\n\r\n public get width() {\r\n return this.font.width;\r\n }\r\n\r\n public get height() {\r\n return this.font.height;\r\n }\r\n\r\n public get localBounds(): BoundingBox {\r\n return this.font.localBounds;\r\n }\r\n\r\n protected _rotate(_ex: ExcaliburGraphicsContext) {\r\n // None this is delegated to font\r\n // This override erases the default behavior\r\n }\r\n\r\n protected _flip(_ex: ExcaliburGraphicsContext) {\r\n // None this is delegated to font\r\n // This override erases the default behavior\r\n }\r\n\r\n protected _drawImage(ex: ExcaliburGraphicsContext, x: number, y: number) {\r\n if (this.font instanceof Font) {\r\n this.font.color = this.color;\r\n }\r\n this.font.flipHorizontal = this.flipHorizontal;\r\n this.font.flipVertical = this.flipVertical;\r\n this.font.scale = this.scale;\r\n this.font.rotation = this.rotation;\r\n this.font.origin = this.origin;\r\n this.font.opacity = this.opacity;\r\n this.font.render(ex, this._text, x, y);\r\n }\r\n}\r\n","import { Engine } from './Engine';\r\nimport { Color } from './Color';\r\nimport { vec, Vector } from './Math/vector';\r\nimport { Text } from './Graphics/Text';\r\nimport { BaseAlign, FontStyle, FontUnit, TextAlign } from './Graphics/FontCommon';\r\nimport { obsolete } from './Util/Decorators';\r\nimport { SpriteFont as LegacySpriteFont } from './Drawing/SpriteSheet';\r\nimport { ExcaliburGraphicsContext, GraphicsComponent, SpriteFont } from './Graphics';\r\nimport { Font } from './Graphics/Font';\r\nimport { Actor } from './Actor';\r\nimport { ActorArgs } from '.';\r\n\r\n/**\r\n * Option for creating a label\r\n */\r\nexport interface LabelOptions {\r\n /**\r\n * Specify the label text\r\n */\r\n text?: string;\r\n /**\r\n * Specify the color of the text (does not apply to SpriteFonts)\r\n */\r\n color?: Color;\r\n x?: number;\r\n y?: number;\r\n pos?: Vector;\r\n /**\r\n * Optionally specify a sprite font, will take precedence over any other [[Font]]\r\n */\r\n spriteFont?: SpriteFont | LegacySpriteFont;\r\n /**\r\n * Specify a custom font\r\n */\r\n font?: Font\r\n}\r\n\r\n/**\r\n * Labels are the way to draw small amounts of text to the screen. They are\r\n * actors and inherit all of the benefits and capabilities.\r\n */\r\nexport class Label extends Actor {\r\n public font: Font = new Font();\r\n private _text: Text = new Text({ text: '', font: this.font });\r\n\r\n /**\r\n * The text to draw.\r\n */\r\n public get text(): string {\r\n return this._text.text;\r\n }\r\n\r\n public set text(text: string) {\r\n this._text.text = text;\r\n }\r\n\r\n public get color(): Color {\r\n return this._text.color;\r\n }\r\n\r\n public set color(color: Color) {\r\n this._text.color = color;\r\n }\r\n\r\n public get opacity(): number {\r\n return this._text.opacity;\r\n }\r\n\r\n public set opacity(opacity: number) {\r\n this._text.opacity = opacity;\r\n }\r\n\r\n /**\r\n * Sets or gets the bold property of the label's text, by default it's false\r\n * @deprecated Use [[Font.bold|Label.font.bold]]\r\n */\r\n @obsolete({\r\n message: 'Label.bold will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.bold'\r\n })\r\n public get bold(): boolean {\r\n return this.font.bold;\r\n }\r\n\r\n public set bold(isBold: boolean) {\r\n this.font.bold = isBold;\r\n }\r\n\r\n /**\r\n * The CSS font family string (e.g. `sans-serif`, `Droid Sans Pro`). Web fonts\r\n * are supported, same as in CSS.\r\n * @deprecated Use [[Font.family|Label.font.family]]\r\n */\r\n @obsolete({\r\n message: 'Label.fontFamily will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.family'\r\n })\r\n public get fontFamily(): string {\r\n return this.font.family;\r\n }\r\n\r\n public set fontFamily(family: string) {\r\n this.font.family = family;\r\n }\r\n\r\n /**\r\n * The font size in the selected units, default is 10 (default units is pixel)\r\n * @deprecated Use [[Font.size|Label.font.size]]\r\n */\r\n @obsolete({\r\n message: 'Label.fontSize will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.size'\r\n })\r\n public get fontSize(): number {\r\n return this.font.size;\r\n }\r\n\r\n public set fontSize(sizeInUnit: number) {\r\n this.font.size = sizeInUnit;\r\n }\r\n\r\n /**\r\n * The font style for this label, the default is [[FontStyle.Normal]]\r\n * @deprecated Use [[Font.style|Label.font.style]]\r\n */\r\n @obsolete({\r\n message: 'Label.fontStyle will be removed in v0.26.0',\r\n alternateMethod: 'Use Lable.font.style'\r\n })\r\n public get fontStyle(): FontStyle {\r\n return this.font.style;\r\n }\r\n\r\n public set fontStyle(style: FontStyle) {\r\n this.font.style = style;\r\n }\r\n\r\n /**\r\n * The css units for a font size such as px, pt, em (SpriteFont only support px), by default is 'px';\r\n * @deprecated Use [[Font.unit|Label.font.unit]]\r\n */\r\n @obsolete({\r\n message: 'Label.fontUnit will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.unit'\r\n })\r\n public get fontUnit(): FontUnit {\r\n return this.font.unit;\r\n }\r\n\r\n public set fontUnit(unit: FontUnit) {\r\n this.font.unit = unit;\r\n }\r\n\r\n /**\r\n * Gets or sets the horizontal text alignment property for the label.\r\n * @deprecated Use [[Font.textAlign|Label.font.textAlign]]\r\n */\r\n @obsolete({\r\n message: 'Label.textAlign will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.textAlign'\r\n })\r\n public get textAlign(): TextAlign {\r\n return this.font.textAlign;\r\n }\r\n\r\n public set textAlign(align: TextAlign) {\r\n this.font.textAlign = align;\r\n }\r\n\r\n /**\r\n * Gets or sets the baseline alignment property for the label.\r\n * @deprecated Use [[Font.baseAlign|Label.font.baseAlign]]\r\n */\r\n @obsolete({\r\n message: 'Label.baseAlign will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.baseAlign'\r\n })\r\n public get baseAlign(): BaseAlign {\r\n return this.font.baseAlign;\r\n }\r\n\r\n public set baseAlign(align: BaseAlign) {\r\n this.font.baseAlign = align;\r\n }\r\n\r\n /**\r\n * Gets or sets the maximum width (in pixels) that the label should occupy\r\n * @deprecated The maxWidth constraint is gone\r\n */\r\n public maxWidth: number;\r\n\r\n private _legacySpriteFont: LegacySpriteFont;\r\n private _spriteFont: SpriteFont;\r\n /**\r\n * The [[LegacyDrawing.SpriteFont]] to use, if any. Overrides [[fontFamily]] if present.\r\n * @deprecated Use [[SpriteFont]]\r\n */\r\n @obsolete()\r\n public get spriteFont(): LegacySpriteFont {\r\n return this._legacySpriteFont;\r\n }\r\n\r\n public set spriteFont(sf: LegacySpriteFont | SpriteFont) {\r\n if (sf) {\r\n if (sf instanceof LegacySpriteFont) {\r\n this._legacySpriteFont = sf;\r\n this._spriteFont = SpriteFont.fromLegacySpriteFont(sf);\r\n this._text.font = this._spriteFont;\r\n return;\r\n }\r\n this._spriteFont = sf;\r\n this._text.font = this._spriteFont;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the letter spacing on a Label. Only supported with Sprite Fonts.\r\n * @deprecated Use [[SpriteFont.spacing]]\r\n */\r\n public letterSpacing: number = 0; //px\r\n\r\n /**\r\n * Whether or not the [[SpriteFont]] will be case-sensitive when matching characters.\r\n * @deprecated Use Graphics.SpriteFont.caseInsensitve\r\n */\r\n public caseInsensitive: boolean = true;\r\n\r\n private _graphicsContext: ExcaliburGraphicsContext;\r\n\r\n /**\r\n * Build a new label\r\n * @param options\r\n */\r\n constructor(options?: LabelOptions & ActorArgs) {\r\n super(options);\r\n const {text, pos, x, y, spriteFont, font, color} = options;\r\n\r\n this.pos = pos ?? (x && y ? vec(x, y) : this.pos);\r\n this.text = text ?? this.text;\r\n this.spriteFont = spriteFont ?? this.spriteFont;\r\n this.font = font ?? this.font;\r\n this.color = color ?? this.color;\r\n const gfx = this.get(GraphicsComponent);\r\n gfx.anchor = Vector.Zero;\r\n gfx.use(this._text);\r\n }\r\n\r\n public _initialize(engine: Engine) {\r\n super._initialize(engine);\r\n this._graphicsContext = engine.graphicsContext;\r\n }\r\n\r\n /**\r\n * Returns the width of the text in the label (in pixels);\r\n */\r\n public getTextWidth(): number {\r\n return this._text.width;\r\n }\r\n\r\n /**\r\n * Sets the text shadow for sprite fonts\r\n * @param offsetX The x offset in pixels to place the shadow\r\n * @param offsetY The y offset in pixels to place the shadow\r\n * @param shadowColor The color of the text shadow\r\n * @deprecated Use [[Font.shadow|Label.font.shadow]]\r\n */\r\n @obsolete({\r\n message: 'Label.setTextShadow will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.shadow'\r\n })\r\n public setTextShadow(offsetX: number, offsetY: number, shadowColor: Color) {\r\n this.font.shadow = { offset: vec(offsetX, offsetY), blur: 2, color: shadowColor };\r\n }\r\n\r\n /**\r\n * Toggles text shadows on or off, only applies when using sprite fonts\r\n * @deprecated Use [[Font.shadow|Label.font.shadow]]\r\n */\r\n @obsolete({\r\n message: 'Label.useTextShadow will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.shadow'\r\n })\r\n public useTextShadow(on: boolean) {\r\n if (this.spriteFont) {\r\n this.spriteFont.useTextShadow(on);\r\n }\r\n }\r\n\r\n /**\r\n * Clears the current text shadow\r\n * @deprecated Use [[Font.shadow|Label.font.shadow]]\r\n */\r\n @obsolete({\r\n message: 'Label.clearTextShadow will be removed in v0.26.0',\r\n alternateMethod: 'Use Label.font.shadow'\r\n })\r\n public clearTextShadow() {\r\n this.font.shadow = null;\r\n }\r\n\r\n public draw(_ctx: CanvasRenderingContext2D, _delta: number) {\r\n const exctx = this._graphicsContext;\r\n this._text.draw(exctx, 0, 0);\r\n }\r\n}\r\n","export * from './ActionContext';\r\nexport * from './ActionQueue';\r\nexport * from './Actionable';\r\nexport * from './RotationType';\r\n\r\nexport * from './Action';\r\nexport * from './Action/Repeat';\r\nexport * from './Action/RepeatForever';\r\nexport * from './Action/Blink';\r\nexport * from './Action/Die';\r\nexport * from './Action/EaseTo';\r\nexport * from './Action/Fade';\r\nexport * from './Action/Follow';\r\nexport * from './Action/Meet';\r\nexport * from './Action/MoveBy';\r\nexport * from './Action/MoveTo';\r\nexport * from './Action/RotateBy';\r\nexport * from './Action/RotateTo';\r\nexport * from './Action/ScaleBy';\r\nexport * from './Action/ScaleTo';\r\n\r\nexport * from './ActionsComponent';\r\nexport * from './ActionsSystem';","import { CollisionGroup } from './CollisionGroup';\r\n\r\n/**\r\n * Static class for managing collision groups in excalibur, there is a maximum of 32 collision groups possible in excalibur\r\n */\r\nexport class CollisionGroupManager {\r\n // using bitmasking the maximum number of groups is 32, because that is the highest 32bit integer that JS can present.\r\n private static _STARTING_BIT = 0b1 | 0;\r\n private static _MAX_GROUPS = 32;\r\n private static _CURRENT_GROUP = 1;\r\n private static _CURRENT_BIT = CollisionGroupManager._STARTING_BIT;\r\n private static _GROUPS: Map<string, CollisionGroup> = new Map<string, CollisionGroup>();\r\n\r\n /**\r\n * Create a new named collision group up to a max of 32.\r\n * @param name Name for the collision group\r\n * @param mask Optionally provide your own 32-bit mask, if none is provide the manager will generate one\r\n */\r\n public static create(name: string, mask?: number) {\r\n if (this._CURRENT_GROUP > this._MAX_GROUPS) {\r\n throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);\r\n }\r\n if (this._GROUPS.get(name)) {\r\n throw new Error(`Collision group ${name} already exists`);\r\n }\r\n const group = new CollisionGroup(name, this._CURRENT_BIT, mask !== undefined ? mask : ~this._CURRENT_BIT);\r\n this._CURRENT_BIT = (this._CURRENT_BIT << 1) | 0;\r\n this._CURRENT_GROUP++;\r\n this._GROUPS.set(name, group);\r\n return group;\r\n }\r\n\r\n /**\r\n * Get all collision groups currently tracked by excalibur\r\n */\r\n public static get groups(): CollisionGroup[] {\r\n return Array.from(this._GROUPS.values());\r\n }\r\n\r\n /**\r\n * Get a collision group by it's name\r\n * @param name\r\n */\r\n public static groupByName(name: string) {\r\n return this._GROUPS.get(name);\r\n }\r\n\r\n /**\r\n * Resets the managers internal group management state\r\n */\r\n public static reset() {\r\n this._GROUPS = new Map<string, CollisionGroup>();\r\n this._CURRENT_BIT = this._STARTING_BIT;\r\n this._CURRENT_GROUP = 1;\r\n }\r\n}\r\n","export * from './BodyComponent';\r\nexport * from './ColliderComponent';\r\nexport * from './CollisionType';\r\n\r\nexport * from './Colliders/Collider';\r\nexport * from './BoundingBox';\r\n\r\nexport * from './Colliders/Shape';\r\nexport * from './Colliders/Collider';\r\nexport * from './Colliders/CompositeCollider';\r\nexport * from './Colliders/CircleCollider';\r\nexport * from './Colliders/EdgeCollider';\r\nexport * from './Colliders/PolygonCollider';\r\nexport * from './Colliders/CollisionJumpTable';\r\nexport * from './Colliders/ClosestLineJumpTable';\r\n\r\nexport * from './Group/CollisionGroup';\r\nexport * from './Group/CollisionGroupManager';\r\n\r\nexport * from './Detection/Pair';\r\nexport * from './Detection/CollisionContact';\r\nexport * from './Detection/CollisionProcessor';\r\nexport * from './Detection/DynamicTree';\r\nexport * from './Detection/DynamicTreeCollisionProcessor';\r\n\r\nexport * from './Solver/ArcadeSolver';\r\nexport * from './Solver/ContactConstraintPoint';\r\nexport * from './Solver/RealisticSolver';\r\nexport * from './Solver/Solver';\r\n\r\nexport * from './CollisionSystem';\r\nexport * from './MotionSystem';\r\n\r\nexport * from './Physics';\r\nexport * from './Side';\r\n","import { Color } from '../Color';\r\nimport * as Effects from './SpriteEffects';\r\n\r\nimport { Drawable, DrawOptions } from '../Interfaces/Drawable';\r\nimport { Vector } from '../Math/vector';\r\nimport { obsolete } from '../Util/Decorators';\r\n\r\n/**\r\n * Creates a closed polygon drawing given a list of [[Vector]]s.\r\n *\r\n * @deprecated Use [[Polygon]]\r\n * @warning Use sparingly as Polygons are performance intensive\r\n */\r\n@obsolete({\r\n message: 'Polygon will be removed in v0.26.0',\r\n alternateMethod: 'Use Graphics.Polygon'\r\n})\r\nexport class Polygon implements Drawable {\r\n public flipVertical: boolean;\r\n public flipHorizontal: boolean;\r\n public drawWidth: number;\r\n public drawHeight: number;\r\n\r\n public width: number;\r\n public height: number;\r\n\r\n /**\r\n * The color to use for the lines of the polygon\r\n */\r\n public lineColor: Color;\r\n /**\r\n * The color to use for the interior of the polygon\r\n */\r\n public fillColor: Color;\r\n /**\r\n * The width of the lines of the polygon\r\n */\r\n public lineWidth: number = 5;\r\n /**\r\n * Indicates whether the polygon is filled or not.\r\n */\r\n public filled: boolean = false;\r\n\r\n private _points: Vector[] = [];\r\n public anchor = Vector.Zero;\r\n public offset = Vector.Zero;\r\n public rotation: number = 0;\r\n public scale = Vector.One;\r\n public opacity: number = 1;\r\n\r\n /**\r\n * @param points The vectors to use to build the polygon in order\r\n */\r\n constructor(points: Vector[]) {\r\n this._points = points;\r\n\r\n const minX = this._points.reduce((prev: number, curr: Vector) => {\r\n return Math.min(prev, curr.x);\r\n }, 0);\r\n const maxX = this._points.reduce((prev: number, curr: Vector) => {\r\n return Math.max(prev, curr.x);\r\n }, 0);\r\n\r\n this.drawWidth = maxX - minX;\r\n\r\n const minY = this._points.reduce((prev: number, curr: Vector) => {\r\n return Math.min(prev, curr.y);\r\n }, 0);\r\n const maxY = this._points.reduce((prev: number, curr: Vector) => {\r\n return Math.max(prev, curr.y);\r\n }, 0);\r\n\r\n this.drawHeight = maxY - minY;\r\n\r\n this.height = this.drawHeight;\r\n this.width = this.drawWidth;\r\n }\r\n\r\n /**\r\n * @notimplemented Effects are not supported on `Polygon`\r\n */\r\n public addEffect() {\r\n // not supported on polygons\r\n }\r\n /**\r\n * @notimplemented Effects are not supported on `Polygon`\r\n */\r\n public removeEffect(index: number): void;\r\n /**\r\n * @notimplemented Effects are not supported on `Polygon`\r\n */\r\n public removeEffect(effect: Effects.SpriteEffect): void;\r\n /**\r\n * @notimplemented Effects are not supported on `Polygon`\r\n */\r\n public removeEffect() {\r\n // not supported on polygons\r\n }\r\n\r\n /**\r\n * @notimplemented Effects are not supported on `Polygon`\r\n */\r\n public clearEffects() {\r\n // not supported on polygons\r\n }\r\n\r\n public reset() {\r\n //pass\r\n }\r\n\r\n /**\r\n * Draws the sprite appropriately to the 2D rendering context, at an x and y coordinate.\r\n * @param ctx The 2D rendering context\r\n * @param x The x coordinate of where to draw\r\n * @param y The y coordinate of where to draw\r\n */\r\n public draw(ctx: CanvasRenderingContext2D, x: number, y: number): void;\r\n /**\r\n * Draws the sprite with custom options to override internals without mutating them.\r\n * @param options\r\n */\r\n public draw(options: DrawOptions): void;\r\n public draw(ctxOrOptions: CanvasRenderingContext2D | DrawOptions, x?: number, y?: number): void {\r\n if (ctxOrOptions instanceof CanvasRenderingContext2D) {\r\n this._drawWithOptions({ ctx: ctxOrOptions, x, y });\r\n } else {\r\n this._drawWithOptions(ctxOrOptions);\r\n }\r\n }\r\n\r\n private _drawWithOptions(options: DrawOptions) {\r\n const { ctx, x, y, rotation, drawWidth, drawHeight, anchor, offset, opacity, flipHorizontal, flipVertical } = {\r\n ...options,\r\n rotation: options.rotation ?? this.rotation,\r\n drawWidth: options.drawWidth ?? this.drawWidth,\r\n drawHeight: options.drawHeight ?? this.drawHeight,\r\n flipHorizontal: options.flipHorizontal ?? this.flipHorizontal,\r\n flipVertical: options.flipVertical ?? this.flipVertical,\r\n anchor: options.anchor ?? this.anchor,\r\n offset: options.offset ?? this.offset,\r\n opacity: (options.opacity ?? 1) * (this.opacity ?? 1)\r\n };\r\n\r\n const xpoint = drawWidth * anchor.x + offset.x + x;\r\n const ypoint = drawHeight * anchor.y + offset.y + y;\r\n\r\n ctx.save();\r\n ctx.translate(xpoint, ypoint);\r\n ctx.scale(this.scale.x, this.scale.y);\r\n ctx.rotate(rotation);\r\n ctx.beginPath();\r\n ctx.lineWidth = this.lineWidth;\r\n\r\n // Iterate through the supplied points and construct a 'polygon'\r\n const firstPoint = this._points[0];\r\n ctx.moveTo(firstPoint.x, firstPoint.y);\r\n\r\n let i = 0;\r\n const len = this._points.length;\r\n\r\n for (i; i < len; i++) {\r\n ctx.lineTo(this._points[i].x, this._points[i].y);\r\n }\r\n\r\n ctx.lineTo(firstPoint.x, firstPoint.y);\r\n ctx.closePath();\r\n\r\n if (this.filled) {\r\n ctx.fillStyle = this.fillColor.toString();\r\n ctx.fill();\r\n }\r\n\r\n ctx.strokeStyle = this.lineColor.toString();\r\n\r\n if (flipHorizontal) {\r\n ctx.translate(drawWidth, 0);\r\n ctx.scale(-1, 1);\r\n }\r\n\r\n if (flipVertical) {\r\n ctx.translate(0, drawHeight);\r\n ctx.scale(1, -1);\r\n }\r\n\r\n const oldAlpha = ctx.globalAlpha;\r\n ctx.globalAlpha = opacity;\r\n ctx.stroke();\r\n ctx.globalAlpha = oldAlpha;\r\n\r\n ctx.restore();\r\n }\r\n}\r\n","export { Animation, AnimationArgs } from './Animation';\r\nexport * from './Polygon';\r\nexport { Sprite, SpriteArgs } from './Sprite';\r\nexport { SpriteSheet, SpriteFont, SpriteSheetArgs, SpriteFontArgs as SpriteFontInitArgs, SpriteFontOptions } from './SpriteSheet';\r\nexport * from './CanvasDrawComponent';\r\nexport * from './CanvasDrawingSystem';\r\nimport * as effects from './SpriteEffects';\r\nexport { effects as Effects };\r\nexport * from './Texture';\r\n","import { Audio } from './Audio';\r\n\r\nexport type ExResponseType = '' | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text';\r\n\r\nexport interface ExResponseTypesLookup {\r\n [name: string]: ExResponseType;\r\n}\r\n\r\nexport class ExResponse {\r\n public static type: ExResponseTypesLookup = {\r\n any: '',\r\n blob: 'blob',\r\n json: 'json',\r\n text: 'text',\r\n document: 'document',\r\n arraybuffer: 'arraybuffer'\r\n };\r\n}\r\n\r\n/**\r\n * Represents an audio implementation like [[WebAudioInstance]]\r\n */\r\nexport interface AudioImplementation {\r\n /**\r\n * XHR response type\r\n */\r\n responseType: ExResponseType;\r\n\r\n /**\r\n * Processes raw data and transforms into sound data\r\n */\r\n processData(data: Blob | ArrayBuffer): Promise<string | AudioBuffer>;\r\n\r\n /**\r\n * Factory method that returns an instance of a played audio track\r\n */\r\n createInstance(data: string | AudioBuffer): Audio;\r\n}\r\n","import { Engine } from './../Engine';\r\nimport * as Events from './../Events';\r\nimport { Scene } from '../Scene';\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _initialize {\r\n _initialize(engine: Engine): void;\r\n}\r\n\r\n/**\r\n * Type guard checking for internal initialize method\r\n * @internal\r\n * @param a\r\n */\r\nexport function has_initialize(a: any): a is _initialize {\r\n return !!a._initialize;\r\n}\r\n\r\nexport interface OnInitialize {\r\n onInitialize(engine: Engine): void;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function hasOnInitialize(a: any): a is OnInitialize {\r\n return !!a.onInitialize;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _preupdate {\r\n _preupdate(engine: Engine, delta: number): void;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function has_preupdate(a: any): a is _preupdate {\r\n return !!a._preupdate;\r\n}\r\n\r\nexport interface OnPreUpdate {\r\n onPreUpdate(engine: Engine, delta: number): void;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function hasOnPreUpdate(a: any): a is OnPreUpdate {\r\n return !!a.onPreUpdate;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _postupdate {\r\n _postupdate(engine: Engine, delta: number): void;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function has_postupdate(a: any): a is _postupdate {\r\n return !!a.onPostUpdate;\r\n}\r\n\r\nexport interface OnPostUpdate {\r\n onPostUpdate(engine: Engine, delta: number): void;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function hasOnPostUpdate(a: any): a is OnPostUpdate {\r\n return !!a.onPostUpdate;\r\n}\r\n\r\nexport interface CanInitialize {\r\n /**\r\n * Overridable implementation\r\n */\r\n onInitialize(_engine: Engine): void;\r\n\r\n /**\r\n * Event signatures\r\n */\r\n on(eventName: Events.initialize, handler: (event: Events.InitializeEvent<any>) => void): void;\r\n once(eventName: Events.initialize, handler: (event: Events.InitializeEvent<any>) => void): void;\r\n off(eventName: Events.initialize, handler?: (event: Events.InitializeEvent<any>) => void): void;\r\n}\r\n\r\nexport interface CanActivate {\r\n /**\r\n * Overridable implementation\r\n */\r\n onActivate(oldScene: Scene, newScene: Scene): void;\r\n\r\n /**\r\n * Event signatures\r\n */\r\n on(eventName: Events.activate, handler: (event: Events.ActivateEvent) => void): void;\r\n once(eventName: Events.activate, handler: (event: Events.ActivateEvent) => void): void;\r\n off(eventName: Events.activate, handler?: (event: Events.ActivateEvent) => void): void;\r\n}\r\n\r\nexport interface CanDeactivate {\r\n /**\r\n * Overridable implementation\r\n */\r\n onDeactivate(oldScene: Scene, newScene: Scene): void;\r\n\r\n /**\r\n * Event signature\r\n */\r\n on(eventName: Events.deactivate, handler: (event: Events.DeactivateEvent) => void): void;\r\n once(eventName: Events.deactivate, handler: (event: Events.DeactivateEvent) => void): void;\r\n off(eventName: Events.deactivate, handler?: (event: Events.DeactivateEvent) => void): void;\r\n}\r\n\r\nexport interface CanUpdate {\r\n /**\r\n * Overridable implementation\r\n */\r\n onPreUpdate(_engine: Engine, _delta: number): void;\r\n\r\n /**\r\n * Event signature\r\n */\r\n on(eventName: Events.preupdate, handler: (event: Events.PreUpdateEvent<any>) => void): void;\r\n once(eventName: Events.preupdate, handler: (event: Events.PreUpdateEvent<any>) => void): void;\r\n off(eventName: Events.preupdate, handler?: (event: Events.PreUpdateEvent<any>) => void): void;\r\n\r\n /**\r\n * Overridable implementation\r\n */\r\n onPostUpdate(_engine: Engine, _delta: number): void;\r\n\r\n /**\r\n * Event signatures\r\n */\r\n on(eventName: Events.postupdate, handler: (event: Events.PostUpdateEvent<any>) => void): void;\r\n once(eventName: Events.postupdate, handler: (event: Events.PostUpdateEvent<any>) => void): void;\r\n off(eventName: Events.postupdate, handler?: (event: Events.PostUpdateEvent<any>) => void): void;\r\n}\r\n\r\nexport interface OnPreDraw {\r\n /**\r\n * Overridable implementation\r\n */\r\n onPreDraw(_ctx: CanvasRenderingContext2D, _delta: number): void;\r\n\r\n /**\r\n * Event signatures\r\n */\r\n on(eventName: Events.predraw, handler: (event: Events.PreDrawEvent) => void): void;\r\n once(eventName: Events.predraw, handler: (event: Events.PreDrawEvent) => void): void;\r\n off(eventName: Events.predraw, handler?: (event: Events.PreDrawEvent) => void): void;\r\n}\r\n\r\nexport interface OnPostDraw {\r\n /**\r\n * Overridable implementation\r\n */\r\n onPostDraw(_ctx: CanvasRenderingContext2D, _delta: number): void;\r\n\r\n /**\r\n * Event signatures\r\n */\r\n on(eventName: Events.postdraw, handler: (event: Events.PostDrawEvent) => void): void;\r\n once(eventName: Events.postdraw, handler: (event: Events.PostDrawEvent) => void): void;\r\n off(eventName: Events.postdraw, handler?: (event: Events.PostDrawEvent) => void): void;\r\n}\r\n\r\nexport interface CanDraw extends OnPreDraw, OnPostDraw {\r\n on(eventName: Events.predraw, handler: (event: Events.PreDrawEvent) => void): void;\r\n on(eventName: Events.postdraw, handler: (event: Events.PostDrawEvent) => void): void;\r\n\r\n once(eventName: Events.predraw, handler: (event: Events.PreDrawEvent) => void): void;\r\n once(eventName: Events.postdraw, handler: (event: Events.PostDrawEvent) => void): void;\r\n\r\n off(eventName: Events.predraw, handler?: (event: Events.PreDrawEvent) => void): void;\r\n off(eventName: Events.postdraw, handler?: (event: Events.PostDrawEvent) => void): void;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function hasPreDraw(a: any): a is OnPreDraw {\r\n return !!a.onPreDraw;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function hasPostDraw(a: any): a is OnPostDraw {\r\n return !!a.onPostDraw;\r\n}\r\n\r\nexport interface CanBeKilled {\r\n /**\r\n * Overridable implementation\r\n */\r\n onPreKill(_scene: Scene): void;\r\n\r\n /**\r\n * Event signatures\r\n */\r\n on(eventName: Events.prekill, handler: (event: Events.PreKillEvent) => void): void;\r\n once(eventName: Events.prekill, handler: (event: Events.PreKillEvent) => void): void;\r\n off(eventName: Events.prekill, handler: (event: Events.PreKillEvent) => void): void;\r\n\r\n /**\r\n * Overridable implementation\r\n */\r\n onPostKill(_scene: Scene): void;\r\n\r\n /**\r\n * Event signatures\r\n */\r\n on(eventName: Events.postkill, handler: (event: Events.PostKillEvent) => void): void;\r\n once(eventName: Events.postkill, handler: (event: Events.PostKillEvent) => void): void;\r\n off(eventName: Events.postkill, handler: (event: Events.PostKillEvent) => void): void;\r\n}\r\n","export * from './Trait';\r\nexport * from './Clonable';\r\nexport * from './Audio';\r\nexport * from './AudioImplementation';\r\nexport * from './Drawable';\r\nexport * from './Evented';\r\nexport * from './Loadable';\r\nexport * from './LifecycleEvents';\r\nexport * from './PointerEventHandlers';\r\n","export * from './ColorBlindCorrector';\r\nexport * from './PostProcessor';\r\n","import { Audio } from '../../Interfaces/Audio';\r\nimport * as Util from '../../Util/Util';\r\nimport { AudioContextFactory } from './AudioContext';\r\n\r\n/**\r\n * Internal class representing a Web Audio AudioBufferSourceNode instance\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\r\n */\r\nexport class WebAudioInstance implements Audio {\r\n private _volume = 1;\r\n private _duration: number | undefined = undefined;\r\n\r\n private _playingPromise: Promise<boolean>;\r\n private _playingResolve: (value: boolean) => void;\r\n\r\n private _loop = false;\r\n public set loop(value: boolean) {\r\n this._loop = value;\r\n\r\n if (this._instance) {\r\n this._instance.loop = value;\r\n this._wireUpOnEnded();\r\n }\r\n }\r\n public get loop(): boolean {\r\n return this._loop;\r\n }\r\n\r\n public set volume(value: number) {\r\n value = Util.clamp(value, 0, 1.0);\r\n\r\n this._volume = value;\r\n\r\n if (this._isPlaying && this._volumeNode.gain.setTargetAtTime) {\r\n // https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime\r\n // After each .1 seconds timestep, the target value will ~63.2% closer to the target value.\r\n // This exponential ramp provides a more pleasant transition in gain\r\n this._volumeNode.gain.setTargetAtTime(value, this._audioContext.currentTime, 0.1);\r\n } else {\r\n this._volumeNode.gain.value = value;\r\n }\r\n }\r\n public get volume(): number {\r\n return this._volume;\r\n }\r\n\r\n public set duration(value: number | undefined) {\r\n this._duration = value;\r\n }\r\n\r\n /**\r\n * Duration of the sound, in seconds.\r\n */\r\n public get duration() {\r\n return this._duration;\r\n }\r\n\r\n private get _playbackRate(): number {\r\n return this._instance ? 1 / (this._instance.playbackRate.value || 1.0) : null;\r\n }\r\n\r\n private _isPlaying = false;\r\n private _isPaused = false;\r\n private _instance: AudioBufferSourceNode;\r\n private _audioContext: AudioContext = AudioContextFactory.create();\r\n private _volumeNode = this._audioContext.createGain();\r\n private _startTime: number;\r\n\r\n /**\r\n * Current playback offset (in seconds)\r\n */\r\n private _currentOffset = 0;\r\n\r\n constructor(private _src: AudioBuffer) {\r\n this._createNewBufferSource();\r\n }\r\n\r\n public isPlaying() {\r\n return this._isPlaying;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public play(playStarted: () => any = () => {}) {\r\n if (this._isPaused) {\r\n this._resumePlayBack();\r\n playStarted();\r\n }\r\n\r\n if (!this._isPlaying) {\r\n this._startPlayBack();\r\n playStarted();\r\n }\r\n\r\n return this._playingPromise;\r\n }\r\n\r\n public pause() {\r\n if (!this._isPlaying) {\r\n return;\r\n }\r\n\r\n this._isPaused = true;\r\n this._isPlaying = false;\r\n\r\n this._instance.stop(0);\r\n // Playback rate will be a scale factor of how fast/slow the audio is being played\r\n // default is 1.0\r\n // we need to invert it to get the time scale\r\n\r\n this._setPauseOffset();\r\n }\r\n\r\n public stop() {\r\n if (!this._isPlaying) {\r\n return;\r\n }\r\n\r\n this._isPlaying = false;\r\n this._isPaused = false;\r\n\r\n this._currentOffset = 0;\r\n this._instance.stop(0);\r\n\r\n // handler will not be wired up if we were looping\r\n if (!this._instance.onended) {\r\n this._handleOnEnded();\r\n }\r\n }\r\n\r\n private _startPlayBack() {\r\n this._isPlaying = true;\r\n this._isPaused = false;\r\n this._playingPromise = new Promise<boolean>((resolve) => {\r\n this._playingResolve = resolve;\r\n });\r\n\r\n if (!this._instance) {\r\n this._createNewBufferSource();\r\n }\r\n\r\n this._rememberStartTime();\r\n\r\n this._volumeNode.connect(this._audioContext.destination);\r\n this._instance.start(0, 0);\r\n this._currentOffset = 0;\r\n\r\n this._wireUpOnEnded();\r\n }\r\n\r\n private _resumePlayBack() {\r\n if (!this._isPaused) {\r\n return;\r\n }\r\n\r\n this._isPaused = false;\r\n this._isPlaying = true;\r\n\r\n // a buffer source can only be started once\r\n // so we need to dispose of the previous instance before\r\n // \"resuming\" the next one\r\n this._instance.onended = null; // dispose of any previous event handler\r\n this._createNewBufferSource();\r\n\r\n const duration = this._playbackRate * this._src.duration;\r\n const restartTime = this._currentOffset % duration;\r\n\r\n this._rememberStartTime(restartTime * -1000);\r\n this._instance.start(0, restartTime);\r\n this._wireUpOnEnded();\r\n }\r\n\r\n private _wireUpOnEnded() {\r\n if (!this.loop) {\r\n this._instance.onended = () => this._handleOnEnded();\r\n }\r\n }\r\n\r\n private _handleOnEnded() {\r\n // pausing calls stop(0) which triggers onended event\r\n // so we don't \"resolve\" yet (when we resume we'll try again)\r\n if (!this._isPaused) {\r\n this._isPlaying = false;\r\n this._playingResolve(true);\r\n }\r\n }\r\n\r\n private _rememberStartTime(amend?: number) {\r\n this._startTime = new Date().getTime() + (amend | 0);\r\n }\r\n\r\n private _setPauseOffset() {\r\n this._currentOffset = ((new Date().getTime() - this._startTime) * this._playbackRate) / 1000; // in seconds\r\n }\r\n\r\n private _createNewBufferSource() {\r\n this._instance = this._audioContext.createBufferSource();\r\n this._instance.buffer = this._src;\r\n this._instance.loop = this.loop;\r\n this._instance.playbackRate.setValueAtTime(1.0, 0);\r\n\r\n this._instance.connect(this._volumeNode);\r\n }\r\n}\r\n","import { Logger } from './Log';\r\n\r\n/**\r\n * Whether or not the browser can play this file as HTML5 Audio\r\n */\r\nexport function canPlayFile(file: string): boolean {\r\n try {\r\n const a = new Audio();\r\n const filetype = /.*\\.([A-Za-z0-9]+)$/;\r\n const type = file.match(filetype)[1];\r\n if (a.canPlayType('audio/' + type)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } catch (e) {\r\n Logger.getInstance().warn('Cannot determine audio support, assuming no support for the Audio Tag', e);\r\n return false;\r\n }\r\n}\r\n","import { ExResponse } from '../../Interfaces/AudioImplementation';\r\nimport { Audio } from '../../Interfaces/Audio';\r\nimport { Engine } from '../../Engine';\r\nimport { Resource } from '../Resource';\r\nimport { WebAudioInstance } from './WebAudioInstance';\r\nimport { AudioContextFactory } from './AudioContext';\r\nimport { NativeSoundEvent, NativeSoundProcessedEvent } from '../../Events/MediaEvents';\r\nimport { canPlayFile } from '../../Util/Sound';\r\nimport { Loadable } from '../../Interfaces/Index';\r\nimport { Logger } from '../../Util/Log';\r\nimport { Class } from '../../Class';\r\n\r\n/**\r\n * The [[Sound]] object allows games built in Excalibur to load audio\r\n * components, from soundtracks to sound effects. [[Sound]] is an [[Loadable]]\r\n * which means it can be passed to a [[Loader]] to pre-load before a game or level.\r\n */\r\nexport class Sound extends Class implements Audio, Loadable<AudioBuffer> {\r\n public logger: Logger = Logger.getInstance();\r\n public data: AudioBuffer;\r\n private _resource: Resource<ArrayBuffer>;\r\n /**\r\n * Indicates whether the clip should loop when complete\r\n * @param value Set the looping flag\r\n */\r\n public set loop(value: boolean) {\r\n this._loop = value;\r\n\r\n for (const track of this._tracks) {\r\n track.loop = this._loop;\r\n }\r\n\r\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._loop);\r\n }\r\n public get loop(): boolean {\r\n return this._loop;\r\n }\r\n\r\n public set volume(value: number) {\r\n this._volume = value;\r\n\r\n for (const track of this._tracks) {\r\n track.volume = this._volume;\r\n }\r\n\r\n this.emit('volumechange', new NativeSoundEvent(this));\r\n\r\n this.logger.debug('Set loop for all instances of sound', this.path, 'to', this._volume);\r\n }\r\n public get volume(): number {\r\n return this._volume;\r\n }\r\n\r\n public get duration(): number | undefined {\r\n return this._duration;\r\n }\r\n\r\n /**\r\n * Return array of Current AudioInstances playing or being paused\r\n */\r\n public get instances(): Audio[] {\r\n return this._tracks;\r\n }\r\n\r\n public get path() {\r\n return this._resource.path;\r\n }\r\n\r\n public set path(val: string) {\r\n this._resource.path = val;\r\n }\r\n\r\n private _loop = false;\r\n private _volume = 1;\r\n private _duration: number | undefined = undefined;\r\n private _isStopped = false;\r\n private _isPaused = false;\r\n private _tracks: Audio[] = [];\r\n private _engine: Engine;\r\n private _wasPlayingOnHidden: boolean = false;\r\n private _audioContext = AudioContextFactory.create();\r\n\r\n /**\r\n * @param paths A list of audio sources (clip.wav, clip.mp3, clip.ogg) for this audio clip. This is done for browser compatibility.\r\n */\r\n constructor(...paths: string[]) {\r\n super();\r\n this._resource = new Resource('', ExResponse.type.arraybuffer);\r\n /**\r\n * Chrome : MP3, WAV, Ogg\r\n * Firefox : WAV, Ogg,\r\n * IE : MP3, WAV coming soon\r\n * Safari MP3, WAV, Ogg\r\n */\r\n for (const path of paths) {\r\n if (canPlayFile(path)) {\r\n this.path = path;\r\n break;\r\n }\r\n }\r\n\r\n if (!this.path) {\r\n this.logger.warn('This browser does not support any of the audio files specified:', paths.join(', '));\r\n this.logger.warn('Attempting to use', paths[0]);\r\n this.path = paths[0]; // select the first specified\r\n }\r\n }\r\n\r\n public isLoaded() {\r\n return !!this.data;\r\n }\r\n\r\n public async load(): Promise<AudioBuffer> {\r\n if (this.data) {\r\n return this.data;\r\n }\r\n const arraybuffer = await this._resource.load();\r\n const audiobuffer = await this.decodeAudio(arraybuffer.slice(0));\r\n this._duration = typeof audiobuffer === 'object' ? audiobuffer.duration : undefined;\r\n this.emit('processed', new NativeSoundProcessedEvent(this, audiobuffer));\r\n return this.data = audiobuffer;\r\n }\r\n\r\n public async decodeAudio(data: ArrayBuffer): Promise<AudioBuffer> {\r\n try {\r\n return await this._audioContext.decodeAudioData(data.slice(0));\r\n } catch (e) {\r\n this.logger.error(\r\n 'Unable to decode ' +\r\n ' this browser may not fully support this format, or the file may be corrupt, ' +\r\n 'if this is an mp3 try removing id3 tags and album art from the file.'\r\n );\r\n return await Promise.reject();\r\n }\r\n }\r\n\r\n public wireEngine(engine: Engine) {\r\n if (engine) {\r\n this._engine = engine;\r\n\r\n this._engine.on('hidden', () => {\r\n if (engine.pauseAudioWhenHidden && this.isPlaying()) {\r\n this._wasPlayingOnHidden = true;\r\n this.pause();\r\n }\r\n });\r\n\r\n this._engine.on('visible', () => {\r\n if (engine.pauseAudioWhenHidden && this._wasPlayingOnHidden) {\r\n this.play();\r\n this._wasPlayingOnHidden = false;\r\n }\r\n });\r\n\r\n this._engine.on('start', () => {\r\n this._isStopped = false;\r\n });\r\n\r\n this._engine.on('stop', () => {\r\n this.stop();\r\n this._isStopped = true;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Returns how many instances of the sound are currently playing\r\n */\r\n public instanceCount(): number {\r\n return this._tracks.length;\r\n }\r\n\r\n /**\r\n * Whether or not the sound is playing right now\r\n */\r\n public isPlaying(): boolean {\r\n return this._tracks.some((t) => t.isPlaying());\r\n }\r\n\r\n /**\r\n * Play the sound, returns a promise that resolves when the sound is done playing\r\n * An optional volume argument can be passed in to play the sound. Max volume is 1.0\r\n */\r\n public play(volume?: number): Promise<boolean> {\r\n if (!this.isLoaded()) {\r\n this.logger.warn('Cannot start playing. Resource', this.path, 'is not loaded yet');\r\n\r\n return Promise.resolve(true);\r\n }\r\n\r\n if (this._isStopped) {\r\n this.logger.warn('Cannot start playing. Engine is in a stopped state.');\r\n return Promise.resolve(false);\r\n }\r\n\r\n this.volume = volume || this.volume;\r\n\r\n if (this._isPaused) {\r\n return this._resumePlayback();\r\n } else {\r\n return this._startPlayback();\r\n }\r\n }\r\n\r\n /**\r\n * Stop the sound, and do not rewind\r\n */\r\n public pause() {\r\n if (!this.isPlaying()) {\r\n return;\r\n }\r\n\r\n for (const track of this._tracks) {\r\n track.pause();\r\n }\r\n\r\n this._isPaused = true;\r\n\r\n this.emit('pause', new NativeSoundEvent(this));\r\n\r\n this.logger.debug('Paused all instances of sound', this.path);\r\n }\r\n\r\n /**\r\n * Stop the sound if it is currently playing and rewind the track. If the sound is not playing, rewinds the track.\r\n */\r\n public stop() {\r\n for (const track of this._tracks) {\r\n track.stop();\r\n }\r\n\r\n this.emit('stop', new NativeSoundEvent(this));\r\n\r\n this._isPaused = false;\r\n this._tracks.length = 0;\r\n this.logger.debug('Stopped all instances of sound', this.path);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get Id of provided AudioInstance in current trackList\r\n * @param track [[Audio]] which Id is to be given\r\n */\r\n public getTrackId(track: Audio): number {\r\n return this._tracks.indexOf(track);\r\n }\r\n\r\n private async _resumePlayback(): Promise<boolean> {\r\n if (this._isPaused) {\r\n const resumed: Promise<boolean>[] = [];\r\n // ensure we resume *current* tracks (if paused)\r\n for (const track of this._tracks) {\r\n resumed.push(track.play());\r\n }\r\n\r\n this._isPaused = false;\r\n\r\n this.emit('resume', new NativeSoundEvent(this));\r\n\r\n this.logger.debug('Resuming paused instances for sound', this.path, this._tracks);\r\n // resolve when resumed tracks are done\r\n await Promise.all(resumed);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Starts playback, returns a promise that resolves when playback is complete\r\n */\r\n private async _startPlayback(): Promise<boolean> {\r\n const track = await this._getTrackInstance(this.data);\r\n\r\n const complete = await track.play(() => {\r\n this.emit('playbackstart', new NativeSoundEvent(this, track));\r\n this.logger.debug('Playing new instance for sound', this.path);\r\n });\r\n\r\n // when done, remove track\r\n this.emit('playbackend', new NativeSoundEvent(this, track));\r\n this._tracks.splice(this.getTrackId(track), 1);\r\n\r\n return complete;\r\n }\r\n\r\n private _getTrackInstance(data: AudioBuffer): WebAudioInstance {\r\n const newTrack = new WebAudioInstance(data);\r\n\r\n newTrack.loop = this.loop;\r\n newTrack.volume = this.volume;\r\n newTrack.duration = this.duration;\r\n\r\n this._tracks.push(newTrack);\r\n\r\n return newTrack;\r\n }\r\n}\r\n","export * from './Sound';\r\nexport * from './AudioContext';\r\nexport * from './WebAudioInstance';\r\n","import { Resource } from './Resource';\r\nimport { Sprite } from '../Graphics/Sprite';\r\nimport { Color } from '../Color';\r\nimport { SpriteSheet } from '../Graphics/SpriteSheet';\r\nimport { Animation } from '../Graphics/Animation';\r\nimport { Engine } from '../Engine';\r\nimport { Loadable } from '../Interfaces/Index';\r\nimport { ImageSource } from '../Graphics/ImageSource';\r\nimport { LegacyDrawing } from '..';\r\nimport { range } from '../Util/Util';\r\n/**\r\n * The [[Texture]] object allows games built in Excalibur to load image resources.\r\n * [[Texture]] is an [[Loadable]] which means it can be passed to a [[Loader]]\r\n * to pre-load before starting a level or game.\r\n */\r\nexport class Gif implements Loadable<ImageSource[]> {\r\n private _resource: Resource<ArrayBuffer>;\r\n\r\n /**\r\n * The width of the texture in pixels\r\n */\r\n public width: number;\r\n\r\n /**\r\n * The height of the texture in pixels\r\n */\r\n public height: number;\r\n\r\n\r\n private _stream: Stream = null;\r\n private _gif: ParseGif = null;\r\n private _textures: ImageSource[] = [];\r\n private _animation: Animation = null;\r\n private _transparentColor: Color = null;\r\n\r\n public data: ImageSource[];\r\n\r\n /**\r\n * @param path Path to the image resource\r\n * @param color Optionally set the color to treat as transparent the gif, by default [[Color.Magenta]]\r\n * @param bustCache Optionally load texture with cache busting\r\n */\r\n constructor(public path: string, public color: Color = Color.Magenta, public bustCache = true) {\r\n this._resource = new Resource(path, 'arraybuffer', bustCache);\r\n this._transparentColor = color;\r\n }\r\n\r\n /**\r\n * Begins loading the texture and returns a promise to be resolved on completion\r\n */\r\n public async load(): Promise<ImageSource[]> {\r\n const arraybuffer = await this._resource.load();\r\n this._stream = new Stream(arraybuffer);\r\n this._gif = new ParseGif(this._stream, this._transparentColor);\r\n const images = this._gif.images.map(i => new ImageSource(i.src, false));\r\n\r\n // Load all textures\r\n await Promise.all(images.map(t => t.load()));\r\n return this.data = this._textures = images;\r\n }\r\n\r\n public isLoaded() {\r\n return !!this.data;\r\n }\r\n\r\n /**\r\n * Return a frame of the gif as a legacy sprite by index\r\n * @deprecated\r\n */\r\n public toLegacySprite(id: number = 0): LegacyDrawing.Sprite {\r\n return Sprite.toLegacySprite(this.toSprite(id));\r\n }\r\n\r\n /**\r\n * Return the gif as a legacy spritesheet\r\n * @deprecated\r\n * @returns\r\n */\r\n public toLegacySpriteSheet(): LegacyDrawing.SpriteSheet {\r\n return SpriteSheet.toLegacySpriteSheet(this.toSpriteSheet());\r\n }\r\n\r\n /**\r\n * Return the gif as a legacy animation\r\n * @deprecated\r\n * @param speed\r\n */\r\n public toLegacyAnimation(engine: Engine, speed: number): LegacyDrawing.Animation {\r\n return Animation.toLegacyAnimation(engine, this.toAnimation(speed));\r\n }\r\n\r\n /**\r\n * Return a frame of the gif as a sprite by id\r\n * @param id\r\n */\r\n public toSprite(id: number = 0): Sprite {\r\n const sprite = this._textures[id].toSprite();\r\n return sprite;\r\n }\r\n\r\n /**\r\n * Return the gif as a spritesheet\r\n */\r\n public toSpriteSheet(): SpriteSheet {\r\n const sprites: Sprite[] = this._textures.map((image) => {\r\n return image.toSprite();\r\n });\r\n return new SpriteSheet({ sprites });\r\n }\r\n\r\n /**\r\n * Transform the GIF into an animation with duration per frame\r\n */\r\n public toAnimation(durationPerFrameMs: number): Animation {\r\n const spriteSheet: SpriteSheet = this.toSpriteSheet();\r\n const length = spriteSheet.sprites.length;\r\n this._animation = Animation.fromSpriteSheet(spriteSheet, range(0, length), durationPerFrameMs);\r\n return this._animation;\r\n }\r\n\r\n public get readCheckBytes(): number[] {\r\n return this._gif.checkBytes;\r\n }\r\n}\r\n\r\nexport interface GifFrame {\r\n sentinel: number;\r\n type: string;\r\n leftPos: number;\r\n topPos: number;\r\n width: number;\r\n height: number;\r\n lctFlag: boolean;\r\n interlaced: boolean;\r\n sorted: boolean;\r\n reserved: boolean[];\r\n lctSize: number;\r\n lzwMinCodeSize: number;\r\n pixels: number[];\r\n}\r\n\r\nconst bitsToNum = (ba: any) => {\r\n return ba.reduce(function (s: number, n: number) {\r\n return s * 2 + n;\r\n }, 0);\r\n};\r\n\r\nconst byteToBitArr = (bite: any) => {\r\n const a = [];\r\n for (let i = 7; i >= 0; i--) {\r\n a.push(!!(bite & (1 << i)));\r\n }\r\n return a;\r\n};\r\n\r\nexport class Stream {\r\n data: any = null;\r\n len: number = 0;\r\n position: number = 0;\r\n\r\n constructor(dataArray: ArrayBuffer) {\r\n this.data = new Uint8Array(dataArray);\r\n this.len = this.data.byteLength;\r\n if (this.len === 0) {\r\n throw new Error('No data loaded from file');\r\n }\r\n }\r\n\r\n public readByte = () => {\r\n if (this.position >= this.data.byteLength) {\r\n throw new Error('Attempted to read past end of stream.');\r\n }\r\n return this.data[this.position++];\r\n };\r\n\r\n public readBytes = (n: number) => {\r\n const bytes = [];\r\n for (let i = 0; i < n; i++) {\r\n bytes.push(this.readByte());\r\n }\r\n return bytes;\r\n };\r\n\r\n public read = (n: number) => {\r\n let s = '';\r\n for (let i = 0; i < n; i++) {\r\n s += String.fromCharCode(this.readByte());\r\n }\r\n return s;\r\n };\r\n\r\n public readUnsigned = () => {\r\n // Little-endian.\r\n const a = this.readBytes(2);\r\n return (a[1] << 8) + a[0];\r\n };\r\n}\r\n\r\nconst lzwDecode = function (minCodeSize: number, data: any) {\r\n // TODO: Now that the GIF parser is a bit different, maybe this should get an array of bytes instead of a String?\r\n let pos = 0; // Maybe this streaming thing should be merged with the Stream?\r\n\r\n const readCode = function (size: number) {\r\n let code = 0;\r\n for (let i = 0; i < size; i++) {\r\n if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) {\r\n code |= 1 << i;\r\n }\r\n pos++;\r\n }\r\n return code;\r\n };\r\n\r\n const output: any[] = [];\r\n\r\n const clearCode = 1 << minCodeSize;\r\n const eoiCode = clearCode + 1;\r\n\r\n let codeSize = minCodeSize + 1;\r\n\r\n let dict: any[] = [];\r\n\r\n const clear = function () {\r\n dict = [];\r\n codeSize = minCodeSize + 1;\r\n for (let i = 0; i < clearCode; i++) {\r\n dict[i] = [i];\r\n }\r\n dict[clearCode] = [];\r\n dict[eoiCode] = null;\r\n };\r\n\r\n let code;\r\n let last;\r\n\r\n while (true) {\r\n last = code;\r\n code = readCode(codeSize);\r\n if (code === clearCode) {\r\n clear();\r\n continue;\r\n }\r\n if (code === eoiCode) {\r\n break;\r\n }\r\n\r\n if (code < dict.length) {\r\n if (last !== clearCode) {\r\n dict.push(dict[last].concat(dict[code][0]));\r\n }\r\n } else {\r\n if (code !== dict.length) {\r\n throw new Error('Invalid LZW code.');\r\n }\r\n dict.push(dict[last].concat(dict[last][0]));\r\n }\r\n output.push.apply(output, dict[code]);\r\n\r\n if (dict.length === 1 << codeSize && codeSize < 12) {\r\n // If we're at the last code and codeSize is 12, the next code will be a clearCode, and it'll be 12 bits long.\r\n codeSize++;\r\n }\r\n }\r\n\r\n // I don't know if this is technically an error, but some GIFs do it.\r\n //if (Math.ceil(pos / 8) !== data.length) throw new Error('Extraneous LZW bytes.');\r\n return output;\r\n};\r\n\r\n// The actual parsing; returns an object with properties.\r\nexport class ParseGif {\r\n private _st: Stream = null;\r\n private _handler: any = {};\r\n private _transparentColor: Color = null;\r\n public frames: GifFrame[] = [];\r\n public images: HTMLImageElement[] = [];\r\n public globalColorTable: any[] = [];\r\n public checkBytes: number[] = [];\r\n\r\n constructor(stream: Stream, color: Color = Color.Magenta) {\r\n this._st = stream;\r\n this._handler = {};\r\n this._transparentColor = color;\r\n this.parseHeader();\r\n this.parseBlock();\r\n }\r\n\r\n // LZW (GIF-specific)\r\n parseColorTable = (entries: any) => {\r\n // Each entry is 3 bytes, for RGB.\r\n const ct = [];\r\n for (let i = 0; i < entries; i++) {\r\n const rgb: number[] = this._st.readBytes(3);\r\n const rgba =\r\n '#' +\r\n rgb\r\n .map((x: any) => {\r\n const hex = x.toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n })\r\n .join('');\r\n ct.push(rgba);\r\n }\r\n return ct;\r\n };\r\n\r\n readSubBlocks = () => {\r\n let size, data;\r\n data = '';\r\n do {\r\n size = this._st.readByte();\r\n data += this._st.read(size);\r\n } while (size !== 0);\r\n return data;\r\n };\r\n\r\n parseHeader = () => {\r\n const hdr: any = {\r\n sig: null,\r\n ver: null,\r\n width: null,\r\n height: null,\r\n colorRes: null,\r\n globalColorTableSize: null,\r\n gctFlag: null,\r\n sorted: null,\r\n globalColorTable: [],\r\n bgColor: null,\r\n pixelAspectRatio: null // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\r\n };\r\n\r\n hdr.sig = this._st.read(3);\r\n hdr.ver = this._st.read(3);\r\n if (hdr.sig !== 'GIF') {\r\n throw new Error('Not a GIF file.'); // XXX: This should probably be handled more nicely.\r\n }\r\n\r\n hdr.width = this._st.readUnsigned();\r\n hdr.height = this._st.readUnsigned();\r\n\r\n const bits = byteToBitArr(this._st.readByte());\r\n hdr.gctFlag = bits.shift();\r\n hdr.colorRes = bitsToNum(bits.splice(0, 3));\r\n hdr.sorted = bits.shift();\r\n hdr.globalColorTableSize = bitsToNum(bits.splice(0, 3));\r\n\r\n hdr.bgColor = this._st.readByte();\r\n hdr.pixelAspectRatio = this._st.readByte(); // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64\r\n\r\n if (hdr.gctFlag) {\r\n hdr.globalColorTable = this.parseColorTable(1 << (hdr.globalColorTableSize + 1));\r\n this.globalColorTable = hdr.globalColorTable;\r\n }\r\n if (this._handler.hdr && this._handler.hdr(hdr)) {\r\n this.checkBytes.push(this._handler.hdr);\r\n }\r\n };\r\n\r\n parseExt = (block: any) => {\r\n const parseGCExt = (block: any) => {\r\n this.checkBytes.push(this._st.readByte()); // Always 4\r\n\r\n const bits = byteToBitArr(this._st.readByte());\r\n block.reserved = bits.splice(0, 3); // Reserved; should be 000.\r\n block.disposalMethod = bitsToNum(bits.splice(0, 3));\r\n block.userInput = bits.shift();\r\n block.transparencyGiven = bits.shift();\r\n\r\n block.delayTime = this._st.readUnsigned();\r\n\r\n block.transparencyIndex = this._st.readByte();\r\n\r\n block.terminator = this._st.readByte();\r\n\r\n if (this._handler.gce && this._handler.gce(block)) {\r\n this.checkBytes.push(this._handler.gce);\r\n }\r\n };\r\n\r\n const parseComExt = (block: any) => {\r\n block.comment = this.readSubBlocks();\r\n if (this._handler.com && this._handler.com(block)) {\r\n this.checkBytes.push(this._handler.com);\r\n }\r\n };\r\n\r\n const parsePTExt = (block: any) => {\r\n this.checkBytes.push(this._st.readByte()); // Always 12\r\n block.ptHeader = this._st.readBytes(12);\r\n block.ptData = this.readSubBlocks();\r\n if (this._handler.pte && this._handler.pte(block)) {\r\n this.checkBytes.push(this._handler.pte);\r\n }\r\n };\r\n\r\n const parseAppExt = (block: any) => {\r\n const parseNetscapeExt = (block: any) => {\r\n this.checkBytes.push(this._st.readByte()); // Always 3\r\n block.unknown = this._st.readByte(); // Q: Always 1? What is this?\r\n block.iterations = this._st.readUnsigned();\r\n block.terminator = this._st.readByte();\r\n if (this._handler.app && this._handler.app.NETSCAPE && this._handler.app.NETSCAPE(block)) {\r\n this.checkBytes.push(this._handler.app);\r\n }\r\n };\r\n\r\n const parseUnknownAppExt = (block: any) => {\r\n block.appData = this.readSubBlocks();\r\n // FIXME: This won't work if a handler wants to match on any identifier.\r\n if (this._handler.app && this._handler.app[block.identifier] && this._handler.app[block.identifier](block)) {\r\n this.checkBytes.push(this._handler.app[block.identifier]);\r\n }\r\n };\r\n\r\n this.checkBytes.push(this._st.readByte()); // Always 11\r\n block.identifier = this._st.read(8);\r\n block.authCode = this._st.read(3);\r\n switch (block.identifier) {\r\n case 'NETSCAPE':\r\n parseNetscapeExt(block);\r\n break;\r\n default:\r\n parseUnknownAppExt(block);\r\n break;\r\n }\r\n };\r\n\r\n const parseUnknownExt = (block: any) => {\r\n block.data = this.readSubBlocks();\r\n if (this._handler.unknown && this._handler.unknown(block)) {\r\n this.checkBytes.push(this._handler.unknown);\r\n }\r\n };\r\n\r\n block.label = this._st.readByte();\r\n switch (block.label) {\r\n case 0xf9:\r\n block.extType = 'gce';\r\n parseGCExt(block);\r\n break;\r\n case 0xfe:\r\n block.extType = 'com';\r\n parseComExt(block);\r\n break;\r\n case 0x01:\r\n block.extType = 'pte';\r\n parsePTExt(block);\r\n break;\r\n case 0xff:\r\n block.extType = 'app';\r\n parseAppExt(block);\r\n break;\r\n default:\r\n block.extType = 'unknown';\r\n parseUnknownExt(block);\r\n break;\r\n }\r\n };\r\n\r\n parseImg = (img: any) => {\r\n const deinterlace = (pixels: any, width: any) => {\r\n // Of course this defeats the purpose of interlacing. And it's *probably*\r\n // the least efficient way it's ever been implemented. But nevertheless...\r\n\r\n const newPixels = new Array(pixels.length);\r\n const rows = pixels.length / width;\r\n const cpRow = (toRow: any, fromRow: any) => {\r\n const fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\r\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\r\n };\r\n\r\n const offsets = [0, 4, 2, 1];\r\n const steps = [8, 8, 4, 2];\r\n\r\n let fromRow = 0;\r\n for (let pass = 0; pass < 4; pass++) {\r\n for (let toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\r\n cpRow(toRow, fromRow);\r\n fromRow++;\r\n }\r\n }\r\n\r\n return newPixels;\r\n };\r\n\r\n img.leftPos = this._st.readUnsigned();\r\n img.topPos = this._st.readUnsigned();\r\n img.width = this._st.readUnsigned();\r\n img.height = this._st.readUnsigned();\r\n\r\n const bits = byteToBitArr(this._st.readByte());\r\n img.lctFlag = bits.shift();\r\n img.interlaced = bits.shift();\r\n img.sorted = bits.shift();\r\n img.reserved = bits.splice(0, 2);\r\n img.lctSize = bitsToNum(bits.splice(0, 3));\r\n\r\n if (img.lctFlag) {\r\n img.lct = this.parseColorTable(1 << (img.lctSize + 1));\r\n }\r\n\r\n img.lzwMinCodeSize = this._st.readByte();\r\n\r\n const lzwData = this.readSubBlocks();\r\n\r\n img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData);\r\n\r\n if (img.interlaced) {\r\n // Move\r\n img.pixels = deinterlace(img.pixels, img.width);\r\n }\r\n\r\n this.frames.push(img);\r\n this.arrayToImage(img);\r\n if (this._handler.img && this._handler.img(img)) {\r\n this.checkBytes.push(this._handler);\r\n }\r\n };\r\n\r\n public parseBlock = () => {\r\n const block = {\r\n sentinel: this._st.readByte(),\r\n type: ''\r\n };\r\n const blockChar = String.fromCharCode(block.sentinel);\r\n switch (blockChar) {\r\n case '!':\r\n block.type = 'ext';\r\n this.parseExt(block);\r\n break;\r\n case ',':\r\n block.type = 'img';\r\n this.parseImg(block);\r\n break;\r\n case ';':\r\n block.type = 'eof';\r\n if (this._handler.eof && this._handler.eof(block)) {\r\n this.checkBytes.push(this._handler.eof);\r\n }\r\n break;\r\n default:\r\n throw new Error('Unknown block: 0x' + block.sentinel.toString(16));\r\n }\r\n\r\n if (block.type !== 'eof') {\r\n this.parseBlock();\r\n }\r\n };\r\n\r\n arrayToImage = (frame: GifFrame) => {\r\n let count = 0;\r\n const c = document.createElement('canvas');\r\n c.id = count.toString();\r\n c.width = frame.width;\r\n c.height = frame.height;\r\n count++;\r\n const context = c.getContext('2d');\r\n const pixSize = 1;\r\n let y = 0;\r\n let x = 0;\r\n for (let i = 0; i < frame.pixels.length; i++) {\r\n if (x % frame.width === 0) {\r\n y++;\r\n x = 0;\r\n }\r\n if (this.globalColorTable[frame.pixels[i]] === this._transparentColor.toHex()) {\r\n context.fillStyle = `rgba(0, 0, 0, 0)`;\r\n } else {\r\n context.fillStyle = this.globalColorTable[frame.pixels[i]];\r\n }\r\n\r\n context.fillRect(x, y, pixSize, pixSize);\r\n x++;\r\n }\r\n const img = new Image();\r\n img.src = c.toDataURL();\r\n this.images.push(img);\r\n };\r\n}\r\n","export * from './Resource';\r\nexport * from './Sound/Index';\r\nexport * from './Gif';\r\n","export * from './Component';\r\nexport * from './Entity';\r\nexport * from './EntityManager';\r\nexport * from './Query';\r\nexport * from './QueryManager';\r\nexport * from './System';\r\nexport * from './SystemManager';\r\nexport * from './World';\r\n\r\nexport * from './Components/TransformComponent';\r\nexport * from './Components/MotionComponent';\r\n","import { Vector, vec } from '../Math/vector';\nimport { Raster, RasterOptions } from './Raster';\n\nexport interface PolygonOptions {\n points: Vector[];\n}\n\n/**\n * A polygon [[Graphic]] for drawing arbitrary polygons to the [[ExcaliburGraphicsContext]]\n */\nexport class Polygon extends Raster {\n private _points: Vector[];\n public get points(): Vector[] {\n return this._points;\n }\n public set points(points: Vector[]) {\n this._points = points;\n const min = this.minPoint;\n this.width = this._points.reduce((max, p) => Math.max(p.x, max), 0) - min.x;\n this.height = this._points.reduce((max, p) => Math.max(p.y, max), 0) - min.y;\n this.flagDirty();\n }\n\n public get minPoint() {\n const minX = this._points.reduce((min, p) => Math.min(p.x, min), Infinity);\n const minY = this._points.reduce((min, p) => Math.min(p.y, min), Infinity);\n return vec(minX, minY);\n }\n\n constructor(options: RasterOptions & PolygonOptions) {\n super(options);\n this.points = options.points;\n this.rasterize();\n }\n\n public clone(): Polygon {\n return new Polygon({\n points: this.points.map((p) => p.clone()),\n ...this.cloneGraphicOptions(),\n ...this.cloneRasterOptions()\n });\n }\n\n execute(ctx: CanvasRenderingContext2D): void {\n if (this.points && this.points.length) {\n ctx.beginPath();\n // Iterate through the supplied points and construct a 'polygon'\n const min = this.minPoint.negate();\n const firstPoint = this.points[0].add(min);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n this.points.forEach((point) => {\n ctx.lineTo(point.x + min.x, point.y + min.y);\n });\n ctx.lineTo(firstPoint.x, firstPoint.y);\n ctx.closePath();\n if (this.color) {\n ctx.fill();\n }\n if (this.strokeColor) {\n ctx.stroke();\n }\n }\n }\n}\n","// Graphics\r\nexport * from './Graphic';\r\nexport * from './Sprite';\r\nexport * from './SpriteSheet';\r\nexport * from './GraphicsGroup';\r\nexport * from './ImageSource';\r\nexport * from './Animation';\r\n\r\n// Graphics ECS\r\nexport * from './GraphicsComponent';\r\nexport * from './GraphicsSystem';\r\n\r\n// Raster graphics\r\nexport * from './Raster';\r\nexport * from './Circle';\r\nexport * from './Rectangle';\r\nexport * from './Polygon';\r\nexport * from './Text';\r\nexport * from './FontCommon';\r\nexport * from './Font';\r\nexport * from './SpriteFont';\r\nexport * from './Canvas';\r\n\r\nexport * from './Context/ExcaliburGraphicsContext';\r\nexport * from './Context/ExcaliburGraphicsContext2DCanvas';\r\nexport * from './Context/ExcaliburGraphicsContextWebGL';\r\n\r\nexport * from './Context/debug-text';\r\n","/**\r\n * @module\r\n * Provides support for mice, keyboards, and controllers.\r\n */\r\n\r\n/**\r\n * @typedoc\r\n */\r\nexport * from './Gamepad';\r\nexport * from './Pointer';\r\nexport * from './Pointers';\r\nexport * from './PointerEvents';\r\nexport * from './Keyboard';\r\nexport * from './EngineInput';\r\nexport * from './CapturePointerConfig';\r\n","/**\r\n * @module\r\n */\r\nexport * from './CapturePointer';\r\nexport * from './OffscreenCulling';\r\n","export * from './Util';\r\n\r\nexport * from './Log';\r\n\r\nexport * from './Observable';\r\n\r\nexport * from './EasingFunctions';\r\n\r\nimport * as drawUtil from './DrawUtil';\r\nexport { drawUtil as DrawUtil };\r\n","import { obsolete } from './Decorators';\r\n\r\n/**\r\n * A sorted list implementation. NOTE: this implementation is not self-balancing\r\n * @deprecated WIll be removed in v0.26.0 Use built in JS array.sort\r\n */\r\n@obsolete({message: 'Will be removed in excalibur v0.26.0', alternateMethod: 'Use built in JS array.sort'})\r\nexport class SortedList<T> {\r\n private _getComparable: (item: T) => number;\r\n private _root: BinaryTreeNode<T>;\r\n\r\n constructor(getComparable: (item: T) => number) {\r\n this._getComparable = getComparable;\r\n }\r\n\r\n public find(element: T): boolean {\r\n return this._find(this._root, element);\r\n }\r\n\r\n private _find(node: BinaryTreeNode<T>, element: any): boolean {\r\n if (node == null) {\r\n return false;\r\n } else if (this._getComparable(element) === node.getKey()) {\r\n if (node.getData().indexOf(element) > -1) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else if (this._getComparable(element) < node.getKey()) {\r\n return this._find(node.getLeft(), element);\r\n } else {\r\n return this._find(node.getRight(), element);\r\n }\r\n }\r\n\r\n // returns the array of elements at a specific key value\r\n public get(key: number): any[] {\r\n return this._get(this._root, key);\r\n }\r\n\r\n private _get(node: BinaryTreeNode<T>, key: number): any[] {\r\n if (node == null) {\r\n return [];\r\n } else if (key === node.getKey()) {\r\n return node.getData();\r\n } else if (key < node.getKey()) {\r\n return this._get(node.getLeft(), key);\r\n } else {\r\n return this._get(node.getRight(), key);\r\n }\r\n }\r\n\r\n public add(element: T): boolean {\r\n if (this._root == null) {\r\n this._root = new BinaryTreeNode(this._getComparable(element), [element], null, null);\r\n return true;\r\n } else {\r\n return this._insert(this._root, element);\r\n }\r\n }\r\n\r\n private _insert(node: BinaryTreeNode<T>, element: T): boolean {\r\n if (node != null) {\r\n if (this._getComparable(element) === node.getKey()) {\r\n if (node.getData().indexOf(element) > -1) {\r\n return false; // the element we're trying to insert already exists\r\n } else {\r\n node.getData().push(element);\r\n return true;\r\n }\r\n } else if (this._getComparable(element) < node.getKey()) {\r\n if (node.getLeft() == null) {\r\n node.setLeft(new BinaryTreeNode(this._getComparable(element), [element], null, null));\r\n return true;\r\n } else {\r\n return this._insert(node.getLeft(), element);\r\n }\r\n } else {\r\n if (node.getRight() == null) {\r\n node.setRight(new BinaryTreeNode(this._getComparable(element), [element], null, null));\r\n return true;\r\n } else {\r\n return this._insert(node.getRight(), element);\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public removeByComparable(element: T): void {\r\n this._root = this._remove(this._root, element);\r\n }\r\n\r\n private _remove(node: BinaryTreeNode<T>, element: T): BinaryTreeNode<T> {\r\n if (node == null) {\r\n return null;\r\n } else if (this._getComparable(element) === node.getKey()) {\r\n const elementIndex = node.getData().indexOf(element);\r\n // if the node contains the element, remove the element\r\n if (elementIndex > -1) {\r\n node.getData().splice(elementIndex, 1);\r\n // if we have removed the last element at this node, remove the node\r\n if (node.getData().length === 0) {\r\n // if the node is a leaf\r\n if (node.getLeft() == null && node.getRight() == null) {\r\n return null;\r\n } else if (node.getLeft() == null) {\r\n return node.getRight();\r\n } else if (node.getRight() == null) {\r\n return node.getLeft();\r\n }\r\n // if node has 2 children\r\n const temp = this._findMinNode(node.getRight());\r\n node.setKey(temp.getKey());\r\n node.setData(temp.getData());\r\n node.setRight(this._cleanup(node.getRight(), temp)); //\"cleanup nodes\" (move them up recursively)\r\n return node;\r\n } else {\r\n // this prevents the node from being removed since it still contains elements\r\n return node;\r\n }\r\n }\r\n } else if (this._getComparable(element) < node.getKey()) {\r\n node.setLeft(this._remove(node.getLeft(), element));\r\n return node;\r\n } else {\r\n node.setRight(this._remove(node.getRight(), element));\r\n return node;\r\n }\r\n return null;\r\n }\r\n\r\n // called once we have successfully removed the element we wanted, recursively corrects the part of the tree below the removed node\r\n private _cleanup(node: BinaryTreeNode<T>, element: BinaryTreeNode<T>): BinaryTreeNode<T> {\r\n const comparable = element.getKey();\r\n if (node == null) {\r\n return null;\r\n } else if (comparable === node.getKey()) {\r\n // if the node is a leaf\r\n if (node.getLeft() == null && node.getRight() == null) {\r\n return null;\r\n } else if (node.getLeft() == null) {\r\n return node.getRight();\r\n } else if (node.getRight() == null) {\r\n return node.getLeft();\r\n }\r\n // if node has 2 children\r\n const temp = this._findMinNode(node.getRight());\r\n node.setKey(temp.getKey());\r\n node.setData(temp.getData());\r\n\r\n node.setRight(this._cleanup(node.getRight(), temp));\r\n return node;\r\n } else if (element.getKey() < node.getKey()) {\r\n node.setLeft(this._cleanup(node.getLeft(), element));\r\n return node;\r\n } else {\r\n node.setRight(this._cleanup(node.getRight(), element));\r\n return node;\r\n }\r\n }\r\n\r\n private _findMinNode(node: BinaryTreeNode<T>): BinaryTreeNode<T> {\r\n let current = node;\r\n while (current.getLeft() != null) {\r\n current = current.getLeft();\r\n }\r\n return current;\r\n }\r\n\r\n public list(): Array<T> {\r\n const results = new Array<T>();\r\n this._list(this._root, results);\r\n return results;\r\n }\r\n\r\n private _list(treeNode: BinaryTreeNode<T>, results: Array<T>): void {\r\n if (treeNode != null) {\r\n this._list(treeNode.getLeft(), results);\r\n treeNode.getData().forEach((element) => {\r\n results.push(element);\r\n });\r\n this._list(treeNode.getRight(), results);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A tree node part of [[SortedList]]\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\n@obsolete({message: 'Will be removed in excalibur v0.26.0'})\r\nexport class BinaryTreeNode<T> {\r\n private _key: number;\r\n private _data: Array<T>;\r\n private _left: BinaryTreeNode<T>;\r\n private _right: BinaryTreeNode<T>;\r\n\r\n constructor(key: number, data: Array<T>, left: BinaryTreeNode<T>, right: BinaryTreeNode<T>) {\r\n this._key = key;\r\n this._data = data;\r\n this._left = left;\r\n this._right = right;\r\n }\r\n\r\n public getKey(): number {\r\n return this._key;\r\n }\r\n\r\n public setKey(key: number) {\r\n this._key = key;\r\n }\r\n\r\n public getData(): T[] {\r\n return this._data;\r\n }\r\n\r\n public setData(data: T[]) {\r\n this._data = data;\r\n }\r\n\r\n public getLeft(): BinaryTreeNode<T> {\r\n return this._left;\r\n }\r\n\r\n public setLeft(left: BinaryTreeNode<T>) {\r\n this._left = left;\r\n }\r\n\r\n public getRight(): BinaryTreeNode<T> {\r\n return this._right;\r\n }\r\n\r\n public setRight(right: BinaryTreeNode<T>) {\r\n this._right = right;\r\n }\r\n}\r\n\r\n/**\r\n * Mock element for testing\r\n *\r\n * @internal\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\nexport class MockedElement {\r\n private _key: number = 0;\r\n\r\n constructor(key: number) {\r\n this._key = key;\r\n }\r\n\r\n public getTheKey() {\r\n return this._key;\r\n }\r\n\r\n public setKey(key: number) {\r\n this._key = key;\r\n }\r\n}\r\n","// Promises/A+ Spec http://promises-aplus.github.io/promises-spec/\r\n\r\nimport { obsolete } from './Util/Decorators';\r\n\r\n/**\r\n * Valid states for a promise to be in\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\nexport enum PromiseState {\r\n Resolved,\r\n Rejected,\r\n Pending\r\n}\r\n\r\n/**\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\nexport interface PromiseLike<T> {\r\n then(successCallback?: (value?: T) => any, rejectCallback?: (value?: T) => any): PromiseLike<T>;\r\n error(rejectCallback?: (value?: any) => any): PromiseLike<T>;\r\n\r\n //Cannot define static methods on interfaces\r\n //wrap<T>(value?: T): IPromise<T>;\r\n\r\n resolve(value?: T): PromiseLike<T>;\r\n reject(value?: any): PromiseLike<T>;\r\n\r\n state(): PromiseState;\r\n}\r\n\r\n/**\r\n * Promises are used to do asynchronous work and they are useful for\r\n * creating a chain of actions. In Excalibur they are used for loading,\r\n * sounds, animation, actions, and more.\r\n * @deprecated Will be removed in v0.26.0\r\n */\r\n@obsolete({\r\n message: 'ex.Promises are being replaced by native browser promises in v0.26.0',\r\n alternateMethod: 'Use browser native promises'\r\n})\r\nexport class Promise<T> implements PromiseLike<T> {\r\n private _state: PromiseState = PromiseState.Pending;\r\n private _value: T;\r\n private _successCallbacks: { (value?: T): any }[] = [];\r\n private _rejectCallback: (value?: any) => any = () => {\r\n return;\r\n };\r\n private _errorCallback: (value?: any) => any;\r\n\r\n /**\r\n * Create and resolve a Promise with an optional value\r\n * @param value An optional value to wrap in a resolved promise\r\n * @deprecated Use browser native promises\r\n */\r\n public static resolve<T>(value?: T): Promise<T> {\r\n const promise = new Promise<T>().resolve(value);\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * Create and reject a Promise with an optional value\r\n * @param value An optional value to wrap in a rejected promise\r\n * @deprecated Use browser native promises\r\n */\r\n public static reject<T>(value?: T): Promise<T> {\r\n const promise = new Promise<T>().reject(value);\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * Returns a new promise that resolves when all the promises passed to it resolve, or rejects\r\n * when at least 1 promise rejects.\r\n * @deprecated Use browser native promises\r\n */\r\n public static join<T>(promises: Promise<T>[]): Promise<T>;\r\n\r\n /**\r\n * Returns a new promise that resolves when all the promises passed to it resolve, or rejects\r\n * when at least 1 promise rejects.\r\n * @deprecated Use browser native promises\r\n */\r\n public static join<T>(...promises: Promise<T>[]): Promise<T>;\r\n\r\n public static join<T>() {\r\n let promises: Promise<T>[] = [];\r\n\r\n if (arguments.length > 0 && !Array.isArray(arguments[0])) {\r\n for (let _i = 0; _i < arguments.length; _i++) {\r\n promises[_i - 0] = arguments[_i];\r\n }\r\n } else if (arguments.length === 1 && Array.isArray(arguments[0])) {\r\n promises = arguments[0];\r\n }\r\n\r\n const joinedPromise = new Promise<T>();\r\n if (!promises || !promises.length) {\r\n return joinedPromise.resolve();\r\n }\r\n\r\n const total = promises.length;\r\n let successes = 0;\r\n let rejects = 0;\r\n const errors: any = [];\r\n\r\n promises.forEach((p) => {\r\n p.then(\r\n () => {\r\n successes += 1;\r\n if (successes === total) {\r\n joinedPromise.resolve();\r\n } else if (successes + rejects + errors.length === total) {\r\n joinedPromise.reject(errors);\r\n }\r\n },\r\n () => {\r\n rejects += 1;\r\n if (successes + rejects + errors.length === total) {\r\n joinedPromise.reject(errors);\r\n }\r\n }\r\n ).error((e) => {\r\n errors.push(e);\r\n if (errors.length + successes + rejects === total) {\r\n joinedPromise.reject(errors);\r\n }\r\n });\r\n });\r\n\r\n return joinedPromise;\r\n }\r\n\r\n /**\r\n * Chain success and reject callbacks after the promise is resolved\r\n * @param successCallback Call on resolution of promise\r\n * @param rejectCallback Call on rejection of promise\r\n * @deprecated Use browser native promises\r\n */\r\n public then(successCallback?: (value?: T) => any, rejectCallback?: (value?: any) => any) {\r\n if (successCallback) {\r\n this._successCallbacks.push(successCallback);\r\n\r\n // If the promise is already resolved call immediately\r\n if (this.state() === PromiseState.Resolved) {\r\n try {\r\n successCallback.call(this, this._value);\r\n } catch (e) {\r\n this._handleError(e);\r\n }\r\n }\r\n }\r\n if (rejectCallback) {\r\n this._rejectCallback = rejectCallback;\r\n\r\n // If the promise is already rejected call immediately\r\n if (this.state() === PromiseState.Rejected) {\r\n try {\r\n rejectCallback.call(this, this._value);\r\n } catch (e) {\r\n this._handleError(e);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add an error callback to the promise\r\n * @param errorCallback Call if there was an error in a callback\r\n * @deprecated Use browser native promises\r\n */\r\n public error(errorCallback?: (value?: any) => any) {\r\n if (errorCallback) {\r\n this._errorCallback = errorCallback;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Resolve the promise and pass an option value to the success callbacks\r\n * @param value Value to pass to the success callbacks\r\n * @deprecated Use browser native promises\r\n */\r\n public resolve(value?: T): Promise<T> {\r\n if (this._state === PromiseState.Pending) {\r\n this._value = value;\r\n try {\r\n this._state = PromiseState.Resolved;\r\n this._successCallbacks.forEach((cb) => {\r\n cb.call(this, this._value);\r\n });\r\n } catch (e) {\r\n this._handleError(e);\r\n }\r\n } else {\r\n throw new Error('Cannot resolve a promise that is not in a pending state!');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Reject the promise and pass an option value to the reject callbacks\r\n * @param value Value to pass to the reject callbacks\r\n * @deprecated Use browser native promises\r\n */\r\n public reject(value?: any) {\r\n if (this._state === PromiseState.Pending) {\r\n this._value = value;\r\n try {\r\n this._state = PromiseState.Rejected;\r\n this._rejectCallback.call(this, this._value);\r\n } catch (e) {\r\n this._handleError(e);\r\n }\r\n } else {\r\n throw new Error('Cannot reject a promise that is not in a pending state!');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Inspect the current state of a promise\r\n * @deprecated Use browser native promises\r\n */\r\n public state(): PromiseState {\r\n return this._state;\r\n }\r\n\r\n private _handleError(e: any) {\r\n if (this._errorCallback) {\r\n this._errorCallback.call(this, e);\r\n } else {\r\n // rethrow error\r\n throw e;\r\n }\r\n }\r\n}\r\n","/**\r\n * The current Excalibur version string\r\n * @description `process.env.__EX_VERSION` gets replaced by Webpack on build\r\n */\r\nexport const EX_VERSION = process.env.__EX_VERSION;\r\nimport { polyfill } from './Polyfill';\r\npolyfill();\r\n\r\n// This file is used as the bundle entry point and exports everything\r\n// that will be exposed as the `ex` global variable.\r\nexport * from './Flags';\r\nexport * from './Id';\r\nexport * from './Engine';\r\nexport * from './Screen';\r\nexport { Actor, ActorArgs } from './Actor';\r\nexport * from './Math/Index';\r\nexport * from './Camera';\r\nexport * from './Class';\r\nexport * from './Configurable';\r\nexport * from './Debug/index';\r\nexport * from './EventDispatcher';\r\nexport * from './Events/MediaEvents';\r\nexport * from './Events';\r\nexport * from './Label';\r\nexport { FontStyle, FontUnit, TextAlign, BaseAlign } from './Graphics/FontCommon';\r\nexport * from './Loader';\r\nexport { Particle, ParticleEmitter, ParticleArgs, ParticleEmitterArgs, EmitterType } from './Particles';\r\nexport * from './Collision/Physics';\r\nexport * from './Scene';\r\nexport { TileMap, Cell, TileMapArgs, CellArgs } from './TileMap';\r\nexport * from './Timer';\r\nexport * from './Trigger';\r\nexport * from './ScreenElement';\r\n\r\nexport * from './Actions/Index';\r\nexport * from './Collision/Index';\r\n\r\n// ex.LegacyDrawing namespace\r\nimport * as legacyDrawing from './Drawing/Index';\r\nexport { legacyDrawing as LegacyDrawing };\r\nexport * from './Interfaces/Index';\r\nexport * from './PostProcessing/Index';\r\nexport * from './Resources/Index';\r\n\r\nexport * from './EntityComponentSystem/index';\r\n\r\nexport * from './Color';\r\n\r\nexport * from './Graphics/index';\r\n\r\n// ex.Events namespace\r\nimport * as events from './Events';\r\nexport { events as Events };\r\n\r\n// ex.Input namespace\r\nimport * as input from './Input/Index';\r\nexport { input as Input };\r\n\r\n// ex.Traits namespace\r\nimport * as traits from './Traits/Index';\r\nexport { traits as Traits };\r\n\r\n// ex.Util namespaces\r\nimport * as util from './Util/Index';\r\nexport { util as Util };\r\nexport {\r\n clamp,\r\n range,\r\n toDegrees,\r\n toRadians,\r\n randomInRange,\r\n randomIntInRange,\r\n canonicalizeAngle\r\n} from './Util/Index';\r\n\r\nexport * from './Util/Browser';\r\nexport * from './Util/Decorators';\r\nexport * from './Util/Detector';\r\nexport * from './Util/CullingBox';\r\nexport * from './Util/EasingFunctions';\r\nexport * from './Util/Observable';\r\nexport * from './Util/Log';\r\nexport * from './Util/SortedList';\r\nexport * from './Util/Pool';\r\n\r\n// ex.Deprecated\r\nexport * from './Promises';\r\n// import * as deprecated from './Deprecated';\r\n// export { deprecated as Deprecated };\r\n// export * from './Deprecated';\r\n"],"names":[],"sourceRoot":""}