tscratch 0.1.7 → 0.1.8

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
@@ -31,8 +31,6 @@ const engine = Engine.init();
31
31
 
32
32
  // Create a rectangle sprite
33
33
  const rect = new Rectangle();
34
- // Add it to the engine
35
- engine.addSprites(rect);
36
34
 
37
35
  // Move it to the center
38
36
  rect.goTo(0, 0);
@@ -50,13 +48,11 @@ import { Engine, Rectangle } from 'tscratch';
50
48
  const engine = Engine.init();
51
49
 
52
50
  const redBox = new Rectangle();
53
- engine.addSprite(redBox);
54
51
 
55
52
  redBox.setColor('red');
56
53
  redBox.goTo(-100, 0);
57
54
 
58
55
  const blueBox = new Rectangle();
59
- engine.addSprite(blueBox);
60
56
 
61
57
  blueBox.setColor('blue');
62
58
  blueBox.goTo(100, 0);
@@ -73,11 +69,12 @@ engine.loop = () => {
73
69
 
74
70
  - `Engine.init()` → get the singleton instance
75
71
  - `engine.removeSprites(...sprites)` → removes sprites from the stage
76
- - `engine.setFramesPerSecond(FPS)`→ sets the update time
72
+ - `engine.setMaxFramesPerSecond(FPS)`→ sets the maximum FPS
77
73
  - `engine.loop = () => { ... }` → game loop logic
78
74
  - `engine.refresh()` → redraw all sprites
79
- - `engine.toRadians` → converts degrees to radians
80
- - `engine.toDegrees` → converts radians to degrees
75
+ - `await engine.wait(ms)` → Wait some time (miliseconds)
76
+ - `engine.toRadians(rad)` → converts degrees to radians
77
+ - `engine.toDegrees(deg)` → converts radians to degrees
81
78
 
82
79
  ### Sprite (abstract)
83
80
 
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var f=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var R=(s,t)=>{for(var i in t)f(s,i,{get:t[i],enumerable:!0})},M=(s,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of O(t))!P.call(s,o)&&o!==i&&f(s,o,{get:()=>t[o],enumerable:!(n=S(t,o))||n.enumerable});return s};var I=s=>M(f({},"__esModule",{value:!0}),s);var Y={};R(Y,{Engine:()=>a,Oval:()=>l,Pen:()=>u,Rectangle:()=>c,RegularPolygon:()=>p,Sprite:()=>h,canvas:()=>r,ctx:()=>e,default:()=>X,setAspectRatio:()=>x,setScale:()=>m});module.exports=I(Y);var r=document.getElementById("game-window"),e=r.getContext("2d"),g=16/9,d;function m(s){d=s,r.width=g*d,r.height=d}function x(s){g=s,r.width=g*d,r.height=d}m(500);var h=class{x;y;dir;refresh(){a.init().refresh()}constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.dir=t?.dir??90,a.init().addSprites(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,i){this.x=t,this.y=i,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y-=t,this.refresh()}async wait(t){return new Promise(i=>setTimeout(i,t))}};var a=class s{static instance;updateInterval;loop=()=>{};maxFPS=24;lastFrame=performance.now();deltaTime=1/this.maxFPS;sprites=[];static init(){return this.instance||(this.instance=new s),this.instance}addSprites(...t){this.sprites.push(...t)}removeSprites(...t){this.sprites=this.sprites.filter(i=>!t.includes(i))}setMaxFramesPerSecond(t){this.maxFPS=t,clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>{let i=performance.now(),n=(i-this.lastFrame)/1e3;this.lastFrame=i,this.deltaTime=n,this.loop()},1e3/this.maxFPS)}refresh(){e.clearRect(0,0,r.width,r.height),this.sprites.forEach(t=>t.draw())}static toRadians(t){return t*Math.PI/180}static toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24)}};var c=class extends h{width;height;color;draw(){e.fillStyle=this.color,e.fillRect(this.x-this.width/2+r.width/2,this.y-this.height/2+r.height/2,this.width,this.height)}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 l=class extends h{radA;radB;color;draw(){e.fillStyle=this.color,e.beginPath(),e.ellipse(this.x,this.y,this.radA,this.radB,this.toRadians(this.dir),0,Math.PI*2),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 p=class extends h{sides;radius;color;draw(){let t=this.radius,i=Math.PI*2/this.sides,n=r.width/2,o=r.height/2;e.beginPath();for(let b=0;b<this.sides;b++){let w=b*i-Math.PI/2,y=n+this.x+t*Math.cos(w),v=o+this.y+t*Math.sin(w);b===0?e.moveTo(y,v):e.lineTo(y,v)}e.closePath(),e.fillStyle=this.color,e.fill()}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 u=class extends h{drawing;size;color;draw(){}up(){this.drawing=!1}down(){this.drawing=!0}dot(){e.fillStyle=this.color,e.fillRect(this.x-this.size/2,this.y-this.size/2,this.size,this.size)}drawLine(t,i){e.beginPath(),e.moveTo(t,i),e.lineTo(this.x+r.width/2,this.y+r.height/2),e.lineWidth=this.size,e.strokeStyle=this.color,e.stroke()}move(t){let i=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(i,n),this.refresh()}setX(t){let i=this.x,n=this.y;this.x=t,this.drawing&&this.drawLine(i,n),this.refresh()}setY(t){let i=this.x,n=this.y;this.y=t,this.drawing&&this.drawLine(i,n),this.refresh()}goTo(t,i){let n=this.x,o=this.y;this.x=t,this.y=i,this.drawing&&this.drawLine(n,o),this.refresh()}changeX(t){let i=this.x,n=this.y;this.x+=t,this.drawing&&this.drawLine(i,n),this.refresh()}changeY(t){let i=this.x,n=this.y;this.y-=t,this.drawing&&this.drawLine(i,n),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var T={Engine:a,Sprite:h,Rectangle:c,Oval:l,RegularPolygon:p,Pen:u,setScale:m,setAspectRatio:x,canvas:r,ctx:e},X=T;0&&(module.exports={Engine,Oval,Pen,Rectangle,RegularPolygon,Sprite,canvas,ctx,setAspectRatio,setScale});
1
+ "use strict";var f=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var M=(r,t)=>{for(var e in t)f(r,e,{get:t[e],enumerable:!0})},I=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of P(t))!R.call(r,o)&&o!==e&&f(r,o,{get:()=>t[o],enumerable:!(n=O(t,o))||n.enumerable});return r};var T=r=>I(f({},"__esModule",{value:!0}),r);var z={};M(z,{Engine:()=>a,Oval:()=>l,Pen:()=>u,Rectangle:()=>c,RegularPolygon:()=>p,Sprite:()=>h,canvas:()=>s,ctx:()=>i,default:()=>Y,setAspectRatio:()=>x,setScale:()=>m});module.exports=T(z);var s=document.getElementById("game-window"),i=s.getContext("2d"),g=16/9,d;function m(r){d=r,s.width=g*d,s.height=d}function x(r){g=r,s.width=g*d,s.height=d}m(500);var h=class{x;y;dir;refresh(){a.init().refresh()}constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.dir=t?.dir??90,a.init().addSprites(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,e){this.x=t,this.y=e,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y-=t,this.refresh()}};var a=class r{static instance;updateInterval;loop=()=>{};maxFPS=24;lastFrame=performance.now();deltaTime=1/this.maxFPS;sprites=[];static init(){return this.instance||(this.instance=new r),this.instance}addSprites(...t){this.sprites.push(...t)}removeSprites(...t){this.sprites=this.sprites.filter(e=>!t.includes(e))}setMaxFramesPerSecond(t){this.maxFPS=t,clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>{let e=performance.now(),n=(e-this.lastFrame)/1e3;this.lastFrame=e,this.deltaTime=n,this.loop()},1e3/this.maxFPS)}refresh(){i.clearRect(0,0,s.width,s.height),this.sprites.forEach(t=>t.draw())}async wait(t){return new Promise(e=>setTimeout(e,t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24)}};var c=class extends h{width;height;color;draw(){i.save();let t=this.x+s.width/2,e=this.y+s.height/2;i.translate(t,e),i.rotate(this.toRadians(this.dir)),i.fillStyle=this.color,i.fillRect(-this.width/2,-this.height/2,this.width,this.height),i.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 l=class extends h{radA;radB;color;draw(){let t=this.toRadians(this.dir);i.beginPath(),i.ellipse(this.x,this.y,this.radA,this.radB,t,0,Math.PI*2),i.fillStyle=this.color,i.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 p=class extends h{sides;radius;color;draw(){let t=this.radius,e=Math.PI*2/this.sides,n=s.width/2,o=s.height/2,S=this.toRadians(this.dir);i.beginPath();for(let b=0;b<this.sides;b++){let w=b*e-Math.PI/2+S,y=n+this.x+t*Math.cos(w),v=o+this.y+t*Math.sin(w);b===0?i.moveTo(y,v):i.lineTo(y,v)}i.closePath(),i.fillStyle=this.color,i.fill()}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 u=class extends h{drawing;size;color;draw(){}up(){this.drawing=!1}down(){this.drawing=!0}dot(){i.fillStyle=this.color,i.fillRect(this.x-this.size/2+s.width/2,this.y-this.size/2+s.height/2,this.size,this.size)}drawLine(t,e){i.beginPath(),i.moveTo(t,e),i.lineTo(this.x+s.width/2,this.y+s.height/2),i.lineWidth=this.size,i.strokeStyle=this.color,i.stroke()}move(t){let e=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(e,n),this.refresh()}setX(t){let e=this.x,n=this.y;this.x=t,this.drawing&&this.drawLine(e,n),this.refresh()}setY(t){let e=this.x,n=this.y;this.y=t,this.drawing&&this.drawLine(e,n),this.refresh()}goTo(t,e){let n=this.x,o=this.y;this.x=t,this.y=e,this.drawing&&this.drawLine(n,o),this.refresh()}changeX(t){let e=this.x,n=this.y;this.x+=t,this.drawing&&this.drawLine(e,n),this.refresh()}changeY(t){let e=this.x,n=this.y;this.y-=t,this.drawing&&this.drawLine(e,n),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var X={Engine:a,Sprite:h,Rectangle:c,Oval:l,RegularPolygon:p,Pen:u,setScale:m,setAspectRatio:x,canvas:s,ctx:i},Y=X;0&&(module.exports={Engine,Oval,Pen,Rectangle,RegularPolygon,Sprite,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"],"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\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\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\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 \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') as CanvasRenderingContext2D;\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 canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n ratio = newAspectRatio;\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n}\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};\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\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 ?? 90;\r\n Engine.init().addSprites(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\r\n // Control\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\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 loop: () => void = () => {};\r\n public maxFPS: number = 24;\r\n\r\n private lastFrame: number = performance.now();\r\n public deltaTime: number = 1 / this.maxFPS;\r\n\r\n public sprites: Sprite[] = [];\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 public addSprites(...sprites: Sprite[]) {\r\n this.sprites.push(...sprites);\r\n }\r\n\r\n public removeSprites(...sprites: Sprite[]) {\r\n this.sprites = this.sprites.filter(s => !sprites.includes(s));\r\n }\r\n\r\n public setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = setInterval(() => {\r\n \r\n const now = performance.now();\r\n const deltaTime = (now - this.lastFrame) / 1000;\r\n this.lastFrame = now;\r\n this.deltaTime = deltaTime;\r\n\r\n this.loop();\r\n }, 1000 / this.maxFPS);\r\n }\r\n\r\n public refresh() {\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n this.sprites.forEach(sprite => sprite.draw());\r\n }\r\n\r\n // Helpers\r\n\r\n public static toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public static 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\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.fillStyle = this.color;\r\n ctx.fillRect(\r\n this.x - this.width / 2 + canvas.width / 2,\r\n this.y - this.height / 2 + canvas.height / 2,\r\n this.width,\r\n this.height\r\n );\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 Engine from './Engine.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { 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 ctx.fillStyle = this.color;\r\n ctx.beginPath()\r\n ctx.ellipse(this.x, this.y, this.radA, this.radB, this.toRadians(this.dir), 0, Math.PI * 2);\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 ctx.beginPath();\r\n for (let i = 0; i < this.sides; i++) {\r\n const theta = i * step - Math.PI / 2;\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 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, ctx } 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 dot() {\r\n ctx.fillStyle = this.color;\r\n ctx.fillRect(\r\n this.x - this.size / 2,\r\n this.y - this.size / 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 ctx.beginPath();\r\n ctx.moveTo(lastX, lastY);\r\n ctx.lineTo(\r\n this.x + canvas.width / 2,\r\n this.y + canvas.height / 2\r\n );\r\n ctx.lineWidth = this.size;\r\n ctx.strokeStyle = this.color;\r\n ctx.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}"],"mappings":"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","names":["index_exports","__export","Engine","Oval","Pen","Rectangle","RegularPolygon","Sprite","canvas","ctx","index_default","setAspectRatio","setScale","__toCommonJS","canvas","ctx","ratio","scale","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","Engine","options","deg","rad","steps","dir","x","y","dX","dY","ms","resolve","Engine","_Engine","sprites","s","maxFPS","now","deltaTime","ctx","canvas","sprite","deg","rad","Rectangle","Sprite","ctx","canvas","width","height","color","options","Oval","Sprite","ctx","radA","radB","color","options","RegularPolygon","Sprite","r","step","cx","canvas","cy","ctx","i","theta","px","py","radius","color","options","Pen","Sprite","ctx","lastX","lastY","canvas","steps","x","y","dX","dY","options","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","Pen","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"],"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\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\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\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 \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') as CanvasRenderingContext2D;\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 canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n ratio = newAspectRatio;\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n}\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};\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\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 ?? 90;\r\n Engine.init().addSprites(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\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private updateInterval: number | undefined;\r\n public loop: () => (void | Promise<void>) = () => {};\r\n public maxFPS: number = 24;\r\n\r\n private lastFrame: number = performance.now();\r\n public deltaTime: number = 1 / this.maxFPS;\r\n\r\n public sprites: Sprite[] = [];\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 public addSprites(...sprites: Sprite[]) {\r\n this.sprites.push(...sprites);\r\n }\r\n\r\n public removeSprites(...sprites: Sprite[]) {\r\n this.sprites = this.sprites.filter(s => !sprites.includes(s));\r\n }\r\n\r\n public setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = setInterval(() => {\r\n \r\n const now = performance.now();\r\n const deltaTime = (now - this.lastFrame) / 1000;\r\n this.lastFrame = now;\r\n this.deltaTime = deltaTime;\r\n\r\n this.loop();\r\n }, 1000 / this.maxFPS);\r\n }\r\n\r\n public refresh() {\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n this.sprites.forEach(sprite => sprite.draw());\r\n }\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\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(-this.width / 2, -this.height / 2, this.width, this.height);\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 Engine from './Engine.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { 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(this.x, this.y, this.radA, this.radB, rotation, 0, Math.PI * 2);\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 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, ctx } 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 dot() {\r\n ctx.fillStyle = this.color;\r\n ctx.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 ctx.beginPath();\r\n ctx.moveTo(lastX, lastY);\r\n ctx.lineTo(\r\n this.x + canvas.width / 2,\r\n this.y + canvas.height / 2\r\n );\r\n ctx.lineWidth = this.size;\r\n ctx.strokeStyle = this.color;\r\n ctx.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}"],"mappings":"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","names":["index_exports","__export","Engine","Oval","Pen","Rectangle","RegularPolygon","Sprite","canvas","ctx","index_default","setAspectRatio","setScale","__toCommonJS","canvas","ctx","ratio","scale","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","Engine","options","deg","rad","steps","dir","x","y","dX","dY","Engine","_Engine","sprites","s","maxFPS","now","deltaTime","ctx","canvas","sprite","ms","resolve","deg","rad","Rectangle","Sprite","ctx","cX","canvas","cY","width","height","color","options","Oval","Sprite","rotation","ctx","radA","radB","color","options","RegularPolygon","Sprite","r","step","cx","canvas","cy","rotation","ctx","i","theta","px","py","radius","color","options","Pen","Sprite","ctx","canvas","lastX","lastY","steps","x","y","dX","dY","options","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","Pen","setScale","setAspectRatio","canvas","ctx","index_default"]}
package/dist/index.d.cts CHANGED
@@ -20,13 +20,12 @@ declare abstract class Sprite {
20
20
  goTo(x: number, y: number): void;
21
21
  changeX(dX: number): void;
22
22
  changeY(dY: number): void;
23
- wait(ms: number): Promise<void>;
24
23
  }
25
24
 
26
25
  declare class Engine {
27
26
  private static instance;
28
27
  private updateInterval;
29
- loop: () => void;
28
+ loop: () => (void | Promise<void>);
30
29
  maxFPS: number;
31
30
  private lastFrame;
32
31
  deltaTime: number;
@@ -36,8 +35,9 @@ declare class Engine {
36
35
  removeSprites(...sprites: Sprite[]): void;
37
36
  setMaxFramesPerSecond(maxFPS: number): void;
38
37
  refresh(): void;
39
- static toRadians(deg: number): number;
40
- static toDegrees(rad: number): number;
38
+ wait(ms: number): Promise<void>;
39
+ toRadians(deg: number): number;
40
+ toDegrees(rad: number): number;
41
41
  private constructor();
42
42
  }
43
43
 
package/dist/index.d.ts CHANGED
@@ -20,13 +20,12 @@ declare abstract class Sprite {
20
20
  goTo(x: number, y: number): void;
21
21
  changeX(dX: number): void;
22
22
  changeY(dY: number): void;
23
- wait(ms: number): Promise<void>;
24
23
  }
25
24
 
26
25
  declare class Engine {
27
26
  private static instance;
28
27
  private updateInterval;
29
- loop: () => void;
28
+ loop: () => (void | Promise<void>);
30
29
  maxFPS: number;
31
30
  private lastFrame;
32
31
  deltaTime: number;
@@ -36,8 +35,9 @@ declare class Engine {
36
35
  removeSprites(...sprites: Sprite[]): void;
37
36
  setMaxFramesPerSecond(maxFPS: number): void;
38
37
  refresh(): void;
39
- static toRadians(deg: number): number;
40
- static toDegrees(rad: number): number;
38
+ wait(ms: number): Promise<void>;
39
+ toRadians(deg: number): number;
40
+ toDegrees(rad: number): number;
41
41
  private constructor();
42
42
  }
43
43
 
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var r=document.getElementById("game-window"),i=r.getContext("2d"),m=16/9,a;function f(h){a=h,r.width=m*a,r.height=a}function y(h){m=h,r.width=m*a,r.height=a}f(500);var n=class{x;y;dir;refresh(){o.init().refresh()}constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.dir=t?.dir??90,o.init().addSprites(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,e){this.x=t,this.y=e,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y-=t,this.refresh()}async wait(t){return new Promise(e=>setTimeout(e,t))}};var o=class h{static instance;updateInterval;loop=()=>{};maxFPS=24;lastFrame=performance.now();deltaTime=1/this.maxFPS;sprites=[];static init(){return this.instance||(this.instance=new h),this.instance}addSprites(...t){this.sprites.push(...t)}removeSprites(...t){this.sprites=this.sprites.filter(e=>!t.includes(e))}setMaxFramesPerSecond(t){this.maxFPS=t,clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>{let e=performance.now(),s=(e-this.lastFrame)/1e3;this.lastFrame=e,this.deltaTime=s,this.loop()},1e3/this.maxFPS)}refresh(){i.clearRect(0,0,r.width,r.height),this.sprites.forEach(t=>t.draw())}static toRadians(t){return t*Math.PI/180}static toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24)}};var c=class extends n{width;height;color;draw(){i.fillStyle=this.color,i.fillRect(this.x-this.width/2+r.width/2,this.y-this.height/2+r.height/2,this.width,this.height)}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 l=class extends n{radA;radB;color;draw(){i.fillStyle=this.color,i.beginPath(),i.ellipse(this.x,this.y,this.radA,this.radB,this.toRadians(this.dir),0,Math.PI*2),i.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 p=class extends n{sides;radius;color;draw(){let t=this.radius,e=Math.PI*2/this.sides,s=r.width/2,b=r.height/2;i.beginPath();for(let d=0;d<this.sides;d++){let g=d*e-Math.PI/2,x=s+this.x+t*Math.cos(g),w=b+this.y+t*Math.sin(g);d===0?i.moveTo(x,w):i.lineTo(x,w)}i.closePath(),i.fillStyle=this.color,i.fill()}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 u=class extends n{drawing;size;color;draw(){}up(){this.drawing=!1}down(){this.drawing=!0}dot(){i.fillStyle=this.color,i.fillRect(this.x-this.size/2,this.y-this.size/2,this.size,this.size)}drawLine(t,e){i.beginPath(),i.moveTo(t,e),i.lineTo(this.x+r.width/2,this.y+r.height/2),i.lineWidth=this.size,i.strokeStyle=this.color,i.stroke()}move(t){let e=this.x,s=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y-=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(e,s),this.refresh()}setX(t){let e=this.x,s=this.y;this.x=t,this.drawing&&this.drawLine(e,s),this.refresh()}setY(t){let e=this.x,s=this.y;this.y=t,this.drawing&&this.drawLine(e,s),this.refresh()}goTo(t,e){let s=this.x,b=this.y;this.x=t,this.y=e,this.drawing&&this.drawLine(s,b),this.refresh()}changeX(t){let e=this.x,s=this.y;this.x+=t,this.drawing&&this.drawLine(e,s),this.refresh()}changeY(t){let e=this.x,s=this.y;this.y-=t,this.drawing&&this.drawLine(e,s),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var v={Engine:o,Sprite:n,Rectangle:c,Oval:l,RegularPolygon:p,Pen:u,setScale:f,setAspectRatio:y,canvas:r,ctx:i},V=v;export{o as Engine,l as Oval,u as Pen,c as Rectangle,p as RegularPolygon,n as Sprite,r as canvas,i as ctx,V as default,y as setAspectRatio,f as setScale};
1
+ var s=document.getElementById("game-window"),i=s.getContext("2d"),m=16/9,a;function f(h){a=h,s.width=m*a,s.height=a}function y(h){m=h,s.width=m*a,s.height=a}f(500);var n=class{x;y;dir;refresh(){o.init().refresh()}constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.dir=t?.dir??90,o.init().addSprites(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,e){this.x=t,this.y=e,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y-=t,this.refresh()}};var o=class h{static instance;updateInterval;loop=()=>{};maxFPS=24;lastFrame=performance.now();deltaTime=1/this.maxFPS;sprites=[];static init(){return this.instance||(this.instance=new h),this.instance}addSprites(...t){this.sprites.push(...t)}removeSprites(...t){this.sprites=this.sprites.filter(e=>!t.includes(e))}setMaxFramesPerSecond(t){this.maxFPS=t,clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>{let e=performance.now(),r=(e-this.lastFrame)/1e3;this.lastFrame=e,this.deltaTime=r,this.loop()},1e3/this.maxFPS)}refresh(){i.clearRect(0,0,s.width,s.height),this.sprites.forEach(t=>t.draw())}async wait(t){return new Promise(e=>setTimeout(e,t))}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24)}};var c=class extends n{width;height;color;draw(){i.save();let t=this.x+s.width/2,e=this.y+s.height/2;i.translate(t,e),i.rotate(this.toRadians(this.dir)),i.fillStyle=this.color,i.fillRect(-this.width/2,-this.height/2,this.width,this.height),i.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 l=class extends n{radA;radB;color;draw(){let t=this.toRadians(this.dir);i.beginPath(),i.ellipse(this.x,this.y,this.radA,this.radB,t,0,Math.PI*2),i.fillStyle=this.color,i.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 p=class extends n{sides;radius;color;draw(){let t=this.radius,e=Math.PI*2/this.sides,r=s.width/2,b=s.height/2,v=this.toRadians(this.dir);i.beginPath();for(let d=0;d<this.sides;d++){let g=d*e-Math.PI/2+v,x=r+this.x+t*Math.cos(g),w=b+this.y+t*Math.sin(g);d===0?i.moveTo(x,w):i.lineTo(x,w)}i.closePath(),i.fillStyle=this.color,i.fill()}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 u=class extends n{drawing;size;color;draw(){}up(){this.drawing=!1}down(){this.drawing=!0}dot(){i.fillStyle=this.color,i.fillRect(this.x-this.size/2+s.width/2,this.y-this.size/2+s.height/2,this.size,this.size)}drawLine(t,e){i.beginPath(),i.moveTo(t,e),i.lineTo(this.x+s.width/2,this.y+s.height/2),i.lineWidth=this.size,i.strokeStyle=this.color,i.stroke()}move(t){let e=this.x,r=this.y;this.x+=t*Math.sin(this.toRadians(this.dir)),this.y-=t*Math.cos(this.toRadians(this.dir)),this.drawing&&this.drawLine(e,r),this.refresh()}setX(t){let e=this.x,r=this.y;this.x=t,this.drawing&&this.drawLine(e,r),this.refresh()}setY(t){let e=this.x,r=this.y;this.y=t,this.drawing&&this.drawLine(e,r),this.refresh()}goTo(t,e){let r=this.x,b=this.y;this.x=t,this.y=e,this.drawing&&this.drawLine(r,b),this.refresh()}changeX(t){let e=this.x,r=this.y;this.x+=t,this.drawing&&this.drawLine(e,r),this.refresh()}changeY(t){let e=this.x,r=this.y;this.y-=t,this.drawing&&this.drawLine(e,r),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.size=t?.size??5,this.color=t?.color??"black"}};var S={Engine:o,Sprite:n,Rectangle:c,Oval:l,RegularPolygon:p,Pen:u,setScale:f,setAspectRatio:y,canvas:s,ctx:i},Z=S;export{o as Engine,l as Oval,u as Pen,c as Rectangle,p as RegularPolygon,n as Sprite,s as canvas,i as ctx,Z as default,y as setAspectRatio,f 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/index.ts"],"sourcesContent":["export const canvas = document.getElementById('game-window') as HTMLCanvasElement;\r\nexport const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\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 canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n ratio = newAspectRatio;\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n}\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};\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\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 ?? 90;\r\n Engine.init().addSprites(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\r\n // Control\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n}","import { canvas, ctx } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\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 loop: () => void = () => {};\r\n public maxFPS: number = 24;\r\n\r\n private lastFrame: number = performance.now();\r\n public deltaTime: number = 1 / this.maxFPS;\r\n\r\n public sprites: Sprite[] = [];\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 public addSprites(...sprites: Sprite[]) {\r\n this.sprites.push(...sprites);\r\n }\r\n\r\n public removeSprites(...sprites: Sprite[]) {\r\n this.sprites = this.sprites.filter(s => !sprites.includes(s));\r\n }\r\n\r\n public setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = setInterval(() => {\r\n \r\n const now = performance.now();\r\n const deltaTime = (now - this.lastFrame) / 1000;\r\n this.lastFrame = now;\r\n this.deltaTime = deltaTime;\r\n\r\n this.loop();\r\n }, 1000 / this.maxFPS);\r\n }\r\n\r\n public refresh() {\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n this.sprites.forEach(sprite => sprite.draw());\r\n }\r\n\r\n // Helpers\r\n\r\n public static toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public static 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\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.fillStyle = this.color;\r\n ctx.fillRect(\r\n this.x - this.width / 2 + canvas.width / 2,\r\n this.y - this.height / 2 + canvas.height / 2,\r\n this.width,\r\n this.height\r\n );\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 Engine from './Engine.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { 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 ctx.fillStyle = this.color;\r\n ctx.beginPath()\r\n ctx.ellipse(this.x, this.y, this.radA, this.radB, this.toRadians(this.dir), 0, Math.PI * 2);\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 ctx.beginPath();\r\n for (let i = 0; i < this.sides; i++) {\r\n const theta = i * step - Math.PI / 2;\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 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, ctx } 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 dot() {\r\n ctx.fillStyle = this.color;\r\n ctx.fillRect(\r\n this.x - this.size / 2,\r\n this.y - this.size / 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 ctx.beginPath();\r\n ctx.moveTo(lastX, lastY);\r\n ctx.lineTo(\r\n this.x + canvas.width / 2,\r\n this.y + canvas.height / 2\r\n );\r\n ctx.lineWidth = this.size;\r\n ctx.strokeStyle = this.color;\r\n ctx.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 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\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\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\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 \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","ratio","scale","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","Engine","options","deg","rad","steps","dir","x","y","dX","dY","ms","resolve","Engine","_Engine","sprites","s","maxFPS","now","deltaTime","ctx","canvas","sprite","deg","rad","Rectangle","Sprite","ctx","canvas","width","height","color","options","Oval","Sprite","ctx","radA","radB","color","options","RegularPolygon","Sprite","r","step","cx","canvas","cy","ctx","i","theta","px","py","radius","color","options","Pen","Sprite","ctx","lastX","lastY","canvas","steps","x","y","dX","dY","options","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","Pen","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/index.ts"],"sourcesContent":["export const canvas = document.getElementById('game-window') as HTMLCanvasElement;\r\nexport const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\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 canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n ratio = newAspectRatio;\r\n canvas.width = ratio * scale;\r\n canvas.height = scale;\r\n}\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};\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\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 ?? 90;\r\n Engine.init().addSprites(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\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private updateInterval: number | undefined;\r\n public loop: () => (void | Promise<void>) = () => {};\r\n public maxFPS: number = 24;\r\n\r\n private lastFrame: number = performance.now();\r\n public deltaTime: number = 1 / this.maxFPS;\r\n\r\n public sprites: Sprite[] = [];\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 public addSprites(...sprites: Sprite[]) {\r\n this.sprites.push(...sprites);\r\n }\r\n\r\n public removeSprites(...sprites: Sprite[]) {\r\n this.sprites = this.sprites.filter(s => !sprites.includes(s));\r\n }\r\n\r\n public setMaxFramesPerSecond(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = setInterval(() => {\r\n \r\n const now = performance.now();\r\n const deltaTime = (now - this.lastFrame) / 1000;\r\n this.lastFrame = now;\r\n this.deltaTime = deltaTime;\r\n\r\n this.loop();\r\n }, 1000 / this.maxFPS);\r\n }\r\n\r\n public refresh() {\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n this.sprites.forEach(sprite => sprite.draw());\r\n }\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\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(-this.width / 2, -this.height / 2, this.width, this.height);\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 Engine from './Engine.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { 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(this.x, this.y, this.radA, this.radB, rotation, 0, Math.PI * 2);\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 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, ctx } 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 dot() {\r\n ctx.fillStyle = this.color;\r\n ctx.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 ctx.beginPath();\r\n ctx.moveTo(lastX, lastY);\r\n ctx.lineTo(\r\n this.x + canvas.width / 2,\r\n this.y + canvas.height / 2\r\n );\r\n ctx.lineWidth = this.size;\r\n ctx.strokeStyle = this.color;\r\n ctx.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 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\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\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\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 \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","ratio","scale","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","Engine","options","deg","rad","steps","dir","x","y","dX","dY","Engine","_Engine","sprites","s","maxFPS","now","deltaTime","ctx","canvas","sprite","ms","resolve","deg","rad","Rectangle","Sprite","ctx","cX","canvas","cY","width","height","color","options","Oval","Sprite","rotation","ctx","radA","radB","color","options","RegularPolygon","Sprite","r","step","cx","canvas","cy","rotation","ctx","i","theta","px","py","radius","color","options","Pen","Sprite","ctx","canvas","lastX","lastY","steps","x","y","dX","dY","options","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","Pen","setScale","setAspectRatio","canvas","ctx","index_default"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tscratch",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "A Scratch-style game engine for TypeScript.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",