From 5deb45001efb3a53b78a4cdf86aa9646c6555371 Mon Sep 17 00:00:00 2001 From: ztimson Date: Mon, 8 Aug 2022 12:05:45 -0400 Subject: [PATCH] sprite refactor --- assets/files.png | Bin 27077 -> 0 bytes assets/sprites/shadow-dog/spritesheet.json | 14 +++ .../shadow-dog/spritesheet.png} | Bin assets/sprites/template/spritesheet.json | 11 +++ .../template/spritesheet.png} | Bin assets/sprites/texture-pack/spritesheet.json | 58 ++++++++++++ assets/sprites/texture-pack/spritesheet.png | Bin 0 -> 29144 bytes src/constants.ts | 1 + src/main.ts | 5 +- src/npc.ts | 84 +++++++++++++++++ src/renderer.ts | 24 ++--- src/sprite-sheet.ts | 87 ++++++++++++++++++ src/sprites.ts | 67 -------------- src/unit-controller.ts | 55 ----------- 14 files changed, 267 insertions(+), 139 deletions(-) delete mode 100644 assets/files.png create mode 100644 assets/sprites/shadow-dog/spritesheet.json rename assets/{shadow_dog.png => sprites/shadow-dog/spritesheet.png} (100%) create mode 100644 assets/sprites/template/spritesheet.json rename assets/{sprite_template.png => sprites/template/spritesheet.png} (100%) create mode 100644 assets/sprites/texture-pack/spritesheet.json create mode 100644 assets/sprites/texture-pack/spritesheet.png create mode 100644 src/npc.ts create mode 100644 src/sprite-sheet.ts delete mode 100644 src/sprites.ts delete mode 100644 src/unit-controller.ts diff --git a/assets/files.png b/assets/files.png deleted file mode 100644 index ae08dc484b6ecfd845e3c0ba2e590344e52d528c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27077 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%0DP8wfF^J5~Ft8ngM^rAqw{GvXkJMahNNYhMgP zCwZ0~*P6-iQ{xze-&^oP$G!$bR&@BVeh&O2j1S(Y>Mb? zNj}Uwxa7JxjJsE@3$n1u~huOd|JdST4HZ0AX2-ciE$0LW;v{QsLW0r_(XJ8%G+ad1U&v^x!jn zK|r=a7bpJSm*ulOzZi*@kcJHgGh>y}F$1j12Y3OG`d-$te>Ojki2~SQ{;hq4=q8lJ zTGkXo8d!it_eaKS8_V8EyzSvLxEqWcwAeoY;d$ofRxmbI9#0=XUPP6H<_Q0j?ZjIX zplZ03%-7iwwPa~YD)m`=9J?qbBj5owHtEkAJU&R7uqz32B=$to&dfC|~2Ar(RWx*9t9z9+y-qvI`_Rjz4- zv}$WW5W3T+qFPO_V*JAb@T%(~0JGSZi1R+E1_5Fe1B>TkNEhkfefnkzU%6OqBJ_Ot zHC?tXz>=!x9N|eEVV8*My!fPwdg9Xo+3}dmWp4*u)>mf$-8R+0|IbAt$@4&3Fn!d* z@wQ!p9KC_V>Y?S#OjWQgOyDQHTQ9B*@cVW#5LI6sK5NVAzm%c=A3rPvoTOHFB*Uo=m_`_ zmmSA00Om+J@TSGT*02=Mn`ui}^>@c!mpY<@ z0U93#93~<$>|w*32IXt~8T|J5oc1xHRW0o!ENJmP$x8r-YSANV-KlyXL()j$$xn^s z5-)|y%>oOOc$ytLG~PgvJW#K`IQR|=e(Adfh~##}!~bBI<)!w&7d*(5w|mPYw8-(D z4$$lYwG95Jyg&gkf^)_o8|WE)E*8JTS6{rzX4+5O)RZ6)pwjHiw;akZ*5VS-N;t>_ zRX9^KmwFyANTDHU=t~{bMGYTdH)9{#nj9Mqr;0um z6hM`QF5b)oOO2*%)79^pMcW#Dbr(eQDo( z$OChh=9x1~icIlHdmBn1{X`XPj=EUui|>zdr5QA<@fO-mlrI{Yq!0=3NzcYT0)EbO zgJ%U(sEo|JoZ$LqO;Hpe_ycGtaJqb0zw*1+gu?-F8=V<=AHGhy0+`@UXCF6J68s{Z$C-uerHB0AwJ!0H*;r@x_y8+5wOQFYP2h8+!qd zU<`l2bU5hF2@7Ivg}-zH>h^9sa{z5n<(2^) z=9RdtYUgW&&ul=L&S@_Hn-vVFFL;04O=owjp}9vAF9x@hx~Nl!hQF$a>(QxU>Awgr znp_=4Ty{2+{tUo9KhDarJBW>6pmMbuebRGH?sCGe&}&{9mowPu4^H5m!tDp^l?2Y6a>)GTog>%m%5ju|}$x5g^M+S0f zMXQilB6PngCEf`@8#mJ5%#Mqng}&#E)K54DaMs(j`u#)_!>Z3Kp(h*tnKl5jHvI_( z-gHniJR+j&iF~+^CKTf&@6t zt2}W5F@n~a#X104E?9YdxU$e>hR}qUKwc)QY)M$oVwMmsn75Y?gV3GOyBzH8c@*S$ zwUHAjSDNz~{>TgoNWuRKKo|FV1$P|Gn{?+~p3ksf<9?`fCMN2`M~Ki<*|3f}CG-oh z@^d_y$y}cRxAl|9Sz3k#z-Jal)bogBM#5iX}>gxH%y0s~hSr4Ps%xh4L2 zAnb3X^u9*wo`7_#u;Vz2NQ7AII>V(}TAc+D)^TDRq4z!EvCoP(PKVh_o-j+U-59*C zYybd$-mTASRS86jx%n=74?ye*SWXtoSx7TMZXbN2FPt{|(s>!%f$75vp!f6c+%bv! z29=_NPc2l+FmllnbYzBDm?!E~!B0|IP)Ja_7}TEHlC;;P`uCw2!z#Flcy$yRIdo%x z=P71;nJf3j+9Cj`U=OHWa2c}plc4*DMDY?iinAM$X2&)W%Bs|| zVDtLxc`3ZUQ2VlvZZQq7hOQpJMPTwxtJJD97aeSZ<>xI{#IV7COp^S$Js;*$)#Fsd z8nm(LL%B8}tctZn{eq&iy}~Dhd_Z9GqJmgfIMj9ko+$d7Wax)%&N9H+rOz>001-z3 z1H|00v`!c{q@IXC9g_bBHgwwoIflLYXs?OGA*zQvgVTB0W}u6TW+f_S9r5wE%z89Y z_$I_Qso@QAW81upQ*M}7O`N#raHT&VIUcLznApAfQd}_Y-6rYWGR4a=1ak^bB*?L$ z;ntKhLLHUQKD3c`*3*P6pd(~i}96w$y1vlwRx5v*HZfX>#qCb(z@VLrP>418JW2Tt&X4}kvSQ&v zzaZ9I-QPb+WU)4tHr1wSl$4Yjg^JYFW2OL)jvclt>MJfYMA|4YF?J!wOI)DO%RO_Y^xtb}jHh?PCID)G`Sn z1^}yp_AMvUxa7i{bpXXNa! v)~ZJ;k>%(fNM5Oxty*>*6)XCtEGxLd#qzfZN@; z*~uvZ*sZ;9j&*ITkw&ux>hmw3-jN!@e*hw8Ap(}5>hLRy@%|^e?g7H>>b*h~0b7NY zuPhnU#TS$g_vctnNh_08BabXQc(>X9%%W-P4p9Sb&H=}O=pE=U;dQ;sydGiGMV`z& zz7H_X729urR4TTuwkVu!k1}Z!&}PGh0ASF<^7K#3qVu9u1GS~&O!`Jn*V|r}s<|hu zGty$J7=^0O8d&4+1AQM_)*oZ;@TxF^yi+dJ6I=>ad%md}4dUY3QgE0cI>8%GJW~K} zT9OyqD{LL2Q-$Ru>d3N-F!T1O6sg26iU#MqNii8uq&v6=dy%1%0bNEIfu)%fl$-rF zAUlGR8Lqj%>9Ky3mz2I8-VZ9iBj0e-FRzuHpK(k0+8P$-z)z)Yk~&m!126k=7SMg% zZU(^439*xt^+**^>_ufV!|emU)C&IH2m3lA7Q7UJjn|$sA2Q5Pdzqy1)KEU zfgUp&S(M|e=M~T4e~gF0(!*2bH48BlYDgz%e&^F}{RUv~P8d!3;NcZ~{~RHKo&fNIxlWettwbb?delg6aC&Zve*0sxvbpy20p6y?@h>u%!Zj0Ddb7t z7{R=?kcSs2{`Ut`j1dp+oz_O_Lp6AQlGHEwft{`uz(F@#fEHjZ&(F)N2%aGNUQ>A) zyPf%_kbM38H!QHID6NsC#~7aZ0dK&u*3v2aD)|&B&2Rdn)kK=p;Q#0JYD1DV3Ib79 zu8%aT$}@!ybJmm>Tqy(`X1y1@^Oi^%fqq{~lDNDA>C$ zCVV&d-D}WnlBB%l{&e`G-2xqpvolK6-w`G(-e_((_t6|x0W5;azf0M)nW$j7U{_zH zx;vGttE2N|1Zy-5aUu-^k_9<;c%=LS0((!*tDgD+O)oD4)DM3PJ}Q6__P=9Xp6`Y+ z>T&SV%Nf`!Z7t)1>5>LLfL)||rwanZuolnze}}oaUPq#lcBL43Tz@Ojs$p9%=E6yT zMgUm<&IqvO2Gxr#RQ>yS1ORi&=~uF0UTsX1^nu9{ar!LBf7TLO`dF7DyUi9m`YLL&)201>2?e7E3(7Fwezwssu*oN?ZFx6)TIw1J$ zAo$i!-~2mcz6`B#ts(3;8Gh<2iXcL=1?V-kt%vpf2~FOj z%1}5K_V*^tH+Go&Iw8MG3!E#$c9xv_$!^B_ZJ3q*ogEo`yG+u%O|qhaCEGZJ;%d<) z?)`#$+gV`XuYa%5cUu*I!wj85cv0ac&axrU3kHaU5Wbu6-|1_Q_d^Y#%*F`U_j7XJ zb2T>NnA_|)M&<&ozXzz@BK5h{))2nmSdU^G`ygCgU3!-Hca&&D(t9B!DdwKQYt?VZ z6n_}<@5BtNIVO!-*;Cz-_&f1MR`Er3Cm#8Xyq^pGJF9|=Z1sBb|9jJKjp?FRZnXMp zX#O4A^4fE8v@17h1AhY(sqSuX{$j@zW7z(`u`s9at4Wl~iu2X}_rkpbb{`Q4G^c!g UFAskL-5BBIq?9Eq#EpXf2U+iea{vGU literal 0 HcmV?d00001 diff --git a/src/constants.ts b/src/constants.ts index 0efa98b..363f2d2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1 +1,2 @@ export const FRAME_RATE = 10; +export const GRAVITY = 9.8; diff --git a/src/main.ts b/src/main.ts index 43fc763..3d7546c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,5 +1,6 @@ -import {app, BrowserWindow, screen} from "electron"; -import * as path from "path"; +import {app, BrowserWindow, screen} from 'electron'; +import * as fs from 'fs'; +import * as path from 'path'; // Window factory function createWindow() { diff --git a/src/npc.ts b/src/npc.ts new file mode 100644 index 0000000..1002cd6 --- /dev/null +++ b/src/npc.ts @@ -0,0 +1,84 @@ +const {GRAVITY} = require('./dist/constants.js'); +const {SpriteSheet} = require('./sprite-sheet'); + +export type NPCOptions = { + bubbleOffset?: [number, number]; + noBounds?: boolean; + noGravity?: boolean; + scale?: number; +} + +export class NPC { + private readonly emojis = [ + 0x1F600, 0x1F601, 0x1F603, 0x1F603, 0x1F604, 0x1F605, 0x1F606, + 0x1F607, 0x1F609, 0x1F60A, 0x1F642, 0x1F643, 0x1F355, 0x1F354, + ]; + private readonly texturePack: any; + + private random: number = 0; + private sprite!: any; + private text: string; + + public pos = [0, 0]; + public vel = [0, 0]; + + constructor(private readonly ctx: CanvasRenderingContext2D, + public readonly spriteSheetPath: string, + public readonly spriteDefPath: string, + public readonly options: NPCOptions = {}, + ) { + this.texturePack = new SpriteSheet(this.ctx, + './assets/sprites/texture-pack/spritesheet.png', + '../assets/sprites/texture-pack/spritesheet.json'); + + if(this.options.bubbleOffset == null) this.options.bubbleOffset = [0, 0]; + if(this.options.scale == null) this.options.scale = 1; + this.sprite = new SpriteSheet(ctx, spriteSheetPath, spriteDefPath); + + setInterval(() => { + this.message(String.fromCodePoint(this.emojis[~~(Math.random() * this.emojis.length)])); + }, 10000); + } + + animate(name: string, reverse = false) { + if(this.text) { + const bubble = this.texturePack.definitions.sprites['bubble']; + const x = this.pos[0] + this.options.bubbleOffset[0] * (reverse ? -1 : 1); + const y = this.pos[1] + this.options.bubbleOffset[1]; + this.texturePack.drawSprite(x, y, 'bubble', reverse); + this.ctx.save(); + this.ctx.textAlign = 'center'; + this.ctx.textBaseline = 'middle'; + this.ctx.font = '24px serif'; + this.ctx.fillText(this.text, x + (bubble.width / 2 * (reverse ? -1 : 1)), y + (bubble.height / 2)); + this.ctx.restore(); + } + this.sprite.animate(this.pos[0], this.pos[1], name, reverse, this.options.scale); + } + + tick() { + if(this.random <= 0) { + const move = Math.random(); + if(move < 0.333) this.vel = [0, 0]; + else if(move < 0.666) this.vel = [-10, 0]; + else this.vel = [10, 0]; + this.random = Math.random() * 50; + } + this.random--; + + this.pos = [this.pos[0] + this.vel[0], this.pos[1] + this.vel[1]]; + if(!this.options.noGravity) this.vel[1] -= GRAVITY; + if(this.pos[1] < 0) this.pos[1] = 0; + if(!this.options.noBounds) { + if(this.pos[0] < 0) this.pos[0] = 0; + if(this.pos[0] > this.ctx.canvas.width) this.pos[0] = this.ctx.canvas.width; + } + + this.animate(this.vel[0] == 0 ? 'idle' : 'walk', this.vel[0] < 0); + } + + message(text: string, ms = 5000) { + setTimeout(() => this.text = null, ms); + this.text = text; + } +} diff --git a/src/renderer.ts b/src/renderer.ts index e01aae1..e436e8d 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -1,7 +1,5 @@ const {FRAME_RATE} = require('./dist/constants.js'); -const {UnitController} = require('./dist/unit-controller.js'); -const {StaticSprite} = require('./dist/sprites.js'); -const {sleep} = require('./dist/utils.js'); +const {NPC} = require('./dist/npc.js') const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); @@ -13,21 +11,17 @@ canvas.height = screenHeight; function clearScreen() { ctx.clearRect(0, 0, screenWidth, screenHeight); } -const sprite = new UnitController(ctx, { - spritesheetSrc: './assets/shadow_dog.png', - spriteAnimations: [ - {name: 'idle', y: 0, frames: 7}, - {name: 'right', y: 3, frames: 9}, - {name: 'left', y: 3, frames: 9, reverse: true}, - ], - spriteScale: 0.5, - spriteWidth: 575, - spriteHeight: 523, - }); +const dog = new NPC(ctx, './assets/sprites/shadow-dog/spritesheet.png', '../assets/sprites/shadow-dog/spritesheet.json', { + bubbleOffset: [50, 75], + scale: 0.25 +}); +let frame = 0, once = true; setInterval(() => { requestAnimationFrame(() => { + frame++; clearScreen(); - sprite.tick(); + + dog.tick(); }) }, 1000 / FRAME_RATE); diff --git a/src/sprite-sheet.ts b/src/sprite-sheet.ts new file mode 100644 index 0000000..ba41478 --- /dev/null +++ b/src/sprite-sheet.ts @@ -0,0 +1,87 @@ +export type SpriteDefinitions = { + width?: number; + height?: number; + animations?: {[key: string]: {y: number, frames: number}}; + sprites?: {[key: string]: {x: number, y: number, width?: number, height?: number}}; +} + +export class SpriteSheet { + private readonly definitions!: SpriteDefinitions; + private readonly spriteSheet!: HTMLImageElement; + + private animation = ''; + private frame = -1; + + constructor(private readonly ctx: CanvasRenderingContext2D, + public readonly spriteSheetPath: string, + public readonly spriteDefPath: string, + ) { + this.spriteSheet = new Image(); + this.spriteSheet.src = spriteSheetPath; + this.definitions = require(spriteDefPath); + + // Backfill coordinates if shorthand is used + if(this.definitions.sprites?.length) { + Object.entries(this.definitions.sprites).forEach(sprite => { + const [name, def] = sprite; + if(def.width == null) { + if(this.definitions.width == null) + throw new Error(`Sprite is missing it's width: ${name}`); + this.definitions.sprites[name].x = this.definitions.width * def.x; + this.definitions.sprites[name].width = this.definitions.width; + } + if(def.height == null) { + if(this.definitions.height == null) + throw new Error(`Sprite is missing it's height: ${name}`); + this.definitions.sprites[name].y = this.definitions.height * def.y; + this.definitions.sprites[name].height = this.definitions.height; + } + }); + } + } + + animate(x: number, y: number, name: string = this.animation, flip = false, scale = 1) { + const animation = this.definitions.animations[name]; + if(!animation) throw new Error(`Animation doesn't exist: ${name}`); + if(name == this.animation) { + this.frame++; + if(this.frame >= animation.frames) this.frame = 0; + } else { + this.animation = name; + this.frame = 0; + } + this.drawFrame(x, y, this.animation, this.frame, flip, scale); + } + + drawFrame(x: number, y: number, name: string, frame: number, flip = false, scale = 1, centerX = true, centerY = false) { + const sprite = this.definitions.animations[name]; + if(!sprite) throw new Error(`Animation doesn't exist: ${name}`); + this.ctx.save(); + this.ctx.translate(centerX ? + this.definitions.width * scale / 2 * (flip ? 1 : -1) : + flip ? this.definitions.width : 0, + centerY ? this.definitions.height / -2 : 0); + this.ctx.scale(flip ? -1 : 1, 1); + this.ctx.drawImage(this.spriteSheet, + frame * this.definitions.width, sprite.y * this.definitions.height, this.definitions.width, this.definitions.height, + x * (flip ? -1 : 1), this.ctx.canvas.height - (this.definitions.height * scale + y), + this.definitions.width * scale, this.definitions.height * scale); + this.ctx.restore(); + } + + drawSprite(x: number, y: number, name: string, flip = false, scale = 1, centerX = true, centerY = false) { + const sprite = this.definitions.sprites[name]; + if(!sprite) throw new Error(`Sprite doesn't exist: ${name}`); + this.ctx.save(); + this.ctx.translate(centerX ? + this.definitions.width * scale / 2 * (flip ? 1 : -1) : + flip ? this.definitions.width : 0, + centerY ? this.definitions.height / -2 : 0); + this.ctx.scale(flip ? -1 : 1, 1); + this.ctx.drawImage(this.spriteSheet, + sprite.x, sprite.y, sprite.width, sprite.height, + x * (flip ? -1 : 1), this.ctx.canvas.height - (sprite.height * scale + y), + sprite.width * scale, sprite.height * scale); + this.ctx.restore(); + } +} diff --git a/src/sprites.ts b/src/sprites.ts deleted file mode 100644 index 3ad9a0a..0000000 --- a/src/sprites.ts +++ /dev/null @@ -1,67 +0,0 @@ -export type SpriteAnimation = { - name: string; - y: number; - frames: number; - reverse?: boolean; -} - -export class AnimatedSprite { - private animation: any = null; - private animationName = ''; - private frame = -1; - private spriteSheet!: HTMLImageElement; - - constructor(private ctx: CanvasRenderingContext2D, - public spritesheetSrc: string, - public spriteAnimations: SpriteAnimation[], - public spriteScale = 1, - public spriteWidth = 100, - public spriteHeight = 100, - ) { - this.spriteSheet = new Image(); - this.spriteSheet.src = this.spritesheetSrc; - } - - render(x: number, y: number, animation: string = this.animationName) { - if(this.animationName != animation) { - this.frame = 0; - this.animation = this.spriteAnimations.find((a) => a.name == animation); - this.animationName = this.animation.name; - } else { - this.frame++; - if(this.frame >= this.animation.frames) this.frame = 0; - } - - this.ctx.save(); - this.ctx.translate(this.spriteWidth * this.spriteScale / 2 * (this.animation.reverse ? 1 : -1), 0); - this.ctx.scale(this.animation.reverse ? -1 : 1, 1); - this.ctx.drawImage(this.spriteSheet, - this.frame * this.spriteWidth, this.animation.y * this.spriteHeight, this.spriteWidth, this.spriteHeight, - x * (this.animation.reverse ? -1 : 1), this.ctx.canvas.height - (this.spriteHeight * this.spriteScale + y), - this.spriteWidth * this.spriteScale, this.spriteHeight * this.spriteScale); - this.ctx.restore(); - } -} - -export class StaticSprite { - private spriteSheet!: HTMLImageElement; - - constructor(private ctx: CanvasRenderingContext2D, - public spritesheetSrc: string, - public sprite: [number, number], - public spriteScale = 1, - public spriteWidth = 100, - public spriteHeight = 100, - ) { - this.spriteSheet = new Image(); - this.spriteSheet.src = this.spritesheetSrc; - } - - render(x: number, y: number) { - this.ctx.drawImage(this.spriteSheet, - this.sprite[0] * this.spriteWidth, this.sprite[1] * this.spriteHeight, - this.spriteWidth, this.spriteHeight, - x, this.ctx.canvas.height - (this.spriteHeight * this.spriteScale + y), - this.spriteWidth * this.spriteScale, this.spriteHeight * this.spriteScale); - } -} diff --git a/src/unit-controller.ts b/src/unit-controller.ts deleted file mode 100644 index 1f0f5f3..0000000 --- a/src/unit-controller.ts +++ /dev/null @@ -1,55 +0,0 @@ -// const {FRAME_RATE} = require('./dist/constants.js'); -const {AnimatedSprite} = require('./sprites.js'); - -export type SpriteOptions = { - spritesheetSrc: string, - spriteAnimations: any[], - spriteScale?: number, - spriteWidth?: number, - spriteHeight?: number, -} - -export class UnitController { - private sprite!: typeof AnimatedSprite; - private random = 0; - - public pos = [0, 0]; - public vel = [0, 0]; - - constructor(private ctx: CanvasRenderingContext2D, - private spriteOptions: SpriteOptions, - ) { - this.sprite = new AnimatedSprite(ctx, spriteOptions.spritesheetSrc, spriteOptions.spriteAnimations, spriteOptions.spriteScale, spriteOptions.spriteWidth, spriteOptions.spriteHeight); - } - - tick() { - // Randomly move the unit - if(this.random <= 0) { - const move = Math.random(); - if(move < 0.333) this.vel = [0, 0]; - else if(move < 0.666) this.vel = [-10, 0]; - else this.vel = [10, 0]; - this.random = Math.random() * 50; - } - this.random--; - - // Calculate new position - this.pos = [this.pos[0] + this.vel[0], this.pos[1] + (this.vel[1] - 9.8)]; - if(this.pos[0] < 0) { - this.pos[0] = 0; - this.vel[0] = 0; - } else if(this.pos[0] > this.ctx.canvas.width) { - this.pos[0] = this.ctx.canvas.width; - this.vel[0] = 0; - } - if(this.pos[1] < 0) this.pos[1] = 0; - - // Decide on animation - let animation = 'idle'; - if(this.vel[0] < 0) animation = 'left'; - if(this.vel[0] > 0) animation = 'right'; - - // Draw - this.sprite.render(this.pos[0], this.pos[1], animation); - } -}