tscratch 0.1.6 → 0.1.7

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
@@ -72,7 +72,6 @@ engine.loop = () => {
72
72
  ### Engine
73
73
 
74
74
  - `Engine.init()` → get the singleton instance
75
- - `engine.addSprites(...sprites)` → add sprites to the stage
76
75
  - `engine.removeSprites(...sprites)` → removes sprites from the stage
77
76
  - `engine.setFramesPerSecond(FPS)`→ sets the update time
78
77
  - `engine.loop = () => { ... }` → game loop logic
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var b=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var P=(i,t)=>{for(var s in t)b(i,s,{get:t[s],enumerable:!0})},R=(i,t,s,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let h of w(t))!O.call(i,h)&&h!==s&&b(i,h,{get:()=>t[h],enumerable:!(a=v(t,h))||a.enumerable});return i};var M=i=>R(b({},"__esModule",{value:!0}),i);var F={};P(F,{Engine:()=>o,Oval:()=>p,Rectangle:()=>c,RegularPolygon:()=>l,Sprite:()=>n,canvas:()=>r,ctx:()=>e,default:()=>A,setAspectRatio:()=>x,setScale:()=>m});module.exports=M(F);var r=document.getElementById("game-window"),e=r.getContext("2d"),f=16/9,u;function m(i){u=i,r.width=f*u,r.height=u}function x(i){f=i,r.width=f*u,r.height=u}m(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}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()}async wait(t){return new Promise(s=>setTimeout(s,t))}};var o=class i{static instance;updateInterval;loop=()=>{};maxFPS=24;lastFrame=performance.now();deltaTime=1/this.maxFPS;sprites=[];static init(){return this.instance||(this.instance=new i),this.instance}addSprites(...t){this.sprites.push(...t)}removeSprites(...t){this.sprites=this.sprites.filter(s=>!t.includes(s))}setMaxFramesPerSecond(t){this.maxFPS=t,clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>{let s=performance.now(),a=(s-this.lastFrame)/1e3;this.lastFrame=s,this.deltaTime=a,this.loop()},1e3/this.maxFPS)}refresh(){e.clearRect(0,0,r.width,r.height),this.sprites.forEach(t=>t.draw())}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(){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 p=class extends n{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 l=class extends n{sides;radius;color;draw(){let t=this.radius,s=Math.PI*2/this.sides,a=r.width/2,h=r.height/2;e.beginPath();for(let d=0;d<this.sides;d++){let g=d*s-Math.PI/2,y=a+this.x+t*Math.cos(g),S=h+this.y+t*Math.sin(g);d===0?e.moveTo(y,S):e.lineTo(y,S)}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 I={Engine:o,Sprite:n,Rectangle:c,Oval:p,RegularPolygon:l,setScale:m,setAspectRatio:x,canvas:r,ctx:e},A=I;0&&(module.exports={Engine,Oval,Rectangle,RegularPolygon,Sprite,canvas,ctx,setAspectRatio,setScale});
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});
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"],"sourcesContent":["import Engine from './Engine.ts';\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 { 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\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\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type OvalOptions,\r\n type RegularPolygonOptions,\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 }\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 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.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 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}"],"mappings":"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","names":["index_exports","__export","Engine","Oval","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","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","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","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\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"]}
package/dist/index.d.cts CHANGED
@@ -36,8 +36,8 @@ declare class Engine {
36
36
  removeSprites(...sprites: Sprite[]): void;
37
37
  setMaxFramesPerSecond(maxFPS: number): void;
38
38
  refresh(): void;
39
- toRadians(deg: number): number;
40
- toDegrees(rad: number): number;
39
+ static toRadians(deg: number): number;
40
+ static toDegrees(rad: number): number;
41
41
  private constructor();
42
42
  }
43
43
 
@@ -88,6 +88,29 @@ declare class RegularPolygon extends Sprite {
88
88
  constructor(options?: RegularPolygonOptions);
89
89
  }
90
90
 
91
+ interface PenOptions extends SpriteOptions {
92
+ drawing: boolean;
93
+ size: number;
94
+ color: string;
95
+ }
96
+ declare class Pen extends Sprite {
97
+ drawing: boolean;
98
+ size: number;
99
+ color: string;
100
+ draw(): void;
101
+ up(): void;
102
+ down(): void;
103
+ dot(): void;
104
+ private drawLine;
105
+ move(steps: number): void;
106
+ setX(x: number): void;
107
+ setY(y: number): void;
108
+ goTo(x: number, y: number): void;
109
+ changeX(dX: number): void;
110
+ changeY(dY: number): void;
111
+ constructor(options?: PenOptions);
112
+ }
113
+
91
114
  declare const canvas: HTMLCanvasElement;
92
115
  declare const ctx: CanvasRenderingContext2D;
93
116
  declare function setScale(newScale: number): void;
@@ -99,10 +122,11 @@ declare const TScratch: {
99
122
  Rectangle: typeof Rectangle;
100
123
  Oval: typeof Oval;
101
124
  RegularPolygon: typeof RegularPolygon;
125
+ Pen: typeof Pen;
102
126
  setScale: typeof setScale;
103
127
  setAspectRatio: typeof setAspectRatio;
104
128
  canvas: HTMLCanvasElement;
105
129
  ctx: CanvasRenderingContext2D;
106
130
  };
107
131
 
108
- export { Engine, Oval, type OvalOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Sprite, type SpriteOptions, canvas, ctx, TScratch as default, setAspectRatio, setScale };
132
+ export { Engine, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Sprite, type SpriteOptions, canvas, ctx, TScratch as default, setAspectRatio, setScale };
package/dist/index.d.ts CHANGED
@@ -36,8 +36,8 @@ declare class Engine {
36
36
  removeSprites(...sprites: Sprite[]): void;
37
37
  setMaxFramesPerSecond(maxFPS: number): void;
38
38
  refresh(): void;
39
- toRadians(deg: number): number;
40
- toDegrees(rad: number): number;
39
+ static toRadians(deg: number): number;
40
+ static toDegrees(rad: number): number;
41
41
  private constructor();
42
42
  }
43
43
 
@@ -88,6 +88,29 @@ declare class RegularPolygon extends Sprite {
88
88
  constructor(options?: RegularPolygonOptions);
89
89
  }
90
90
 
91
+ interface PenOptions extends SpriteOptions {
92
+ drawing: boolean;
93
+ size: number;
94
+ color: string;
95
+ }
96
+ declare class Pen extends Sprite {
97
+ drawing: boolean;
98
+ size: number;
99
+ color: string;
100
+ draw(): void;
101
+ up(): void;
102
+ down(): void;
103
+ dot(): void;
104
+ private drawLine;
105
+ move(steps: number): void;
106
+ setX(x: number): void;
107
+ setY(y: number): void;
108
+ goTo(x: number, y: number): void;
109
+ changeX(dX: number): void;
110
+ changeY(dY: number): void;
111
+ constructor(options?: PenOptions);
112
+ }
113
+
91
114
  declare const canvas: HTMLCanvasElement;
92
115
  declare const ctx: CanvasRenderingContext2D;
93
116
  declare function setScale(newScale: number): void;
@@ -99,10 +122,11 @@ declare const TScratch: {
99
122
  Rectangle: typeof Rectangle;
100
123
  Oval: typeof Oval;
101
124
  RegularPolygon: typeof RegularPolygon;
125
+ Pen: typeof Pen;
102
126
  setScale: typeof setScale;
103
127
  setAspectRatio: typeof setAspectRatio;
104
128
  canvas: HTMLCanvasElement;
105
129
  ctx: CanvasRenderingContext2D;
106
130
  };
107
131
 
108
- export { Engine, Oval, type OvalOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Sprite, type SpriteOptions, canvas, ctx, TScratch as default, setAspectRatio, setScale };
132
+ export { Engine, Oval, type OvalOptions, Pen, type PenOptions, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Sprite, type SpriteOptions, canvas, ctx, TScratch as default, setAspectRatio, setScale };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var i=document.getElementById("game-window"),e=i.getContext("2d"),d=16/9,h;function m(n){h=n,i.width=d*h,i.height=h}function g(n){d=n,i.width=d*h,i.height=h}m(500);var r=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}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()}async wait(t){return new Promise(s=>setTimeout(s,t))}};var o=class n{static instance;updateInterval;loop=()=>{};maxFPS=24;lastFrame=performance.now();deltaTime=1/this.maxFPS;sprites=[];static init(){return this.instance||(this.instance=new n),this.instance}addSprites(...t){this.sprites.push(...t)}removeSprites(...t){this.sprites=this.sprites.filter(s=>!t.includes(s))}setMaxFramesPerSecond(t){this.maxFPS=t,clearInterval(this.updateInterval),this.updateInterval=setInterval(()=>{let s=performance.now(),u=(s-this.lastFrame)/1e3;this.lastFrame=s,this.deltaTime=u,this.loop()},1e3/this.maxFPS)}refresh(){e.clearRect(0,0,i.width,i.height),this.sprites.forEach(t=>t.draw())}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}constructor(){this.setMaxFramesPerSecond(24)}};var a=class extends r{width;height;color;draw(){e.fillStyle=this.color,e.fillRect(this.x-this.width/2+i.width/2,this.y-this.height/2+i.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 c=class extends r{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 r{sides;radius;color;draw(){let t=this.radius,s=Math.PI*2/this.sides,u=i.width/2,y=i.height/2;e.beginPath();for(let l=0;l<this.sides;l++){let b=l*s-Math.PI/2,f=u+this.x+t*Math.cos(b),x=y+this.y+t*Math.sin(b);l===0?e.moveTo(f,x):e.lineTo(f,x)}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 S={Engine:o,Sprite:r,Rectangle:a,Oval:c,RegularPolygon:p,setScale:m,setAspectRatio:g,canvas:i,ctx:e},z=S;export{o as Engine,c as Oval,a as Rectangle,p as RegularPolygon,r as Sprite,i as canvas,e as ctx,z as default,g as setAspectRatio,m as setScale};
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};
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/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 }\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 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.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 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 Engine from './Engine.ts';\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 { 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\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\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type OvalOptions,\r\n type RegularPolygonOptions,\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","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","TScratch","Engine","Sprite","Rectangle","Oval","RegularPolygon","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\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tscratch",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "A Scratch-style game engine for TypeScript.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",