From 1a54c4a333096bebe8d1699c914aa7baec03fd0a Mon Sep 17 00:00:00 2001 From: John Doty Date: Wed, 5 Jul 2023 17:06:08 -0700 Subject: [PATCH 1/3] [game] art fun --- game/bot.aseprite | Bin 1095 -> 1445 bytes game/bot.png | Bin 708 -> 799 bytes game/overworld.ldtk | 413 ++++++++++++++++++++++++++++++------ game/world_sprites.aseprite | Bin 651 -> 1005 bytes 4 files changed, 345 insertions(+), 68 deletions(-) diff --git a/game/bot.aseprite b/game/bot.aseprite index f46f61ef9e9b75dbc14c0279a27deba83c476153..2cc7061dde9c10edc4b08691d16ef2a7f0e31f69 100644 GIT binary patch delta 965 zcmX@kv6P#ADJuiRgQYAJ*(-UEGBGgx`pCwR!oa}5wz0Q{v0fd>l2Bj-k`TbezzkzT zXch*a{QLq@pbAz61_nkT{0}q)0^}Iv87k&ny%xxI$bg6K!Q5lrl}!2%CO=RtW1DZ= z;{M@aH;1fl$iHo#zPDKJD)cx`?l+6wo?5uS$^PQ3>7Pyi9Jp7%T6#+2!(}nP4aTpQ z?fF{v{@CN6dhZf?cPLFR+U$F#{?yv*Q;S#c^xt{YYMr8M-M5nL&D(5a&MkS?`*^C_ z%SFP^#TIWX{L}DryWaL|a_hG37khW2Zd=jT_v@Fgwp_m^_T|q#=HXf2_ccf9Kiluu zE^_OA-MMa4mVd_&cl?~7-IbG6Z%|i$KkNExJ7J}TV#zK$zD9a09DjZ7`Lo-5CHtRO7rRY69y)Ulw^{K23Esc8 zb}sp*D8A-#OxA(YW!}D7={qK!yxMzQ+V|Sgb5XaYt{i(T`z$YZ<#ow*rFF_N=d1dP z*51!wQlI@Z-gWn_|DVsrmhsEqWuJLtM$ozIF9V!+KR;ZdIsfXrD<59=UR;y6TJLSl z)?W%&yWV|$wluStvDRUy(zUwpu^)aN`F5agWm)T=dGl7q&Z=h2eidS+0SpP`P>}%g z;fV(nOi-Z0$WV`>5EPtnh3Kj5IyjXvTmYrArq~1e2c6&W{Qf2&caUFSDJ06nbMqGO zOH+0_3KYJLo|QNAvdJHg$DL~{_uC#~{1$n40S~`pQ8$SPH^}(l<&+s`Ly?Z_^dVEb7w^JWIg`O`|SR% zty|?DX1#v>FzVap>8tnF+s2;#eCqa8yZQc)#BBF$=l8O;xu3po$%SvV65`Kqd|bVA zLbf>T3=1i{-QjEhE(w!QTeoMK58tiDJKjy>{900T|E%(Fp)9{=Uw1q&tKD?|Q@(6% YREqhv-OJ}GeQ)@$GkZ?mN#D?T09I0~zyJUM delta 612 zcmZ3=eVl{corQtn!BVD)?3KJrnHU&;ePm@wVPIfj-Pl{hSTDl}WGOH(04aw5Kv@Wo zV^CnIm~-{|T}~!L9)<^gkCU3->phtKK;Zi$COhjE;ST=o9RZ#TCoRkLyv4G&xj-i7 z(?#!k6PEAVzl66|+QmNNf3tR1prlydsjDnSZg;0_zw_>H#h!adWh0f>op^F5$N2I5 zqL<~lJ5%c41m|u0=It|azHMw)(Cx#yGwJ%M?r)Bo2GZDl_NuG83b z^3CNd>#zNFnZN7x`c&yT>TfKpwsys_{oS+TRib>B@z))3QL(P|=L6r)yw8@jJMql7 z;3wanOEhd!El0y!y*~gBu+>bq= zeo*nSqeuv?@4Ven08=NlV{{@*VZ+S)Xfm9pHacUwTkN zF7Mn{mZGY=bIk9*J6o~Gt~)>F>kh5S#ocGG*gv_n&r5G*?Frp$b!{?F%a?fjX1VW} zbnr`Lo8ON1B2bIcX@9is*u6F-7KjO__)}WW!p8$;$Bntol diff --git a/game/bot.png b/game/bot.png index 5b74b676dadcb0bc733ba3a797963a146cd1b2aa..d2e3a0ccf2f6781bdc006645f8f965311e0aa99b 100644 GIT binary patch literal 799 zcmV+)1K|9LP)Px%*-1n}RA_Hkd#^6_w@6!F5L^dBMsF(BID??V8huE0aWwNwKQ;`On^i+|Gquq-mhVARh{MeG2) z`8NqbHXcsUY_*jawNFm5{P`pQ9uFr>ge%llfnNRV0$@ZgL$lQeHEVP_C~#DP-u+YF z0R=p+mc;`nr!fh)pA-NYxhP_OdsVt;FzN#iXGFY?DqbJ(;h$UqJo!cE2^XCw={W|U z4`1XBQGu@g@6<{-mI`zU>sb&0+$;`U=`exmq|KtjgiD17ytOH7@y8>PNw|WWlB0^?`|fRK=zjl<`-g+!3q+j0W z*=Eo(v?74*L+Nd1NUndY#&eN{Hr1Ek8`^)V1quDm*&o}$wlAt$Kvm1JX#qU=mZakk z>7NngS>tj0R>dJZCxYAp!~;bBApY4ppkX`TrJ};1jK3j#sF2=I;P(QNUpftCq8xLZ djJPx%en~_@RA_f`uLl|Hq`GhWrFX&Vu!Gc&Bkf>C3s4BG*18c=n zB*erQR4o03mJJ3vbYkv?gu(z0j_t%g*AA_CQq;(He0MMJ>~ji~gQO%oWNegRBk8t# zz>1Pk1_7&pT=M?|0fh?Oq)bFK91zF<2}}uKEE=QLX(m_$5=;n4y6qmSQCv7EJ~+hW z`6>PFwtI{OSMZ`h9RWtct5A(%P*tPzg91|pQr3VB-lvmn!@;3)Ts4a2u{3y9pcMfu zpxMq903e+AF}lCDQi=xN6-eF&#o+n-CEqmJ5B|!7jyw_ps^A$|+vxsUdZyKB0uFZs z-j6)HrXVYT5B|LNiSyd0vX8-M@SsnSu=03M3N{&iht< zs|peUY(-TC%G!>OFCDmL1{Vq>D?mj8yZ2BBNN}w{t2KZpq0Be$LxI+%a2anq&+hwl zf^go?RHC*%t<^Tj;8KBF0$QD>Re{0nzg|#{;>=}>yc9?Ppxf@DzB|L#bcl!PY2iep zAClN_V=+Yi?hKD_A%7}cxep|wLuuf^Z@$%cXV^cvB~ASD6Fh$$<`j`fg!1@ma~#$v zFpzG*eRL3wSsZAT$5?>~iG0=Z^;>~sJZu*$P())f#79)a<69{8@%EKYFvm3x>mU(o zK%_*Rxc=zY6_G@7F44Y3!0ci#W!pfqI%HC+u^1w}c`cgHg$haPlTtv)cUOy60{pHE zMJbRcd7BjE!KZ{O1ya_0e84cUq3RPsPC>CjWuMgnf$e@zMGnC#`+;y#p?qGn&lf_0 q&%%YFKwW=rKZVbKaZTnf)&3XKSCsSQ@55IB0000@7@!ISdR8zdkZDqyT9~AdZ>L#iZob@a{&9mz--=VuivR zd7l|U^%I2pUcBg_pa;$rz&{+(494OPD_o-OE-^zZPp`60#=zA`baH1fYtk7isx z$hcUzaWkfUJ6|K^Fi}47m!~0nq^{ww3x63eId|>7aY%5wT}kPZBaBN6-TLZEY@fVx zJwD||f1aB_=TH9GbwOtxu5mLoIR<|#N3$UvWP=M%8!W#yf0>Y_UlsA-lKa{Z3g$W| ec=^5V_^q7J`A~uDv%H7>&a{Rvj0~v~(H;OF6>s1G delta 16 XcmaFM-p$J1&BVa)U@7B9_7)}pD{BPZ From 895098e17fb30b3a63327ced2fdcca6df61dc828 Mon Sep 17 00:00:00 2001 From: John Doty Date: Fri, 7 Jul 2023 06:20:47 -0700 Subject: [PATCH 2/3] [game] Walking animation --- game/bot.aseprite | Bin 1445 -> 2203 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/game/bot.aseprite b/game/bot.aseprite index 2cc7061dde9c10edc4b08691d16ef2a7f0e31f69..6936bf22e05c1664639a34ee96e265d7cc12d2a2 100644 GIT binary patch delta 1046 zcmZ3=JzJ1{HU|U4gQZ*>*+rNbIXBBNr83oPGcqvz`pC$T!oa`)WHLwt304IN`#%#< z01V_96c{SzT)lRe^N<4%!vnv^Nq!HQ>^S)@O4gKdxPLh4+M-=PVbU_s*-wPFv?@61 z$4~y9*{=9k>*tYMdt%=|W&ajrnXd+%13qCI)i=63UDf2^t(-+$s${SK|k#Rt<~ zy)Vj)SDk+4-qWU1IdASC^Irx{z9qRXrKt4r?_RanNz1Q=HQ)MC*Zy<+x+|}Fu3POF zT$gU^zVq5&>6cOGR%e7)+sU83dMo<9<9hCGkN4)=P0zma{9lZpuE)H)4TYxdhvwVL zoCviypJBmLU%WpewyMm~F1x&D@tU0aH{3g;>St_yxK}JYXokMk^ojSse~wZ%b$|0U zHu^>R`&NAC#tZ%uYkM++=*e1UcKE-#ZJ4@1JTLPPZe#`!)nkJ3KeRFpZ$ zE^c_xp-FS8$=`(+mFqM0rd$8W=x?5KD7sJG?Q_w-XYx0yOE(*Z?by0rts%KId;iPV^C>UVN2 z%eIHV**@prja;i7^Y(k}!>DVYwZeb@Usq!K`)XGBF8lXK-kvLXZ>jP1L4C#g%M05+ zojG2del}7sK;nONuoAnk^f$dj?~7d5Eie80$mhAe`>hN5 zmV(LE=Q1buU%UCi=D^xyD!C zN3p2a6RjF8_$BZK|Fwg>hYWaFFZdiz@;SgXXM)5cXHM`bf- zd2b8)uNMAo>(j1V<~vhlm&Y{kbKiAoN?FToqpiDsRxDq+>yGBusT0iP?Gyg3z5S}R z<#lX)i}j~^x1IO?c9+0oneW5v2EVUB2-#PNwc&|(v-PD5OM8Wnr@lXH2etT ziLH6RJ;DL@S>2!v4>yg~1ahoy8n>*^X1w0t;uBdGS7dT7*i8OiE?w7}OLFgW!MZLX z1$-arQj^*v+?vVdjn7w_tc#tPTMTOBc=HYB-@3K69^q>1>)~4VvzM#Ae?48z^UB+m zKA%tG7CpST4@x~e-)Fw0(Dr>87w6dVtGSSC7X_F&8a}&Mt^K4{A7-w+rc4gnqqy#t s3H5Y*-_83HYEI_$xaW3#vd{8w9erA4H`cqSo+9^v|16uFe#uQ$U+JHW+W-In From c934914ac561e409c1cf1e95260d271fc3d29493 Mon Sep 17 00:00:00 2001 From: John Doty Date: Fri, 7 Jul 2023 06:21:01 -0700 Subject: [PATCH 3/3] [game] Walk controls (unbound) --- game/main.ts | 41 +++++++++++++++++++++++++++++++++++++---- game/vector.ts | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/input.ts | 11 +++++++++++ 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 game/vector.ts create mode 100644 src/input.ts diff --git a/game/main.ts b/game/main.ts index 767b8f38..ee7162b4 100644 --- a/game/main.ts +++ b/game/main.ts @@ -1,6 +1,8 @@ import { cls, print, spr, use_texture } from "./graphics"; import { load_texture } from "./assets"; -import { since_start, since_last_frame } from "./time"; +import { since_start } from "./time"; +import { btn, Button } from "./input"; +import { new_v2, vadd, vmul, vnorm } from "./vector"; let bot_sprite: number | undefined = undefined; @@ -14,7 +16,39 @@ export function init() { }); } -export function update() {} +const friction = 0.6; +let robo_vel = new_v2(0); +let robo_pos = new_v2(10); + +export function update() { + // Acceleration from input + let a = new_v2(0); + if (btn(Button.Up)) { + a.y -= 1; + } + if (btn(Button.Down)) { + a.y += 1; + } + if (btn(Button.Left)) { + a.x -= 1; + } + if (btn(Button.Right)) { + a.x += 1; + } + vnorm(a); + + // Friction + let v = vmul(robo_vel, friction); + v = vadd(v, a); + + // Motion + let np = vadd(robo_pos, v); + + // TODO: Collide. + + robo_pos = np; + robo_vel = v; +} export function draw() { cls(0.1, 0.2, 0.3); @@ -22,8 +56,7 @@ export function draw() { // ...it gets resolved here? use_texture(bot_sprite); - let y = (since_start() * 10) % 240; - spr(10, y, 32, 32, 0, 0); + spr(robo_pos.x, robo_pos.y, 32, 32, 0, 0); } // print("FRAME TIME:", since_last_frame()); } diff --git a/game/vector.ts b/game/vector.ts new file mode 100644 index 00000000..1e2842b1 --- /dev/null +++ b/game/vector.ts @@ -0,0 +1,49 @@ +export interface Vec2 { + x: number; + y: number; +} + +export function new_v2(x: number, y: number | undefined = undefined): Vec2 { + y = y || x; + return { x, y }; +} + +function vecargs(v: Vec2 | number): Vec2 { + if (typeof v == "number") { + return new_v2(v, v); + } else { + return v; + } +} + +export function vadd(a: Vec2, b: Vec2 | number): Vec2 { + b = vecargs(b); + return { x: a.x + b.x, y: a.y + b.y }; +} + +export function vsub(a: Vec2, b: Vec2 | number): Vec2 { + b = vecargs(b); + return { x: a.x - b.x, y: a.y - b.y }; +} + +export function vmul(a: Vec2, b: Vec2 | number): Vec2 { + b = vecargs(b); + return { x: a.x * b.x, y: a.y * b.y }; +} + +export function vdiv(a: Vec2, b: Vec2 | number): Vec2 { + b = vecargs(b); + return { x: a.x / b.x, y: a.y / b.y }; +} + +export function vlen(a: Vec2): number { + return Math.sqrt(a.x * a.x + a.y * a.y); +} + +export function vnorm(a: Vec2) { + const length = vlen(a); + if (length > 0) { + a.x /= length; + a.y /= length; + } +} diff --git a/src/input.ts b/src/input.ts new file mode 100644 index 00000000..097c4f59 --- /dev/null +++ b/src/input.ts @@ -0,0 +1,11 @@ +export const Button = { + Up: 0, + Down: 1, + Left: 2, + Right: 3, +} as const; +type Button = (typeof Button)[keyof typeof Button]; + +export function btn(_which: Button): boolean { + return false; +}