tscratch 0.6.4 → 0.6.6
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.
- package/dist/client/index.cjs +1 -1
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +41 -12
- package/dist/client/index.d.ts +41 -12
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/package.json +1 -1
package/dist/client/index.d.cts
CHANGED
|
@@ -19,6 +19,7 @@ declare abstract class Sprite {
|
|
|
19
19
|
scene: string;
|
|
20
20
|
hidden: boolean;
|
|
21
21
|
layer: number;
|
|
22
|
+
abstract discriminant: string;
|
|
22
23
|
private cachedPath;
|
|
23
24
|
private pathDirty;
|
|
24
25
|
private static collisionCanvas;
|
|
@@ -63,21 +64,21 @@ type SceneMap = Map<string, {
|
|
|
63
64
|
declare class Engine {
|
|
64
65
|
private static instance;
|
|
65
66
|
private loopRunning;
|
|
66
|
-
gameLoop
|
|
67
|
+
private gameLoop;
|
|
67
68
|
maxFPS: number;
|
|
68
69
|
deltaTime: number;
|
|
69
70
|
private lastFrame;
|
|
70
71
|
private refreshScheduled;
|
|
71
72
|
private animationFrameId;
|
|
72
|
-
sounds
|
|
73
|
+
private sounds;
|
|
73
74
|
mouseX: number;
|
|
74
75
|
mouseY: number;
|
|
75
76
|
mouseDown: boolean;
|
|
76
77
|
mouseClicked: boolean;
|
|
77
78
|
private keysPressed;
|
|
78
|
-
currentScene
|
|
79
|
+
private currentScene;
|
|
79
80
|
sceneMap: SceneMap;
|
|
80
|
-
variableMap
|
|
81
|
+
private variableMap;
|
|
81
82
|
static init(): Engine;
|
|
82
83
|
changeScene(scene: string): void;
|
|
83
84
|
setLoop(scene: string, loop: GameLoop): void;
|
|
@@ -97,7 +98,7 @@ declare class Engine {
|
|
|
97
98
|
stopSound(sound: HTMLAudioElement): void;
|
|
98
99
|
stopAllSounds(): void;
|
|
99
100
|
pickRandom(min: number, max: number): number;
|
|
100
|
-
dotProduct(vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]): number;
|
|
101
|
+
dotProduct(...vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]): number;
|
|
101
102
|
sin(deg: number): number;
|
|
102
103
|
cos(deg: number): number;
|
|
103
104
|
tan(deg: number): number;
|
|
@@ -319,7 +320,7 @@ declare class Pen extends Sprite {
|
|
|
319
320
|
}
|
|
320
321
|
|
|
321
322
|
interface TextOptions extends SpriteOptions {
|
|
322
|
-
content?: string;
|
|
323
|
+
content?: string | number;
|
|
323
324
|
color?: string;
|
|
324
325
|
fontFamily?: string;
|
|
325
326
|
fontSize?: number;
|
|
@@ -328,7 +329,7 @@ interface TextOptions extends SpriteOptions {
|
|
|
328
329
|
}
|
|
329
330
|
declare class Text extends Sprite {
|
|
330
331
|
discriminant: string;
|
|
331
|
-
content: string;
|
|
332
|
+
content: string | number;
|
|
332
333
|
color: string;
|
|
333
334
|
fontFamily: string;
|
|
334
335
|
fontSize: number;
|
|
@@ -339,7 +340,7 @@ declare class Text extends Sprite {
|
|
|
339
340
|
getPath(): Path2D;
|
|
340
341
|
draw(stamping?: boolean): void;
|
|
341
342
|
create(options?: TextOptions): this;
|
|
342
|
-
setContent(content: string): void;
|
|
343
|
+
setContent(content: string | number): void;
|
|
343
344
|
setColor(color: string): void;
|
|
344
345
|
setFontSize(fontSize: number): void;
|
|
345
346
|
setFontFamily(fontFamily: string): void;
|
|
@@ -349,7 +350,7 @@ declare class Text extends Sprite {
|
|
|
349
350
|
}
|
|
350
351
|
|
|
351
352
|
interface ButtonOptions extends SpriteOptions {
|
|
352
|
-
content?: string;
|
|
353
|
+
content?: string | number;
|
|
353
354
|
fontColor?: string;
|
|
354
355
|
fontFamily?: string;
|
|
355
356
|
fontSize?: number;
|
|
@@ -361,7 +362,7 @@ interface ButtonOptions extends SpriteOptions {
|
|
|
361
362
|
}
|
|
362
363
|
declare class Button extends Sprite {
|
|
363
364
|
discriminant: string;
|
|
364
|
-
content: string;
|
|
365
|
+
content: string | number;
|
|
365
366
|
fontColor: string;
|
|
366
367
|
fontFamily: string;
|
|
367
368
|
fontSize: number;
|
|
@@ -375,7 +376,7 @@ declare class Button extends Sprite {
|
|
|
375
376
|
getPath(): Path2D;
|
|
376
377
|
draw(stamping?: boolean): void;
|
|
377
378
|
create(options?: ButtonOptions): this;
|
|
378
|
-
setContent(content: string): void;
|
|
379
|
+
setContent(content: string | number): void;
|
|
379
380
|
setBackgroundColor(color: string): void;
|
|
380
381
|
setFontColor(color: string): void;
|
|
381
382
|
setFontSize(fontSize: number): void;
|
|
@@ -383,6 +384,11 @@ declare class Button extends Sprite {
|
|
|
383
384
|
constructor(options?: ButtonOptions);
|
|
384
385
|
}
|
|
385
386
|
|
|
387
|
+
declare class Watermark extends Text {
|
|
388
|
+
create(options?: TextOptions): this;
|
|
389
|
+
constructor(options?: TextOptions);
|
|
390
|
+
}
|
|
391
|
+
|
|
386
392
|
interface ImageSpriteOptions extends SpriteOptions {
|
|
387
393
|
src?: string;
|
|
388
394
|
width: number;
|
|
@@ -408,6 +414,27 @@ declare class ImageSprite extends Sprite {
|
|
|
408
414
|
constructor(options?: ImageSpriteOptions);
|
|
409
415
|
}
|
|
410
416
|
|
|
417
|
+
interface RigidBodyOptions {
|
|
418
|
+
gravity: number;
|
|
419
|
+
drag: number;
|
|
420
|
+
bounceLoss: number;
|
|
421
|
+
vX: number;
|
|
422
|
+
vY: number;
|
|
423
|
+
update: () => void;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
interface RigidCircleOptions extends CircleOptions, Partial<RigidBodyOptions> {
|
|
427
|
+
}
|
|
428
|
+
declare class RigidCircle extends Circle implements RigidBodyOptions {
|
|
429
|
+
gravity: number;
|
|
430
|
+
vX: number;
|
|
431
|
+
vY: number;
|
|
432
|
+
drag: number;
|
|
433
|
+
bounceLoss: number;
|
|
434
|
+
update(): void;
|
|
435
|
+
constructor(options?: RigidCircleOptions);
|
|
436
|
+
}
|
|
437
|
+
|
|
411
438
|
type Mat2<T = number> = [
|
|
412
439
|
[
|
|
413
440
|
T,
|
|
@@ -476,7 +503,9 @@ declare const TScratch: {
|
|
|
476
503
|
Pen: typeof Pen;
|
|
477
504
|
Text: typeof Text;
|
|
478
505
|
Button: typeof Button;
|
|
506
|
+
Watermark: typeof Watermark;
|
|
479
507
|
ImageSprite: typeof ImageSprite;
|
|
508
|
+
RigidCircle: typeof RigidCircle;
|
|
480
509
|
scale: number;
|
|
481
510
|
aspectRatio: number;
|
|
482
511
|
setScale: typeof setScale;
|
|
@@ -485,4 +514,4 @@ declare const TScratch: {
|
|
|
485
514
|
ctx: CanvasRenderingContext2D;
|
|
486
515
|
};
|
|
487
516
|
|
|
488
|
-
export { Arc, type ArcOptions, Button, type ButtonOptions, Circle, type CircleOptions, CustomPolygon, type CustomPolygonOptions, Engine, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Multiplayer, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
|
|
517
|
+
export { Arc, type ArcOptions, Button, type ButtonOptions, Circle, type CircleOptions, CustomPolygon, type CustomPolygonOptions, Engine, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Multiplayer, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, type RigidBodyOptions, RigidCircle, type RigidCircleOptions, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
|
package/dist/client/index.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ declare abstract class Sprite {
|
|
|
19
19
|
scene: string;
|
|
20
20
|
hidden: boolean;
|
|
21
21
|
layer: number;
|
|
22
|
+
abstract discriminant: string;
|
|
22
23
|
private cachedPath;
|
|
23
24
|
private pathDirty;
|
|
24
25
|
private static collisionCanvas;
|
|
@@ -63,21 +64,21 @@ type SceneMap = Map<string, {
|
|
|
63
64
|
declare class Engine {
|
|
64
65
|
private static instance;
|
|
65
66
|
private loopRunning;
|
|
66
|
-
gameLoop
|
|
67
|
+
private gameLoop;
|
|
67
68
|
maxFPS: number;
|
|
68
69
|
deltaTime: number;
|
|
69
70
|
private lastFrame;
|
|
70
71
|
private refreshScheduled;
|
|
71
72
|
private animationFrameId;
|
|
72
|
-
sounds
|
|
73
|
+
private sounds;
|
|
73
74
|
mouseX: number;
|
|
74
75
|
mouseY: number;
|
|
75
76
|
mouseDown: boolean;
|
|
76
77
|
mouseClicked: boolean;
|
|
77
78
|
private keysPressed;
|
|
78
|
-
currentScene
|
|
79
|
+
private currentScene;
|
|
79
80
|
sceneMap: SceneMap;
|
|
80
|
-
variableMap
|
|
81
|
+
private variableMap;
|
|
81
82
|
static init(): Engine;
|
|
82
83
|
changeScene(scene: string): void;
|
|
83
84
|
setLoop(scene: string, loop: GameLoop): void;
|
|
@@ -97,7 +98,7 @@ declare class Engine {
|
|
|
97
98
|
stopSound(sound: HTMLAudioElement): void;
|
|
98
99
|
stopAllSounds(): void;
|
|
99
100
|
pickRandom(min: number, max: number): number;
|
|
100
|
-
dotProduct(vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]): number;
|
|
101
|
+
dotProduct(...vectors: [Vec2, Vec2] | [Vec3, Vec3] | [Vec4, Vec4]): number;
|
|
101
102
|
sin(deg: number): number;
|
|
102
103
|
cos(deg: number): number;
|
|
103
104
|
tan(deg: number): number;
|
|
@@ -319,7 +320,7 @@ declare class Pen extends Sprite {
|
|
|
319
320
|
}
|
|
320
321
|
|
|
321
322
|
interface TextOptions extends SpriteOptions {
|
|
322
|
-
content?: string;
|
|
323
|
+
content?: string | number;
|
|
323
324
|
color?: string;
|
|
324
325
|
fontFamily?: string;
|
|
325
326
|
fontSize?: number;
|
|
@@ -328,7 +329,7 @@ interface TextOptions extends SpriteOptions {
|
|
|
328
329
|
}
|
|
329
330
|
declare class Text extends Sprite {
|
|
330
331
|
discriminant: string;
|
|
331
|
-
content: string;
|
|
332
|
+
content: string | number;
|
|
332
333
|
color: string;
|
|
333
334
|
fontFamily: string;
|
|
334
335
|
fontSize: number;
|
|
@@ -339,7 +340,7 @@ declare class Text extends Sprite {
|
|
|
339
340
|
getPath(): Path2D;
|
|
340
341
|
draw(stamping?: boolean): void;
|
|
341
342
|
create(options?: TextOptions): this;
|
|
342
|
-
setContent(content: string): void;
|
|
343
|
+
setContent(content: string | number): void;
|
|
343
344
|
setColor(color: string): void;
|
|
344
345
|
setFontSize(fontSize: number): void;
|
|
345
346
|
setFontFamily(fontFamily: string): void;
|
|
@@ -349,7 +350,7 @@ declare class Text extends Sprite {
|
|
|
349
350
|
}
|
|
350
351
|
|
|
351
352
|
interface ButtonOptions extends SpriteOptions {
|
|
352
|
-
content?: string;
|
|
353
|
+
content?: string | number;
|
|
353
354
|
fontColor?: string;
|
|
354
355
|
fontFamily?: string;
|
|
355
356
|
fontSize?: number;
|
|
@@ -361,7 +362,7 @@ interface ButtonOptions extends SpriteOptions {
|
|
|
361
362
|
}
|
|
362
363
|
declare class Button extends Sprite {
|
|
363
364
|
discriminant: string;
|
|
364
|
-
content: string;
|
|
365
|
+
content: string | number;
|
|
365
366
|
fontColor: string;
|
|
366
367
|
fontFamily: string;
|
|
367
368
|
fontSize: number;
|
|
@@ -375,7 +376,7 @@ declare class Button extends Sprite {
|
|
|
375
376
|
getPath(): Path2D;
|
|
376
377
|
draw(stamping?: boolean): void;
|
|
377
378
|
create(options?: ButtonOptions): this;
|
|
378
|
-
setContent(content: string): void;
|
|
379
|
+
setContent(content: string | number): void;
|
|
379
380
|
setBackgroundColor(color: string): void;
|
|
380
381
|
setFontColor(color: string): void;
|
|
381
382
|
setFontSize(fontSize: number): void;
|
|
@@ -383,6 +384,11 @@ declare class Button extends Sprite {
|
|
|
383
384
|
constructor(options?: ButtonOptions);
|
|
384
385
|
}
|
|
385
386
|
|
|
387
|
+
declare class Watermark extends Text {
|
|
388
|
+
create(options?: TextOptions): this;
|
|
389
|
+
constructor(options?: TextOptions);
|
|
390
|
+
}
|
|
391
|
+
|
|
386
392
|
interface ImageSpriteOptions extends SpriteOptions {
|
|
387
393
|
src?: string;
|
|
388
394
|
width: number;
|
|
@@ -408,6 +414,27 @@ declare class ImageSprite extends Sprite {
|
|
|
408
414
|
constructor(options?: ImageSpriteOptions);
|
|
409
415
|
}
|
|
410
416
|
|
|
417
|
+
interface RigidBodyOptions {
|
|
418
|
+
gravity: number;
|
|
419
|
+
drag: number;
|
|
420
|
+
bounceLoss: number;
|
|
421
|
+
vX: number;
|
|
422
|
+
vY: number;
|
|
423
|
+
update: () => void;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
interface RigidCircleOptions extends CircleOptions, Partial<RigidBodyOptions> {
|
|
427
|
+
}
|
|
428
|
+
declare class RigidCircle extends Circle implements RigidBodyOptions {
|
|
429
|
+
gravity: number;
|
|
430
|
+
vX: number;
|
|
431
|
+
vY: number;
|
|
432
|
+
drag: number;
|
|
433
|
+
bounceLoss: number;
|
|
434
|
+
update(): void;
|
|
435
|
+
constructor(options?: RigidCircleOptions);
|
|
436
|
+
}
|
|
437
|
+
|
|
411
438
|
type Mat2<T = number> = [
|
|
412
439
|
[
|
|
413
440
|
T,
|
|
@@ -476,7 +503,9 @@ declare const TScratch: {
|
|
|
476
503
|
Pen: typeof Pen;
|
|
477
504
|
Text: typeof Text;
|
|
478
505
|
Button: typeof Button;
|
|
506
|
+
Watermark: typeof Watermark;
|
|
479
507
|
ImageSprite: typeof ImageSprite;
|
|
508
|
+
RigidCircle: typeof RigidCircle;
|
|
480
509
|
scale: number;
|
|
481
510
|
aspectRatio: number;
|
|
482
511
|
setScale: typeof setScale;
|
|
@@ -485,4 +514,4 @@ declare const TScratch: {
|
|
|
485
514
|
ctx: CanvasRenderingContext2D;
|
|
486
515
|
};
|
|
487
516
|
|
|
488
|
-
export { Arc, type ArcOptions, Button, type ButtonOptions, Circle, type CircleOptions, CustomPolygon, type CustomPolygonOptions, Engine, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Multiplayer, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
|
|
517
|
+
export { Arc, type ArcOptions, Button, type ButtonOptions, Circle, type CircleOptions, CustomPolygon, type CustomPolygonOptions, Engine, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Multiplayer, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, type RigidBodyOptions, RigidCircle, type RigidCircleOptions, Sprite, type SpriteOptions, Square, type SquareOptions, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
|
package/dist/client/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var s=document.getElementById("game-window")||document.createElement("canvas"),o=s.getContext("2d"),u=document.createElement("canvas"),a=u.getContext("2d");u.id="pen-canvas";var y=16/9,m;function I(){s.width=y*m,s.height=m,u.width=y*m,u.height=m}function z(n){m=n,I()}function V(n){y=n,I()}s.parentElement?.insertBefore(u,s);z(500);var l=class n{x=0;y=0;dir=0;scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){d.init().refresh()}invalidatePath(){this.pathDirty=!0,this.cachedPath=null}getCachedPath(){return(this.pathDirty||!this.cachedPath)&&(this.cachedPath=this.getPath(),this.pathDirty=!1),this.cachedPath}constructor(t){Object.assign(this,t),d.init().addSprite(this)}clone(t){return this.create({x:this.x,y:this.y,dir:this.dir,scene:this.scene,layer:this.layer,hidden:this.hidden,...t})}touching(t){if(this.hidden||t.hidden)return!1;let i=this.getBoundingBox(),e=t.getBoundingBox();if(!(Math.abs(i.x-e.x)<(i.width+e.width)/2&&Math.abs(i.y-e.y)<(i.height+e.height)/2))return!1;let h=i.x-i.width/2,b=i.y+i.height/2,f=i.x+i.width/2,x=i.y-i.height/2,L=e.x-e.width/2,D=e.y+e.height/2,E=e.x+e.width/2,$=e.y-e.height/2,X=Math.max(h,L),Y=Math.min(x,$),q=Math.min(f,E),H=Math.max(b,D),g=q-X,p=H-Y;if(g<=1||p<=1)return!1;n.collisionCanvas||(n.collisionCanvas=document.createElement("canvas"),n.collisionCtx=n.collisionCanvas.getContext("2d",{willReadFrequently:!0})),(n.collisionCanvas.width<g||n.collisionCanvas.height<p)&&(n.collisionCanvas.width=Math.max(g,n.collisionCanvas.width),n.collisionCanvas.height=Math.max(p,n.collisionCanvas.height));let c=n.collisionCtx;c.clearRect(0,0,g,p),c.save(),c.translate(this.x-X,p-this.y+Y),c.rotate(this.toRadians(this.dir)),c.fillStyle="red",c.fill(this.getCachedPath()),c.restore();let A=c.getImageData(0,0,g,p).data;c.clearRect(0,0,g,p),c.save(),c.translate(t.x-X,p-t.y+Y),c.rotate(this.toRadians(t.dir)),c.fillStyle="blue",c.fill(t.getCachedPath()),c.restore();let G=c.getImageData(0,0,g,p).data;for(let T=3;T<A.length;T+=4)if(A[T]>0&&G[T]>0)return!0;return!1}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}distanceTo(t,i){return Math.hypot(t-this.x,i-this.y)}move(t){this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.refresh()}turn(t){this.dir+=t,this.refresh()}point(t){this.dir=t,this.refresh()}pointTowards(t,i){this.dir=90-this.toDegrees(Math.atan2(i-this.y,t-this.x)),this.refresh()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,i){this.x=t,this.y=i,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}show(){this.hidden=!1,this.refresh()}hide(){this.hidden=!0,this.refresh()}goToLayer(t){this.layer=t,this.refresh()}changeLayer(t){this.layer+=t,this.refresh()}};var d=class n{static instance;loopRunning=!1;gameLoop=null;maxFPS=24;deltaTime=1/this.maxFPS;lastFrame=performance.now();refreshScheduled=!1;animationFrameId=null;sounds=[];mouseX=0;mouseY=0;mouseDown=!1;mouseClicked=!1;keysPressed=new Set;currentScene="main";sceneMap=new Map;variableMap=new Map;static init(){return this.instance||(this.instance=new n),this.instance}changeScene(t){this.sceneMap.get(t)||this.sceneMap.set(t,{sprites:[],loop:null}),this.loopRunning=!1,this.currentScene=t,this.gameLoop=this.sceneMap.get(t).loop,this.setMaxFramesPerSecond(this.maxFPS)}setLoop(t,i){if(!this.sceneMap.get(t)){this.sceneMap.set(t,{sprites:[],loop:i}),t===this.currentScene&&this.changeScene(t);return}this.sceneMap.get(t).loop=i,t===this.currentScene&&this.changeScene(t)}pauseLoop(){this.loopRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}resumeLoop(){this.loopRunning=!0,this.setMaxFramesPerSecond(this.maxFPS)}addSprite(t){let{scene:i,layer:e}=t;if(!this.sceneMap.get(i)){this.sceneMap.set(i,{sprites:[t],loop:null});return}let r=this.sceneMap.get(i).sprites.findIndex(h=>h.layer>e);if(r===-1){this.sceneMap.get(i).sprites.push(t);return}this.sceneMap.get(i).sprites.splice(r,0,t),this.refresh()}removeSprite(t){let{scene:i}=t;this.sceneMap.get(i)&&(this.sceneMap.get(i).sprites=this.sceneMap.get(i).sprites.filter(e=>e!==t),this.refresh())}async setMaxFramesPerSecond(t){this.maxFPS=t;let i=this.gameLoop;if(!i)return;this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.loopRunning=!0;let e=1e3/t,r=0,h=async b=>{if(!this.loopRunning)return;let f=b-this.lastFrame;this.lastFrame=b,r+=f,r>=e&&(this.deltaTime=r/1e3,r=r%e,i&&await i()),this.animationFrameId=requestAnimationFrame(h)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(h)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,o.clearRect(0,0,s.width,s.height),[...this.sceneMap.get(this.currentScene).sprites,...this.sceneMap.get("*").sprites].forEach(i=>{i.hidden||i.draw()})}))}async wait(t){return new Promise(i=>setTimeout(i,t))}async waitUntil(t){return new Promise(i=>{let e=()=>{t()?i():setTimeout(e,1e3/this.maxFPS)};e()})}setVariable(t,i){this.variableMap.set(t,i)}getVariable(t){return this.variableMap.get(t)}hovering(t){let{mouseX:i,mouseY:e}=this,r=i+s.width/2,h=s.height/2-e,b=r-(t.x+s.width/2),f=h-(s.height/2-t.y),x=-this.toRadians(t.dir),L=b*Math.cos(x)-f*Math.sin(x),D=b*Math.sin(x)+f*Math.cos(x);return o.isPointInPath(t.getCachedPath(),L,D)}keyPressed(t){switch(t){case"any":return this.keysPressed.size>0;case"up":return this.keysPressed.has("ArrowUp");case"down":return this.keysPressed.has("ArrowDown");case"left":return this.keysPressed.has("ArrowLeft");case"right":return this.keysPressed.has("ArrowRight");case"space":return this.keysPressed.has(" ");default:return this.keysPressed.has(t)}}playSound(t){let i=new Audio(t);return this.sounds.push(i),i.play(),i}stopSound(t){t.pause(),t.currentTime=0,this.sounds=this.sounds.filter(i=>i!==t)}stopAllSounds(){this.sounds.forEach(t=>{t.pause(),t.currentTime=0}),this.sounds=[]}pickRandom(t,i){return t>i&&([t,i]=[i,t]),Math.floor(Math.random()*(i-t+1)+t)}dotProduct(t){let[i,e]=t;switch(i.length){case 2:return i[0]*e[0]+i[1]*e[1];case 3:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2];case 4:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2]+i[3]*e[3]}}sin(t){return Math.sin(this.toRadians(t))}cos(t){return Math.cos(this.toRadians(t))}tan(t){return Math.tan(this.toRadians(t))}csc(t){return 1/Math.sin(this.toRadians(t))}sec(t){return 1/Math.cos(this.toRadians(t))}cot(t){return 1/Math.tan(this.toRadians(t))}asin(t){return this.toDegrees(Math.asin(t))}acos(t){return this.toDegrees(Math.acos(t))}acsc(t){return this.toDegrees(Math.asin(1/t))}asec(t){return this.toDegrees(Math.acos(1/t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24),this.sceneMap.set("main",{loop:null,sprites:[]}),this.sceneMap.set("*",{loop:null,sprites:[]}),u.addEventListener("mousemove",t=>{this.mouseX=t.clientX-u.offsetLeft-u.width/2,this.mouseY=-(t.clientY-u.offsetTop-u.height/2)}),u.addEventListener("mousedown",()=>{this.mouseDown=!0}),u.addEventListener("mouseup",()=>{this.mouseDown=!1}),u.addEventListener("click",()=>{this.mouseClicked=!0,setTimeout(()=>this.mouseClicked=!1,0)}),addEventListener("keydown",t=>{t.repeat||this.keysPressed.add(t.key)}),addEventListener("keyup",t=>{this.keysPressed.delete(t.key)})}};import{io as U}from"socket.io-client";var w=class n{static instance;socket;static connect(t="http://localhost:3000"){return this.instance||(this.instance=new n(t)),this.instance}disconnect(){this.socket.disconnect()}constructor(t){this.socket=U(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var v=class n extends l{discriminant="rectangle";width;height;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:Math.hypot(this.width,this.height),height:Math.hypot(this.width,this.height)}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.width=t?.width??50,this.height=t?.height??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var S=class n extends l{discriminant="square";sideLength;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:Math.hypot(this.sideLength,this.sideLength),height:Math.hypot(this.sideLength,this.sideLength)}}getPath(){let t=new Path2D;return t.rect(-this.sideLength/2,-this.sideLength/2,this.sideLength,this.sideLength),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}setSideLength(t){this.sideLength=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sideLength=t?.sideLength??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var C=class n extends l{discriminant="oval";radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:Math.hypot(this.radX*2,this.radY*2),height:Math.hypot(this.radX*2,this.radY*2)}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radX,this.radY,0,0,Math.PI*2),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}setRadX(t){this.radX=t,this.invalidatePath(),this.refresh()}setRadY(t){this.radY=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radX=t?.radX??25,this.radY=t?.radY??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var P=class n extends l{discriminant="circle";radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radius,this.radius,0,0,Math.PI*2),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var B=class n extends l{discriminant="arc";radius;angle;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D;return t.arc(0,0,this.radius,this.toRadians(this.angle/2-90),this.toRadians(-this.angle/2-90)),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setAngle(t){this.angle=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.angle=t?.angle??270,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var M=class n extends l{discriminant="regularpolygon";sides;radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D,i=2*Math.PI/this.sides;t.moveTo(this.radius,0);for(let e=1;e<this.sides;e++)t.lineTo(this.radius*Math.cos(i*e),this.radius*Math.sin(i*e));return t.closePath(),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}setSides(t){this.sides=t,this.invalidatePath(),this.refresh()}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sides=t?.sides??5,this.radius=t?.radius??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var O=class n extends l{discriminant="custompolygon";vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=0;for(let i of this.vertices){let e=Math.hypot(i[0],i[1]);e>t&&(t=e)}return{x:this.x,y:this.y,width:t,height:t}}getPath(){let t=new Path2D,i=this.vertices;if(i.length<2)return t;t.moveTo(i[0][0],i[0][1]);for(let e=1;e<i.length;e++)t.lineTo(i[e][0],i[e][1]);return t.closePath(),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir));let h=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(h),this.outlineWidth&&i.stroke(h),i.restore()}create(t){return new n(t)}setVertices(t){this.vertices=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.vertices=t?.vertices??[],this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var k=class n extends l{discriminant="pen";drawing;size;color;getBoundingBox(){return{x:this.x,y:this.y,width:this.size,height:this.size}}getPath(){return new Path2D}draw(){}create(t){return new n(t)}up(){this.drawing=!1}down(){this.drawing=!0}stamp(t){t.draw(!0)}eraseAll(){a.clearRect(0,0,s.width,s.height)}dot(){a.fillStyle=this.color,a.fillRect(this.x-this.size/2+s.width/2,-this.y-this.size/2+s.height/2,this.size,this.size)}drawLine(t,i){a.beginPath(),a.moveTo(t+s.width/2,-i+s.height/2),a.lineTo(this.x+s.width/2,-this.y+s.height/2),a.lineWidth=this.size,a.strokeStyle=this.color,a.stroke()}move(t){let i=this.x,e=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(i,e),this.refresh()}setX(t){let i=this.x,e=this.y;this.x=t,this.drawing&&this.drawLine(i,e),this.refresh()}setY(t){let i=this.x,e=this.y;this.y=t,this.drawing&&this.drawLine(i,e),this.refresh()}goTo(t,i){let e=this.x,r=this.y;this.x=t,this.y=i,this.drawing&&this.drawLine(e,r),this.refresh()}changeX(t){let i=this.x,e=this.y;this.x+=t,this.drawing&&this.drawLine(i,e),this.refresh()}changeY(t){let i=this.x,e=this.y;this.y+=t,this.drawing&&this.drawLine(i,e),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var W=class n extends l{discriminant="text";content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=o.measureText(this.content),i=t.width,e=t.actualBoundingBoxAscent+t.actualBoundingBoxDescent;return{x:this.x,y:this.y,width:i,height:e}}getPath(){let t=new Path2D;o.save(),o.font=this.font;let i=o.measureText(this.content),e=i.width,r=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent;return o.restore(),t.rect(-e/2,-r/2,e,r),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.font=this.font,i.fillStyle=this.color,i.textAlign=this.align,i.textBaseline=this.baseline,i.fillText(this.content,0,0),i.restore()}create(t){return new n(t)}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setAlign(t){this.align=t,this.invalidatePath(),this.refresh()}setBaseline(t){this.baseline=t,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.color=t?.color??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.align=t?.align??"center",this.baseline=t?.baseline??"middle",this.font=`${this.fontSize}px ${this.fontFamily}`,this.draw()}};var R=class n extends l{discriminant="button";content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){o.save(),o.font=this.font;let t=o.measureText(this.content),i=Math.max(t.width,this.width),e=Math.max(t.actualBoundingBoxAscent+t.actualBoundingBoxDescent,this.width);return o.restore(),{x:this.x,y:this.y,width:Math.hypot(i,e),height:Math.hypot(i,e)}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.fillStyle=this.backgroundColor,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth;let h=this.getCachedPath();i.fill(h),this.outlineWidth&&i.stroke(h),i.font=this.font,i.fillStyle=this.fontColor,i.textAlign="center",i.textBaseline="middle",i.fillText(this.content,0,0),i.restore()}create(t){return new n(t)}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setBackgroundColor(t){this.backgroundColor=t,this.refresh()}setFontColor(t){this.fontColor=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.fontColor=t?.fontColor??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.font=`${this.fontSize}px ${this.fontFamily}`,this.width=t?.width??this.content.length*this.fontSize+10,this.height=t?.height??this.fontSize+10,this.backgroundColor=t?.backgroundColor??"rgb(204, 204, 204)",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var F=class n extends l{discriminant="imagesprite";src;width;height;outlineColor;outlineWidth;img;getBoundingBox(){return{x:this.x,y:this.y,width:this.width,height:this.height}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?a:o;i.save();let e=this.x+s.width/2,r=-this.y+s.height/2;i.translate(e,r),i.rotate(this.toRadians(this.dir)),i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.drawImage(this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),this.outlineWidth&&i.stroke(this.getCachedPath()),i.restore()}create(t){return new n(t)}setSrc(t){this.src=t,this.refresh()}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.src=t?.src??"",this.img=new Image,this.img.src=this.src,this.width=t?.width??this.img.width,this.height=t?.height??this.img.height,this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var j={Engine:d,Sprite:l,Multiplayer:w,Rectangle:v,Square:S,Oval:C,Circle:P,Arc:B,RegularPolygon:M,CustomPolygon:O,Pen:k,Text:W,Button:R,ImageSprite:F,scale:m,aspectRatio:y,setScale:z,setAspectRatio:V,canvas:s,ctx:o},Zt=j;export{B as Arc,R as Button,P as Circle,O as CustomPolygon,d as Engine,F as ImageSprite,w as Multiplayer,C as Oval,k as Pen,v as Rectangle,M as RegularPolygon,l as Sprite,S as Square,W as Text,y as aspectRatio,s as canvas,o as ctx,Zt as default,m as scale,V as setAspectRatio,z as setScale};
|
|
1
|
+
var n=document.getElementById("game-window")||document.createElement("canvas"),h=n.getContext("2d"),m=document.createElement("canvas"),c=m.getContext("2d");m.id="pen-canvas";var O=16/9,P;function G(){n.width=O*P,n.height=P,m.width=O*P,m.height=P}function $(o){P=o,G()}function U(o){O=o,G()}n.parentElement?.insertBefore(m,n);$(500);var l=class o{x=0;y=0;dir=0;scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){d.init().refresh()}invalidatePath(){this.pathDirty=!0,this.cachedPath=null}getCachedPath(){return(this.pathDirty||!this.cachedPath)&&(this.cachedPath=this.getPath(),this.pathDirty=!1),this.cachedPath}constructor(t){Object.assign(this,t),d.init().addSprite(this)}clone(t){return this.create({x:this.x,y:this.y,dir:this.dir,scene:this.scene,layer:this.layer,hidden:this.hidden,...t})}touching(t){if(this.hidden||t.hidden||this.scene!=="*"&&t.scene!=="*"&&this.scene!==t.scene)return!1;let i=this.getBoundingBox(),e=t.getBoundingBox();if(!(Math.abs(i.x-e.x)<(i.width+e.width)/2&&Math.abs(i.y-e.y)<(i.height+e.height)/2))return!1;let r=i.x-i.width/2,a=i.y+i.height/2,p=i.x+i.width/2,u=i.y-i.height/2,g=e.x-e.width/2,f=e.y+e.height/2,x=e.x+e.width/2,y=e.y-e.height/2,S=Math.max(r,g),C=Math.min(u,y),E=Math.min(p,x),V=Math.max(a,f),v=E-S,w=V-C;if(v<=1||w<=1)return!1;o.collisionCanvas||(o.collisionCanvas=document.createElement("canvas"),o.collisionCtx=o.collisionCanvas.getContext("2d",{willReadFrequently:!0})),(o.collisionCanvas.width<v||o.collisionCanvas.height<w)&&(o.collisionCanvas.width=Math.max(v,o.collisionCanvas.width),o.collisionCanvas.height=Math.max(w,o.collisionCanvas.height));let b=o.collisionCtx;b.clearRect(0,0,v,w),b.save(),b.translate(this.x-S,w-this.y+C),b.rotate(this.toRadians(this.dir)),b.fillStyle="red",b.fill(this.getCachedPath()),b.restore();let q=b.getImageData(0,0,v,w).data;b.clearRect(0,0,v,w),b.save(),b.translate(t.x-S,w-t.y+C),b.rotate(this.toRadians(t.dir)),b.fillStyle="blue",b.fill(t.getCachedPath()),b.restore();let j=b.getImageData(0,0,v,w).data;for(let H=3;H<q.length;H+=4)if(q[H]>0&&j[H]>0)return!0;return!1}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}distanceTo(t,i){return Math.hypot(t-this.x,i-this.y)}move(t){this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.refresh()}turn(t){this.dir+=t,this.refresh()}point(t){this.dir=t,this.refresh()}pointTowards(t,i){this.dir=90-this.toDegrees(Math.atan2(i-this.y,t-this.x)),this.refresh()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,i){this.x=t,this.y=i,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}show(){this.hidden=!1,this.refresh()}hide(){this.hidden=!0,this.refresh()}goToLayer(t){this.layer=t,this.refresh()}changeLayer(t){this.layer+=t,this.refresh()}};var d=class o{static instance;loopRunning=!1;gameLoop=null;maxFPS=24;deltaTime=1/this.maxFPS;lastFrame=performance.now();refreshScheduled=!1;animationFrameId=null;sounds=[];mouseX=0;mouseY=0;mouseDown=!1;mouseClicked=!1;keysPressed=new Set;currentScene="main";sceneMap=new Map;variableMap=new Map;static init(){return this.instance||(this.instance=new o),this.instance}changeScene(t){this.sceneMap.get(t)||this.sceneMap.set(t,{sprites:[],loop:null}),this.loopRunning=!1,this.currentScene=t,this.gameLoop=this.sceneMap.get(t).loop,this.setMaxFramesPerSecond(this.maxFPS)}setLoop(t,i){if(!this.sceneMap.get(t)){this.sceneMap.set(t,{sprites:[],loop:i}),t===this.currentScene&&this.changeScene(t);return}this.sceneMap.get(t).loop=i,t===this.currentScene&&this.changeScene(t)}pauseLoop(){this.loopRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}resumeLoop(){this.loopRunning=!0,this.setMaxFramesPerSecond(this.maxFPS)}addSprite(t){let{scene:i,layer:e}=t;if(!this.sceneMap.get(i)){this.sceneMap.set(i,{sprites:[t],loop:null});return}let s=this.sceneMap.get(i).sprites.findIndex(r=>r.layer>e);if(s===-1){this.sceneMap.get(i).sprites.push(t);return}this.sceneMap.get(i).sprites.splice(s,0,t),this.refresh()}removeSprite(t){let{scene:i}=t;this.sceneMap.get(i)&&(this.sceneMap.get(i).sprites=this.sceneMap.get(i).sprites.filter(e=>e!==t),this.refresh())}async setMaxFramesPerSecond(t){this.maxFPS=t;let i=this.gameLoop;if(!i)return;this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.loopRunning=!0;let e=1e3/t,s=0,r=async a=>{if(!this.loopRunning)return;let p=a-this.lastFrame;this.lastFrame=a,s+=p,s>=e&&(this.deltaTime=s/1e3,s=s%e,i&&await i()),this.animationFrameId=requestAnimationFrame(r)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(r)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,h.clearRect(0,0,n.width,n.height),[...this.sceneMap.get(this.currentScene).sprites,...this.sceneMap.get("*").sprites].forEach(i=>{i.hidden||i.draw()})}))}async wait(t){return new Promise(i=>setTimeout(i,t))}async waitUntil(t){return new Promise(i=>{let e=()=>{t()?i():setTimeout(e,1e3/this.maxFPS)};e()})}setVariable(t,i){this.variableMap.set(t,i)}getVariable(t){return this.variableMap.get(t)}hovering(t){let{mouseX:i,mouseY:e}=this,s=i+n.width/2,r=n.height/2-e,a=s-(t.x+n.width/2),p=r-(n.height/2-t.y),u=-this.toRadians(t.dir),g=a*Math.cos(u)-p*Math.sin(u),f=a*Math.sin(u)+p*Math.cos(u);return h.isPointInPath(t.getCachedPath(),g,f)}keyPressed(t){switch(t){case"any":return this.keysPressed.size>0;case"up":return this.keysPressed.has("ArrowUp");case"down":return this.keysPressed.has("ArrowDown");case"left":return this.keysPressed.has("ArrowLeft");case"right":return this.keysPressed.has("ArrowRight");case"space":return this.keysPressed.has(" ");default:return this.keysPressed.has(t)}}playSound(t){let i=new Audio(t);return this.sounds.push(i),i.play(),i}stopSound(t){t.pause(),t.currentTime=0,this.sounds=this.sounds.filter(i=>i!==t)}stopAllSounds(){this.sounds.forEach(t=>{t.pause(),t.currentTime=0}),this.sounds=[]}pickRandom(t,i){return t>i&&([t,i]=[i,t]),Math.floor(Math.random()*(i-t+1)+t)}dotProduct(...t){let[i,e]=t;switch(i.length){case 2:return i[0]*e[0]+i[1]*e[1];case 3:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2];case 4:return i[0]*e[0]+i[1]*e[1]+i[2]*e[2]+i[3]*e[3]}}sin(t){return Math.sin(this.toRadians(t))}cos(t){return Math.cos(this.toRadians(t))}tan(t){return Math.tan(this.toRadians(t))}csc(t){return 1/Math.sin(this.toRadians(t))}sec(t){return 1/Math.cos(this.toRadians(t))}cot(t){return 1/Math.tan(this.toRadians(t))}asin(t){return this.toDegrees(Math.asin(t))}acos(t){return this.toDegrees(Math.acos(t))}acsc(t){return this.toDegrees(Math.asin(1/t))}asec(t){return this.toDegrees(Math.acos(1/t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24),this.sceneMap.set("main",{loop:null,sprites:[]}),this.sceneMap.set("*",{loop:null,sprites:[]}),m.addEventListener("mousemove",t=>{this.mouseX=t.clientX-m.offsetLeft-m.width/2,this.mouseY=-(t.clientY-m.offsetTop-m.height/2)}),m.addEventListener("mousedown",()=>{this.mouseDown=!0}),m.addEventListener("mouseup",()=>{this.mouseDown=!1}),m.addEventListener("click",()=>{this.mouseClicked=!0,setTimeout(()=>this.mouseClicked=!1,0)}),addEventListener("keydown",t=>{t.repeat||this.keysPressed.add(t.key)}),addEventListener("keyup",t=>{this.keysPressed.delete(t.key)})}};import{io as J}from"socket.io-client";var k=class o{static instance;socket;static connect(t="http://localhost:3000"){return this.instance||(this.instance=new o(t)),this.instance}disconnect(){this.socket.disconnect()}constructor(t){this.socket=J(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var R=class o extends l{discriminant="rectangle";width;height;color;outlineColor;outlineWidth;getBoundingBox(){let t=d.init(),i=this.width,e=this.height,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),p=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:p,height:u}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.width=t?.width??50,this.height=t?.height??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var W=class o extends l{discriminant="square";sideLength;color;outlineColor;outlineWidth;getBoundingBox(){let t=d.init(),i=this.sideLength,e=this.dir,s=Math.abs(t.cos(e)),r=Math.abs(t.sin(e)),a=i*s+i*r;return{x:this.x,y:this.y,width:a,height:a}}getPath(){let t=new Path2D;return t.rect(-this.sideLength/2,-this.sideLength/2,this.sideLength,this.sideLength),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}setSideLength(t){this.sideLength=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sideLength=t?.sideLength??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var T=class o extends l{discriminant="oval";radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){let t=d.init(),i=this.radX,e=this.radY,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),p=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:p,height:u}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radX,this.radY,0,0,Math.PI*2),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}setRadX(t){this.radX=t,this.invalidatePath(),this.refresh()}setRadY(t){this.radY=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radX=t?.radX??25,this.radY=t?.radY??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var M=class o extends l{discriminant="circle";radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radius,this.radius,0,0,Math.PI*2),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var Y=class o extends l{discriminant="arc";radius;angle;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D;return t.arc(0,0,this.radius,this.toRadians(this.angle/2-90),this.toRadians(-this.angle/2-90)),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setAngle(t){this.angle=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.angle=t?.angle??270,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var L=class o extends l{discriminant="regularpolygon";sides;radius;color;outlineColor;outlineWidth;getBoundingBox(){return{x:this.x,y:this.y,width:this.radius*2,height:this.radius*2}}getPath(){let t=new Path2D,i=2*Math.PI/this.sides;t.moveTo(this.radius,0);for(let e=1;e<this.sides;e++)t.lineTo(this.radius*Math.cos(i*e),this.radius*Math.sin(i*e));return t.closePath(),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}setSides(t){this.sides=t,this.invalidatePath(),this.refresh()}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sides=t?.sides??5,this.radius=t?.radius??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var X=class o extends l{discriminant="custompolygon";vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=d.init(),i=t.cos(this.dir),e=t.sin(this.dir),s=1/0,r=-1/0,a=1/0,p=-1/0;for(let u of this.vertices){let g=u[0]*i-u[1]*e,f=u[0]*e+u[1]*i,x=this.x+g,y=this.y+f;x<s&&(s=x),x>r&&(r=x),y<a&&(a=y),y>p&&(p=y)}return{x:s,y:a,width:r-s,height:p-a}}getPath(){let t=new Path2D,i=this.vertices;if(i.length<2)return t;t.moveTo(i[0][0],i[0][1]);for(let e=1;e<i.length;e++)t.lineTo(i[e][0],i[e][1]);return t.closePath(),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir));let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new o(t)}setVertices(t){this.vertices=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.vertices=t?.vertices??[],this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var F=class o extends l{discriminant="pen";drawing;size;color;getBoundingBox(){return{x:this.x,y:this.y,width:this.size,height:this.size}}getPath(){return new Path2D}draw(){}create(t){return new o(t)}up(){this.drawing=!1}down(){this.drawing=!0}stamp(t){t.draw(!0)}eraseAll(){c.clearRect(0,0,n.width,n.height)}dot(){c.fillStyle=this.color,c.fillRect(this.x-this.size/2+n.width/2,-this.y-this.size/2+n.height/2,this.size,this.size)}drawLine(t,i){c.beginPath(),c.moveTo(t+n.width/2,-i+n.height/2),c.lineTo(this.x+n.width/2,-this.y+n.height/2),c.lineWidth=this.size,c.strokeStyle=this.color,c.stroke()}move(t){let i=this.x,e=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(i,e),this.refresh()}setX(t){let i=this.x,e=this.y;this.x=t,this.drawing&&this.drawLine(i,e),this.refresh()}setY(t){let i=this.x,e=this.y;this.y=t,this.drawing&&this.drawLine(i,e),this.refresh()}goTo(t,i){let e=this.x,s=this.y;this.x=t,this.y=i,this.drawing&&this.drawLine(e,s),this.refresh()}changeX(t){let i=this.x,e=this.y;this.x+=t,this.drawing&&this.drawLine(i,e),this.refresh()}changeY(t){let i=this.x,e=this.y;this.y+=t,this.drawing&&this.drawLine(i,e),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var B=class o extends l{discriminant="text";content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=d.init(),i=h.measureText(String(this.content)),e=i.width,s=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent,r=this.dir,a=Math.abs(t.cos(r)),p=Math.abs(t.sin(r)),u=e*a+s*p,g=e*p+s*a;return{x:this.x,y:this.y,width:u,height:g}}getPath(){let t=new Path2D;h.save(),h.font=this.font;let i=h.measureText(String(this.content)),e=i.width,s=i.actualBoundingBoxAscent+i.actualBoundingBoxDescent;return h.restore(),t.rect(-e/2,-s/2,e,s),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.font=this.font,i.fillStyle=this.color,i.textAlign=this.align,i.textBaseline=this.baseline,i.fillText(String(this.content),0,0),i.restore()}create(t){return new o(t)}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setAlign(t){this.align=t,this.invalidatePath(),this.refresh()}setBaseline(t){this.baseline=t,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.color=t?.color??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.align=t?.align??"center",this.baseline=t?.baseline??"middle",this.font=`${this.fontSize}px ${this.fontFamily}`,this.draw()}};var D=class o extends l{discriminant="button";content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){let t=d.init();h.save(),h.font=this.font;let i=h.measureText(String(this.content)),e=Math.max(i.width,this.width),s=Math.max(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent,this.height);h.restore();let r=this.dir,a=Math.abs(t.cos(r)),p=Math.abs(t.sin(r)),u=e*a+s*p,g=e*p+s*a;return{x:this.x,y:this.y,width:u,height:g}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.fillStyle=this.backgroundColor,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth;let r=this.getCachedPath();i.fill(r),this.outlineWidth&&i.stroke(r),i.font=this.font,i.fillStyle=this.fontColor,i.textAlign="center",i.textBaseline="middle",i.fillText(String(this.content),0,0),i.restore()}create(t){return new o(t)}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setBackgroundColor(t){this.backgroundColor=t,this.refresh()}setFontColor(t){this.fontColor=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.fontColor=t?.fontColor??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.font=`${this.fontSize}px ${this.fontFamily}`,this.width=t?.width??String(this.content).length*this.fontSize+10,this.height=t?.height??this.fontSize+10,this.backgroundColor=t?.backgroundColor??"rgb(204, 204, 204)",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var I=class o extends B{create(t){return new o(t)}constructor(t){super(t),this.content=t?.content??"Made with TScratch",this.x=t?.x??-n.width/2+5,this.y=t?.y??n.height/2-5,this.align=t?.align??"left",this.baseline=t?.baseline??"top",this.draw()}};var z=class o extends l{discriminant="imagesprite";src;width;height;outlineColor;outlineWidth;img;getBoundingBox(){let t=d.init(),i=this.width,e=this.height,s=this.dir,r=Math.abs(t.cos(s)),a=Math.abs(t.sin(s)),p=i*r+e*a,u=i*a+e*r;return{x:this.x,y:this.y,width:p,height:u}}getPath(){let t=new Path2D;return t.rect(-this.width/2,-this.height/2,this.width,this.height),t}draw(t){let i=t?c:h;i.save();let e=this.x+n.width/2,s=-this.y+n.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.drawImage(this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),this.outlineWidth&&i.stroke(this.getCachedPath()),i.restore()}create(t){return new o(t)}setSrc(t){this.src=t,this.refresh()}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.src=t?.src??"",this.img=new Image,this.img.src=this.src,this.width=t?.width??this.img.width,this.height=t?.height??this.img.height,this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var A=class extends M{gravity;vX;vY;drag;bounceLoss;update(){let t=d.init();this.vY+=this.gravity,this.vY*=this.drag,this.vX*=this.drag;let i=this.x+this.vX,e=this.y+this.vY,s=t.sceneMap.get(this.scene).sprites.filter(f=>f.discriminant==="circle"),r=t.sceneMap.get("*").sprites.filter(f=>f.discriminant==="circle"),a=[...s,...r],p=Math.ceil(this.distanceTo(i,e)/(2*this.radius));for(let f=0;f<p;f++)for(let x of a)if(this.distanceTo(x.x,x.y)<this.radius+x.radius){let y=this.x-x.x,S=this.y-x.y,C=Math.sqrt(y*y+S*S);if(C===0)continue;let E=y/C,V=S/C,v=this.vX*E+this.vY*V;this.vX=(this.vX-2*v*E)*this.bounceLoss,this.vY=(this.vY-2*v*V)*this.bounceLoss,this.changeX(this.vX),this.changeY(this.vY);return}this.goTo(i,e);let u=n.width/2,g=n.height/2;this.x-this.radius<-u?(this.setX(-u+this.radius),this.vX=Math.abs(this.vX)*this.bounceLoss):this.x+this.radius>u&&(this.setX(u-this.radius),this.vX=-Math.abs(this.vX)*this.bounceLoss),this.y-this.radius<-g?(this.setY(-g+this.radius),this.vY=Math.abs(this.vY)*this.bounceLoss):this.y+this.radius>g&&(this.setY(g-this.radius),this.vY=-Math.abs(this.vY)*this.bounceLoss)}constructor(t){super(t),this.gravity=t?.gravity??-1.8,this.drag=t?.drag??.96,this.bounceLoss=t?.bounceLoss??.9,this.vX=t?.vX??0,this.vY=t?.vY??0}};var K={Engine:d,Sprite:l,Multiplayer:k,Rectangle:R,Square:W,Oval:T,Circle:M,Arc:Y,RegularPolygon:L,CustomPolygon:X,Pen:F,Text:B,Button:D,Watermark:I,ImageSprite:z,RigidCircle:A,scale:P,aspectRatio:O,setScale:$,setAspectRatio:U,canvas:n,ctx:h},vi=K;export{Y as Arc,D as Button,M as Circle,X as CustomPolygon,d as Engine,z as ImageSprite,k as Multiplayer,T as Oval,F as Pen,R as Rectangle,L as RegularPolygon,A as RigidCircle,l as Sprite,W as Square,B as Text,I as Watermark,O as aspectRatio,n as canvas,h as ctx,vi as default,P as scale,U as setAspectRatio,$ as setScale};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|