tscratch 0.2.9 → 0.3.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.
package/README.md CHANGED
@@ -7,11 +7,11 @@ Type-safe, lightweight, and fun — bring the simplicity of Scratch into real co
7
7
 
8
8
  ## ✨ Features
9
9
 
10
- - 🎮 **Scratch-style API** — `goTo`, `setX`, `move`, etc.
11
- - **TypeScript first** — full type safety & IntelliSense.
12
- - 🖼️ **Canvas rendering** — built on the HTML5 canvas.
13
- - 🧩 **Sprites system** — extend `Sprite` to create your own shapes.
14
- - 🛠️ **Lightweight** — no heavy dependencies, works in any TypeScript project.
10
+ - **Scratch-style API** — `goTo`, `setX`, `move`, etc.
11
+ - **TypeScript first** — full type safety & IntelliSense.
12
+ - **Canvas rendering** — built on the HTML5 canvas.
13
+ - **Sprites system** — extend `Sprite` to create your own shapes.
14
+ - **Lightweight** — no heavy dependencies, works in any TypeScript project.
15
15
 
16
16
  ---
17
17
 
@@ -30,49 +30,88 @@ import { Engine, Rectangle } from 'tscratch';
30
30
  const engine = Engine.init();
31
31
 
32
32
  // Create a rectangle sprite
33
- const rect = new Rectangle();
34
-
33
+ const rect = new Rectangle({ color: 'red' });
35
34
  // Move it to the center
36
- rect.goTo(0, 0);
35
+ rect.goTo(100, 50);
37
36
 
38
37
  // Animate in the game loop
39
- engine.loop = () => {
40
- rect.changeX(2); // move right every frame
41
- };
38
+ engine.setLoop('main', () => {
39
+ rect.move(1);
40
+ rect.turn(-2);
41
+ });
42
42
  ```
43
43
  ## 🎨 Example: Multiple Sprites
44
44
 
45
45
  ```ts
46
46
  import { Engine, Rectangle } from 'tscratch';
47
47
 
48
+ // Setup
48
49
  const engine = Engine.init();
49
50
 
50
- const redBox = new Rectangle();
51
+ const redBox = new Rectangle({ scene: 'primary' });
51
52
 
52
53
  redBox.setColor('red');
53
54
  redBox.goTo(-100, 0);
54
55
 
55
- const blueBox = new Rectangle();
56
+ const blueBox = new Rectangle({ scene: 'secondary' });
56
57
 
57
58
  blueBox.setColor('blue');
58
59
  blueBox.goTo(100, 0);
59
60
 
