rymrB_
yZr<+jwgP3=8FyOk+hVk=RXLEO2s``0*?&wq-`^Zhc)e*ENQI}XpUXO@geCxp=>!D;
literal 0
HcmV?d00001
diff --git a/src/sprites/character/down/Character_Down.png b/src/sprites/character/down/Character_Down.png
new file mode 100644
index 0000000000000000000000000000000000000000..79754937ae33e7e78bd7f2a90739414a5fe16441
GIT binary patch
literal 917
zcmV;G18V$1q=p*!C){L3IED#01(a1#wyeTQr=v|ftNvpJShg&jbULJ(9EF&WxtW>5S-&4=
z_*jS-CP)CFDFIpbA9sRcn+G7owXMQ?kbunkANv)sP%5F_?OrP=f|9}64ghE?gOivS
zob~&pBLP|WKlTM^ce_*%45?SbD%9d3SC9USUmrU0@7Yp8L
zsQlGD7Yn75mhu-(fXY?(Y8++Dy7lVIyMF+~w-5lesuj7-soM^THnm;(tc74ZCH3mI
zBlq5-O|+}`LCjjnyMF-Yi(o4gyf$bjFyxpsb2$KV9Nt1x9t%i!nx=
z^Q6jPs{X~eqRe0ApK~7i!_=m;5^LaCZ|J78f_?Y+!qC>v)g8ZHv~M~qg?;xpRuD0u
zR<(ksTT7T;-v(n$KJa}XqAEmU)~27f|ET^b|D1Dt`t?)J6Eq$Ls}ScLj}E`dBhR|+
z;Lp3a*xlW|>6l|RMac_{4T&aVn1CeoL$RdbKcqjxHvk|qPl?15+G~m}igIZuC})?-
z9)^=a*xHfhKMDN^ckVx`&p99Z9yKQud00000NkvXXu0mjfo8r2c
literal 0
HcmV?d00001
diff --git a/src/sprites/character/down/Character_DownLeft.png b/src/sprites/character/down/Character_DownLeft.png
new file mode 100644
index 0000000000000000000000000000000000000000..a76cf65949fa49842bc8c5c5d82fa3f4904fb30d
GIT binary patch
literal 797
zcmV+&1LFLNP)Udv
z0f4s5AvBbP78Kxo{XgyZfh++c2@}hzJB-E(&^7-L%3S2yHUJO+`gwax5%cBmBIaXz
zb3*_qyG|=v0RRA7=HOfMTYCYz?7vh4Y?6c`=3~noM9jx*y}|-R06>6W0MbNkl0-`q
znl8Y(`-e9g0RTnJr!8|RVm?9H2E{|XuOX1Xw8hV2E7YjnY5%=r7r3@9SAgjDLo6`F
zY`rS=x69&ymyYBz!2q>BtTVGwcww*H%q}y)Mym()1
z#Z~Ed-T%=BaBaIMX5IqB+$uPfjH(W1Ehs>z{g>GRFtM!OY`w}Ieh#4=O#Yh|6rj`o
z|7A{590qv(bpar~1(~dW$k%E>RnOsxWyypVS3_|wt1+O$ISk_;L_`#a0mWfJNE0GY
z!^mz^pzn4>>J>HBQ@GBP_?i1p1K2I+v|G-Jh-kN*Qyc~qF`stJxd=!Xtth}L_}B8m
z*k|VzP)LGengGz3w=b&~{=>Zm06?5`0zlLLLoMQ`;vWFLd-7Oc08k7IVf6!vPySSk
z_=gwIWemjv6l2g5K!g6Xg349D&%fA(lo+c;6aWBuo+qC<=fpXefoT!XP!pj(;xN$O
z01f-6I1HpN?rA`+4WI^t%PYd=6?vW~gDPx^S{RSVfKmWeR~Ub9J<=sFXu^MP+^7w>
zuPL%-)rLH2a?WKkgt)E|Ahe5`g_WnZ^F<5|_)iP&UZk&;21LI2`cc1`f--+<3Lt;0
zb1}`uQiFcu{>8`ljA6vzKT31Sv!jsno?{sl5XmS=h`JzC=-ltnewi@toHqQxova?fY3_1%?7XNp${z1pKXQGn{1+FK~2d;;o
z*Vh~f#otp#!?N%-`b8tREzT8DfU^0|)BqjZ#zhoS;CdLjZTPqX01QyY@!2W(eBgSx
zh$1B;QfC3m=)aOhn9Z|sW`HUHz{izHhO@UEkd7-KRW%hqJ&4rUU9Jd7!uRUm3R&LW@!?G}%Ojc^j-OowLa|$lA
z|5P0+uRkmV0FATn0DzI(7VpEJkJiZ`^|e#7pv}k$NETpK(z3Gc{sG)Pe(=GY4`I(2
zuVK$8BFcSJhP4CNqrmm%HeWEm5hCKrQ(ulDsktrwWoSC=Q{Z|O_I#QS`$R-E9rkHD
z?3c0t3AFgtuj;?dQ4Q{KRWn
z1pubQJ_e{F?D?p5TOcCTx-HbYEnI$hpSScJy8J)9e^0#E=Krm?4*=vijyNE7B?_2=
z4iB1OEgp5r(f8`vQzhD({fij~fAJ51UOs-LAcR;n?D-2xkdvXR035@r
zG=Qv+gn!3zlnz4CZIBDm{WLp@`9)47LLLpAjC#GUR9lz-xTzM3y{rMHyyOc{fdGW*
zqoX52e21z;bP-`vbb2BdRl;lH|0V`5ywreBrzwA~E`Y%GFs#sAGQxhG7_nVHk#C7=}5_SGx`XwEe9dRo4#y
z6p1DQptf!2Zu|-YP<8#A4hV%$0LZnhLhPfU0H8$rUu3DYH9}ee00dYe6h5N$x{zRm
z!pA(0jR&C2`ZEoHc^p$Hd_BQ&^ka>6?(hpNjRSqQMp(?s~$8n6<-co1)s;(cv
zQzz&}eiH5X`zB}KvjG60Y#R>1Rq9{%0%iOC%NtYX|AGLJ=Xn%~CPkvDk3wU-du=J(
z$TMHuZ;OJjAc>
zOWgeY0YII9FS-Li}TJc}R`MQ%2qyq-MIF0;C^?
zH-U=6^>-egisnbEPjWylKY19G7b0@!i=CxV`jdw*Tdq$3PBBhCJ5LS$R&3ALE&@QU
sRx1}@aHaZlafD$QhG7_nVVM7zKTV!EaAoG8V*mgE07*qoM6N<$g4={&ng9R*
literal 0
HcmV?d00001
diff --git a/src/sprites/character/right/Character_Right.png b/src/sprites/character/right/Character_Right.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ca39842a71eb49d0bdc3b6f4a309c3b2afa10ba
GIT binary patch
literal 787
zcmV+u1MK{XP))+M90i6gp`0uW$%K_?LL-*e(VCfOs@?X^Jr&
zOrgaP4GqNe+ac0bGHz?7`f%)fK=@16`#$%cPUn-sU@#aA27|$1Fc=Jm<#=Q707&$>
zacsIjfK1$d0p!58OAo#R1=w8w-G>h$YJkA?1d#HxsICC(;{PD)7otG&k*>)o9d)(`m-T|D6>mz}op|z6317=SnB!b4B2K45!oF
zhrulJs?o^(?E4e<*?;K{;8>Op@-N~>DC@dhMgi8lArMEqIY3lD5N
zx3jS70<5e5(g`}2r5hm`D3*?{IZWJroWZDwN!X%UcZweM)G(N54(sZlWdzXA&juHq
zH1|^SBEq=s;|xZeIJ>#ez#Yq~#f{vfo;url)NuwQU4*=g55^z({TmpNaod+!zbk?3
z$*kWM5s_KHE916bq7mXPPT=+4(?a5|
zKmmXa_mAX6DJ4oNz48@rMaj>RYJ{>10M+|%ZEZo0{&$(B%DC+V@b=Re0EWZi{~RwH
zwgcfrlv2sKnrDx!+Si}g3%-~emG~cfhkUsBEC5O={r-F#Wc9yO2blG{0Bj$f>SUrs
z3he-T8MJkd`t}ikcduUXr1hNbqtp4_i^`=cf0^~We1AXI9WTj(lcAVgj=e)j4tuS0
z0c2;Vlv|Rwlb+VOjvEhufOI;Y!tcyg=$~>;wn6;74F6O@f$K@9(<$>-Xfj@EOU{T(
zx;0$3|3Yu7@=wl4DX9ZAo6TfQO|(i@>i+_&@Q+vte}lnbFc=I5gTZiL`2`?d4qV~I
RDp&vj002ovPDHLkV1l%;fNlT)
literal 0
HcmV?d00001
diff --git a/src/sprites/character/up/Character_Up.png b/src/sprites/character/up/Character_Up.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1902e938e3543aa182f2dd5f1beb68b8e2816f9
GIT binary patch
literal 905
zcmV;419tq0P)efOU4&UOHaL?V$$Boc{4B9TbK`Ko0A
zfc4*}j%oJ~0L;9|Qm_tEv;%M?wieiu}K#G%9Es&^OwD
z;Q;dh07uWGrWW&*QA~5PJgB?4MKsP1j{L-GHO#h2g4Yia{vjP8@H#
zZsdcIbOO@sU!gQwnw!IQug7Y-fimtw+a6#ZRm(&{)0C#`z9^UweA-+i7*9;vsrEmz
z01BFhrt2~QsObg(gbo6)%&KLQ`lpa&0@Ch(D%~(2?G$*
z5Gmpi3YwYP
z;iP@Z96j&52K7?4OcaYn*tX68M>%OYG}rtW_!F_3s7%VE^+s)a!L$gJQ8L{{FT85i9!#FX?|I
zo9YbCIuDHBg&UTDnDmqOFZ3w|n8{?6ZnsP7m|Ot&$9n*P*{vM_e#0Ewwh?F-$pCB{
zt2i<*n4{+b3{QY<+h|qFST3zZs*i;IbNwII9{|AV>8Y4$INo?{+a}LIqyTvW#DUW8
z^9>K5j&B>Q%8_|N>7D|+KiQX4_Z|YKT`&
zH&{(K7)rab=?9p&{{j8d?vw8!bI-}A1mSs-KR}U4
fBoc{4k{>4Q|
zL*1bhEGS~>ayx``F>jmtC3An$6@KZS^FQa@2L?bQkw_#Gi9{liNOn?HvjD(np9jaG
z>jwbt7)6elf{=g&9J+q+mSKt@Xo?cK{WueVL)BkWRRG}B9HYovhAGY?3`8smNTYt{
z^}&*=;%+?VEyDx=SQstb?;?lm!L9Fp{Xjm@xnmR;>}ra_oXI2%)2Y?($ntCac5^1Mrau(oXLdmeAow7H7mqh7_ChL*#>|h
zr{c8h-&p`;xQiStjL=1H>+{=2$UelKfVAuPG6OK0T6T$d6Vxb7Kmt;&-^&aDO;OnO
z;1*s35#%ULKmt;&-_K@=59<~Roi2bUk?X3BHX|ifWq0GTkM1|4DT)Z_rcKZ~9}w(j
zFqQg!6#(ZPj4@Ck+(Dq~3|hR~eq0G4`)Sngdj>eI6#xL4N<&m55!P2AvY&(mBtbtB
zg#Mj-0HSrdOZ#Vb&1!@5PsLBof2i%)y)1^X?-6wU3&
zW&SL12V&MwgJ8w}8vUUm65tp`Zre83bzL-s7=h0NKY<0(4yuwFqO>FMJ^TSkjI?
zHG5tHh@5=|ZE%l%zb~%+eEpFQ*^ghp_wi#Zm-#bR=yZ{(G@uRc(fRNh{eB<1u8Rf$
z-`<}uEDvE2hkiGI-U%OMc)#
zN5eLfpr4k3X|Fw>>1xg8Wgv9cuDi3JN~1&7fOrBBxBj`!Hy7*tiOzwj3~uD~9Ed&u
w$t<807*qoM6N<$f)){a*8l(j
literal 0
HcmV?d00001
diff --git a/src/sprites/character/up/Character_UpRight.png b/src/sprites/character/up/Character_UpRight.png
new file mode 100644
index 0000000000000000000000000000000000000000..a406a08e289758257df384914ba87de8c5fb78fa
GIT binary patch
literal 821
zcmV-51Iqk~P)Iuq
z(y=7LQ}>T(R%_z2x*-7Z)>w*NpJWU0bp7YESuX&866C6wW*lK8R)Dnm&x92QXjW_3
z3<4VtIRFkj=TuBH({tSi2Q`a)Hp`#e+dv$}&QEWDk=mrtzj6Z<4TH<;Ycb8dABP-=
zopbihmCUJoqa27Li4`EN{-3ETtC;t`TixK)y@_-j77YWKZXUp9fX#qrwMNf%BflHd
z>R-75q{u8Ba@Y)T$a#T;Ie!*O7XZ@fU#S6P_o?vjC{q4I1(GU2n*Bdl5tiM@oVyS1
zi~|%6BeHvVbpI-ScM;D5Y4)$wp%v4l=eqZfAo<_}&~Mn3j~(T+6;XQlf?xqulQxeu
z`&SOqp9C0>BWYe57ebK9WI~-CMmwPbq}G3^ApJju{2X@98Ma#h{QlZcT>&I%^dIV1
zz{{l8MF%ypoAGg8|j=Z!spLcPqe-IC_nSzC=dgv9+94P&nV
zU!OlkEgeAg8+PE;r(Bk03CpqsAZl+)kqhsZ*755#t2J-=KOeSR{urYsG5`J;nBgA~
zVVXZwr|y>4IlH(L0G4G4N9JQmB_%-a80=wgRHxu=)7?2i}87-3mSaAI#_#=uZX|a{$4F7vdXx
z_r*hu{{77t)BhekE}nb>G#ZUYqtR$In*Zf55VE<&mw%9100000NkvXXu0mjf this.fps) {
+ this.then = this.now - (this.elapsed % this.fps);
+ Ui.draw(this.canvas, this.context);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/vendor/State.ts b/src/vendor/State.ts
new file mode 100644
index 0000000..879701e
--- /dev/null
+++ b/src/vendor/State.ts
@@ -0,0 +1,82 @@
+export default class State {
+ enemies: any;
+ player: any;
+ projectiles: any;
+ loots: any;
+ score: number;
+ level: number;
+
+ constructor() {
+ this.enemies = [];
+ this.player = null;
+ this.projectiles = [];
+ this.loots = [];
+ this.score = 0;
+ this.level = 1;
+ }
+
+ public addEnemy(enemy: any): void {
+ this.enemies.push(enemy);
+ }
+
+ public addPlayer(player: any): void {
+ this.player = player;
+ }
+
+ public addProjectile(projectile: any): void {
+ this.projectiles.push(projectile);
+ }
+
+ public addLoot(loot: any): void {
+ this.loots.push(loot);
+ }
+
+ public removeEnemy(enemy: any): void {
+ this.enemies = this.enemies.filter((e: any) => e !== enemy);
+ }
+
+ public removePlayer(): void {
+ this.player = null;
+ }
+
+ public removeProjectile(projectile: any): void {
+ this.projectiles = this.projectiles.filter((p: any) => p !== projectile);
+ }
+
+ public removeLoot(loot: any): void {
+ this.loots = this.loots.filter((l: any) => l !== loot);
+ }
+
+ levelUp(): void {
+ this.level++;
+ }
+
+ addScore(score: number): void {
+ this.score += score;
+ }
+
+ getScore(): number {
+ return this.score;
+ }
+
+ getLevel(): number {
+ return this.level;
+ }
+
+ getEnemies(): any {
+ return this.enemies;
+ }
+
+ getPlayer(): any {
+ return this.player;
+ }
+
+ getProjectiles(): any {
+ return this.projectiles;
+ }
+
+ getLoots(): any {
+ return this.loots;
+ }
+
+}
\ No newline at end of file
diff --git a/src/vendor/Ui.ts b/src/vendor/Ui.ts
new file mode 100644
index 0000000..c9b7c6f
--- /dev/null
+++ b/src/vendor/Ui.ts
@@ -0,0 +1,14 @@
+export default class Ui {
+
+
+ public static draw(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): void {
+ context.fillStyle = 'rgb(0, 0, 0)';
+ context.fillRect(0, 0, canvas.width, canvas.height);
+ }
+
+ public static clear(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): void {
+ context.clearRect(0, 0, canvas.width, canvas.height);
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..1a2f4df
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": [
+ "./src"
+ ]
+}
From ce96f45674d6fc193eae79b7be97d86fdf3c4cd3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20THOMAS?=
<74055963+SebastienThomasDEV@users.noreply.github.com>
Date: Tue, 7 Nov 2023 21:39:46 +0100
Subject: [PATCH 02/14] entities
---
src/entities/Archer.ts | 8 ++++++++
src/entities/Player.ts | 9 ++++-----
src/entities/Warrior.ts | 17 ++++++-----------
src/model/Entity.ts | 4 ++++
4 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/src/entities/Archer.ts b/src/entities/Archer.ts
index af04902..b08d851 100644
--- a/src/entities/Archer.ts
+++ b/src/entities/Archer.ts
@@ -1,5 +1,13 @@
import Entity from "../model/Entity";
+import State from "../vendor/State";
export default class Archer extends Entity {
+ constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
+ super(x, y, 10, context, canvas, state);
+ }
+ public draw(): void {
+ this.context.fillStyle = 'rgb(0, 0, 255)';
+ this.context.fillRect(this.x, this.y, this.radius, this.radius);
+ }
}
\ No newline at end of file
diff --git a/src/entities/Player.ts b/src/entities/Player.ts
index f29787d..a97d7aa 100644
--- a/src/entities/Player.ts
+++ b/src/entities/Player.ts
@@ -3,12 +3,11 @@ import State from "../vendor/State";
export default class Player extends Entity {
constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
- super(x, y, 10);
- this.state = state;
- this.draw = this.draw.bind(this);
+ super(x, y, 10, context, canvas, state);
}
+
public draw(): void {
- this.context.fillStyle = 'rgb(0, 0, 0)';
- this.context.fillRect(this.x, this.y, 10, 10);
+ this.context.fillStyle = 'rgb(0, 255, 0)';
+ this.context.fillRect(this.x, this.y, this.radius, this.radius);
}
}
\ No newline at end of file
diff --git a/src/entities/Warrior.ts b/src/entities/Warrior.ts
index 34789a5..23ff8b9 100644
--- a/src/entities/Warrior.ts
+++ b/src/entities/Warrior.ts
@@ -2,17 +2,12 @@ import Entity from "../model/Entity";
import State from "../vendor/State";
export default class Warrior extends Entity {
- context: CanvasRenderingContext2D;
- canvas: HTMLCanvasElement;
- state: State;
-
constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
- super(x, y, 10);
- this.x = x;
- this.y = y;
- this.context = context;
- this.canvas = canvas;
- this.state = state;
- this.draw = this.draw.bind(this);
+ super(x, y, 10, context, canvas, state);
+ }
+
+ public draw(): void {
+ this.context.fillStyle = 'rgb(255, 0, 0)';
+ this.context.fillRect(this.x, this.y, this.radius, this.radius);
}
}
\ No newline at end of file
diff --git a/src/model/Entity.ts b/src/model/Entity.ts
index 15931cb..1542b82 100644
--- a/src/model/Entity.ts
+++ b/src/model/Entity.ts
@@ -4,6 +4,8 @@ export default class Entity {
public x: number;
public y: number;
+ public dx: number;
+ public dy: number;
public radius: number;
context: CanvasRenderingContext2D;
canvas: HTMLCanvasElement;
@@ -12,6 +14,8 @@ export default class Entity {
constructor(x: number, y: number, radius: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
this.x = x;
this.y = y;
+ this.dx = 0;
+ this.dy = 0;
this.radius = radius;
this.context = context;
this.canvas = canvas;
From 3593db61639a5068ae0f19662801ffefbed1d3f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20THOMAS?=
<74055963+SebastienThomasDEV@users.noreply.github.com>
Date: Mon, 13 Nov 2023 23:59:56 +0100
Subject: [PATCH 03/14] refacto
---
index.html | 6 ++--
public/vite.svg | 1 -
src/entities/Archer.ts | 6 ++--
src/entities/Player.ts | 6 ++--
src/entities/Warrior.ts | 6 ++--
src/main.ts | 6 ++--
src/{model => models}/Entity.ts | 6 ++--
src/models/Prop.ts | 0
src/vendor/Game.ts | 46 +++++++++++++++++++--------
src/vendor/{State.ts => GameState.ts} | 28 ++++++++++------
src/vendor/Renderer.ts | 24 ++++++++++++++
src/vendor/Runtime.ts | 36 ---------------------
src/vendor/Ui.ts | 1 +
13 files changed, 94 insertions(+), 78 deletions(-)
delete mode 100644 public/vite.svg
rename src/{model => models}/Entity.ts (85%)
create mode 100644 src/models/Prop.ts
rename src/vendor/{State.ts => GameState.ts} (71%)
create mode 100644 src/vendor/Renderer.ts
delete mode 100644 src/vendor/Runtime.ts
diff --git a/index.html b/index.html
index bec9790..ec43d89 100644
--- a/index.html
+++ b/index.html
@@ -4,8 +4,7 @@
-
-
+
@@ -13,7 +12,7 @@
Document
-
+
@@ -79,6 +78,5 @@
-
diff --git a/public/vite.svg b/public/vite.svg
deleted file mode 100644
index e7b8dfb..0000000
--- a/public/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/entities/Archer.ts b/src/entities/Archer.ts
index b08d851..823fa36 100644
--- a/src/entities/Archer.ts
+++ b/src/entities/Archer.ts
@@ -1,8 +1,8 @@
-import Entity from "../model/Entity";
-import State from "../vendor/State";
+import Entity from "../models/Entity";
+import GameState from "../vendor/GameState";
export default class Archer extends Entity {
- constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
+ constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: GameState) {
super(x, y, 10, context, canvas, state);
}
diff --git a/src/entities/Player.ts b/src/entities/Player.ts
index a97d7aa..d74d755 100644
--- a/src/entities/Player.ts
+++ b/src/entities/Player.ts
@@ -1,8 +1,8 @@
-import Entity from "../model/Entity";
-import State from "../vendor/State";
+import Entity from "../models/Entity";
+import GameState from "../vendor/GameState";
export default class Player extends Entity {
- constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
+ constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: GameState) {
super(x, y, 10, context, canvas, state);
}
diff --git a/src/entities/Warrior.ts b/src/entities/Warrior.ts
index 23ff8b9..18f14a0 100644
--- a/src/entities/Warrior.ts
+++ b/src/entities/Warrior.ts
@@ -1,8 +1,8 @@
-import Entity from "../model/Entity";
-import State from "../vendor/State";
+import Entity from "../models/Entity";
+import GameState from "../vendor/GameState";
export default class Warrior extends Entity {
- constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
+ constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: GameState) {
super(x, y, 10, context, canvas, state);
}
diff --git a/src/main.ts b/src/main.ts
index ab18d6b..33ced38 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,6 +1,8 @@
import {Game} from "./vendor/Game";
window.onload = () => {
- const game = new Game();
- game.start();
+ const canvas = document.createElement('canvas');
+ document.body.appendChild(canvas)
+ const game = new Game(canvas);
+ game.loop()
}
\ No newline at end of file
diff --git a/src/model/Entity.ts b/src/models/Entity.ts
similarity index 85%
rename from src/model/Entity.ts
rename to src/models/Entity.ts
index 1542b82..168e53a 100644
--- a/src/model/Entity.ts
+++ b/src/models/Entity.ts
@@ -1,4 +1,4 @@
-import State from "../vendor/State";
+import GameState from "../vendor/GameState";
export default class Entity {
@@ -9,9 +9,9 @@ export default class Entity {
public radius: number;
context: CanvasRenderingContext2D;
canvas: HTMLCanvasElement;
- state: State;
+ state: GameState;
- constructor(x: number, y: number, radius: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
+ constructor(x: number, y: number, radius: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: GameState) {
this.x = x;
this.y = y;
this.dx = 0;
diff --git a/src/models/Prop.ts b/src/models/Prop.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/vendor/Game.ts b/src/vendor/Game.ts
index cb63cdf..5204dbe 100644
--- a/src/vendor/Game.ts
+++ b/src/vendor/Game.ts
@@ -1,26 +1,46 @@
-import Runtime from "./Runtime";
-import State from "./State";
+import Renderer from "./Renderer";
+// import State from "./State";
export class Game {
- canvas: HTMLCanvasElement;
- context: CanvasRenderingContext2D;
- state: State;
+ requestId: number | null;
+ isRunning : boolean;
+ fps: number;
+ then: number;
+ elapsed: number;
+ renderer: Renderer;
+
+ constructor(canvas: HTMLCanvasElement) {
+ this.renderer = new Renderer(canvas)
+ this.then = 0;
+ this.elapsed = 0;
+ this.fps = 1
+ this.requestId = 0
+ this.isRunning = false;
+ }
- constructor() {
- this.canvas = document.getElementById('game_window') as HTMLCanvasElement;
- this.context = this.canvas.getContext('2d')!;
- this.state = new State();
- this.start = this.start.bind(this);
+ public loop(): void {
+ this.requestId = requestAnimationFrame(this.loop.bind(this))
+ const now = performance.now();
+ const delta = now - this.then
+ const frameInterval = 1000 / this.fps;
+ if (delta > frameInterval) {
+ this.then = now - (delta / frameInterval);
+ this.elapsed++
+ console.log(this.elapsed)
+ this.renderer.render()
+ }
}
- public start(): void {
- const runtime = new Runtime(60, this.context, this.canvas, this.state);
- runtime.animate();
+ public setFps(fps: number) {
+ this.fps = fps;
}
+ public getFps() {
+ return this.fps;
+ }
}
diff --git a/src/vendor/State.ts b/src/vendor/GameState.ts
similarity index 71%
rename from src/vendor/State.ts
rename to src/vendor/GameState.ts
index 879701e..d5b8380 100644
--- a/src/vendor/State.ts
+++ b/src/vendor/GameState.ts
@@ -1,18 +1,26 @@
-export default class State {
- enemies: any;
- player: any;
- projectiles: any;
- loots: any;
+import Entity from "../model/Entity";
+import Player from "../entities/Player";
+
+
+export default class GameState {
+ enemies: Entity[];
+ player: Player | null;
+ projectiles: Entity[];
+ loots: Entity[];
score: number;
level: number;
+ context: CanvasRenderingContext2D;
+ canvas: HTMLCanvasElement;
- constructor() {
+ constructor(context: CanvasRenderingContext2D, canvas: HTMLCanvasElement) {
this.enemies = [];
this.player = null;
this.projectiles = [];
this.loots = [];
this.score = 0;
this.level = 1;
+ this.context = context;
+ this.canvas = canvas;
}
public addEnemy(enemy: any): void {
@@ -63,19 +71,19 @@ export default class State {
return this.level;
}
- getEnemies(): any {
+ getEnemies(): Entity[] {
return this.enemies;
}
- getPlayer(): any {
+ getPlayer(): Player | null {
return this.player;
}
- getProjectiles(): any {
+ getProjectiles(): Entity[] {
return this.projectiles;
}
- getLoots(): any {
+ getLoots(): Entity[] {
return this.loots;
}
diff --git a/src/vendor/Renderer.ts b/src/vendor/Renderer.ts
new file mode 100644
index 0000000..ef6dfa9
--- /dev/null
+++ b/src/vendor/Renderer.ts
@@ -0,0 +1,24 @@
+import Ui from "./Ui";
+
+
+export default class Renderer {
+ context: CanvasRenderingContext2D;
+ canvas: HTMLCanvasElement;
+ constructor(canvas: HTMLCanvasElement) {
+ const context = canvas.getContext('2d');
+ if (context === null) {
+ throw new Error("Canvas not supported")
+ }
+ this.context = context!;
+ this.canvas = canvas;
+ }
+
+
+ public render(entities: Entity[]): void {
+ Ui.draw(this.canvas, this.context);
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/src/vendor/Runtime.ts b/src/vendor/Runtime.ts
deleted file mode 100644
index c842371..0000000
--- a/src/vendor/Runtime.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import Ui from "./Ui";
-import State from "./State";
-
-export default class Runtime {
- fps: number;
- then: number;
- now: number;
- elapsed: number;
- context: CanvasRenderingContext2D;
- canvas: HTMLCanvasElement;
- state: State;
-
- constructor(fps: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
- this.fps = fps;
- this.then = Date.now();
- this.now = Date.now();
- this.elapsed = 0;
- this.context = context;
- this.canvas = canvas;
- this.state = state;
- this.animate = this.animate.bind(this);
- }
-
-
- public animate(): void {
- requestAnimationFrame(this.animate);
- this.then = this.then || Date.now();
- this.now = Date.now();
- this.elapsed = this.now - this.then;
- if (this.elapsed > this.fps) {
- this.then = this.now - (this.elapsed % this.fps);
- Ui.draw(this.canvas, this.context);
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/vendor/Ui.ts b/src/vendor/Ui.ts
index c9b7c6f..8cefd11 100644
--- a/src/vendor/Ui.ts
+++ b/src/vendor/Ui.ts
@@ -2,6 +2,7 @@ export default class Ui {
public static draw(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): void {
+ this.clear(canvas, context);
context.fillStyle = 'rgb(0, 0, 0)';
context.fillRect(0, 0, canvas.width, canvas.height);
}
From 70ce981e80d45b3d31c224b8f5f239135f84306d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20THOMAS?=
<74055963+SebastienThomasDEV@users.noreply.github.com>
Date: Wed, 20 Dec 2023 02:32:39 +0100
Subject: [PATCH 04/14] player move & shoot
---
assets/css/main.css | 6 ++
src/entities/Archer.ts | 4 +-
src/entities/Player.ts | 129 +++++++++++++++++++++++++++++++++++--
src/entities/Projectile.ts | 27 ++++++++
src/entities/Warrior.ts | 4 +-
src/models/Entity.ts | 35 +++++-----
src/models/Prop.ts | 20 ++++++
src/vendor/Game.ts | 24 ++++---
src/vendor/GameState.ts | 90 --------------------------
src/vendor/Renderer.ts | 27 ++++++--
src/vendor/State.ts | 45 +++++++++++++
src/vendor/Ui.ts | 5 +-
12 files changed, 289 insertions(+), 127 deletions(-)
create mode 100644 src/entities/Projectile.ts
delete mode 100644 src/vendor/GameState.ts
create mode 100644 src/vendor/State.ts
diff --git a/assets/css/main.css b/assets/css/main.css
index 38d83ce..7aaa082 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -19,4 +19,10 @@ body {
background-image: url("../img/bricks.png");
background-repeat: repeat;
box-shadow: inset 0px 0px 6px 6px rgba(0, 0, 0, 0.5);
+}
+
+canvas {
+ height: 100vh;
+ width: 100vw;
+ display: block;
}
\ No newline at end of file
diff --git a/src/entities/Archer.ts b/src/entities/Archer.ts
index 823fa36..4593b41 100644
--- a/src/entities/Archer.ts
+++ b/src/entities/Archer.ts
@@ -1,8 +1,8 @@
import Entity from "../models/Entity";
-import GameState from "../vendor/GameState";
+import State from "../vendor/State";
export default class Archer extends Entity {
- constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: GameState) {
+ constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
super(x, y, 10, context, canvas, state);
}
diff --git a/src/entities/Player.ts b/src/entities/Player.ts
index d74d755..8a481c1 100644
--- a/src/entities/Player.ts
+++ b/src/entities/Player.ts
@@ -1,13 +1,134 @@
import Entity from "../models/Entity";
-import GameState from "../vendor/GameState";
+import State from "../vendor/State";
+import {Projectile} from "./Projectile";
+
export default class Player extends Entity {
- constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: GameState) {
- super(x, y, 10, context, canvas, state);
+ public isMoving: boolean;
+ private inputs: any = {
+ 'z': false,
+ 'q': false,
+ 's': false,
+ 'd': false,
+ 'click': false,
+ };
+ private mouse: any = {
+ x: 0,
+ y: 0
+ }
+ private angle: number;
+ private speed: number = 3;
+
+
+ constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, private state?: State) {
+ super(x, y, 10, context, canvas);
+ this.isMoving = false;
+ this.angle = 0;
+ if (this.state === undefined) {
+ throw new Error("State is undefined");
+ }
+ this.initialize();
}
public draw(): void {
this.context.fillStyle = 'rgb(0, 255, 0)';
- this.context.fillRect(this.x, this.y, this.radius, this.radius);
+ this.context.beginPath();
+ this.context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
+ this.context.fill();
+ this.context.closePath();
+ }
+
+ private initialize(): void {
+ this.keyEvent();
+ this.clickEvent();
+ this.mouseEvent();
+ }
+
+ private keyEvent(): void {
+ document.body.addEventListener('keydown', (e: KeyboardEvent) => {
+ this.inputs[e.key] = true;
+ });
+ document.body.addEventListener('keyup', (e: KeyboardEvent) => {
+ for (let i = 0; i < Object.keys(this.inputs).length; i++) {
+ if (Object.keys(this.inputs)[i] === e.key) {
+ this.inputs[e.key] = false;
+ }
+ }
+ });
+ }
+
+ public update(): void {
+ this.draw();
+ const keys = Object.keys(this.inputs);
+ const keyDown: string[] = [];
+ for (let i = 0; i < keys.length; i++) {
+ if (this.inputs[keys[i]]) {
+ keyDown.push(keys[i]);
+ }
+ }
+ if (keyDown.length !== 0) {
+ for (let i = 0; i < keys.length; i++) {
+ if (this.inputs[keys[i]]) {
+ this.isMoving = true;
+ switch (keys[i]) {
+ case 'z':
+ this.t.y -= this.speed;
+ break;
+ case 'q':
+ this.t.x -= this.speed;
+ break;
+ case 's':
+ this.t.y += this.speed;
+ break;
+ case 'd':
+ this.t.x += this.speed;
+ break;
+ }
+ }
+ }
+ const dx = this.t.x - this.x;
+ const dy = this.t.y - this.y;
+ if (dx !== 0 || dy !== 0) {
+ const angle = Math.atan2(dy, dx);
+ const velocity = {
+ x: Math.cos(angle) * this.speed,
+ y: Math.sin(angle) * this.speed
+ }
+ if (Math.abs(dx) < Math.abs(velocity.x)) {
+ this.x = this.t.x;
+ } else {
+ this.x += velocity.x;
+ }
+ if (Math.abs(dy) < Math.abs(velocity.y)) {
+ this.y = this.t.y;
+ } else {
+ this.y += velocity.y;
+ }
+ }
+ }
+ if (this.inputs['click']) {
+ this.angle = Math.atan2(this.mouse.y - this.y, this.mouse.x - this.x);
+ this.state?.addEntity(new Projectile(this.x, this.y, this.context, this.canvas, { x: Math.cos(this.angle) * 20, y: Math.sin(this.angle) * 20 }));
+ }
+ }
+
+ clickEvent(): void {
+ this.canvas.addEventListener('mousedown', () => {
+ this.inputs['click'] = true;
+ console.log(this.inputs['click']);
+ });
+ this.canvas.addEventListener('mouseup', () => {
+ this.inputs['click'] = false;
+ console.log(this.inputs['click']);
+ });
+ }
+
+ mouseEvent(): void {
+ this.canvas.addEventListener('mousemove', (e) => {
+ this.mouse = {
+ x: e.clientX,
+ y: e.clientY
+ }
+ });
}
}
\ No newline at end of file
diff --git a/src/entities/Projectile.ts b/src/entities/Projectile.ts
new file mode 100644
index 0000000..07ea729
--- /dev/null
+++ b/src/entities/Projectile.ts
@@ -0,0 +1,27 @@
+import Entity from "../models/Entity";
+
+export class Projectile extends Entity {
+ private speed: number = 3;
+
+ constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, private vlc: { x: number, y: number }) {
+ super(x, y, 10, context, canvas);
+ this.v = {
+ x: this.vlc.x,
+ y: this.vlc.y
+ }
+ }
+
+ public draw(): void {
+ this.context.fillStyle = 'rgb(0, 0, 255)';
+ this.context.beginPath();
+ this.context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
+ this.context.fill();
+ this.context.closePath();
+ }
+
+ public update(): void {
+ this.draw();
+ this.x += this.v.x + this.speed;
+ this.y += this.v.y + this.speed;
+ }
+}
\ No newline at end of file
diff --git a/src/entities/Warrior.ts b/src/entities/Warrior.ts
index 18f14a0..ae09dd5 100644
--- a/src/entities/Warrior.ts
+++ b/src/entities/Warrior.ts
@@ -1,8 +1,8 @@
import Entity from "../models/Entity";
-import GameState from "../vendor/GameState";
+import State from "../vendor/State";
export default class Warrior extends Entity {
- constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: GameState) {
+ constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: State) {
super(x, y, 10, context, canvas, state);
}
diff --git a/src/models/Entity.ts b/src/models/Entity.ts
index 168e53a..77ecb58 100644
--- a/src/models/Entity.ts
+++ b/src/models/Entity.ts
@@ -1,25 +1,37 @@
-import GameState from "../vendor/GameState";
export default class Entity {
public x: number;
public y: number;
- public dx: number;
- public dy: number;
+ // v for velocity
+ public v: {
+ x: number,
+ y: number
+ }
+ // t for target
+ public t: {
+ x: number,
+ y: number
+ }
public radius: number;
context: CanvasRenderingContext2D;
canvas: HTMLCanvasElement;
- state: GameState;
- constructor(x: number, y: number, radius: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, state: GameState) {
+ constructor(x: number, y: number, radius: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement) {
this.x = x;
this.y = y;
- this.dx = 0;
- this.dy = 0;
+ this.v = {
+ x: 0,
+ y: 0
+ }
+
+ this.t = {
+ x: 0,
+ y: 0
+ }
this.radius = radius;
this.context = context;
this.canvas = canvas;
- this.state = state;
}
public draw(): void {
@@ -30,11 +42,4 @@ export default class Entity {
throw new Error("Method not implemented.");
}
- public move(): void {
- throw new Error("Method not implemented.");
- }
-
- public collision(): void {
- throw new Error("Method not implemented.");
- }
}
\ No newline at end of file
diff --git a/src/models/Prop.ts b/src/models/Prop.ts
index e69de29..e54e6fb 100644
--- a/src/models/Prop.ts
+++ b/src/models/Prop.ts
@@ -0,0 +1,20 @@
+import State from "../vendor/State";
+import Entity from "./Entity";
+
+export default class Prop extends Entity {
+
+ constructor(
+ x: number,
+ y: number,
+ radius: number,
+ context: CanvasRenderingContext2D,
+ canvas: HTMLCanvasElement,
+ state: State) {
+ super(x, y, radius, context, canvas, state);
+ }
+
+ draw() {
+ this.context.fillStyle = 'rgb(0, 0, 0)';
+ this.context.fillRect(this.x, this.y, this.radius, this.radius);
+ }
+}
\ No newline at end of file
diff --git a/src/vendor/Game.ts b/src/vendor/Game.ts
index 5204dbe..a8dec88 100644
--- a/src/vendor/Game.ts
+++ b/src/vendor/Game.ts
@@ -1,7 +1,5 @@
-
-
import Renderer from "./Renderer";
-// import State from "./State";
+import State from "./State";
export class Game {
@@ -11,14 +9,17 @@ export class Game {
then: number;
elapsed: number;
renderer: Renderer;
+ canvas: HTMLCanvasElement;
constructor(canvas: HTMLCanvasElement) {
- this.renderer = new Renderer(canvas)
+ this.renderer = new Renderer(canvas, new State())
this.then = 0;
this.elapsed = 0;
- this.fps = 1
- this.requestId = 0
+ this.fps = 60;
+ this.requestId = 0;
this.isRunning = false;
+ this.canvas = canvas;
+ this.autoResize();
}
public loop(): void {
@@ -29,7 +30,6 @@ export class Game {
if (delta > frameInterval) {
this.then = now - (delta / frameInterval);
this.elapsed++
- console.log(this.elapsed)
this.renderer.render()
}
}
@@ -42,5 +42,13 @@ export class Game {
return this.fps;
}
-
+ private autoResize(): void {
+ const resizeObserver = new ResizeObserver((entries) => {
+ const { width, height } = entries[0].contentRect;
+ this.canvas.width = width;
+ this.canvas.height = height;
+ this.renderer.render();
+ })
+ resizeObserver.observe(this.canvas);
+ }
}
diff --git a/src/vendor/GameState.ts b/src/vendor/GameState.ts
deleted file mode 100644
index d5b8380..0000000
--- a/src/vendor/GameState.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import Entity from "../model/Entity";
-import Player from "../entities/Player";
-
-
-export default class GameState {
- enemies: Entity[];
- player: Player | null;
- projectiles: Entity[];
- loots: Entity[];
- score: number;
- level: number;
- context: CanvasRenderingContext2D;
- canvas: HTMLCanvasElement;
-
- constructor(context: CanvasRenderingContext2D, canvas: HTMLCanvasElement) {
- this.enemies = [];
- this.player = null;
- this.projectiles = [];
- this.loots = [];
- this.score = 0;
- this.level = 1;
- this.context = context;
- this.canvas = canvas;
- }
-
- public addEnemy(enemy: any): void {
- this.enemies.push(enemy);
- }
-
- public addPlayer(player: any): void {
- this.player = player;
- }
-
- public addProjectile(projectile: any): void {
- this.projectiles.push(projectile);
- }
-
- public addLoot(loot: any): void {
- this.loots.push(loot);
- }
-
- public removeEnemy(enemy: any): void {
- this.enemies = this.enemies.filter((e: any) => e !== enemy);
- }
-
- public removePlayer(): void {
- this.player = null;
- }
-
- public removeProjectile(projectile: any): void {
- this.projectiles = this.projectiles.filter((p: any) => p !== projectile);
- }
-
- public removeLoot(loot: any): void {
- this.loots = this.loots.filter((l: any) => l !== loot);
- }
-
- levelUp(): void {
- this.level++;
- }
-
- addScore(score: number): void {
- this.score += score;
- }
-
- getScore(): number {
- return this.score;
- }
-
- getLevel(): number {
- return this.level;
- }
-
- getEnemies(): Entity[] {
- return this.enemies;
- }
-
- getPlayer(): Player | null {
- return this.player;
- }
-
- getProjectiles(): Entity[] {
- return this.projectiles;
- }
-
- getLoots(): Entity[] {
- return this.loots;
- }
-
-}
\ No newline at end of file
diff --git a/src/vendor/Renderer.ts b/src/vendor/Renderer.ts
index ef6dfa9..9802d58 100644
--- a/src/vendor/Renderer.ts
+++ b/src/vendor/Renderer.ts
@@ -1,24 +1,43 @@
import Ui from "./Ui";
+import Entity from "../models/Entity";
+import State from "./State";
+import Player from "../entities/Player";
export default class Renderer {
context: CanvasRenderingContext2D;
canvas: HTMLCanvasElement;
- constructor(canvas: HTMLCanvasElement) {
+ state: State;
+ entities: Entity[] = [];
+
+ constructor(canvas: HTMLCanvasElement, state: State) {
const context = canvas.getContext('2d');
if (context === null) {
throw new Error("Canvas not supported")
}
- this.context = context!;
+ context.imageSmoothingEnabled = false;
+ this.context = context;
this.canvas = canvas;
+ this.state = state;
}
- public render(entities: Entity[]): void {
+ public render(): void {
Ui.draw(this.canvas, this.context);
+ let playerInstance = false;
+ for (let i = 0; i < this.state.entities.length; i++) {
+ if (this.state.entities[i] instanceof Player) {
+ playerInstance = true;
+ }
+ this.state.entities[i].update();
+ }
+
+ if (!playerInstance) {
+ this.state.addEntity(new Player(0, 0, this.context, this.canvas, this.state));
+ }
}
+}
-}
\ No newline at end of file
diff --git a/src/vendor/State.ts b/src/vendor/State.ts
new file mode 100644
index 0000000..489feb6
--- /dev/null
+++ b/src/vendor/State.ts
@@ -0,0 +1,45 @@
+import Entity from "../models/Entity";
+
+
+export default class State {
+ entities: Entity[] = [];
+ score: number = 0;
+ level: number = 0;
+
+ constructor() {}
+
+ public addEntity(entity: Entity): void {
+ this.entities.push(entity);
+ }
+
+ public removeEntity(entity: Entity): void {
+ for (let i = 0; i < this.entities.length; i++) {
+ if (this.entities[i] === entity) {
+ this.entities.splice(i, 1);
+ }
+ }
+ }
+
+ public clear(): void {
+ this.entities = [];
+ }
+
+ levelUp(): void {
+ this.level++;
+ }
+
+ addScore(score: number): void {
+ this.score += score;
+ }
+
+ getScore(): number {
+ return this.score;
+ }
+
+ getLevel(): number {
+ return this.level;
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/src/vendor/Ui.ts b/src/vendor/Ui.ts
index 8cefd11..5a3c3e7 100644
--- a/src/vendor/Ui.ts
+++ b/src/vendor/Ui.ts
@@ -1,9 +1,10 @@
-export default class Ui {
+export default class Ui {
+ static bg: string = '#709775';
public static draw(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): void {
this.clear(canvas, context);
- context.fillStyle = 'rgb(0, 0, 0)';
+ context.fillStyle = this.bg;
context.fillRect(0, 0, canvas.width, canvas.height);
}
From 76e38ab648bc657bf4ea49a84aaed6d6dd741313 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20THOMAS?=
<74055963+SebastienThomasDEV@users.noreply.github.com>
Date: Wed, 20 Dec 2023 17:25:27 +0100
Subject: [PATCH 05/14] stop player from guiting canva
---
src/entities/Player.ts | 38 ++++++++++++++----
src/models/Prop.ts | 6 +--
src/sprites/character/Character_RollDown.png | Bin 1184 -> 0 bytes
.../character/Character_RollDownLeft.png | Bin 1307 -> 0 bytes
.../character/Character_RollDownRight.png | Bin 1272 -> 0 bytes
src/sprites/character/Character_RollLeft.png | Bin 1114 -> 0 bytes
src/sprites/character/Character_RollRight.png | Bin 1076 -> 0 bytes
src/sprites/character/Character_RollUp.png | Bin 1135 -> 0 bytes
.../character/Character_RollUpLeft.png | Bin 1152 -> 0 bytes
.../character/Character_RollUpRight.png | Bin 1108 -> 0 bytes
.../character/Character_SlashDownLeft.png | Bin 864 -> 0 bytes
.../character/Character_SlashDownRight.png | Bin 881 -> 0 bytes
.../character/Character_SlashUpLeft.png | Bin 934 -> 0 bytes
.../character/Character_SlashUpRight.png | Bin 895 -> 0 bytes
.../character/Weapon/Sword_DownLeft.png | Bin 591 -> 0 bytes
.../character/Weapon/Sword_DownRight.png | Bin 477 -> 0 bytes
src/sprites/character/Weapon/Sword_UpLeft.png | Bin 540 -> 0 bytes
.../character/Weapon/Sword_UpRight.png | Bin 580 -> 0 bytes
src/sprites/character/down/Character_Down.png | Bin 917 -> 0 bytes
.../character/down/Character_DownLeft.png | Bin 797 -> 0 bytes
.../character/down/Character_DownRight.png | Bin 842 -> 0 bytes
src/sprites/character/left/Character_Left.png | Bin 762 -> 0 bytes
.../character/right/Character_Right.png | Bin 787 -> 0 bytes
src/sprites/character/up/Character_Up.png | Bin 905 -> 0 bytes
src/sprites/character/up/Character_UpLeft.png | Bin 818 -> 0 bytes
.../character/up/Character_UpRight.png | Bin 821 -> 0 bytes
26 files changed, 32 insertions(+), 12 deletions(-)
delete mode 100644 src/sprites/character/Character_RollDown.png
delete mode 100644 src/sprites/character/Character_RollDownLeft.png
delete mode 100644 src/sprites/character/Character_RollDownRight.png
delete mode 100644 src/sprites/character/Character_RollLeft.png
delete mode 100644 src/sprites/character/Character_RollRight.png
delete mode 100644 src/sprites/character/Character_RollUp.png
delete mode 100644 src/sprites/character/Character_RollUpLeft.png
delete mode 100644 src/sprites/character/Character_RollUpRight.png
delete mode 100644 src/sprites/character/Character_SlashDownLeft.png
delete mode 100644 src/sprites/character/Character_SlashDownRight.png
delete mode 100644 src/sprites/character/Character_SlashUpLeft.png
delete mode 100644 src/sprites/character/Character_SlashUpRight.png
delete mode 100644 src/sprites/character/Weapon/Sword_DownLeft.png
delete mode 100644 src/sprites/character/Weapon/Sword_DownRight.png
delete mode 100644 src/sprites/character/Weapon/Sword_UpLeft.png
delete mode 100644 src/sprites/character/Weapon/Sword_UpRight.png
delete mode 100644 src/sprites/character/down/Character_Down.png
delete mode 100644 src/sprites/character/down/Character_DownLeft.png
delete mode 100644 src/sprites/character/down/Character_DownRight.png
delete mode 100644 src/sprites/character/left/Character_Left.png
delete mode 100644 src/sprites/character/right/Character_Right.png
delete mode 100644 src/sprites/character/up/Character_Up.png
delete mode 100644 src/sprites/character/up/Character_UpLeft.png
delete mode 100644 src/sprites/character/up/Character_UpRight.png
diff --git a/src/entities/Player.ts b/src/entities/Player.ts
index 8a481c1..51b77e2 100644
--- a/src/entities/Player.ts
+++ b/src/entities/Player.ts
@@ -17,7 +17,7 @@ export default class Player extends Entity {
y: 0
}
private angle: number;
- private speed: number = 3;
+ private speed: number = 10;
constructor(x: number, y: number, context: CanvasRenderingContext2D, canvas: HTMLCanvasElement, private state?: State) {
@@ -72,17 +72,38 @@ export default class Player extends Entity {
this.isMoving = true;
switch (keys[i]) {
case 'z':
- this.t.y -= this.speed;
+ if (this.t.y > 0) {
+ this.t.y -= this.speed;
+ } else {
+ this.t.y = 0;
+ }
break;
case 'q':
- this.t.x -= this.speed;
+ if (this.t.x > 0) {
+ this.t.x -= this.speed;
+ } else {
+ this.t.x = 0;
+ }
break;
case 's':
- this.t.y += this.speed;
+ if (this.t.y < this.canvas.height) {
+ this.t.y += this.speed;
+ } else {
+ this.t.y = this.canvas.height;
+ }
break;
case 'd':
- this.t.x += this.speed;
+ if (this.t.x < this.canvas.width) {
+ this.t.x += this.speed;
+ } else {
+ this.t.x = this.canvas.width;
+ }
break;
+ case ' ':
+ // dash mechanic
+
+ break;
+
}
}
}
@@ -108,18 +129,19 @@ export default class Player extends Entity {
}
if (this.inputs['click']) {
this.angle = Math.atan2(this.mouse.y - this.y, this.mouse.x - this.x);
- this.state?.addEntity(new Projectile(this.x, this.y, this.context, this.canvas, { x: Math.cos(this.angle) * 20, y: Math.sin(this.angle) * 20 }));
+ this.state?.addEntity(new Projectile(this.x, this.y, this.context, this.canvas, {
+ x: Math.cos(this.angle) * 20,
+ y: Math.sin(this.angle) * 20
+ }));
}
}
clickEvent(): void {
this.canvas.addEventListener('mousedown', () => {
this.inputs['click'] = true;
- console.log(this.inputs['click']);
});
this.canvas.addEventListener('mouseup', () => {
this.inputs['click'] = false;
- console.log(this.inputs['click']);
});
}
diff --git a/src/models/Prop.ts b/src/models/Prop.ts
index e54e6fb..b3d038b 100644
--- a/src/models/Prop.ts
+++ b/src/models/Prop.ts
@@ -1,4 +1,3 @@
-import State from "../vendor/State";
import Entity from "./Entity";
export default class Prop extends Entity {
@@ -8,9 +7,8 @@ export default class Prop extends Entity {
y: number,
radius: number,
context: CanvasRenderingContext2D,
- canvas: HTMLCanvasElement,
- state: State) {
- super(x, y, radius, context, canvas, state);
+ canvas: HTMLCanvasElement) {
+ super(x, y, radius, context, canvas);
}
draw() {
diff --git a/src/sprites/character/Character_RollDown.png b/src/sprites/character/Character_RollDown.png
deleted file mode 100644
index 2422b399d8cae8b225adb5a9cc4ec2ad9af28f47..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1184
zcmV;R1Yi4!P)x$4{3$390vmscW~z``S&C#%
z$iV}F4vqsuOVj`fQdo<8!8jpdNWzR?{1caZP^*xcP>09f0$Z!8bWp-vm0D9z|U4vn^>
zZei|j0RTeR!+g0U5wwp+5}xw74*xm>bR7psJGyP#NJkz6z|wo#;yzit&j=3y
z6EqRT(aHqry(f$JT5`F}fD<(75pF`+_*UIyx{iaB#e%hM+nO(zb(^UJ3tbNY5X2FH
z)d&Rc#?{D>C~NV(B9nfR3wq$GNqn^yAf9SdELi_mo(
z>twO0(p+5_24i441_tBoo#`0RU;w11t0+EH4UVb?4B`lPHa4ucA3l_}UA42g=rrnx
zAdc2y0>01@&DZPo002pn&~4Qwkm`IwLlvlHKp8!1tpW1l)3uYuLhC#%#-`2)U5^V-
zM$m;Y*On5*5!$wWZSl)?7h+CBoMDJFgs#W+C~IHZ07Z$A2%;FeOhEDJ3j)C0-Qu5<
zBoQls7J@h`Gyz?kpqaU^qWsU7OTOmG$1eITR)MbLlp0Xl0AeD*Me%i-pzAo9`1w*O
zx*jMWHFXH$2(yFX1ryMmn=ikr=sJ!?Z5A0Yh$FP)(@cD-J~Gp>REcWa_LTwD2`@#zBqK%+mx{oNg<=A)^kHRxpGQ|xbk
z`IQ@io{^>00JQx8t`?u5XH+eM@>7otK^&pCxv6v~@aX86)r4P~`6u7toFGBSeNSuCT45;fM2I&;=W;#P_
z(7~JOEK_#rT5HfDp_Im+9Srf~?=JzYw!2huh(>?J4};qAsdRjq3V=Hs8@w?Y5oA}O
zGSpc~tBgqp7wUWLUjD@)f>ij>_3-!I?{Ro|
z2-V^Pz~krza4sg>+uK{kkE4|dU;oBUz$?^4xwh++s`ImW0l|ej&f+uY;g_+lLJB&>utrS(8w>`6!C){LD)SFBPn6!!IN8qt0000
diff --git a/src/sprites/character/Character_RollDownLeft.png b/src/sprites/character/Character_RollDownLeft.png
deleted file mode 100644
index 3d303be9327aa4e57d015dadc51d67a3a31e5917..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1307
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
diff --git a/src/sprites/character/Character_RollRight.png b/src/sprites/character/Character_RollRight.png
deleted file mode 100644
index e45ea115ccf61a814fa75846297e27123aca517f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1076
zcmV-41k3x0P))MHWhc)VZP%ca%%8!4*>iX05f$x@8uOKtSUOua~fGYf>t0F
z<~yz^&IwQf0JKL#3R=6KObSRPF?Ai$bjspmEt*cHUHf-NEV@PC$#W0)2v8yKH?D84
z4)9*zOMOoaBywuJJ;~S?Q1(aDDf1l{zT;9NFjU_bzJ3;MaqPOoZL|3H>(`lzd+QEB
zSr|FB%>T1ZMsCve9hY|&G&+wT=yw1>qwXNH>xkMS6vw%HqJ0^Dm7=wQ)UGQ+erNF@
z&w{MF_ecpQi*EbnKaXeTiw@hiF&>ZkX-X0qNwBW%nxk9H23_o*UEuWSP`mo}y^z*A
zD6z8^Ue==9`W9g7x<;8Fpu*b^y^6;agsJONs`3B7Kg(Xr}|Ms*c{#R_p@|}tkmmu
z?eg*x=ywn{J%mjU0Qln5qAxy;$hc3Z&4bQY8y1~n=k7^iy;ZC$Jo261-=_QJ+5{dO
z1`h@RKDRz{Va6ERqahDa*r*la=H>>7+Zh=?9*=n<0Lu#{OM4x&K^J%ZkRN{;el10B
zUEz`MVbg;-y2U5+P3Df9D*>)26YTBnX#imL0^IdOd~SWjY|sTTH=;cn@~q6#inhh-
z1qhoSsts#ng%%~P?FOjet{?JP$|kMw$oFc)LfG{1U-Tn$66Q*PgM$M+JUlSE2V1=W
z`)3ybfQPF~UJ;mAtkmxS&fOD@w5kn@>z0MsdI>QhtX=@ywgEt#H>=m{(qoBz)U1l3
ziG>F|`fl|CoE{xYFE|kffZ4XqN7(dO*z^+5$frk#WySyiT+?@47CE)0;X5wHQ&@{M
z=$iCO9)RZF=&)9+B};c@EGu>6@$S!8CCP$ss2CcZg!pXGWwSxI%tHn?^Fy7cCg#;r?58yXMOun*z
u8(8w+FvY*0o%afbLZMJ76bgkR55E9;hny{scUN%$00008?R=PNCQ0KoQLKtEH73xH4xr^(&)jmJ_7&oOupR^PR`HixJ;=-Y$5OFKe>94fbFV)d
z-AarmaU%!;sCOa&QsYR>`8U6pW
z=^v!x`=b%6GwPiv2JXZGU!VWUgTMa1QN|=7@<1xT%3%IYK`4H(8iW#jYFUd_sto7{
z>$F(S?0;>cstBog)fp{TfqYv*xcP+W=;O5`ws*(J_O5!57ae`HYFC1OSpZBbB9Cl1
zWn1i|^+>si|4kw_Zj2*5iMq5i)F3c?_EKJkPdSK=B@&gf~)lRyKT}PnVa;vs8cEu&*@+n54j|R$pZ>GYg1-
zJo>_<)iz<$A+P*sQ)X6|nFK}INi_ppd^ZLJKf^24i
z*IS#On(~F-PL->}J)~<`Yqog3wP`KzO2wjAHym6xf{^a{xvdP4*w<Dgy+ML{EFqa+(+pvE!940|n
z??elOK>B|Z4O#&p0!$*%rV|)1v?Tq%WTPsBBnTuR3YD7GJ{YcB;WFm~$t=L;EJ%V-
zGT$N{y`8F&2Hh@T>U^GnJg0(cMXOzp1c8*9_SZV7tq^X$zqCBLp4Wny%yd)@>7(4E
zt3kU9n3o080`h19!n|paIxtnQ+Z=<4L)A1}>YOI$<#L&Fxopi|nsD=pSE$qy+v;FX
z^?jjI*7J
zbVF2w@SlG_Xur4dQm_ahm1KtR{BBh-x;os}@ibz|teY(~L&8~EMuOANCsTr$wg
z%8GY!aiR50Be8i1&_#k^)=Ff0UA)ve&22wI-4iJliyn}4HFvZV2$NY6aJ?S_vL|9x
zr&*)bngA2j08|4(9hgn-^WF`=(M=JM6fCR$5{4~npa5x+ehr{8>%6|jzey<8-p(FqR002ovPDHLkV1oYB
BBAEaH
diff --git a/src/sprites/character/Character_RollUpLeft.png b/src/sprites/character/Character_RollUpLeft.png
deleted file mode 100644
index ff131d0e7e4f21ac3ed9e585626ecc232f85f737..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1152
zcmV-`1b_R9P)Nkls)YLl-4QU34ti7x6@y-hY*YOSEy5wE>06H
zH!d8h2u7VFbBMsn2FKX9jgS?RYEnqE+Fk3%O4>aIGaoFclSX=P-h1=ry%|s_6bgkx
zp-?Ck3WY+USioI910VvAVhe2352A18g=<>d4*)#}(f~I;-Kr`V$yeFSkbocFi#xEO
z>o7mkL@t|MNB-LE?(UBD@%n;d1&S4T@l;Iod?yL|;P=7bqHpGDaFueq1;8g)uB`l<
z+6rTZYgz!2hY0Q5>Wqh>X=Ab4>0O!P|jO5fSk76o0`qQ(JUBk6bpZ
zmD?@i`eGHi3yZ+6=gA=OGl3+HbRVTZ7|h&j`(~b8y@A{pVeA+H>hQhwnf6QTk3@AD
z4u@h^?Qs#vg05Gxr}LZ>gt7*RTYtn_CDC?g)(S|v_zB9LCr`c?>4mkw-n`jZc7$oy
zF$sb=SpXo{K80kmkq|o|Py=(o_gB%Ke$
zZe?T(G|?fI7SJ^<%6qrz0LEAj_L9nc?3B}uWq*17V;;YJg{EoK+NU0rF=ie6#|nVQ
zFJFmX$>v7!ke%a`@m~DsXX>|p@T+ftTsEt9J&!vFH+gXOEVdHs5Hxzo3FBT^kU|US
zzJ5q~?{-LTx!szZjwe02w&}S@)c!Eu2J5%Jo@xJ8h6L7L{AYUPXc&h7T23@=
z=SPw4QLcT;)8~I`-|X+FcM^E7GCqAQRw%byp@X0XSN#N~XDK^yA>+SJ
z>Rw`-_KzYQ#|cfAV#RkxS_%Xm5OsR=|1{)Bh|X6Ao&dz;LME+Csjb-G=jiANf|2;q
zb$Ht#sWCYh5c8gkxCxAAgVY5E*tY#=5;VxWd=>kDMcH4WP$(1%g+ifFtj2#V1d$c`
SA}D?U0000SFFHvbh01c8wL3U3-RdMJv>
zOD1XP;4N?v2mvG;a0*0P1Y2#l>mVL;lqu^dk+Ol_2OuDcr+e?d@7>)y5)1}|!C){L
z3=VPCHr1z+jqUGjR(H~;GF-#$;nAp_CiXw&FN@#E$IvS
zyfqk)vox)urG3e^t<%v+tHZC8STE%B494SF2LLJzLq}xWG>8-5|NNHU|NTe(N#t@l
z>+B5Qt2(*<{jgFljf!d#|7EKP)Vdue?FPMr3IG>Jz3|?o-C*~yMTH^vU%UcH#deZ01N06m
z9QV&sKMf`EW40Dp)Ly#=7>vikGPrmJShgU!0So2S(L1QHd)R`*>320525vF553AK8
za?FcnUWFmJ-qa@`m&=i6Euy3S%vMAppV!hoQ4x3(s_4>@Gz+8Oyzj01FJ6U7pzg_q
z!xjU#7`9bcprA<0^n{=i)FP?cEZMeI>vjZll2O)N@MUu7CcUnH50J;h
z)790rqmbPD;`~|B51}U3JftnP5DiE(31an^wq@Xj5LlL_ZCkqrI30~-CWeO9OYYH<
z2lu|w?OKbHZS(2sO8Blf_b3#{s!2Gzvc=sCgTMVNlS$<{k
zDc3mxII2Sivp>!!Sg-yn)923Rx^NsPyindyk>PpRdH4{Nmm$9Eg`ef+yIyL~0fIil
zKGo0RZ{>RAepMMt_6BU@#aA27|${
a8vg-|0)?5&tGM_80000001Be1^@s6m49>f0009gNklT8qvN`b
z!z?Rt`SZO|J|F-yJFxzEAgM40_Sfq_4TOj&=>?SZ0>UIA3DfI9mCwNB8l+rrJZ}v$
z68_Y2RgVDduh*|bNiU%BpikpLpNNRYgFYp_fFj}3c+fYt7@7}8B|NkrL@$WKIqbhA
zegMGM`YNQPxP@Uz0O-Zz2bFs@RFdl*SQdl)%wQp~zh3`o5VG?jPd?d_O^ToU50PJg
zssro$@_Q47z?%V?a-1zv($O81N7yv+z0|0J4eW?~h^U0B^
zIM`p8U$25$o5ii&y{`VsQU
ql6Cw?_ow1uKf^E#!!QiPoaG-2DU`)Ecz2ut0000001Be1^@s6m49>f0009xNklVQx1fUi7|YV<(Do9f{e0KEGB0HVgwhQ6zoKM#rkd#Q^}I
zg$h=;w?OCfxDnI{-F{y+0_DM|2{6M(V1G9Ll8%syFD3#oEIL92Pk4a;^IKv6v`0vdbzDf
z*{|)O%M9wG4x#Z9D1&lQs(iii1aO6d40=PuceeK)2rHIq5h|f^Xxx^)SHk|
z6_)^D&~BoI3PR6C)iEKZMAb1-bxizv`)0b2q(Q?lO4Mlp@b3K+P%Z$dIwnHT#m7!}
zCXJBR-|p_KhGl;;+S8}`fHH(FR(UMhXw{jGaxZOn>+@F0@Z2$MM`
z$b3m~mVeN0#U5-3GP9=IoVx_T}Y3W<)uRW4{lt~(#w7d06@Z78`}j_D9pG3pWic&GsJSh
zSvx*v|Ap~iohF2D**LoO2kXGtVt;QloaS;`eEJru@1R!a9|N0f!%X{MaP;UQ*4cll
z{lLj7ZtPsf)7{yAqo)2GJCTX~m($NM48t%C!!QiPFc*}+4aqYY;?}fy00000NkvXX
Hu0mjfwPc001Be1^@s6m49>f000ARNklFq
zpy~MxHa81N#I@m2H9gvv7*PK!0iltU3;FhFeNkyn_hXh*!ctrgrh7wb1JlQ8Hg#{~{)x
zYr|pYdm{1Y??0I~Krg$|SQZavF9J4LI7%cFR2_%aZ{HGC_aJZ9h`$(rY6Wy{+tLS)
z$?Q-0+|i?AH}R+W(t1pmhamA6<4;Y%^QTV%JEz`h6ETZrxav5j{HHl1N|`SG;xEoW
z%^^hf8v*5ZgnoscB-?9tWVtEUC+~q*!R@UZFOb+616dz_#QzugHLBkT6rhw+D*j$K
zqX%9^H9cQ7JwNldz+?Bai9!3dD;@_qHD<-1uRnDOzIEw>rK{ejXHOZew760)oBI(Z
zGZXYI$g&;qYVbw%8-a0-R$2f&59iDnU2!v$ioY;_>M8i$*Y5zk%Wr${ae9B4VF@-f
zs@#s~6L5u>#`Uvz2hLvwz{#fv2Eg@mwpDINO8m#;2jJedSpYR!X_@7gWQRPDB|!BX
zff}u}RKF3ZTCHY0VHlb?!Z0*HpZ9NM>fi4Ye|G+<%jUd)gXQiA(~xf8eMG0zG51$j
zR}cNn6cVNX^HQHD??0NGb8~Yv-oD1|t)s`Cx&I;;|L3JXfcSIpr!K*oR;%I!$)x8wtKn4wmyQEo?!>aEP&lf?fBv56-Bg8YVY
zqft>`+`Y!-H_ww;jHGuWhKD!HDIcF6z3uqz5`Q87{YbQ10L8gWCeXb8D!IUNe%H3aaf^;g{KxAT1VIo4K@bE%5QKl2U$Ytv>}Es#2><{907*qo
IM6N<$f-|GREC2ui
diff --git a/src/sprites/character/Character_SlashUpRight.png b/src/sprites/character/Character_SlashUpRight.png
deleted file mode 100644
index 835cbbb839b17c20482995b2a3b248da13c1bc12..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 895
zcmV-_1AzRAP)001Be1^@s6m49>f0009^Es2e;QojE9aAt6NLR8$bT>A5(5N55ClOG1VIqQYW7tb0C@6B
z{s-po0(@p{a{&Cc@`U_r?0;0Z0I~hgQ7|*M@g@Ar0dP%G$iIgEx&ee^n3x&cIA&4n
zqp+{4KqmA6FvfEL@kMY96SFYn0C;jN`PalRRW0Vl#s+?0UUDD~p@lg#?<`xaG-a&n
z$KD1PE+9U6+jEiKm)+k&4didhUp0Wa;AIgbqKyk6LSN)vq>VoU`P=iCz6FbW{IVh}
z%wb^;$1pKvtg+s(ud3;c3tR_%6`}_6ci;cGY$3BSEHwgvxG&JWGv34~oHE88!vug*
zZVU7DB58_(Ss0SP!~RN(kTTP+D4?lP*jH7__T2RIZ$liDX^hF=VSlLrR#{>%_JXC~
zxP&QV&=f_oJr}m;uDl4M{~-VR_)7&)+>v4@~*u{5u1Zv&RO&-jv@bg_)AaGeN`=NNJaR9p@rVj7@TuRl2qxl
zOOo~z%VuLS{R4n3%Tg3YkG0B32JBFEVNP-p&t=!L7Cx=Z25J>(BesFM*4L1kCbzSGW
zuIIew?pA|p^0(oydz-uwDqYtB0KV_1`>sw7@$~J7yLfW!t1^yRJhFr@i|_jghF02#
zH0dUPJO0uSq8BMD;N#v7u(y*dz}(%E+^^?#H93x11jHw_bXM&hjS;|V#7F-2{q<+S
z!3g@#Pw9@u^#7U!=pBvk;#i6-%ZQ?gFAf6V_wnkPB7OgpdjLxQ4*P2dFl|N$qwBqs
zQSP8OTQ8;0=RayHZm%KdzVFS;XOO|@8^mWA0LNzU7uchK0TBBcs^&%
z-i`87mR8=6|JKFte_&sK{rJa#GgUuh`IL%mY_GeoyxrN?E;Bo~Z~60%>(f6KZ7BF-
zbwJzq3TxeqwZ=M+w!S=_?rHhr#MwPNF39Le?dL0)ap~Ta;>qXbLPOWqa;=_a{crtd
zyWh-Snx?Vd->nbusQ2fuTIHp=^iB_3kk{My^X&I5eXOsxF*rLnd*+`wvOBV
z{rk6NyC>Pby?-<+gYVp%vfUv?dS3nVhzopr03zT6
Ai2wiq
diff --git a/src/sprites/character/Weapon/Sword_DownRight.png b/src/sprites/character/Weapon/Sword_DownRight.png
deleted file mode 100644
index e3bb6ee2f9c2b68d92ef5e1c28ab6ef951a403e6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 477
zcmeAS@N?(olHy`uVBq!ia0y~yU~~Yo9XQy4WcKrQazKG4o-U3d6?5L+_VqjDAkpw}
z{jul@rjqwfymJmN`To!)PEcGSQ~N^v9HY-RoShT(ekp#wrK!jS)K3IxNZ)Y#t&&pT
zTz5mS`SM*wxd+W%pD}9G)@hu-U45jN^}eVj+k!7Y760WGud{o#%df17zociq^ZiBU
z_4_`H=WXuSux2RCXH2PQ-EedJv;K4U|LoB{6aMnE`1{Rz)(nEF=kNbykGRvMU;FP7
zXM)T5z4OmyGc@m6V#oOF>h13x?+-6XE{^@*yK~h%=il?%xfyGizJ61_y`eY2)jIEL
z@BPCG>sR_W{BC)_WR+j9^?tdtKeqDyJ|3*Ze9u7pTF3nvTw(h+GQ8W&8n?3ZBeUBE
z*0`DHriK4`(8yx2(E9uLWo_s0iMt6L*dn(7Q1O5MwqkyRwW`@mYYZkaEZgp~V--hu
zy}>kwW#;A5I&}sU8SKnIHcPS?>|GiERLFkD$>j%L8@!q=H(mY+f12QdFKx&Ce$3Thne`j&5hnHKr>LmSKqDd
z7gkTX)INLNozkw38EWlJa&N2OGJZ)D-Iska`o8<$1x$>0PPTp6D`>yMg`s>yN4(z;
zr6c^SeuY&toPXE%W3O%6>BkMS91mpQ^~eXzWXRi+{3oY*p%CMpgy&P|UsVoKYPkJY
zQctjjtA=aN%R}OGif?{$Qf4Wbtt(o?KYz8|0$!#c5_;v$Y?b^5hmXBo|HE-Hi$VOi
z)VxRRxk3jH9pS&F+E7^&%W9?6@HFC=<71W$3b*4kW-~Ay{$%Trw`~{OuScJ*t(u;m
z#2RtJ=KR+7fK$Jk7i{@6H|W;mBF732MxBIN%Vxy?yCUb7dAk1DtaW$ze1#A2nCHLm
zdp;vR?lj-BzV(NuDdjX*$}ycdTja;E*iwd1@PGJz&ANZDWyy=E>!)CpTn@Ln$K;%eb2kkQ{R7L
z`S3XW=|VBXUw;xauE&26e0hJ{hV;ef<=f1Dao2tM$&4BmNW7SD;zyMtnY+?WL9x!@
M>FVdQ&MBb@0N}OedH?_b
diff --git a/src/sprites/character/Weapon/Sword_UpRight.png b/src/sprites/character/Weapon/Sword_UpRight.png
deleted file mode 100644
index aa7791d67df8bd73dee10c71647349f529485b22..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 580
zcmeAS@N?(olHy`uVBq!ia0y~yU~~Yo9XQy4WcKrQatsVi+@3CuAr*7p-a6QOIY5Bz
zL1l-wyI;r#lZS5^mnyvS6kf@s_29@vrZb8+6I?lO9x1d*uAiT>cInyPaJlV;8Y
zGzl3rl-|rS6BMj<`SM=i@akRJH`C?vjSk;w{~fw=(*Coy2fXh5UL$Wm|Jtd#km;MY
zcU;=J&hnXEN=(iLZm%c*4Zbt{39sKF_R*{&sjzW{JL9ztM}&NSx*1Ge_xhP!Vp!zo
z`Z?7M_ty4zlohR6k->TV*XmvCve#~X?6-aEwc}l0`@Q~^Fza4f{Qd9LZ|ToBZCBdd
zADYB(w(!eO*~aXsM-wIH`7vG#-TF7`h}CK9*K%(njh=01)_J!fer9z~^d8grl?&eo
zrt+Ij<@y=SyE!5F-}(G+wYP4{Cb-O$eHQWZdxEg{-1~w*Ja27(|9kb;8*j^Wzs0v~
z&z|z;_{qd?Z_9Qs`_$c0|MR+5@xQM%+|R#!lKS}a^S^)R-*?R4{dm3Ksn_?^PX8AB
z@ihC$dimNtd)~3jq{OrS41Vta>&lw*CzN9DMvK}ssjJO&6x4E@F+(=NsF`W^){{m0
zOp1!EGbU`esNiFrFrymrB_
yZr<+jwgP3=8FyOk+hVk=RXLEO2s``0*?&wq-`^Zhc)e*ENQI}XpUXO@geCxp=>!D;
diff --git a/src/sprites/character/down/Character_Down.png b/src/sprites/character/down/Character_Down.png
deleted file mode 100644
index 79754937ae33e7e78bd7f2a90739414a5fe16441..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 917
zcmV;G18V$1q=p*!C){L3IED#01(a1#wyeTQr=v|ftNvpJShg&jbULJ(9EF&WxtW>5S-&4=
z_*jS-CP)CFDFIpbA9sRcn+G7owXMQ?kbunkANv)sP%5F_?OrP=f|9}64ghE?gOivS
zob~&pBLP|WKlTM^ce_*%45?SbD%9d3SC9USUmrU0@7Yp8L
zsQlGD7Yn75mhu-(fXY?(Y8++Dy7lVIyMF+~w-5lesuj7-soM^THnm;(tc74ZCH3mI
zBlq5-O|+}`LCjjnyMF-Yi(o4gyf$bjFyxpsb2$KV9Nt1x9t%i!nx=
z^Q6jPs{X~eqRe0ApK~7i!_=m;5^LaCZ|J78f_?Y+!qC>v)g8ZHv~M~qg?;xpRuD0u
zR<(ksTT7T;-v(n$KJa}XqAEmU)~27f|ET^b|D1Dt`t?)J6Eq$Ls}ScLj}E`dBhR|+
z;Lp3a*xlW|>6l|RMac_{4T&aVn1CeoL$RdbKcqjxHvk|qPl?15+G~m}igIZuC})?-
z9)^=a*xHfhKMDN^ckVx`&p99Z9yKQud00000NkvXXu0mjfo8r2c
diff --git a/src/sprites/character/down/Character_DownLeft.png b/src/sprites/character/down/Character_DownLeft.png
deleted file mode 100644
index a76cf65949fa49842bc8c5c5d82fa3f4904fb30d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 797
zcmV+&1LFLNP)Udv
z0f4s5AvBbP78Kxo{XgyZfh++c2@}hzJB-E(&^7-L%3S2yHUJO+`gwax5%cBmBIaXz
zb3*_qyG|=v0RRA7=HOfMTYCYz?7vh4Y?6c`=3~noM9jx*y}|-R06>6W0MbNkl0-`q
znl8Y(`-e9g0RTnJr!8|RVm?9H2E{|XuOX1Xw8hV2E7YjnY5%=r7r3@9SAgjDLo6`F
zY`rS=x69&ymyYBz!2q>BtTVGwcww*H%q}y)Mym()1
z#Z~Ed-T%=BaBaIMX5IqB+$uPfjH(W1Ehs>z{g>GRFtM!OY`w}Ieh#4=O#Yh|6rj`o
z|7A{590qv(bpar~1(~dW$k%E>RnOsxWyypVS3_|wt1+O$ISk_;L_`#a0mWfJNE0GY
z!^mz^pzn4>>J>HBQ@GBP_?i1p1K2I+v|G-Jh-kN*Qyc~qF`stJxd=!Xtth}L_}B8m
z*k|VzP)LGengGz3w=b&~{=>Zm06?5`0zlLLLoMQ`;vWFLd-7Oc08k7IVf6!vPySSk
z_=gwIWemjv6l2g5K!g6Xg349D&%fA(lo+c;6aWBuo+qC<=fpXefoT!XP!pj(;xN$O
z01f-6I1HpN?rA`+4WI^t%PYd=6?vW~gDPx^S{RSVfKmWeR~Ub9J<=sFXu^MP+^7w>
zuPL%-)rLH2a?WKkgt)E|Ahe5`g_WnZ^F<5|_)iP&UZk&;21LI2`cc1`f--+<3Lt;0
zb1}`uQiFcu{>8`ljA6vzKT31Sv!jsno?{sl5XmS=h`JzC=-ltnewi@toHqQxova?fY3_1%?7XNp${z1pKXQGn{1+FK~2d;;o
z*Vh~f#otp#!?N%-`b8tREzT8DfU^0|)BqjZ#zhoS;CdLjZTPqX01QyY@!2W(eBgSx
zh$1B;QfC3m=)aOhn9Z|sW`HUHz{izHhO@UEkd7-KRW%hqJ&4rUU9Jd7!uRUm3R&LW@!?G}%Ojc^j-OowLa|$lA
z|5P0+uRkmV0FATn0DzI(7VpEJkJiZ`^|e#7pv}k$NETpK(z3Gc{sG)Pe(=GY4`I(2
zuVK$8BFcSJhP4CNqrmm%HeWEm5hCKrQ(ulDsktrwWoSC=Q{Z|O_I#QS`$R-E9rkHD
z?3c0t3AFgtuj;?dQ4Q{KRWn
z1pubQJ_e{F?D?p5TOcCTx-HbYEnI$hpSScJy8J)9e^0#E=Krm?4*=vijyNE7B?_2=
z4iB1OEgp5r(f8`vQzhD({fij~fAJ51UOs-LAcR;n?D-2xkdvXR035@r
zG=Qv+gn!3zlnz4CZIBDm{WLp@`9)47LLLpAjC#GUR9lz-xTzM3y{rMHyyOc{fdGW*
zqoX52e21z;bP-`vbb2BdRl;lH|0V`5ywreBrzwA~E`Y%GFs#sAGQxhG7_nVHk#C7=}5_SGx`XwEe9dRo4#y
z6p1DQptf!2Zu|-YP<8#A4hV%$0LZnhLhPfU0H8$rUu3DYH9}ee00dYe6h5N$x{zRm
z!pA(0jR&C2`ZEoHc^p$Hd_BQ&^ka>6?(hpNjRSqQMp(?s~$8n6<-co1)s;(cv
zQzz&}eiH5X`zB}KvjG60Y#R>1Rq9{%0%iOC%NtYX|AGLJ=Xn%~CPkvDk3wU-du=J(
z$TMHuZ;OJjAc>
zOWgeY0YII9FS-Li}TJc}R`MQ%2qyq-MIF0;C^?
zH-U=6^>-egisnbEPjWylKY19G7b0@!i=CxV`jdw*Tdq$3PBBhCJ5LS$R&3ALE&@QU
sRx1}@aHaZlafD$QhG7_nVVM7zKTV!EaAoG8V*mgE07*qoM6N<$g4={&ng9R*
diff --git a/src/sprites/character/right/Character_Right.png b/src/sprites/character/right/Character_Right.png
deleted file mode 100644
index 2ca39842a71eb49d0bdc3b6f4a309c3b2afa10ba..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 787
zcmV+u1MK{XP))+M90i6gp`0uW$%K_?LL-*e(VCfOs@?X^Jr&
zOrgaP4GqNe+ac0bGHz?7`f%)fK=@16`#$%cPUn-sU@#aA27|$1Fc=Jm<#=Q707&$>
zacsIjfK1$d0p!58OAo#R1=w8w-G>h$YJkA?1d#HxsICC(;{PD)7otG&k*>)o9d)(`m-T|D6>mz}op|z6317=SnB!b4B2K45!oF
zhrulJs?o^(?E4e<*?;K{;8>Op@-N~>DC@dhMgi8lArMEqIY3lD5N
zx3jS70<5e5(g`}2r5hm`D3*?{IZWJroWZDwN!X%UcZweM)G(N54(sZlWdzXA&juHq
zH1|^SBEq=s;|xZeIJ>#ez#Yq~#f{vfo;url)NuwQU4*=g55^z({TmpNaod+!zbk?3
z$*kWM5s_KHE916b