60
- engine.loop = () => {
61
- redBox.changeX(1);
62
- blueBox.changeX(-1);
63
- };
61
+ // Scenes & loops
62
+ engine.changeScene('primary');
63
+
64
+ engine.setLoop('primary', () => redBox.changeX(1));
65
+ engine.setLoop('secondary', () => blueBox.changeX(-1));
64
66
  ```
65
67
 
68
+ The recommended way of managing multiple scenes is to seperate your code into
69
+ 1 file per scene, export the loop function and set the loops inside index.ts
70
+ (your entry file).
71
+
72
+ ```ts
73
+ // scenes/main.ts
74
+
75
+ const rect = new Rectangle();
76
+
77
+ // Export the loop
78
+ export default () => rect.move(1);
79
+ ```
80
+
81
+ ```ts
82
+ // index.ts
83
+
84
+ import { Engine } from 'tscratch';
85
+ import main from './scenes/main.ts';
86
+
87
+ const engine = Engine.init();
88
+
89
+ // No need for changeScene() here, because it's 'main'
90
+ engine.setLoop('main', main);
91
+ ```
92
+
93
+ ## Scenes
94
+
95
+ TScratch supports scenes with the `scene` property. In every sprite you create,
96
+ you can specify, in which scene you want it to render. TScratch will default it
97
+ to 'main' if not specified.
98
+
99
+ After that, you can switch between scenes by using `engine.changeScene(scene)`.
100
+ TScratch will then render only the sprites, that belong in that specific scene.
101
+
102
+ You can also specify 1 loop per scene using `engine.setLoop(scene, callback)`.
103
+ Keep in mind that there is only 1 loop running at a time, which is the one
104
+ in the current scene.
105
+
66
106
  ## 🛠️ API Overview
67
107
 
68
108
  ### Engine
69
109
 
70
110
  - `Engine.init()` → get the singleton instance
71
- - `engine.removeSprites(...sprites)` → removes sprites from the stage
72
111
  - `engine.setMaxFramesPerSecond(FPS)`→ sets the maximum FPS
73
- - `engine.loop = () => { ... }` → game loop logic
74
- - `engine.refresh()` → redraw all sprites
75
- - `await engine.wait(ms)` → Wait some time (miliseconds)
112
+ - `engine.setLoop(scene, callback)` → game loop logic
113
+ - `engine.changeScene(scene)` → changes the scene, renders only the targeted sprites
114
+ - `await engine.wait(ms)` → Wait some time in milliseconds (experimental)
76
115
  - `engine.toRadians(rad)` → converts degrees to radians
77
116
  - `engine.toDegrees(deg)` → converts radians to degrees
78
117
 
@@ -84,16 +123,38 @@ engine.loop = () => {
84
123
  - `turn(deg)` / `point(deg)` → change / set direction
85
124
  - `changeX(dX)` / `changeY(dY)` → relative movement
86
125
 
87
- ### Rectangle (example sprite)
126
+ ### Rectangle
127
+
128
+ - Has `width`, `height`, and `color` properties.
129
+ - Draws a rectangle centered on `(x, y)`.
130
+
131
+ ### RegularPolygon
132
+
133
+ - Has `radius`, `sides`, and `color` properties.
134
+ - Draws a polygon centered on `(x, y)`.
135
+
136
+ ### Oval
137
+
138
+ - Has `radA`, `radB`, and `color` properties.
139
+ - Draws an oval centered on `(x, y)`.
140
+
141
+ ### Text
142
+
143
+ - Has `content`, `color`, and other properties specifying the style.
144
+ - Draws a label aligned to your preference.
145
+
146
+ ### ImageSprite
88
147
 
89
- - Has `width`, `height`, and `color` properties
90
- - Draws a rectangle centered on `(x, y)`
148
+ - Has `src`, `width`, and `height` properties.
149
+ - Draws an image centered on `(x, y)`.
91
150
 
92
151
  ### Pen
93
152
 
153
+ - Has `color`, `size`, and `drawing` properties.
94
154
  - `down()` → starts drawing
95
155
  - `up()` → stops drawing
96
156
  - `dot()` → draws a single dot
157
+ - Movement methods, such as `move()`, can draw a line based on if `drawing` is true.
97
158
 
98
159
  ### Canvas
99
160
 
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var S=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var A=(r,t)=>{for(var s in t)S(r,s,{get:t[s],enumerable:!0})},L=(r,t,s,h)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of C(t))!I.call(r,a)&&a!==s&&S(r,a,{get:()=>t[a],enumerable:!(h=T(t,a))||h.enumerable});return r};var z=r=>L(S({},"__esModule",{value:!0}),r);var X={};A(X,{Engine:()=>l,ImageSprite:()=>f,Oval:()=>d,Pen:()=>b,Rectangle:()=>u,RegularPolygon:()=>m,Sprite:()=>n,Text:()=>g,canvas:()=>i,ctx:()=>e,default:()=>B,setAspectRatio:()=>v,setScale:()=>w});module.exports=z(X);var i=document.getElementById("game-window"),e=i.getContext("2d"),p=document.createElement("canvas"),o=p.getContext("2d");p.id="pen-canvas";var x=16/9,c;function w(r){c=r,i.width=x*c,i.height=c,p.width=x*c,p.height=c}function v(r){x=r,i.width=x*c,i.height=c,p.width=x*c,p.height=c}i.parentElement?.insertBefore(p,i);w(500);var n=class{x;y;dir;scene;refresh(){l.init().refresh()}constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.dir=t?.dir??0,this.scene=t?.scene??"main",l.init().addSprite(this.scene,this)}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}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()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,s){this.x=t,this.y=s,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}};var l=class r{static instance;updateInterval;gameLoop=null;maxFPS=24;mouseX=0;mouseY=0;currentScene="main";sceneMap={};static init(){return this.instance||(this.instance=new r),this.instance}changeScene(t){this.sceneMap[t]||(this.sceneMap[t]={sprites:[],loop:null}),this.currentScene=t,this.gameLoop=this.sceneMap[t].loop,this.setMaxFramesPerSecond(this.maxFPS)}setLoop(t,s){if(!this.sceneMap[t]){this.sceneMap[t]={sprites:[],loop:s};return}this.sceneMap[t].loop=s}addSprite(t,s){if(!this.sceneMap[t]){this.sceneMap[t]={sprites:[s],loop:null};return}this.sceneMap[t].sprites.push(s)}setMaxFramesPerSecond(t){this.maxFPS=t;let s=this.gameLoop;s&&(clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>s(),1e3/this.maxFPS))}refresh(){e.clearRect(0,0,i.width,i.height),this.sceneMap[this.currentScene]?.sprites.forEach(t=>t.draw())}async wait(t){return new Promise(s=>setTimeout(s,t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24),i.addEventListener("mousemove",t=>{this.mouseX=t.clientX-i.offsetLeft-i.width/2,this.mouseY=-(t.clientY-i.offsetTop-i.height/2)})}};var u=class extends n{width;height;color;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height),e.restore()}setWidth(t){this.width=t,this.refresh()}setHeight(t){this.height=t,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.draw()}};var d=class extends n{radA;radB;color;draw(){let t=this.toRadians(this.dir);e.beginPath(),e.ellipse(this.x+i.width/2,-this.y+i.height/2,this.radA,this.radB,t,0,Math.PI*2),e.fillStyle=this.color,e.fill()}setRadA(t){this.radA=t,this.refresh()}setRadB(t){this.radB=t,this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radA=t?.radA??25,this.radB=t?.radB??25,this.color=t?.color??"black",this.draw()}};var m=class extends n{sides;radius;color;draw(){let t=this.radius,s=Math.PI*2/this.sides,h=i.width/2,a=i.height/2,R=this.toRadians(this.dir);e.beginPath();for(let y=0;y<this.sides;y++){let O=y*s-Math.PI/2+R,M=h+this.x+t*Math.cos(O),P=a-this.y-t*Math.sin(O);y===0?e.moveTo(M,P):e.lineTo(M,P)}e.closePath(),e.fillStyle=this.color,e.fill()}setSides(t){this.sides=t,this.refresh()}setRadius(t){this.radius=t,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.draw()}};var b=class extends n{drawing;size;color;draw(){}up(){this.drawing=!1}down(){this.drawing=!0}ereaseAll(){o.clearRect(0,0,i.width,i.height)}dot(){o.fillStyle=this.color,o.fillRect(this.x-this.size/2+i.width/2,-this.y-this.size/2+i.height/2,this.size,this.size)}drawLine(t,s){o.beginPath(),o.moveTo(t+i.width/2,-s+i.height/2),o.lineTo(this.x+i.width/2,-this.y+i.height/2),o.lineWidth=this.size,o.strokeStyle=this.color,o.stroke()}move(t){let s=this.x,h=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(s,h),this.refresh()}setX(t){let s=this.x,h=this.y;this.x=t,this.drawing&&this.drawLine(s,h),this.refresh()}setY(t){let s=this.x,h=this.y;this.y=t,this.drawing&&this.drawLine(s,h),this.refresh()}goTo(t,s){let h=this.x,a=this.y;this.x=t,this.y=s,this.drawing&&this.drawLine(h,a),this.refresh()}changeX(t){let s=this.x,h=this.y;this.x+=t,this.drawing&&this.drawLine(s,h),this.refresh()}changeY(t){let s=this.x,h=this.y;this.y+=t,this.drawing&&this.drawLine(s,h),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var g=class extends n{content;color;fontFamily;fontSize;align;baseline;font;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.font=this.font,e.fillStyle=this.color,e.textAlign=this.align,e.textBaseline=this.baseline,e.fillText(this.content,0,0),e.restore()}setContent(t){this.content=t,this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.refresh()}setAlign(t){this.align=t,this.refresh()}setBaseline(t){this.baseline=t,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}`}};var f=class extends n{src;width;height;img;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.drawImage(this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),e.restore()}setSrc(t){this.src=t,this.refresh()}setWidth(t){this.width=t,this.refresh()}setHeight(t){this.height=t,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}};var F={Engine:l,Sprite:n,Rectangle:u,Oval:d,RegularPolygon:m,Pen:b,Text:g,ImageSprite:f,setScale:w,setAspectRatio:v,canvas:i,ctx:e},B=F;0&&(module.exports={Engine,ImageSprite,Oval,Pen,Rectangle,RegularPolygon,Sprite,Text,canvas,ctx,setAspectRatio,setScale});
1
+ "use strict";var S=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var A=(r,t)=>{for(var s in t)S(r,s,{get:t[s],enumerable:!0})},L=(r,t,s,h)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of C(t))!I.call(r,o)&&o!==s&&S(r,o,{get:()=>t[o],enumerable:!(h=T(t,o))||h.enumerable});return r};var z=r=>L(S({},"__esModule",{value:!0}),r);var X={};A(X,{Engine:()=>l,ImageSprite:()=>f,Oval:()=>d,Pen:()=>b,Rectangle:()=>u,RegularPolygon:()=>m,Sprite:()=>n,Text:()=>g,canvas:()=>i,ctx:()=>e,default:()=>B,setAspectRatio:()=>v,setScale:()=>w});module.exports=z(X);var i=document.getElementById("game-window"),e=i.getContext("2d"),p=document.createElement("canvas"),a=p.getContext("2d");p.id="pen-canvas";var x=16/9,c;function w(r){c=r,i.width=x*c,i.height=c,p.width=x*c,p.height=c}function v(r){x=r,i.width=x*c,i.height=c,p.width=x*c,p.height=c}i.parentElement?.insertBefore(p,i);w(500);var n=class{x;y;dir;scene;refresh(){l.init().refresh()}constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.dir=t?.dir??0,this.scene=t?.scene??"main",l.init().addSprite(this.scene,this)}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}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()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,s){this.x=t,this.y=s,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}};var l=class r{static instance;updateInterval;gameLoop=null;maxFPS=24;mouseX=0;mouseY=0;currentScene="main";sceneMap={};static init(){return this.instance||(this.instance=new r),this.instance}changeScene(t){this.sceneMap[t]||(this.sceneMap[t]={sprites:[],loop:null}),this.currentScene=t,this.gameLoop=this.sceneMap[t].loop,this.setMaxFramesPerSecond(this.maxFPS)}setLoop(t,s){if(!this.sceneMap[t]){this.sceneMap[t]={sprites:[],loop:s},t===this.currentScene&&this.changeScene(t);return}this.sceneMap[t].loop=s,t===this.currentScene&&this.changeScene(t)}addSprite(t,s){if(!this.sceneMap[t]){this.sceneMap[t]={sprites:[s],loop:null};return}this.sceneMap[t].sprites.push(s)}setMaxFramesPerSecond(t){this.maxFPS=t;let s=this.gameLoop;s&&(clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>s(),1e3/this.maxFPS))}refresh(){e.clearRect(0,0,i.width,i.height),this.sceneMap[this.currentScene]?.sprites.forEach(t=>t.draw())}async wait(t){return new Promise(s=>setTimeout(s,t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24),i.addEventListener("mousemove",t=>{this.mouseX=t.clientX-i.offsetLeft-i.width/2,this.mouseY=-(t.clientY-i.offsetTop-i.height/2)})}};var u=class extends n{width;height;color;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height),e.restore()}setWidth(t){this.width=t,this.refresh()}setHeight(t){this.height=t,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.draw()}};var d=class extends n{radA;radB;color;draw(){let t=this.toRadians(this.dir);e.beginPath(),e.ellipse(this.x+i.width/2,-this.y+i.height/2,this.radA,this.radB,t,0,Math.PI*2),e.fillStyle=this.color,e.fill()}setRadA(t){this.radA=t,this.refresh()}setRadB(t){this.radB=t,this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radA=t?.radA??25,this.radB=t?.radB??25,this.color=t?.color??"black",this.draw()}};var m=class extends n{sides;radius;color;draw(){let t=this.radius,s=Math.PI*2/this.sides,h=i.width/2,o=i.height/2,R=this.toRadians(this.dir);e.beginPath();for(let y=0;y<this.sides;y++){let O=y*s-Math.PI/2+R,M=h+this.x+t*Math.cos(O),P=o-this.y-t*Math.sin(O);y===0?e.moveTo(M,P):e.lineTo(M,P)}e.closePath(),e.fillStyle=this.color,e.fill()}setSides(t){this.sides=t,this.refresh()}setRadius(t){this.radius=t,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.draw()}};var b=class extends n{drawing;size;color;draw(){}up(){this.drawing=!1}down(){this.drawing=!0}ereaseAll(){a.clearRect(0,0,i.width,i.height)}dot(){a.fillStyle=this.color,a.fillRect(this.x-this.size/2+i.width/2,-this.y-this.size/2+i.height/2,this.size,this.size)}drawLine(t,s){a.beginPath(),a.moveTo(t+i.width/2,-s+i.height/2),a.lineTo(this.x+i.width/2,-this.y+i.height/2),a.lineWidth=this.size,a.strokeStyle=this.color,a.stroke()}move(t){let s=this.x,h=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(s,h),this.refresh()}setX(t){let s=this.x,h=this.y;this.x=t,this.drawing&&this.drawLine(s,h),this.refresh()}setY(t){let s=this.x,h=this.y;this.y=t,this.drawing&&this.drawLine(s,h),this.refresh()}goTo(t,s){let h=this.x,o=this.y;this.x=t,this.y=s,this.drawing&&this.drawLine(h,o),this.refresh()}changeX(t){let s=this.x,h=this.y;this.x+=t,this.drawing&&this.drawLine(s,h),this.refresh()}changeY(t){let s=this.x,h=this.y;this.y+=t,this.drawing&&this.drawLine(s,h),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var g=class extends n{content;color;fontFamily;fontSize;align;baseline;font;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.font=this.font,e.fillStyle=this.color,e.textAlign=this.align,e.textBaseline=this.baseline,e.fillText(this.content,0,0),e.restore()}setContent(t){this.content=t,this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.refresh()}setAlign(t){this.align=t,this.refresh()}setBaseline(t){this.baseline=t,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}`}};var f=class extends n{src;width;height;img;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.drawImage(this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),e.restore()}setSrc(t){this.src=t,this.refresh()}setWidth(t){this.width=t,this.refresh()}setHeight(t){this.height=t,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}};var F={Engine:l,Sprite:n,Rectangle:u,Oval:d,RegularPolygon:m,Pen:b,Text:g,ImageSprite:f,setScale:w,setAspectRatio:v,canvas:i,ctx:e},B=F;0&&(module.exports={Engine,ImageSprite,Oval,Pen,Rectangle,RegularPolygon,Sprite,Text,canvas,ctx,setAspectRatio,setScale});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/canvas.ts","../src/Sprite.ts","../src/Engine.ts","../src/Rectangle.ts","../src/Oval.ts","../src/RegularPolygon.ts","../src/Pen.ts","../src/Text.ts","../src/ImageSprite.ts"],"sourcesContent":["import Engine from './Engine.ts';\r\n\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport Rectangle, { type RectangleOptions } from './Rectangle.ts';\r\nimport Oval, { type OvalOptions } from './Oval.ts';\r\nimport RegularPolygon, { type RegularPolygonOptions } from './RegularPolygon.ts';\r\nimport Pen, { type PenOptions } from './Pen.ts';\r\nimport Text, { type TextOptions, type CanvasTextAlign, type CanvasTextBaseline } from './Text.ts';\r\nimport ImageSprite, { type ImageSpriteOptions } from './ImageSprite.ts';\r\n\r\nimport { setScale, setAspectRatio, canvas, ctx } from './canvas.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Sprites\r\n Rectangle,\r\n Oval,\r\n RegularPolygon,\r\n Pen,\r\n Text,\r\n ImageSprite,\r\n\r\n // Canvas\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};\r\n\r\nexport default TScratch;\r\nexport {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Sprites\r\n Rectangle,\r\n Oval,\r\n RegularPolygon,\r\n Pen,\r\n Text,\r\n ImageSprite,\r\n\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type OvalOptions,\r\n type RegularPolygonOptions,\r\n type PenOptions,\r\n type TextOptions,\r\n type ImageSpriteOptions,\r\n\r\n // Other types\r\n type CanvasTextAlign,\r\n type CanvasTextBaseline,\r\n \r\n // Canvas\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};","export const canvas = document.getElementById('game-window') as HTMLCanvasElement;\r\nexport const ctx = canvas.getContext('2d')!;\r\n\r\nexport const penCanvas = document.createElement('canvas');\r\nexport const penCtx = penCanvas.getContext('2d')!;\r\npenCanvas.id = 'pen-canvas';\r\n\r\nlet ratio: number = 16 / 9;\r\nlet scale: number;\r\n\r\nexport function setScale(newScale: number) {\r\n scale = newScale;\r\n\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = ratio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n ratio = newAspectRatio;\r\n\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = ratio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\ncanvas.parentElement?.insertBefore(penCanvas, canvas);\r\n\r\nsetScale(500);","import Engine from './Engine.ts';\r\n\r\nexport interface SpriteOptions {\r\n x?: number;\r\n y?: number;\r\n dir?: number;\r\n scene: string;\r\n};\r\n\r\nexport default abstract class Sprite {\r\n\r\n public x: number;\r\n public y: number;\r\n public dir: number;\r\n public scene: string;\r\n\r\n // Rendering\r\n\r\n public abstract draw(): void;\r\n\r\n protected refresh() {\r\n Engine.init().refresh();\r\n }\r\n\r\n constructor(options?: SpriteOptions) {\r\n this.x = options?.x ?? 0;\r\n this.y = options?.y ?? 0;\r\n this.dir = options?.dir ?? 0;\r\n this.scene = options?.scene ?? 'main';\r\n Engine.init().addSprite(this.scene, this);\r\n }\r\n\r\n // Helpers\r\n\r\n protected toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n protected toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Methods\r\n\r\n // Motion\r\n public move(steps: number) {\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n this.refresh();\r\n }\r\n\r\n public turn(deg: number) {\r\n this.dir += deg;\r\n this.refresh();\r\n }\r\n\r\n public point(dir: number) {\r\n this.dir = dir;\r\n this.refresh();\r\n }\r\n\r\n public setX(x: number) {\r\n this.x = x;\r\n this.refresh();\r\n }\r\n\r\n public setY(y: number) {\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public goTo(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public changeX(dX: number) {\r\n this.x += dX;\r\n this.refresh();\r\n }\r\n\r\n public changeY(dY: number) {\r\n this.y += dY;\r\n this.refresh();\r\n }\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\r\n\r\ntype GameLoop = (() => any) | (() => Promise<any>);\r\n\r\ntype SceneMap = {\r\n [sceneName: string]: {\r\n sprites: Sprite[];\r\n loop: GameLoop | null;\r\n };\r\n};\r\n\r\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private updateInterval: number | undefined;\r\n public gameLoop: GameLoop | null = null;\r\n public maxFPS: number = 24;\r\n\r\n public mouseX: number = 0;\r\n public mouseY: number = 0;\r\n\r\n public currentScene: string = 'main';\r\n public sceneMap: SceneMap = {};\r\n\r\n // Singleton initialization\r\n\r\n public static init() {\r\n if (!this.instance)\r\n this.instance = new Engine();\r\n\r\n return this.instance;\r\n }\r\n\r\n // Change the scene\r\n\r\n public changeScene(scene: string) {\r\n if (!this.sceneMap[scene])\r\n this.sceneMap[scene] = { sprites: [], loop: null };\r\n\r\n this.currentScene = scene;\r\n this.gameLoop = this.sceneMap[scene].loop;\r\n this.setMaxFramesPerSecond(this.maxFPS); // Update the interval function\r\n }\r\n\r\n // Set a loop\r\n\r\n public setLoop(scene: string, loop: GameLoop) {\r\n if (!this.sceneMap[scene]) {\r\n this.sceneMap[scene] = { sprites: [], loop };\r\n return;\r\n }\r\n\r\n this.sceneMap[scene].loop = loop;\r\n }\r\n\r\n // Internal\r\n\r\n public addSprite(scene: string, sprite: Sprite) {\r\n if (!this.sceneMap[scene]) {\r\n this.sceneMap[scene] = { sprites: [sprite], loop: null };\r\n return;\r\n }\r\n\r\n this.sceneMap[scene].sprites.push(sprite);\r\n }\r\n\r\n public setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n \r\n let loop = this.gameLoop;\r\n if (!loop) return;\r\n\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = setInterval(() => loop(), 1000 / this.maxFPS);\r\n }\r\n\r\n public refresh() {\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n this.sceneMap[this.currentScene]?.sprites.forEach(sprite => sprite.draw());\r\n }\r\n\r\n // Wait function\r\n\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n // Helpers\r\n\r\n public toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Private constructor\r\n\r\n private constructor() {\r\n this.setMaxFramesPerSecond(24);\r\n\r\n canvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - canvas.offsetLeft - canvas.width / 2;\r\n this.mouseY = -(e.clientY - canvas.offsetTop - canvas.height / 2);\r\n });\r\n }\r\n}","import Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { ctx, canvas } from './canvas.ts';\r\n\r\nexport interface RectangleOptions extends SpriteOptions {\r\n width?: number;\r\n height?: number;\r\n color?: string;\r\n};\r\n\r\nexport default class Rectangle extends Sprite {\r\n\r\n public width: number;\r\n public height: number;\r\n public color: string;\r\n\r\n public draw(): void {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fillRect(\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width,\r\n this.height\r\n );\r\n\r\n ctx.restore();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RectangleOptions) {\r\n super(options);\r\n this.width = options?.width ?? 50;\r\n this.height = options?.height ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { canvas, ctx } from './canvas.ts';\r\n\r\nexport interface OvalOptions extends SpriteOptions {\r\n radA?: number;\r\n radB?: number;\r\n color?: string;\r\n};\r\n\r\nexport default class Oval extends Sprite {\r\n\r\n public radA: number;\r\n public radB: number;\r\n public color: string;\r\n\r\n public draw(): void {\r\n const rotation = this.toRadians(this.dir);\r\n \r\n ctx.beginPath();\r\n ctx.ellipse(\r\n this.x + canvas.width / 2,\r\n -this.y + canvas.height / 2,\r\n this.radA,\r\n this.radB,\r\n rotation, 0,\r\n Math.PI * 2\r\n );\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fill();\r\n }\r\n\r\n public setRadA(radA: number) {\r\n this.radA = radA;\r\n this.refresh();\r\n }\r\n\r\n public setRadB(radB: number) {\r\n this.radB = radB;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: OvalOptions) {\r\n super(options);\r\n this.radA = options?.radA ?? 25;\r\n this.radB = options?.radB ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface RegularPolygonOptions extends SpriteOptions {\r\n sides?: number;\r\n radius?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class RegularPolygon extends Sprite {\r\n\r\n public sides: number;\r\n public radius: number;\r\n public color: string;\r\n\r\n public draw() {\r\n const r = this.radius;\r\n const step = (Math.PI * 2) / this.sides;\r\n const cx = canvas.width / 2;\r\n const cy = canvas.height / 2;\r\n\r\n const rotation = this.toRadians(this.dir);\r\n\r\n ctx.beginPath();\r\n for (let i = 0; i < this.sides; i++) {\r\n const theta = i * step - Math.PI / 2 + rotation;\r\n const px = cx + this.x + r * Math.cos(theta);\r\n const py = cy - this.y - r * Math.sin(theta);\r\n\r\n if (i === 0) ctx.moveTo(px, py);\r\n else ctx.lineTo(px, py);\r\n }\r\n ctx.closePath();\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fill();\r\n }\r\n\r\n public setSides(sides: number) {\r\n this.sides = sides;\r\n this.refresh();\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RegularPolygonOptions) {\r\n super(options);\r\n this.sides = options?.sides ?? 5;\r\n this.radius = options?.radius ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, penCtx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface PenOptions extends SpriteOptions {\r\n drawing?: boolean;\r\n size?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class Pen extends Sprite {\r\n\r\n public drawing: boolean;\r\n public size: number;\r\n public color: string;\r\n\r\n draw() {}\r\n\r\n public up() {\r\n this.drawing = false;\r\n }\r\n\r\n public down() {\r\n this.drawing = true;\r\n }\r\n\r\n public ereaseAll() {\r\n penCtx.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n public dot() {\r\n penCtx.fillStyle = this.color;\r\n penCtx.fillRect(\r\n this.x - this.size / 2 + canvas.width / 2,\r\n -this.y - this.size / 2 + canvas.height / 2,\r\n this.size,\r\n this.size\r\n );\r\n }\r\n\r\n private drawLine(lastX: number, lastY: number) {\r\n penCtx.beginPath();\r\n\r\n penCtx.moveTo(lastX + canvas.width / 2, -lastY + canvas.height / 2);\r\n penCtx.lineTo(this.x + canvas.width / 2, -this.y + canvas.height / 2);\r\n\r\n penCtx.lineWidth = this.size;\r\n penCtx.strokeStyle = this.color;\r\n penCtx.stroke();\r\n }\r\n\r\n // Overriding methods to include drawing\r\n\r\n public override move(steps: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setX(x: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setY(y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override goTo(x: number, y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeX(dX: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += dX;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeY(dY: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y += dY;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: PenOptions) {\r\n super(options);\r\n this.drawing = options?.drawing ?? false;\r\n this.size = options?.size ?? 5;\r\n this.color = options?.color ?? 'black';\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport type CanvasTextAlign =\r\n | 'left'\r\n | 'right'\r\n | 'center'\r\n | 'start'\r\n | 'end';\r\n\r\nexport type CanvasTextBaseline =\r\n | 'top'\r\n | 'hanging'\r\n | 'middle'\r\n | 'alphabetic'\r\n | 'ideographic'\r\n | 'bottom';\r\n\r\nexport interface TextOptions extends SpriteOptions {\r\n content?: string;\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n align?: CanvasTextAlign;\r\n baseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport default class Text extends Sprite {\r\n\r\n public content: string;\r\n public color: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n public align: CanvasTextAlign;\r\n public baseline: CanvasTextBaseline;\r\n\r\n private font: string;\r\n\r\n public draw() {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.font = this.font;\r\n ctx.fillStyle = this.color;\r\n ctx.textAlign = this.align;\r\n ctx.textBaseline = this.baseline;\r\n\r\n ctx.fillText(this.content, 0, 0);\r\n\r\n ctx.restore();\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string) {\r\n this.content = content;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.refresh();\r\n }\r\n\r\n public setAlign(align: CanvasTextAlign) {\r\n this.align = align;\r\n this.refresh();\r\n }\r\n\r\n public setBaseline(baseline: CanvasTextBaseline) {\r\n this.baseline = baseline;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.color = options?.color ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n this.align = options?.align ?? 'center';\r\n this.baseline = options?.baseline ?? 'middle';\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n }\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface ImageSpriteOptions extends SpriteOptions {\r\n src?: string;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nexport default class ImageSprite extends Sprite {\r\n\r\n public src: string;\r\n public width: number;\r\n public height: number;\r\n\r\n protected img: HTMLImageElement;\r\n\r\n public draw() {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.drawImage(\r\n this.img,\r\n 0, 0,\r\n this.img.width,\r\n this.img.height,\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width, this.height\r\n );\r\n\r\n ctx.restore();\r\n }\r\n\r\n // Methods\r\n\r\n public setSrc(src: string) {\r\n this.src = src;\r\n this.refresh();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ImageSpriteOptions) {\r\n super(options);\r\n\r\n this.src = options?.src ?? '';\r\n this.img = new Image();\r\n this.img.src = this.src;\r\n\r\n this.width = options?.width ?? this.img.width;\r\n this.height = options?.height ?? this.img.height;\r\n }\r\n}"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,YAAAE,EAAA,gBAAAC,EAAA,SAAAC,EAAA,QAAAC,EAAA,cAAAC,EAAA,mBAAAC,EAAA,WAAAC,EAAA,SAAAC,EAAA,WAAAC,EAAA,QAAAC,EAAA,YAAAC,EAAA,mBAAAC,EAAA,aAAAC,IAAA,eAAAC,EAAAf,GCAO,IAAMgB,EAAS,SAAS,eAAe,aAAa,EAC9CC,EAAMD,EAAO,WAAW,IAAI,EAE5BE,EAAY,SAAS,cAAc,QAAQ,EAC3CC,EAASD,EAAU,WAAW,IAAI,EAC/CA,EAAU,GAAK,aAEf,IAAIE,EAAgB,GAAK,EACrBC,EAEG,SAASC,EAASC,EAAkB,CACvCF,EAAQE,EAERP,EAAO,MAAQI,EAAQC,EACvBL,EAAO,OAASK,EAEhBH,EAAU,MAAQE,EAAQC,EAC1BH,EAAU,OAASG,CACvB,CAEO,SAASG,EAAeC,EAAwB,CACnDL,EAAQK,EAERT,EAAO,MAAQI,EAAQC,EACvBL,EAAO,OAASK,EAEhBH,EAAU,MAAQE,EAAQC,EAC1BH,EAAU,OAASG,CACvB,CAEAL,EAAO,eAAe,aAAaE,EAAWF,CAAM,EAEpDM,EAAS,GAAG,ECvBZ,IAA8BI,EAA9B,KAAqC,CAE1B,EACA,EACA,IACA,MAMG,SAAU,CAChBC,EAAO,KAAK,EAAE,QAAQ,CAC1B,CAEA,YAAYC,EAAyB,CACjC,KAAK,EAAIA,GAAS,GAAK,EACvB,KAAK,EAAIA,GAAS,GAAK,EACvB,KAAK,IAAMA,GAAS,KAAO,EAC3B,KAAK,MAAQA,GAAS,OAAS,OAC/BD,EAAO,KAAK,EAAE,UAAU,KAAK,MAAO,IAAI,CAC5C,CAIU,UAAUE,EAAa,CAC7B,OAAOA,EAAM,KAAK,GAAK,GAC3B,CAEU,UAAUC,EAAa,CAC7B,OAAOA,EAAM,IAAM,KAAK,EAC5B,CAKO,KAAKC,EAAe,CACvB,KAAK,GAAKA,EAAQ,KAAK,IAAI,KAAK,UAAU,KAAK,GAAG,CAAC,EACnD,KAAK,GAAKA,EAAQ,KAAK,IAAI,KAAK,UAAU,KAAK,GAAG,CAAC,EACnD,KAAK,QAAQ,CACjB,CAEO,KAAKF,EAAa,CACrB,KAAK,KAAOA,EACZ,KAAK,QAAQ,CACjB,CAEO,MAAMG,EAAa,CACtB,KAAK,IAAMA,EACX,KAAK,QAAQ,CACjB,CAEO,KAAKC,EAAW,CACnB,KAAK,EAAIA,EACT,KAAK,QAAQ,CACjB,CAEO,KAAKC,EAAW,CACnB,KAAK,EAAIA,EACT,KAAK,QAAQ,CACjB,CAEO,KAAKD,EAAWC,EAAW,CAC9B,KAAK,EAAID,EACT,KAAK,EAAIC,EACT,KAAK,QAAQ,CACjB,CAEO,QAAQC,EAAY,CACvB,KAAK,GAAKA,EACV,KAAK,QAAQ,CACjB,CAEO,QAAQC,EAAY,CACvB,KAAK,GAAKA,EACV,KAAK,QAAQ,CACjB,CACJ,EC1EA,IAAqBC,EAArB,MAAqBC,CAAO,CAExB,OAAe,SAEP,eACD,SAA4B,KAC5B,OAAiB,GAEjB,OAAiB,EACjB,OAAiB,EAEjB,aAAuB,OACvB,SAAqB,CAAC,EAI7B,OAAc,MAAO,CACjB,OAAK,KAAK,WACN,KAAK,SAAW,IAAIA,GAEjB,KAAK,QAChB,CAIO,YAAYC,EAAe,CACzB,KAAK,SAASA,CAAK,IACpB,KAAK,SAASA,CAAK,EAAI,CAAE,QAAS,CAAC,EAAG,KAAM,IAAK,GAErD,KAAK,aAAeA,EACpB,KAAK,SAAW,KAAK,SAASA,CAAK,EAAE,KACrC,KAAK,sBAAsB,KAAK,MAAM,CAC1C,CAIO,QAAQA,EAAeC,EAAgB,CAC1C,GAAI,CAAC,KAAK,SAASD,CAAK,EAAG,CACvB,KAAK,SAASA,CAAK,EAAI,CAAE,QAAS,CAAC,EAAG,KAAAC,CAAK,EAC3C,MACJ,CAEA,KAAK,SAASD,CAAK,EAAE,KAAOC,CAChC,CAIO,UAAUD,EAAeE,EAAgB,CAC5C,GAAI,CAAC,KAAK,SAASF,CAAK,EAAG,CACvB,KAAK,SAASA,CAAK,EAAI,CAAE,QAAS,CAACE,CAAM,EAAG,KAAM,IAAK,EACvD,MACJ,CAEA,KAAK,SAASF,CAAK,EAAE,QAAQ,KAAKE,CAAM,CAC5C,CAEO,sBAAsBC,EAAgB,CACzC,KAAK,OAASA,EAEd,IAAIF,EAAO,KAAK,SACXA,IAEL,cAAc,KAAK,cAAc,EACjC,KAAK,eAAiB,YAAY,IAAMA,EAAK,EAAG,IAAO,KAAK,MAAM,EACtE,CAEO,SAAU,CACbG,EAAI,UAAU,EAAG,EAAGC,EAAO,MAAOA,EAAO,MAAM,EAC/C,KAAK,SAAS,KAAK,YAAY,GAAG,QAAQ,QAAQH,GAAUA,EAAO,KAAK,CAAC,CAC7E,CAIA,MAAa,KAAKI,EAA2B,CACzC,OAAO,IAAI,QAAQC,GAAW,WAAWA,EAASD,CAAE,CAAC,CACzD,CAIO,UAAUE,EAAa,CAC1B,OAAOA,EAAM,KAAK,GAAK,GAC3B,CAEO,UAAUC,EAAa,CAC1B,OAAOA,EAAM,IAAM,KAAK,EAC5B,CAIQ,aAAc,CAClB,KAAK,sBAAsB,EAAE,EAE7BJ,EAAO,iBAAiB,YAAaK,GAAK,CACtC,KAAK,OAASA,EAAE,QAAUL,EAAO,WAAaA,EAAO,MAAQ,EAC7D,KAAK,OAAS,EAAEK,EAAE,QAAUL,EAAO,UAAYA,EAAO,OAAS,EACnE,CAAC,CACL,CACJ,ECpGA,IAAqBM,EAArB,cAAuCC,CAAO,CAEnC,MACA,OACA,MAEA,MAAa,CAChBC,EAAI,KAAK,EAET,IAAMC,EAAK,KAAK,EAAIC,EAAO,MAAQ,EAC7BC,EAAK,CAAC,KAAK,EAAID,EAAO,OAAS,EACrCF,EAAI,UAAUC,EAAIE,CAAE,EAEpBH,EAAI,OAAO,KAAK,UAAU,KAAK,GAAG,CAAC,EAEnCA,EAAI,UAAY,KAAK,MACrBA,EAAI,SACA,CAAC,KAAK,MAAQ,EACd,CAAC,KAAK,OAAS,EACf,KAAK,MACL,KAAK,MACT,EAEAA,EAAI,QAAQ,CAChB,CAEO,SAASI,EAAe,CAC3B,KAAK,MAAQA,EACb,KAAK,QAAQ,CACjB,CAEO,UAAUC,EAAgB,CAC7B,KAAK,OAASA,EACd,KAAK,QAAQ,CACjB,CAEO,SAASC,EAAe,CAC3B,KAAK,MAAQA,EACb,KAAK,QAAQ,CACjB,CAEA,YAAYC,EAA4B,CACpC,MAAMA,CAAO,EACb,KAAK,MAAQA,GAAS,OAAS,GAC/B,KAAK,OAASA,GAAS,QAAU,GACjC,KAAK,MAAQA,GAAS,OAAS,QAC/B,KAAK,KAAK,CACd,CAEJ,ECjDA,IAAqBC,EAArB,cAAkCC,CAAO,CAE9B,KACA,KACA,MAEA,MAAa,CAChB,IAAMC,EAAW,KAAK,UAAU,KAAK,GAAG,EAExCC,EAAI,UAAU,EACdA,EAAI,QACA,KAAK,EAAIC,EAAO,MAAQ,EACxB,CAAC,KAAK,EAAIA,EAAO,OAAS,EAC1B,KAAK,KACL,KAAK,KACLF,EAAU,EACV,KAAK,GAAK,CACd,EAEAC,EAAI,UAAY,KAAK,MACrBA,EAAI,KAAK,CACb,CAEO,QAAQE,EAAc,CACzB,KAAK,KAAOA,EACZ,KAAK,QAAQ,CACjB,CAEO,QAAQC,EAAc,CACzB,KAAK,KAAOA,EACZ,KAAK,QAAQ,CACjB,CAEO,SAASC,EAAe,CAC3B,KAAK,MAAQA,EACb,KAAK,QAAQ,CACjB,CAEA,YAAYC,EAAuB,CAC/B,MAAMA,CAAO,EACb,KAAK,KAAOA,GAAS,MAAQ,GAC7B,KAAK,KAAOA,GAAS,MAAQ,GAC7B,KAAK,MAAQA,GAAS,OAAS,QAC/B,KAAK,KAAK,CACd,CAEJ,EC9CA,IAAqBC,EAArB,cAA4CC,CAAO,CAExC,MACA,OACA,MAEA,MAAO,CACV,IAAMC,EAAI,KAAK,OACTC,EAAQ,KAAK,GAAK,EAAK,KAAK,MAC5BC,EAAKC,EAAO,MAAQ,EACpBC,EAAKD,EAAO,OAAS,EAErBE,EAAW,KAAK,UAAU,KAAK,GAAG,EAExCC,EAAI,UAAU,EACd,QAASC,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAK,CACjC,IAAMC,EAAQD,EAAIN,EAAO,KAAK,GAAK,EAAII,EACjCI,EAAKP,EAAK,KAAK,EAAIF,EAAI,KAAK,IAAIQ,CAAK,EACrCE,EAAKN,EAAK,KAAK,EAAIJ,EAAI,KAAK,IAAIQ,CAAK,EAEvCD,IAAM,EAAGD,EAAI,OAAOG,EAAIC,CAAE,EACzBJ,EAAI,OAAOG,EAAIC,CAAE,CAC1B,CACAJ,EAAI,UAAU,EAEdA,EAAI,UAAY,KAAK,MACrBA,EAAI,KAAK,CACb,CAEO,SAASK,EAAe,CAC3B,KAAK,MAAQA,EACb,KAAK,QAAQ,CACjB,CAEO,UAAUC,EAAgB,CAC7B,KAAK,OAASA,EACd,KAAK,QAAQ,CACjB,CAEO,SAASC,EAAe,CAC3B,KAAK,MAAQA,EACb,KAAK,QAAQ,CACjB,CAEA,YAAYC,EAAiC,CACzC,MAAMA,CAAO,EACb,KAAK,MAAQA,GAAS,OAAS,EAC/B,KAAK,OAASA,GAAS,QAAU,GACjC,KAAK,MAAQA,GAAS,OAAS,QAC/B,KAAK,KAAK,CACd,CAEJ,ECpDA,IAAqBC,EAArB,cAAiCC,CAAO,CAE7B,QACA,KACA,MAEP,MAAO,CAAC,CAED,IAAK,CACR,KAAK,QAAU,EACnB,CAEO,MAAO,CACV,KAAK,QAAU,EACnB,CAEO,WAAY,CACfC,EAAO,UAAU,EAAG,EAAGC,EAAO,MAAOA,EAAO,MAAM,CACtD,CAEO,KAAM,CACTD,EAAO,UAAY,KAAK,MACxBA,EAAO,SACH,KAAK,EAAI,KAAK,KAAO,EAAIC,EAAO,MAAQ,EACxC,CAAC,KAAK,EAAI,KAAK,KAAO,EAAIA,EAAO,OAAS,EAC1C,KAAK,KACL,KAAK,IACT,CACJ,CAEQ,SAASC,EAAeC,EAAe,CAC3CH,EAAO,UAAU,EAEjBA,EAAO,OAAOE,EAAQD,EAAO,MAAQ,EAAG,CAACE,EAAQF,EAAO,OAAS,CAAC,EAClED,EAAO,OAAO,KAAK,EAAIC,EAAO,MAAQ,EAAG,CAAC,KAAK,EAAIA,EAAO,OAAS,CAAC,EAEpED,EAAO,UAAY,KAAK,KACxBA,EAAO,YAAc,KAAK,MAC1BA,EAAO,OAAO,CAClB,CAIgB,KAAKI,EAAe,CAChC,IAAMF,EAAQ,KAAK,EACbC,EAAQ,KAAK,EAEnB,KAAK,GAAKC,EAAQ,KAAK,IAAI,KAAK,UAAU,KAAK,GAAG,CAAC,EACnD,KAAK,GAAKA,EAAQ,KAAK,IAAI,KAAK,UAAU,KAAK,GAAG,CAAC,EAC/C,KAAK,SACL,KAAK,SAASF,EAAOC,CAAK,EAC9B,KAAK,QAAQ,CACjB,CAEgB,KAAKE,EAAW,CAC5B,IAAMH,EAAQ,KAAK,EACbC,EAAQ,KAAK,EAEnB,KAAK,EAAIE,EACL,KAAK,SACL,KAAK,SAASH,EAAOC,CAAK,EAC9B,KAAK,QAAQ,CACjB,CAEgB,KAAKG,EAAW,CAC5B,IAAMJ,EAAQ,KAAK,EACbC,EAAQ,KAAK,EAEnB,KAAK,EAAIG,EACL,KAAK,SACL,KAAK,SAASJ,EAAOC,CAAK,EAC9B,KAAK,QAAQ,CACjB,CAEgB,KAAKE,EAAWC,EAAW,CACvC,IAAMJ,EAAQ,KAAK,EACbC,EAAQ,KAAK,EAEnB,KAAK,EAAIE,EACT,KAAK,EAAIC,EACL,KAAK,SACL,KAAK,SAASJ,EAAOC,CAAK,EAC9B,KAAK,QAAQ,CACjB,CAEgB,QAAQI,EAAY,CAChC,IAAML,EAAQ,KAAK,EACbC,EAAQ,KAAK,EAEnB,KAAK,GAAKI,EACN,KAAK,SACL,KAAK,SAASL,EAAOC,CAAK,EAC9B,KAAK,QAAQ,CACjB,CAEgB,QAAQK,EAAY,CAChC,IAAMN,EAAQ,KAAK,EACbC,EAAQ,KAAK,EAEnB,KAAK,GAAKK,EACN,KAAK,SACL,KAAK,SAASN,EAAOC,CAAK,EAC9B,KAAK,QAAQ,CACjB,CAIA,YAAYM,EAAsB,CAC9B,MAAMA,CAAO,EACb,KAAK,QAAUA,GAAS,SAAW,GACnC,KAAK,KAAOA,GAAS,MAAQ,EAC7B,KAAK,MAAQA,GAAS,OAAS,OACnC,CAEJ,EChGA,IAAqBC,EAArB,cAAkCC,CAAO,CAE9B,QACA,MACA,WACA,SACA,MACA,SAEC,KAED,MAAO,CACVC,EAAI,KAAK,EAET,IAAMC,EAAK,KAAK,EAAIC,EAAO,MAAQ,EAC7BC,EAAK,CAAC,KAAK,EAAID,EAAO,OAAS,EACrCF,EAAI,UAAUC,EAAIE,CAAE,EAEpBH,EAAI,OAAO,KAAK,UAAU,KAAK,GAAG,CAAC,EAEnCA,EAAI,KAAO,KAAK,KAChBA,EAAI,UAAY,KAAK,MACrBA,EAAI,UAAY,KAAK,MACrBA,EAAI,aAAe,KAAK,SAExBA,EAAI,SAAS,KAAK,QAAS,EAAG,CAAC,EAE/BA,EAAI,QAAQ,CAChB,CAIO,WAAWI,EAAiB,CAC/B,KAAK,QAAUA,EACf,KAAK,QAAQ,CACjB,CAEO,SAASC,EAAe,CAC3B,KAAK,MAAQA,EACb,KAAK,QAAQ,CACjB,CAEO,YAAYC,EAAkB,CACjC,KAAK,SAAWA,EAChB,KAAK,KAAO,GAAG,KAAK,QAAQ,MAAM,KAAK,UAAU,GACjD,KAAK,QAAQ,CACjB,CAEO,cAAcC,EAAoB,CACrC,KAAK,WAAaA,EAClB,KAAK,KAAO,GAAG,KAAK,QAAQ,MAAM,KAAK,UAAU,GACjD,KAAK,QAAQ,CACjB,CAEO,SAASC,EAAwB,CACpC,KAAK,MAAQA,EACb,KAAK,QAAQ,CACjB,CAEO,YAAYC,EAA8B,CAC7C,KAAK,SAAWA,EAChB,KAAK,QAAQ,CACjB,CAIA,YAAYC,EAAuB,CAC/B,MAAMA,CAAO,EAEb,KAAK,QAAUA,GAAS,SAAW,GACnC,KAAK,MAAQA,GAAS,OAAS,QAC/B,KAAK,WAAaA,GAAS,YAAc,QACzC,KAAK,SAAWA,GAAS,UAAY,GACrC,KAAK,MAAQA,GAAS,OAAS,SAC/B,KAAK,SAAWA,GAAS,UAAY,SAErC,KAAK,KAAO,GAAG,KAAK,QAAQ,MAAM,KAAK,UAAU,EACrD,CACJ,EChGA,IAAqBC,EAArB,cAAyCC,CAAO,CAErC,IACA,MACA,OAEG,IAEH,MAAO,CACVC,EAAI,KAAK,EAET,IAAMC,EAAK,KAAK,EAAIC,EAAO,MAAQ,EAC7BC,EAAK,CAAC,KAAK,EAAID,EAAO,OAAS,EACrCF,EAAI,UAAUC,EAAIE,CAAE,EAEpBH,EAAI,OAAO,KAAK,UAAU,KAAK,GAAG,CAAC,EAEnCA,EAAI,UACA,KAAK,IACL,EAAG,EACH,KAAK,IAAI,MACT,KAAK,IAAI,OACT,CAAC,KAAK,MAAQ,EACd,CAAC,KAAK,OAAS,EACf,KAAK,MAAO,KAAK,MACrB,EAEAA,EAAI,QAAQ,CAChB,CAIO,OAAOI,EAAa,CACvB,KAAK,IAAMA,EACX,KAAK,QAAQ,CACjB,CAEO,SAASC,EAAe,CAC3B,KAAK,MAAQA,EACb,KAAK,QAAQ,CACjB,CAEO,UAAUC,EAAgB,CAC7B,KAAK,OAASA,EACd,KAAK,QAAQ,CACjB,CAIA,YAAYC,EAA8B,CACtC,MAAMA,CAAO,EAEb,KAAK,IAAMA,GAAS,KAAO,GAC3B,KAAK,IAAM,IAAI,MACf,KAAK,IAAI,IAAM,KAAK,IAEpB,KAAK,MAAQA,GAAS,OAAS,KAAK,IAAI,MACxC,KAAK,OAASA,GAAS,QAAU,KAAK,IAAI,MAC9C,CACJ,ETxDA,IAAMC,EAAW,CAEb,OAAAC,EACA,OAAAC,EAGA,UAAAC,EACA,KAAAC,EACA,eAAAC,EACA,IAAAC,EACA,KAAAC,EACA,YAAAC,EAGA,SAAAC,EACA,eAAAC,EACA,OAAAC,EACA,IAAAC,CACJ,EAEOC,EAAQb","names":["index_exports","__export","Engine","ImageSprite","Oval","Pen","Rectangle","RegularPolygon","Sprite","Text","canvas","ctx","index_default","setAspectRatio","setScale","__toCommonJS","canvas","ctx","penCanvas","penCtx","ratio","scale","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","Engine","options","deg","rad","steps","dir","x","y","dX","dY","Engine","_Engine","scene","loop","sprite","maxFPS","ctx","canvas","ms","resolve","deg","rad","e","Rectangle","Sprite","ctx","cX","canvas","cY","width","height","color","options","Oval","Sprite","rotation","ctx","canvas","radA","radB","color","options","RegularPolygon","Sprite","r","step","cx","canvas","cy","rotation","ctx","i","theta","px","py","sides","radius","color","options","Pen","Sprite","penCtx","canvas","lastX","lastY","steps","x","y","dX","dY","options","Text","Sprite","ctx","cX","canvas","cY","content","color","fontSize","fontFamily","align","baseline","options","ImageSprite","Sprite","ctx","cX","canvas","cY","src","width","height","options","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","Pen","Text","ImageSprite","setScale","setAspectRatio","canvas","ctx","index_default"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/canvas.ts","../src/Sprite.ts","../src/Engine.ts","../src/Rectangle.ts","../src/Oval.ts","../src/RegularPolygon.ts","../src/Pen.ts","../src/Text.ts","../src/ImageSprite.ts"],"sourcesContent":["import Engine from './Engine.ts';\r\n\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport Rectangle, { type RectangleOptions } from './Rectangle.ts';\r\nimport Oval, { type OvalOptions } from './Oval.ts';\r\nimport RegularPolygon, { type RegularPolygonOptions } from './RegularPolygon.ts';\r\nimport Pen, { type PenOptions } from './Pen.ts';\r\nimport Text, { type TextOptions, type CanvasTextAlign, type CanvasTextBaseline } from './Text.ts';\r\nimport ImageSprite, { type ImageSpriteOptions } from './ImageSprite.ts';\r\n\r\nimport { setScale, setAspectRatio, canvas, ctx } from './canvas.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Sprites\r\n Rectangle,\r\n Oval,\r\n RegularPolygon,\r\n Pen,\r\n Text,\r\n ImageSprite,\r\n\r\n // Canvas\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};\r\n\r\nexport default TScratch;\r\nexport {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Sprites\r\n Rectangle,\r\n Oval,\r\n RegularPolygon,\r\n Pen,\r\n Text,\r\n ImageSprite,\r\n\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type OvalOptions,\r\n type RegularPolygonOptions,\r\n type PenOptions,\r\n type TextOptions,\r\n type ImageSpriteOptions,\r\n\r\n // Other types\r\n type CanvasTextAlign,\r\n type CanvasTextBaseline,\r\n \r\n // Canvas\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};","export const canvas = document.getElementById('game-window') as HTMLCanvasElement;\r\nexport const ctx = canvas.getContext('2d')!;\r\n\r\nexport const penCanvas = document.createElement('canvas');\r\nexport const penCtx = penCanvas.getContext('2d')!;\r\npenCanvas.id = 'pen-canvas';\r\n\r\nlet ratio: number = 16 / 9;\r\nlet scale: number;\r\n\r\nexport function setScale(newScale: number) {\r\n scale = newScale;\r\n\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = ratio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n ratio = newAspectRatio;\r\n\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = ratio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\ncanvas.parentElement?.insertBefore(penCanvas, canvas);\r\n\r\nsetScale(500);","import Engine from './Engine.ts';\r\n\r\nexport interface SpriteOptions {\r\n x?: number;\r\n y?: number;\r\n dir?: number;\r\n scene?: string;\r\n};\r\n\r\nexport default abstract class Sprite {\r\n\r\n public x: number;\r\n public y: number;\r\n public dir: number;\r\n public scene: string;\r\n\r\n // Rendering\r\n\r\n public abstract draw(): void;\r\n\r\n protected refresh() {\r\n Engine.init().refresh();\r\n }\r\n\r\n constructor(options?: SpriteOptions) {\r\n this.x = options?.x ?? 0;\r\n this.y = options?.y ?? 0;\r\n this.dir = options?.dir ?? 0;\r\n this.scene = options?.scene ?? 'main';\r\n Engine.init().addSprite(this.scene, this);\r\n }\r\n\r\n // Helpers\r\n\r\n protected toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n protected toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Methods\r\n\r\n // Motion\r\n public move(steps: number) {\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n this.refresh();\r\n }\r\n\r\n public turn(deg: number) {\r\n this.dir += deg;\r\n this.refresh();\r\n }\r\n\r\n public point(dir: number) {\r\n this.dir = dir;\r\n this.refresh();\r\n }\r\n\r\n public setX(x: number) {\r\n this.x = x;\r\n this.refresh();\r\n }\r\n\r\n public setY(y: number) {\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public goTo(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public changeX(dX: number) {\r\n this.x += dX;\r\n this.refresh();\r\n }\r\n\r\n public changeY(dY: number) {\r\n this.y += dY;\r\n this.refresh();\r\n }\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\r\n\r\ntype GameLoop = (() => any) | (() => Promise<any>);\r\n\r\ntype SceneMap = {\r\n [sceneName: string]: {\r\n sprites: Sprite[];\r\n loop: GameLoop | null;\r\n };\r\n};\r\n\r\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private updateInterval: number | undefined;\r\n public gameLoop: GameLoop | null = null;\r\n public maxFPS: number = 24;\r\n\r\n public mouseX: number = 0;\r\n public mouseY: number = 0;\r\n\r\n public currentScene: string = 'main';\r\n public sceneMap: SceneMap = {};\r\n\r\n // Singleton initialization\r\n\r\n public static init() {\r\n if (!this.instance)\r\n this.instance = new Engine();\r\n\r\n return this.instance;\r\n }\r\n\r\n // Change the scene\r\n\r\n public changeScene(scene: string) {\r\n if (!this.sceneMap[scene])\r\n this.sceneMap[scene] = { sprites: [], loop: null };\r\n\r\n this.currentScene = scene;\r\n this.gameLoop = this.sceneMap[scene].loop;\r\n this.setMaxFramesPerSecond(this.maxFPS); // Update the interval function\r\n }\r\n\r\n // Set a loop\r\n\r\n public setLoop(scene: string, loop: GameLoop) {\r\n if (!this.sceneMap[scene]) {\r\n this.sceneMap[scene] = { sprites: [], loop };\r\n if (scene === this.currentScene)\r\n this.changeScene(scene);\r\n return;\r\n }\r\n\r\n this.sceneMap[scene].loop = loop;\r\n if (scene === this.currentScene)\r\n this.changeScene(scene);\r\n }\r\n\r\n // Internal\r\n\r\n public addSprite(scene: string, sprite: Sprite) {\r\n if (!this.sceneMap[scene]) {\r\n this.sceneMap[scene] = { sprites: [sprite], loop: null };\r\n return;\r\n }\r\n\r\n this.sceneMap[scene].sprites.push(sprite);\r\n }\r\n\r\n public setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n \r\n let loop = this.gameLoop;\r\n if (!loop) return;\r\n\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = setInterval(() => loop(), 1000 / this.maxFPS);\r\n }\r\n\r\n public refresh() {\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n this.sceneMap[this.currentScene]?.sprites.forEach(sprite => sprite.draw());\r\n }\r\n\r\n // Wait function\r\n\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n // Helpers\r\n\r\n public toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Private constructor\r\n\r\n private constructor() {\r\n this.setMaxFramesPerSecond(24);\r\n\r\n canvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - canvas.offsetLeft - canvas.width / 2;\r\n this.mouseY = -(e.clientY - canvas.offsetTop - canvas.height / 2);\r\n });\r\n }\r\n}","import Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { ctx, canvas } from './canvas.ts';\r\n\r\nexport interface RectangleOptions extends SpriteOptions {\r\n width?: number;\r\n height?: number;\r\n color?: string;\r\n};\r\n\r\nexport default class Rectangle extends Sprite {\r\n\r\n public width: number;\r\n public height: number;\r\n public color: string;\r\n\r\n public draw(): void {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fillRect(\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width,\r\n this.height\r\n );\r\n\r\n ctx.restore();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RectangleOptions) {\r\n super(options);\r\n this.width = options?.width ?? 50;\r\n this.height = options?.height ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { canvas, ctx } from './canvas.ts';\r\n\r\nexport interface OvalOptions extends SpriteOptions {\r\n radA?: number;\r\n radB?: number;\r\n color?: string;\r\n};\r\n\r\nexport default class Oval extends Sprite {\r\n\r\n public radA: number;\r\n public radB: number;\r\n public color: string;\r\n\r\n public draw(): void {\r\n const rotation = this.toRadians(this.dir);\r\n \r\n ctx.beginPath();\r\n ctx.ellipse(\r\n this.x + canvas.width / 2,\r\n -this.y + canvas.height / 2,\r\n this.radA,\r\n this.radB,\r\n rotation, 0,\r\n Math.PI * 2\r\n );\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fill();\r\n }\r\n\r\n public setRadA(radA: number) {\r\n this.radA = radA;\r\n this.refresh();\r\n }\r\n\r\n public setRadB(radB: number) {\r\n this.radB = radB;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: OvalOptions) {\r\n super(options);\r\n this.radA = options?.radA ?? 25;\r\n this.radB = options?.radB ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface RegularPolygonOptions extends SpriteOptions {\r\n sides?: number;\r\n radius?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class RegularPolygon extends Sprite {\r\n\r\n public sides: number;\r\n public radius: number;\r\n public color: string;\r\n\r\n public draw() {\r\n const r = this.radius;\r\n const step = (Math.PI * 2) / this.sides;\r\n const cx = canvas.width / 2;\r\n const cy = canvas.height / 2;\r\n\r\n const rotation = this.toRadians(this.dir);\r\n\r\n ctx.beginPath();\r\n for (let i = 0; i < this.sides; i++) {\r\n const theta = i * step - Math.PI / 2 + rotation;\r\n const px = cx + this.x + r * Math.cos(theta);\r\n const py = cy - this.y - r * Math.sin(theta);\r\n\r\n if (i === 0) ctx.moveTo(px, py);\r\n else ctx.lineTo(px, py);\r\n }\r\n ctx.closePath();\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fill();\r\n }\r\n\r\n public setSides(sides: number) {\r\n this.sides = sides;\r\n this.refresh();\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RegularPolygonOptions) {\r\n super(options);\r\n this.sides = options?.sides ?? 5;\r\n this.radius = options?.radius ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, penCtx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface PenOptions extends SpriteOptions {\r\n drawing?: boolean;\r\n size?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class Pen extends Sprite {\r\n\r\n public drawing: boolean;\r\n public size: number;\r\n public color: string;\r\n\r\n draw() {}\r\n\r\n public up() {\r\n this.drawing = false;\r\n }\r\n\r\n public down() {\r\n this.drawing = true;\r\n }\r\n\r\n public ereaseAll() {\r\n penCtx.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n public dot() {\r\n penCtx.fillStyle = this.color;\r\n penCtx.fillRect(\r\n this.x - this.size / 2 + canvas.width / 2,\r\n -this.y - this.size / 2 + canvas.height / 2,\r\n this.size,\r\n this.size\r\n );\r\n }\r\n\r\n private drawLine(lastX: number, lastY: number) {\r\n penCtx.beginPath();\r\n\r\n penCtx.moveTo(lastX + canvas.width / 2, -lastY + canvas.height / 2);\r\n penCtx.lineTo(this.x + canvas.width / 2, -this.y + canvas.height / 2);\r\n\r\n penCtx.lineWidth = this.size;\r\n penCtx.strokeStyle = this.color;\r\n penCtx.stroke();\r\n }\r\n\r\n // Overriding methods to include drawing\r\n\r\n public override move(steps: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setX(x: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setY(y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override goTo(x: number, y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeX(dX: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += dX;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeY(dY: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y += dY;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: PenOptions) {\r\n super(options);\r\n this.drawing = options?.drawing ?? false;\r\n this.size = options?.size ?? 5;\r\n this.color = options?.color ?? 'black';\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport type CanvasTextAlign =\r\n | 'left'\r\n | 'right'\r\n | 'center'\r\n | 'start'\r\n | 'end';\r\n\r\nexport type CanvasTextBaseline =\r\n | 'top'\r\n | 'hanging'\r\n | 'middle'\r\n | 'alphabetic'\r\n | 'ideographic'\r\n | 'bottom';\r\n\r\nexport interface TextOptions extends SpriteOptions {\r\n content?: string;\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n align?: CanvasTextAlign;\r\n baseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport default class Text extends Sprite {\r\n\r\n public content: string;\r\n public color: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n public align: CanvasTextAlign;\r\n public baseline: CanvasTextBaseline;\r\n\r\n private font: string;\r\n\r\n public draw() {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.font = this.font;\r\n ctx.fillStyle = this.color;\r\n ctx.textAlign = this.align;\r\n ctx.textBaseline = this.baseline;\r\n\r\n ctx.fillText(this.content, 0, 0);\r\n\r\n ctx.restore();\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string) {\r\n this.content = content;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.refresh();\r\n }\r\n\r\n public setAlign(align: CanvasTextAlign) {\r\n this.align = align;\r\n this.refresh();\r\n }\r\n\r\n public setBaseline(baseline: CanvasTextBaseline) {\r\n this.baseline = baseline;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.color = options?.color ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n this.align = options?.align ?? 'center';\r\n this.baseline = options?.baseline ?? 'middle';\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n }\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface ImageSpriteOptions extends SpriteOptions {\r\n src?: string;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nexport default class ImageSprite extends Sprite {\r\n\r\n public src: string;\r\n public width: number;\r\n public height: number;\r\n\r\n protected img: HTMLImageElement;\r\n\r\n public draw() {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.drawImage(\r\n this.img,\r\n 0, 0,\r\n this.img.width,\r\n this.img.height,\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width, this.height\r\n );\r\n\r\n ctx.restore();\r\n }\r\n\r\n // Methods\r\n\r\n public setSrc(src: string) {\r\n this.src = src;\r\n this.refresh();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ImageSpriteOptions) {\r\n super(options);\r\n\r\n this.src = options?.src ?? '';\r\n this.img = new Image();\r\n this.img.src = this.src;\r\n\r\n this.width = options?.width ?? this.img.width;\r\n this.height = options?.height ?? this.img.height;\r\n }\r\n}"],"mappings":"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","names":["index_exports","__export","Engine","ImageSprite","Oval","Pen","Rectangle","RegularPolygon","Sprite","Text","canvas","ctx","index_default","setAspectRatio","setScale","__toCommonJS","canvas","ctx","penCanvas","penCtx","ratio","scale","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","Engine","options","deg","rad","steps","dir","x","y","dX","dY","Engine","_Engine","scene","loop","sprite","maxFPS","ctx","canvas","ms","resolve","deg","rad","e","Rectangle","Sprite","ctx","cX","canvas","cY","width","height","color","options","Oval","Sprite","rotation","ctx","canvas","radA","radB","color","options","RegularPolygon","Sprite","r","step","cx","canvas","cy","rotation","ctx","i","theta","px","py","sides","radius","color","options","Pen","Sprite","penCtx","canvas","lastX","lastY","steps","x","y","dX","dY","options","Text","Sprite","ctx","cX","canvas","cY","content","color","fontSize","fontFamily","align","baseline","options","ImageSprite","Sprite","ctx","cX","canvas","cY","src","width","height","options","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","Pen","Text","ImageSprite","setScale","setAspectRatio","canvas","ctx","index_default"]}
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ interface SpriteOptions {
2
2
  x?: number;
3
3
  y?: number;
4
4
  dir?: number;
5
- scene: string;
5
+ scene?: string;
6
6
  }
7
7
  declare abstract class Sprite {
8
8
  x: number;
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ interface SpriteOptions {
2
2
  x?: number;
3
3
  y?: number;
4
4
  dir?: number;
5
- scene: string;
5
+ scene?: string;
6
6
  }
7
7
  declare abstract class Sprite {
8
8
  x: number;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var i=document.getElementById("game-window"),e=i.getContext("2d"),l=document.createElement("canvas"),o=l.getContext("2d");l.id="pen-canvas";var p=16/9,a;function w(h){a=h,i.width=p*a,i.height=a,l.width=p*a,l.height=a}function M(h){p=h,i.width=p*a,i.height=a,l.width=p*a,l.height=a}i.parentElement?.insertBefore(l,i);w(500);var r=class{x;y;dir;scene;refresh(){c.init().refresh()}constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.dir=t?.dir??0,this.scene=t?.scene??"main",c.init().addSprite(this.scene,this)}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}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()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,s){this.x=t,this.y=s,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}};var c=class h{static instance;updateInterval;gameLoop=null;maxFPS=24;mouseX=0;mouseY=0;currentScene="main";sceneMap={};static init(){return this.instance||(this.instance=new h),this.instance}changeScene(t){this.sceneMap[t]||(this.sceneMap[t]={sprites:[],loop:null}),this.currentScene=t,this.gameLoop=this.sceneMap[t].loop,this.setMaxFramesPerSecond(this.maxFPS)}setLoop(t,s){if(!this.sceneMap[t]){this.sceneMap[t]={sprites:[],loop:s};return}this.sceneMap[t].loop=s}addSprite(t,s){if(!this.sceneMap[t]){this.sceneMap[t]={sprites:[s],loop:null};return}this.sceneMap[t].sprites.push(s)}setMaxFramesPerSecond(t){this.maxFPS=t;let s=this.gameLoop;s&&(clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>s(),1e3/this.maxFPS))}refresh(){e.clearRect(0,0,i.width,i.height),this.sceneMap[this.currentScene]?.sprites.forEach(t=>t.draw())}async wait(t){return new Promise(s=>setTimeout(s,t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24),i.addEventListener("mousemove",t=>{this.mouseX=t.clientX-i.offsetLeft-i.width/2,this.mouseY=-(t.clientY-i.offsetTop-i.height/2)})}};var u=class extends r{width;height;color;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height),e.restore()}setWidth(t){this.width=t,this.refresh()}setHeight(t){this.height=t,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.draw()}};var d=class extends r{radA;radB;color;draw(){let t=this.toRadians(this.dir);e.beginPath(),e.ellipse(this.x+i.width/2,-this.y+i.height/2,this.radA,this.radB,t,0,Math.PI*2),e.fillStyle=this.color,e.fill()}setRadA(t){this.radA=t,this.refresh()}setRadB(t){this.radB=t,this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radA=t?.radA??25,this.radB=t?.radB??25,this.color=t?.color??"black",this.draw()}};var m=class extends r{sides;radius;color;draw(){let t=this.radius,s=Math.PI*2/this.sides,n=i.width/2,y=i.height/2,P=this.toRadians(this.dir);e.beginPath();for(let x=0;x<this.sides;x++){let S=x*s-Math.PI/2+P,v=n+this.x+t*Math.cos(S),O=y-this.y-t*Math.sin(S);x===0?e.moveTo(v,O):e.lineTo(v,O)}e.closePath(),e.fillStyle=this.color,e.fill()}setSides(t){this.sides=t,this.refresh()}setRadius(t){this.radius=t,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.draw()}};var b=class extends r{drawing;size;color;draw(){}up(){this.drawing=!1}down(){this.drawing=!0}ereaseAll(){o.clearRect(0,0,i.width,i.height)}dot(){o.fillStyle=this.color,o.fillRect(this.x-this.size/2+i.width/2,-this.y-this.size/2+i.height/2,this.size,this.size)}drawLine(t,s){o.beginPath(),o.moveTo(t+i.width/2,-s+i.height/2),o.lineTo(this.x+i.width/2,-this.y+i.height/2),o.lineWidth=this.size,o.strokeStyle=this.color,o.stroke()}move(t){let s=this.x,n=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(s,n),this.refresh()}setX(t){let s=this.x,n=this.y;this.x=t,this.drawing&&this.drawLine(s,n),this.refresh()}setY(t){let s=this.x,n=this.y;this.y=t,this.drawing&&this.drawLine(s,n),this.refresh()}goTo(t,s){let n=this.x,y=this.y;this.x=t,this.y=s,this.drawing&&this.drawLine(n,y),this.refresh()}changeX(t){let s=this.x,n=this.y;this.x+=t,this.drawing&&this.drawLine(s,n),this.refresh()}changeY(t){let s=this.x,n=this.y;this.y+=t,this.drawing&&this.drawLine(s,n),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var g=class extends r{content;color;fontFamily;fontSize;align;baseline;font;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.font=this.font,e.fillStyle=this.color,e.textAlign=this.align,e.textBaseline=this.baseline,e.fillText(this.content,0,0),e.restore()}setContent(t){this.content=t,this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.refresh()}setAlign(t){this.align=t,this.refresh()}setBaseline(t){this.baseline=t,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}`}};var f=class extends r{src;width;height;img;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.drawImage(this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),e.restore()}setSrc(t){this.src=t,this.refresh()}setWidth(t){this.width=t,this.refresh()}setHeight(t){this.height=t,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}};var R={Engine:c,Sprite:r,Rectangle:u,Oval:d,RegularPolygon:m,Pen:b,Text:g,ImageSprite:f,setScale:w,setAspectRatio:M,canvas:i,ctx:e},ot=R;export{c as Engine,f as ImageSprite,d as Oval,b as Pen,u as Rectangle,m as RegularPolygon,r as Sprite,g as Text,i as canvas,e as ctx,ot as default,M as setAspectRatio,w as setScale};
1
+ var i=document.getElementById("game-window"),e=i.getContext("2d"),l=document.createElement("canvas"),a=l.getContext("2d");l.id="pen-canvas";var p=16/9,o;function w(h){o=h,i.width=p*o,i.height=o,l.width=p*o,l.height=o}function M(h){p=h,i.width=p*o,i.height=o,l.width=p*o,l.height=o}i.parentElement?.insertBefore(l,i);w(500);var r=class{x;y;dir;scene;refresh(){c.init().refresh()}constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.dir=t?.dir??0,this.scene=t?.scene??"main",c.init().addSprite(this.scene,this)}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}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()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,s){this.x=t,this.y=s,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}};var c=class h{static instance;updateInterval;gameLoop=null;maxFPS=24;mouseX=0;mouseY=0;currentScene="main";sceneMap={};static init(){return this.instance||(this.instance=new h),this.instance}changeScene(t){this.sceneMap[t]||(this.sceneMap[t]={sprites:[],loop:null}),this.currentScene=t,this.gameLoop=this.sceneMap[t].loop,this.setMaxFramesPerSecond(this.maxFPS)}setLoop(t,s){if(!this.sceneMap[t]){this.sceneMap[t]={sprites:[],loop:s},t===this.currentScene&&this.changeScene(t);return}this.sceneMap[t].loop=s,t===this.currentScene&&this.changeScene(t)}addSprite(t,s){if(!this.sceneMap[t]){this.sceneMap[t]={sprites:[s],loop:null};return}this.sceneMap[t].sprites.push(s)}setMaxFramesPerSecond(t){this.maxFPS=t;let s=this.gameLoop;s&&(clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>s(),1e3/this.maxFPS))}refresh(){e.clearRect(0,0,i.width,i.height),this.sceneMap[this.currentScene]?.sprites.forEach(t=>t.draw())}async wait(t){return new Promise(s=>setTimeout(s,t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24),i.addEventListener("mousemove",t=>{this.mouseX=t.clientX-i.offsetLeft-i.width/2,this.mouseY=-(t.clientY-i.offsetTop-i.height/2)})}};var u=class extends r{width;height;color;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height),e.restore()}setWidth(t){this.width=t,this.refresh()}setHeight(t){this.height=t,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.draw()}};var d=class extends r{radA;radB;color;draw(){let t=this.toRadians(this.dir);e.beginPath(),e.ellipse(this.x+i.width/2,-this.y+i.height/2,this.radA,this.radB,t,0,Math.PI*2),e.fillStyle=this.color,e.fill()}setRadA(t){this.radA=t,this.refresh()}setRadB(t){this.radB=t,this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radA=t?.radA??25,this.radB=t?.radB??25,this.color=t?.color??"black",this.draw()}};var m=class extends r{sides;radius;color;draw(){let t=this.radius,s=Math.PI*2/this.sides,n=i.width/2,y=i.height/2,P=this.toRadians(this.dir);e.beginPath();for(let x=0;x<this.sides;x++){let S=x*s-Math.PI/2+P,v=n+this.x+t*Math.cos(S),O=y-this.y-t*Math.sin(S);x===0?e.moveTo(v,O):e.lineTo(v,O)}e.closePath(),e.fillStyle=this.color,e.fill()}setSides(t){this.sides=t,this.refresh()}setRadius(t){this.radius=t,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.draw()}};var b=class extends r{drawing;size;color;draw(){}up(){this.drawing=!1}down(){this.drawing=!0}ereaseAll(){a.clearRect(0,0,i.width,i.height)}dot(){a.fillStyle=this.color,a.fillRect(this.x-this.size/2+i.width/2,-this.y-this.size/2+i.height/2,this.size,this.size)}drawLine(t,s){a.beginPath(),a.moveTo(t+i.width/2,-s+i.height/2),a.lineTo(this.x+i.width/2,-this.y+i.height/2),a.lineWidth=this.size,a.strokeStyle=this.color,a.stroke()}move(t){let s=this.x,n=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(s,n),this.refresh()}setX(t){let s=this.x,n=this.y;this.x=t,this.drawing&&this.drawLine(s,n),this.refresh()}setY(t){let s=this.x,n=this.y;this.y=t,this.drawing&&this.drawLine(s,n),this.refresh()}goTo(t,s){let n=this.x,y=this.y;this.x=t,this.y=s,this.drawing&&this.drawLine(n,y),this.refresh()}changeX(t){let s=this.x,n=this.y;this.x+=t,this.drawing&&this.drawLine(s,n),this.refresh()}changeY(t){let s=this.x,n=this.y;this.y+=t,this.drawing&&this.drawLine(s,n),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var g=class extends r{content;color;fontFamily;fontSize;align;baseline;font;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.font=this.font,e.fillStyle=this.color,e.textAlign=this.align,e.textBaseline=this.baseline,e.fillText(this.content,0,0),e.restore()}setContent(t){this.content=t,this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.refresh()}setAlign(t){this.align=t,this.refresh()}setBaseline(t){this.baseline=t,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}`}};var f=class extends r{src;width;height;img;draw(){e.save();let t=this.x+i.width/2,s=-this.y+i.height/2;e.translate(t,s),e.rotate(this.toRadians(this.dir)),e.drawImage(this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),e.restore()}setSrc(t){this.src=t,this.refresh()}setWidth(t){this.width=t,this.refresh()}setHeight(t){this.height=t,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}};var R={Engine:c,Sprite:r,Rectangle:u,Oval:d,RegularPolygon:m,Pen:b,Text:g,ImageSprite:f,setScale:w,setAspectRatio:M,canvas:i,ctx:e},at=R;export{c as Engine,f as ImageSprite,d as Oval,b as Pen,u as Rectangle,m as RegularPolygon,r as Sprite,g as Text,i as canvas,e as ctx,at as default,M as setAspectRatio,w as setScale};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/canvas.ts","../src/Sprite.ts","../src/Engine.ts","../src/Rectangle.ts","../src/Oval.ts","../src/RegularPolygon.ts","../src/Pen.ts","../src/Text.ts","../src/ImageSprite.ts","../src/index.ts"],"sourcesContent":["export const canvas = document.getElementById('game-window') as HTMLCanvasElement;\r\nexport const ctx = canvas.getContext('2d')!;\r\n\r\nexport const penCanvas = document.createElement('canvas');\r\nexport const penCtx = penCanvas.getContext('2d')!;\r\npenCanvas.id = 'pen-canvas';\r\n\r\nlet ratio: number = 16 / 9;\r\nlet scale: number;\r\n\r\nexport function setScale(newScale: number) {\r\n scale = newScale;\r\n\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = ratio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n ratio = newAspectRatio;\r\n\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = ratio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\ncanvas.parentElement?.insertBefore(penCanvas, canvas);\r\n\r\nsetScale(500);","import Engine from './Engine.ts';\r\n\r\nexport interface SpriteOptions {\r\n x?: number;\r\n y?: number;\r\n dir?: number;\r\n scene: string;\r\n};\r\n\r\nexport default abstract class Sprite {\r\n\r\n public x: number;\r\n public y: number;\r\n public dir: number;\r\n public scene: string;\r\n\r\n // Rendering\r\n\r\n public abstract draw(): void;\r\n\r\n protected refresh() {\r\n Engine.init().refresh();\r\n }\r\n\r\n constructor(options?: SpriteOptions) {\r\n this.x = options?.x ?? 0;\r\n this.y = options?.y ?? 0;\r\n this.dir = options?.dir ?? 0;\r\n this.scene = options?.scene ?? 'main';\r\n Engine.init().addSprite(this.scene, this);\r\n }\r\n\r\n // Helpers\r\n\r\n protected toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n protected toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Methods\r\n\r\n // Motion\r\n public move(steps: number) {\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n this.refresh();\r\n }\r\n\r\n public turn(deg: number) {\r\n this.dir += deg;\r\n this.refresh();\r\n }\r\n\r\n public point(dir: number) {\r\n this.dir = dir;\r\n this.refresh();\r\n }\r\n\r\n public setX(x: number) {\r\n this.x = x;\r\n this.refresh();\r\n }\r\n\r\n public setY(y: number) {\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public goTo(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public changeX(dX: number) {\r\n this.x += dX;\r\n this.refresh();\r\n }\r\n\r\n public changeY(dY: number) {\r\n this.y += dY;\r\n this.refresh();\r\n }\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\r\n\r\ntype GameLoop = (() => any) | (() => Promise<any>);\r\n\r\ntype SceneMap = {\r\n [sceneName: string]: {\r\n sprites: Sprite[];\r\n loop: GameLoop | null;\r\n };\r\n};\r\n\r\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private updateInterval: number | undefined;\r\n public gameLoop: GameLoop | null = null;\r\n public maxFPS: number = 24;\r\n\r\n public mouseX: number = 0;\r\n public mouseY: number = 0;\r\n\r\n public currentScene: string = 'main';\r\n public sceneMap: SceneMap = {};\r\n\r\n // Singleton initialization\r\n\r\n public static init() {\r\n if (!this.instance)\r\n this.instance = new Engine();\r\n\r\n return this.instance;\r\n }\r\n\r\n // Change the scene\r\n\r\n public changeScene(scene: string) {\r\n if (!this.sceneMap[scene])\r\n this.sceneMap[scene] = { sprites: [], loop: null };\r\n\r\n this.currentScene = scene;\r\n this.gameLoop = this.sceneMap[scene].loop;\r\n this.setMaxFramesPerSecond(this.maxFPS); // Update the interval function\r\n }\r\n\r\n // Set a loop\r\n\r\n public setLoop(scene: string, loop: GameLoop) {\r\n if (!this.sceneMap[scene]) {\r\n this.sceneMap[scene] = { sprites: [], loop };\r\n return;\r\n }\r\n\r\n this.sceneMap[scene].loop = loop;\r\n }\r\n\r\n // Internal\r\n\r\n public addSprite(scene: string, sprite: Sprite) {\r\n if (!this.sceneMap[scene]) {\r\n this.sceneMap[scene] = { sprites: [sprite], loop: null };\r\n return;\r\n }\r\n\r\n this.sceneMap[scene].sprites.push(sprite);\r\n }\r\n\r\n public setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n \r\n let loop = this.gameLoop;\r\n if (!loop) return;\r\n\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = setInterval(() => loop(), 1000 / this.maxFPS);\r\n }\r\n\r\n public refresh() {\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n this.sceneMap[this.currentScene]?.sprites.forEach(sprite => sprite.draw());\r\n }\r\n\r\n // Wait function\r\n\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n // Helpers\r\n\r\n public toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Private constructor\r\n\r\n private constructor() {\r\n this.setMaxFramesPerSecond(24);\r\n\r\n canvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - canvas.offsetLeft - canvas.width / 2;\r\n this.mouseY = -(e.clientY - canvas.offsetTop - canvas.height / 2);\r\n });\r\n }\r\n}","import Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { ctx, canvas } from './canvas.ts';\r\n\r\nexport interface RectangleOptions extends SpriteOptions {\r\n width?: number;\r\n height?: number;\r\n color?: string;\r\n};\r\n\r\nexport default class Rectangle extends Sprite {\r\n\r\n public width: number;\r\n public height: number;\r\n public color: string;\r\n\r\n public draw(): void {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fillRect(\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width,\r\n this.height\r\n );\r\n\r\n ctx.restore();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RectangleOptions) {\r\n super(options);\r\n this.width = options?.width ?? 50;\r\n this.height = options?.height ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { canvas, ctx } from './canvas.ts';\r\n\r\nexport interface OvalOptions extends SpriteOptions {\r\n radA?: number;\r\n radB?: number;\r\n color?: string;\r\n};\r\n\r\nexport default class Oval extends Sprite {\r\n\r\n public radA: number;\r\n public radB: number;\r\n public color: string;\r\n\r\n public draw(): void {\r\n const rotation = this.toRadians(this.dir);\r\n \r\n ctx.beginPath();\r\n ctx.ellipse(\r\n this.x + canvas.width / 2,\r\n -this.y + canvas.height / 2,\r\n this.radA,\r\n this.radB,\r\n rotation, 0,\r\n Math.PI * 2\r\n );\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fill();\r\n }\r\n\r\n public setRadA(radA: number) {\r\n this.radA = radA;\r\n this.refresh();\r\n }\r\n\r\n public setRadB(radB: number) {\r\n this.radB = radB;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: OvalOptions) {\r\n super(options);\r\n this.radA = options?.radA ?? 25;\r\n this.radB = options?.radB ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface RegularPolygonOptions extends SpriteOptions {\r\n sides?: number;\r\n radius?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class RegularPolygon extends Sprite {\r\n\r\n public sides: number;\r\n public radius: number;\r\n public color: string;\r\n\r\n public draw() {\r\n const r = this.radius;\r\n const step = (Math.PI * 2) / this.sides;\r\n const cx = canvas.width / 2;\r\n const cy = canvas.height / 2;\r\n\r\n const rotation = this.toRadians(this.dir);\r\n\r\n ctx.beginPath();\r\n for (let i = 0; i < this.sides; i++) {\r\n const theta = i * step - Math.PI / 2 + rotation;\r\n const px = cx + this.x + r * Math.cos(theta);\r\n const py = cy - this.y - r * Math.sin(theta);\r\n\r\n if (i === 0) ctx.moveTo(px, py);\r\n else ctx.lineTo(px, py);\r\n }\r\n ctx.closePath();\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fill();\r\n }\r\n\r\n public setSides(sides: number) {\r\n this.sides = sides;\r\n this.refresh();\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RegularPolygonOptions) {\r\n super(options);\r\n this.sides = options?.sides ?? 5;\r\n this.radius = options?.radius ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, penCtx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface PenOptions extends SpriteOptions {\r\n drawing?: boolean;\r\n size?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class Pen extends Sprite {\r\n\r\n public drawing: boolean;\r\n public size: number;\r\n public color: string;\r\n\r\n draw() {}\r\n\r\n public up() {\r\n this.drawing = false;\r\n }\r\n\r\n public down() {\r\n this.drawing = true;\r\n }\r\n\r\n public ereaseAll() {\r\n penCtx.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n public dot() {\r\n penCtx.fillStyle = this.color;\r\n penCtx.fillRect(\r\n this.x - this.size / 2 + canvas.width / 2,\r\n -this.y - this.size / 2 + canvas.height / 2,\r\n this.size,\r\n this.size\r\n );\r\n }\r\n\r\n private drawLine(lastX: number, lastY: number) {\r\n penCtx.beginPath();\r\n\r\n penCtx.moveTo(lastX + canvas.width / 2, -lastY + canvas.height / 2);\r\n penCtx.lineTo(this.x + canvas.width / 2, -this.y + canvas.height / 2);\r\n\r\n penCtx.lineWidth = this.size;\r\n penCtx.strokeStyle = this.color;\r\n penCtx.stroke();\r\n }\r\n\r\n // Overriding methods to include drawing\r\n\r\n public override move(steps: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setX(x: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setY(y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override goTo(x: number, y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeX(dX: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += dX;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeY(dY: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y += dY;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: PenOptions) {\r\n super(options);\r\n this.drawing = options?.drawing ?? false;\r\n this.size = options?.size ?? 5;\r\n this.color = options?.color ?? 'black';\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport type CanvasTextAlign =\r\n | 'left'\r\n | 'right'\r\n | 'center'\r\n | 'start'\r\n | 'end';\r\n\r\nexport type CanvasTextBaseline =\r\n | 'top'\r\n | 'hanging'\r\n | 'middle'\r\n | 'alphabetic'\r\n | 'ideographic'\r\n | 'bottom';\r\n\r\nexport interface TextOptions extends SpriteOptions {\r\n content?: string;\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n align?: CanvasTextAlign;\r\n baseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport default class Text extends Sprite {\r\n\r\n public content: string;\r\n public color: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n public align: CanvasTextAlign;\r\n public baseline: CanvasTextBaseline;\r\n\r\n private font: string;\r\n\r\n public draw() {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.font = this.font;\r\n ctx.fillStyle = this.color;\r\n ctx.textAlign = this.align;\r\n ctx.textBaseline = this.baseline;\r\n\r\n ctx.fillText(this.content, 0, 0);\r\n\r\n ctx.restore();\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string) {\r\n this.content = content;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.refresh();\r\n }\r\n\r\n public setAlign(align: CanvasTextAlign) {\r\n this.align = align;\r\n this.refresh();\r\n }\r\n\r\n public setBaseline(baseline: CanvasTextBaseline) {\r\n this.baseline = baseline;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.color = options?.color ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n this.align = options?.align ?? 'center';\r\n this.baseline = options?.baseline ?? 'middle';\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n }\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface ImageSpriteOptions extends SpriteOptions {\r\n src?: string;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nexport default class ImageSprite extends Sprite {\r\n\r\n public src: string;\r\n public width: number;\r\n public height: number;\r\n\r\n protected img: HTMLImageElement;\r\n\r\n public draw() {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.drawImage(\r\n this.img,\r\n 0, 0,\r\n this.img.width,\r\n this.img.height,\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width, this.height\r\n );\r\n\r\n ctx.restore();\r\n }\r\n\r\n // Methods\r\n\r\n public setSrc(src: string) {\r\n this.src = src;\r\n this.refresh();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ImageSpriteOptions) {\r\n super(options);\r\n\r\n this.src = options?.src ?? '';\r\n this.img = new Image();\r\n this.img.src = this.src;\r\n\r\n this.width = options?.width ?? this.img.width;\r\n this.height = options?.height ?? this.img.height;\r\n }\r\n}","import Engine from './Engine.ts';\r\n\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport Rectangle, { type RectangleOptions } from './Rectangle.ts';\r\nimport Oval, { type OvalOptions } from './Oval.ts';\r\nimport RegularPolygon, { type RegularPolygonOptions } from './RegularPolygon.ts';\r\nimport Pen, { type PenOptions } from './Pen.ts';\r\nimport Text, { type TextOptions, type CanvasTextAlign, type CanvasTextBaseline } from './Text.ts';\r\nimport ImageSprite, { type ImageSpriteOptions } from './ImageSprite.ts';\r\n\r\nimport { setScale, setAspectRatio, canvas, ctx } from './canvas.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Sprites\r\n Rectangle,\r\n Oval,\r\n RegularPolygon,\r\n Pen,\r\n Text,\r\n ImageSprite,\r\n\r\n // Canvas\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};\r\n\r\nexport default TScratch;\r\nexport {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Sprites\r\n Rectangle,\r\n Oval,\r\n RegularPolygon,\r\n Pen,\r\n Text,\r\n ImageSprite,\r\n\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type OvalOptions,\r\n type RegularPolygonOptions,\r\n type PenOptions,\r\n type TextOptions,\r\n type ImageSpriteOptions,\r\n\r\n // Other types\r\n type CanvasTextAlign,\r\n type CanvasTextBaseline,\r\n \r\n // Canvas\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};"],"mappings":"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","names":["canvas","ctx","penCanvas","penCtx","ratio","scale","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","Engine","options","deg","rad","steps","dir","x","y","dX","dY","Engine","_Engine","scene","loop","sprite","maxFPS","ctx","canvas","ms","resolve","deg","rad","e","Rectangle","Sprite","ctx","cX","canvas","cY","width","height","color","options","Oval","Sprite","rotation","ctx","canvas","radA","radB","color","options","RegularPolygon","Sprite","r","step","cx","canvas","cy","rotation","ctx","i","theta","px","py","sides","radius","color","options","Pen","Sprite","penCtx","canvas","lastX","lastY","steps","x","y","dX","dY","options","Text","Sprite","ctx","cX","canvas","cY","content","color","fontSize","fontFamily","align","baseline","options","ImageSprite","Sprite","ctx","cX","canvas","cY","src","width","height","options","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","Pen","Text","ImageSprite","setScale","setAspectRatio","canvas","ctx","index_default"]}
1
+ {"version":3,"sources":["../src/canvas.ts","../src/Sprite.ts","../src/Engine.ts","../src/Rectangle.ts","../src/Oval.ts","../src/RegularPolygon.ts","../src/Pen.ts","../src/Text.ts","../src/ImageSprite.ts","../src/index.ts"],"sourcesContent":["export const canvas = document.getElementById('game-window') as HTMLCanvasElement;\r\nexport const ctx = canvas.getContext('2d')!;\r\n\r\nexport const penCanvas = document.createElement('canvas');\r\nexport const penCtx = penCanvas.getContext('2d')!;\r\npenCanvas.id = 'pen-canvas';\r\n\r\nlet ratio: number = 16 / 9;\r\nlet scale: number;\r\n\r\nexport function setScale(newScale: number) {\r\n scale = newScale;\r\n\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = ratio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n ratio = newAspectRatio;\r\n\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = ratio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\ncanvas.parentElement?.insertBefore(penCanvas, canvas);\r\n\r\nsetScale(500);","import Engine from './Engine.ts';\r\n\r\nexport interface SpriteOptions {\r\n x?: number;\r\n y?: number;\r\n dir?: number;\r\n scene?: string;\r\n};\r\n\r\nexport default abstract class Sprite {\r\n\r\n public x: number;\r\n public y: number;\r\n public dir: number;\r\n public scene: string;\r\n\r\n // Rendering\r\n\r\n public abstract draw(): void;\r\n\r\n protected refresh() {\r\n Engine.init().refresh();\r\n }\r\n\r\n constructor(options?: SpriteOptions) {\r\n this.x = options?.x ?? 0;\r\n this.y = options?.y ?? 0;\r\n this.dir = options?.dir ?? 0;\r\n this.scene = options?.scene ?? 'main';\r\n Engine.init().addSprite(this.scene, this);\r\n }\r\n\r\n // Helpers\r\n\r\n protected toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n protected toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Methods\r\n\r\n // Motion\r\n public move(steps: number) {\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n this.refresh();\r\n }\r\n\r\n public turn(deg: number) {\r\n this.dir += deg;\r\n this.refresh();\r\n }\r\n\r\n public point(dir: number) {\r\n this.dir = dir;\r\n this.refresh();\r\n }\r\n\r\n public setX(x: number) {\r\n this.x = x;\r\n this.refresh();\r\n }\r\n\r\n public setY(y: number) {\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public goTo(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public changeX(dX: number) {\r\n this.x += dX;\r\n this.refresh();\r\n }\r\n\r\n public changeY(dY: number) {\r\n this.y += dY;\r\n this.refresh();\r\n }\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\r\n\r\ntype GameLoop = (() => any) | (() => Promise<any>);\r\n\r\ntype SceneMap = {\r\n [sceneName: string]: {\r\n sprites: Sprite[];\r\n loop: GameLoop | null;\r\n };\r\n};\r\n\r\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private updateInterval: number | undefined;\r\n public gameLoop: GameLoop | null = null;\r\n public maxFPS: number = 24;\r\n\r\n public mouseX: number = 0;\r\n public mouseY: number = 0;\r\n\r\n public currentScene: string = 'main';\r\n public sceneMap: SceneMap = {};\r\n\r\n // Singleton initialization\r\n\r\n public static init() {\r\n if (!this.instance)\r\n this.instance = new Engine();\r\n\r\n return this.instance;\r\n }\r\n\r\n // Change the scene\r\n\r\n public changeScene(scene: string) {\r\n if (!this.sceneMap[scene])\r\n this.sceneMap[scene] = { sprites: [], loop: null };\r\n\r\n this.currentScene = scene;\r\n this.gameLoop = this.sceneMap[scene].loop;\r\n this.setMaxFramesPerSecond(this.maxFPS); // Update the interval function\r\n }\r\n\r\n // Set a loop\r\n\r\n public setLoop(scene: string, loop: GameLoop) {\r\n if (!this.sceneMap[scene]) {\r\n this.sceneMap[scene] = { sprites: [], loop };\r\n if (scene === this.currentScene)\r\n this.changeScene(scene);\r\n return;\r\n }\r\n\r\n this.sceneMap[scene].loop = loop;\r\n if (scene === this.currentScene)\r\n this.changeScene(scene);\r\n }\r\n\r\n // Internal\r\n\r\n public addSprite(scene: string, sprite: Sprite) {\r\n if (!this.sceneMap[scene]) {\r\n this.sceneMap[scene] = { sprites: [sprite], loop: null };\r\n return;\r\n }\r\n\r\n this.sceneMap[scene].sprites.push(sprite);\r\n }\r\n\r\n public setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n \r\n let loop = this.gameLoop;\r\n if (!loop) return;\r\n\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = setInterval(() => loop(), 1000 / this.maxFPS);\r\n }\r\n\r\n public refresh() {\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n this.sceneMap[this.currentScene]?.sprites.forEach(sprite => sprite.draw());\r\n }\r\n\r\n // Wait function\r\n\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n // Helpers\r\n\r\n public toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Private constructor\r\n\r\n private constructor() {\r\n this.setMaxFramesPerSecond(24);\r\n\r\n canvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - canvas.offsetLeft - canvas.width / 2;\r\n this.mouseY = -(e.clientY - canvas.offsetTop - canvas.height / 2);\r\n });\r\n }\r\n}","import Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { ctx, canvas } from './canvas.ts';\r\n\r\nexport interface RectangleOptions extends SpriteOptions {\r\n width?: number;\r\n height?: number;\r\n color?: string;\r\n};\r\n\r\nexport default class Rectangle extends Sprite {\r\n\r\n public width: number;\r\n public height: number;\r\n public color: string;\r\n\r\n public draw(): void {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fillRect(\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width,\r\n this.height\r\n );\r\n\r\n ctx.restore();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RectangleOptions) {\r\n super(options);\r\n this.width = options?.width ?? 50;\r\n this.height = options?.height ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { canvas, ctx } from './canvas.ts';\r\n\r\nexport interface OvalOptions extends SpriteOptions {\r\n radA?: number;\r\n radB?: number;\r\n color?: string;\r\n};\r\n\r\nexport default class Oval extends Sprite {\r\n\r\n public radA: number;\r\n public radB: number;\r\n public color: string;\r\n\r\n public draw(): void {\r\n const rotation = this.toRadians(this.dir);\r\n \r\n ctx.beginPath();\r\n ctx.ellipse(\r\n this.x + canvas.width / 2,\r\n -this.y + canvas.height / 2,\r\n this.radA,\r\n this.radB,\r\n rotation, 0,\r\n Math.PI * 2\r\n );\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fill();\r\n }\r\n\r\n public setRadA(radA: number) {\r\n this.radA = radA;\r\n this.refresh();\r\n }\r\n\r\n public setRadB(radB: number) {\r\n this.radB = radB;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: OvalOptions) {\r\n super(options);\r\n this.radA = options?.radA ?? 25;\r\n this.radB = options?.radB ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface RegularPolygonOptions extends SpriteOptions {\r\n sides?: number;\r\n radius?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class RegularPolygon extends Sprite {\r\n\r\n public sides: number;\r\n public radius: number;\r\n public color: string;\r\n\r\n public draw() {\r\n const r = this.radius;\r\n const step = (Math.PI * 2) / this.sides;\r\n const cx = canvas.width / 2;\r\n const cy = canvas.height / 2;\r\n\r\n const rotation = this.toRadians(this.dir);\r\n\r\n ctx.beginPath();\r\n for (let i = 0; i < this.sides; i++) {\r\n const theta = i * step - Math.PI / 2 + rotation;\r\n const px = cx + this.x + r * Math.cos(theta);\r\n const py = cy - this.y - r * Math.sin(theta);\r\n\r\n if (i === 0) ctx.moveTo(px, py);\r\n else ctx.lineTo(px, py);\r\n }\r\n ctx.closePath();\r\n\r\n ctx.fillStyle = this.color;\r\n ctx.fill();\r\n }\r\n\r\n public setSides(sides: number) {\r\n this.sides = sides;\r\n this.refresh();\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RegularPolygonOptions) {\r\n super(options);\r\n this.sides = options?.sides ?? 5;\r\n this.radius = options?.radius ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, penCtx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface PenOptions extends SpriteOptions {\r\n drawing?: boolean;\r\n size?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class Pen extends Sprite {\r\n\r\n public drawing: boolean;\r\n public size: number;\r\n public color: string;\r\n\r\n draw() {}\r\n\r\n public up() {\r\n this.drawing = false;\r\n }\r\n\r\n public down() {\r\n this.drawing = true;\r\n }\r\n\r\n public ereaseAll() {\r\n penCtx.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n public dot() {\r\n penCtx.fillStyle = this.color;\r\n penCtx.fillRect(\r\n this.x - this.size / 2 + canvas.width / 2,\r\n -this.y - this.size / 2 + canvas.height / 2,\r\n this.size,\r\n this.size\r\n );\r\n }\r\n\r\n private drawLine(lastX: number, lastY: number) {\r\n penCtx.beginPath();\r\n\r\n penCtx.moveTo(lastX + canvas.width / 2, -lastY + canvas.height / 2);\r\n penCtx.lineTo(this.x + canvas.width / 2, -this.y + canvas.height / 2);\r\n\r\n penCtx.lineWidth = this.size;\r\n penCtx.strokeStyle = this.color;\r\n penCtx.stroke();\r\n }\r\n\r\n // Overriding methods to include drawing\r\n\r\n public override move(steps: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setX(x: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setY(y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override goTo(x: number, y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeX(dX: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += dX;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeY(dY: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y += dY;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: PenOptions) {\r\n super(options);\r\n this.drawing = options?.drawing ?? false;\r\n this.size = options?.size ?? 5;\r\n this.color = options?.color ?? 'black';\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport type CanvasTextAlign =\r\n | 'left'\r\n | 'right'\r\n | 'center'\r\n | 'start'\r\n | 'end';\r\n\r\nexport type CanvasTextBaseline =\r\n | 'top'\r\n | 'hanging'\r\n | 'middle'\r\n | 'alphabetic'\r\n | 'ideographic'\r\n | 'bottom';\r\n\r\nexport interface TextOptions extends SpriteOptions {\r\n content?: string;\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n align?: CanvasTextAlign;\r\n baseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport default class Text extends Sprite {\r\n\r\n public content: string;\r\n public color: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n public align: CanvasTextAlign;\r\n public baseline: CanvasTextBaseline;\r\n\r\n private font: string;\r\n\r\n public draw() {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.font = this.font;\r\n ctx.fillStyle = this.color;\r\n ctx.textAlign = this.align;\r\n ctx.textBaseline = this.baseline;\r\n\r\n ctx.fillText(this.content, 0, 0);\r\n\r\n ctx.restore();\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string) {\r\n this.content = content;\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.refresh();\r\n }\r\n\r\n public setAlign(align: CanvasTextAlign) {\r\n this.align = align;\r\n this.refresh();\r\n }\r\n\r\n public setBaseline(baseline: CanvasTextBaseline) {\r\n this.baseline = baseline;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.color = options?.color ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n this.align = options?.align ?? 'center';\r\n this.baseline = options?.baseline ?? 'middle';\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n }\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\n\r\nexport interface ImageSpriteOptions extends SpriteOptions {\r\n src?: string;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nexport default class ImageSprite extends Sprite {\r\n\r\n public src: string;\r\n public width: number;\r\n public height: number;\r\n\r\n protected img: HTMLImageElement;\r\n\r\n public draw() {\r\n ctx.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n ctx.translate(cX, cY);\r\n\r\n ctx.rotate(this.toRadians(this.dir));\r\n\r\n ctx.drawImage(\r\n this.img,\r\n 0, 0,\r\n this.img.width,\r\n this.img.height,\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width, this.height\r\n );\r\n\r\n ctx.restore();\r\n }\r\n\r\n // Methods\r\n\r\n public setSrc(src: string) {\r\n this.src = src;\r\n this.refresh();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ImageSpriteOptions) {\r\n super(options);\r\n\r\n this.src = options?.src ?? '';\r\n this.img = new Image();\r\n this.img.src = this.src;\r\n\r\n this.width = options?.width ?? this.img.width;\r\n this.height = options?.height ?? this.img.height;\r\n }\r\n}","import Engine from './Engine.ts';\r\n\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport Rectangle, { type RectangleOptions } from './Rectangle.ts';\r\nimport Oval, { type OvalOptions } from './Oval.ts';\r\nimport RegularPolygon, { type RegularPolygonOptions } from './RegularPolygon.ts';\r\nimport Pen, { type PenOptions } from './Pen.ts';\r\nimport Text, { type TextOptions, type CanvasTextAlign, type CanvasTextBaseline } from './Text.ts';\r\nimport ImageSprite, { type ImageSpriteOptions } from './ImageSprite.ts';\r\n\r\nimport { setScale, setAspectRatio, canvas, ctx } from './canvas.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Sprites\r\n Rectangle,\r\n Oval,\r\n RegularPolygon,\r\n Pen,\r\n Text,\r\n ImageSprite,\r\n\r\n // Canvas\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};\r\n\r\nexport default TScratch;\r\nexport {\r\n // Main\r\n Engine,\r\n Sprite,\r\n\r\n // Sprites\r\n Rectangle,\r\n Oval,\r\n RegularPolygon,\r\n Pen,\r\n Text,\r\n ImageSprite,\r\n\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type OvalOptions,\r\n type RegularPolygonOptions,\r\n type PenOptions,\r\n type TextOptions,\r\n type ImageSpriteOptions,\r\n\r\n // Other types\r\n type CanvasTextAlign,\r\n type CanvasTextBaseline,\r\n \r\n // Canvas\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};"],"mappings":"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","names":["canvas","ctx","penCanvas","penCtx","ratio","scale","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","Engine","options","deg","rad","steps","dir","x","y","dX","dY","Engine","_Engine","scene","loop","sprite","maxFPS","ctx","canvas","ms","resolve","deg","rad","e","Rectangle","Sprite","ctx","cX","canvas","cY","width","height","color","options","Oval","Sprite","rotation","ctx","canvas","radA","radB","color","options","RegularPolygon","Sprite","r","step","cx","canvas","cy","rotation","ctx","i","theta","px","py","sides","radius","color","options","Pen","Sprite","penCtx","canvas","lastX","lastY","steps","x","y","dX","dY","options","Text","Sprite","ctx","cX","canvas","cY","content","color","fontSize","fontFamily","align","baseline","options","ImageSprite","Sprite","ctx","cX","canvas","cY","src","width","height","options","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","Pen","Text","ImageSprite","setScale","setAspectRatio","canvas","ctx","index_default"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tscratch",
3
- "version": "0.2.9",
3
+ "version": "0.3.1",
4
4
  "description": "A Scratch-style game engine for TypeScript.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",