From d5ce797d1eb388bf8e35d20a1b77a86cbc6d8410 Mon Sep 17 00:00:00 2001 From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Sat, 9 Jul 2022 23:02:56 -0400 Subject: [PATCH] sword animation --- Assets/player/Sword_Slash.gif | Bin 0 -> 8503 bytes Player.py | 56 +++++++++++++++++++++++++++++----- Setup.py | 12 ++++++++ 3 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 Assets/player/Sword_Slash.gif diff --git a/Assets/player/Sword_Slash.gif b/Assets/player/Sword_Slash.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f9cb6ef10faf12eee0c5577132b4150a680525d GIT binary patch literal 8503 zcmZ?wbhEHb3}6UgC}&_${Lk&@8WQa67~pE8XTZ$Jz`&sRlZBIufq_AXfq{Vmq^y;J zfnkrfMWuq)JPp$ld&?=&&fdO(w-8VWpgr20=RDLR>BHUGkj60fyU>u;q5|AP$`K65C@71Go&)>g)y@&tfyRRR4j`9Dz$neS%QK?x}XwIVw-Q1Q;Q(u73pmgqFOjbRIXIBFA#O%5>^w4*q|WE(05EG zWW|SzOkV7#6An$%R7^V6J<-b7aRtLer`FlbiVfDYgq+zXKVa~=P@r&_jZbP36T^(F zT48JX87r=K6??EPe^4N{dD=qfww$bXfr5f*%v(1V$#(30#j{?3Nv@^m>C?ouru>cH zZ<)5=Vf!M(lmR4hX=y71qJ5XazFHmG-=ljeUVnqjrj7biQ730b6ezRuHI(hQs|Ns9Xbt9ynBrVktt(uJF zRgssl|GfLp2BtbM=2oWmn)dc)&sOHH39UUIeSH&HCQWvk+Rwzox`2g=d6wJU1>o9o z#?sl$EbI#)wd48?pxSXe*P&gzotCi7XE}8GsOyOn>}SrNW7x!g*^TGc8unW^oNhh5 zbMNxQhrGPcp5A)F%g6Wf;Zgp#PVe8pS}!0d#P9t5!=azrqKt=HIGr^#YOX&x$jrH3 z%flsN!fYo+p>=c#Kny`<}2{%hO{`0y;4aFBU9486;pJuw#Pb z;ihiZ6FKj89S=U-R(@m|qYjtAY$vYwdM9dr^ggYR>eC_1I@>8X5=R({cINyPyo4pDqDFU2NWO;;CWs+s+=R7{llUQ#n>@sENZp^x?} zFccW<;dZ&J$l~C_=NLKp*=Z*u_i1-#UhKH+?$`1QTBySKl;f1p{N zlZmL7KBSrN?HdSb=Kp7Kfw%M_ZF~t4)dvqAOiE>1Udpnyj^*Tbzo@9F#>PfyQFihq zJcX%gyU?_m&%nSyMpFBcPf}5~f{g`Kkj-afW#{1FT)lQ30}IzCc5e1Yb@ghtQ>V_H-F4y8WjD54H(YsmZn53F<8<%dgGYCs^6>J$y77vakMHf%%db9t zdUxi_#~)vK&d50=TvupvtYn$#SfRi&hp|~`Tjnf>iB7GG7lkAk7#ttFC<y5frJ?z-FnoafB!&xbZ+j`R%CcTIXYZBlTGUM5GAaRw@4(AWgJhQ?( znYTM}SlpQ1xb}XuCHrl~(?=Tpm73mWXxurnapH**lLCW1EQU|`N^Ank9$BWdUno>7 zj=Qw5&r1w40505eJ*&X*T5rb!|{>f z#{1UU&PFi?GGVtL?G~4Mt@NQHJLTjqt;O9rEk#l1V(gdvZHTNt7wq?)$Nq1H@DQh<=G{}mMaQZnadtXh}zdS8Lg z`I6lG73<#Dy#Ie-0me{-5_8j-l&EDusoQs;^&v=-hd=-Mn#Uud0cNiZV0b zzH|3}+#{7IA`h5FM4l@>5q-rX_FhT+-X{^UKkvo=zx}~!^Zfzi)-(yWdD&qbZnE$Q zy!ADBF=3W11Jl;nBN_n@cV{Sc&VB6>^u%nE#`$DNpBsfs_p)m%irtyZnFtptkKS+i#C*|`%^14Tte?a{W_ zTE|kUptZb|WuAuVq*SI7d&|7MJV?Z29m_(F;FBj$N{FbYSVlui5rXmR5t?u^My>j6 z#+S-&t99WkCrd>q?T>#u?X=YVO-V&FThsVBSWDO0N*sAw?4BU7<8fhlX*(n~nNAdu9_Eu<;8 zB|}NsEkVLEZcYc|<7OTu&&3%x9E6hFrfV{KOxSSgsrL+}m!1-i{fEy^`Qj$>=42!D zg$2%kkBS5)K0mv_+x^ZQsnUlBRtGN63Y7?6eSL;&tsk#+sMC!_)~lIrY$#sFwpH3> z5353Xd($YBvlyE95A(hIcRHmq?s4Y8>LR-(< z{Xi8AxDAb&{UL<_6-iPmm{$!ocJ1~rf7skzcjfoj8rS;fhDL@~&*sLWu!^>bzW(0o zbf#(3;wGj}pTitenZ&Y)dCBx8OQIJnT)cewqLs4}7Hwu(%esETs!dy#u(IuEWoC)& zNZiW2pPikJgJb*7UAtL1_H%M^a_pv^Ccjsc#>(?Cb zFMRyOaG4|OMF#I#0h5e^bMZ49nVE&wIGx}*)W|2JFvm&bz|3|&IhzR<1spAEqGw$m z%m`e3teru{V}=4tQ;V{qYhRDY!e__YMHwPCC>%ND{Xt1ocUq@|$)O1i9A<870?sp8 zGU(|`1ctCNUsQT0rf}lqlsT7K?Nn1{EO2DLke6hTV371_<;1!2j4?ADuDzKMk>m5q z^;7VPm`&nKq-KRTG$t1Np2}Kr+Wmbq?*vn)of~GXi#6{vcGt}Q`DxZH5t-(BhawAS zr!B}f+a0uBXEvX#Kt;#irE4CTh$e71-hJ4-L_@Ub{X2m>-`}gfF5*+%ckahWmCtkd zJO9aWepNoZI$2*~uSeNimurm;aSSfsUp<<-gk3*HuH)mi(}&srFRc5k^6mWQ`{(!X z|NozXP2)iWi&(~kMh>+V51M$)UOZ_2$I6Jkm4umyUtL)R8I6Yw!tdF$=fQ&qQJEbl zPo8Y)oMNwGv}NZ}$S4D(fxczOp{S@RNOusDlp!PVhgvfSQ|la@i2Yyw*fV$L`|sa9 z>YAz=TuQu~Tf-~5y4!n0dnT0kr!h^R9@mmGV=i;d>||!<8H*Q3FHB@vwuXfzsy=1i zx;3opA~z;)Ud_VB#?HLHZ)N;$=6(A(7!HNiZQ8=jd4he%xung<*|=EuU5U7Mo#74} zE9)iJt2ynJ8yzVXOdbWF)O)6D+oh3*e_MW(5aMTcZ8 zCOk-JW)l$M>Nya|b%a4kJ;;S);S;w$*@ZPSk8?R#IGxn|9DY7g_At>;R1>gVxLo-8 z?93vj8=9L`=TFVl&{&($`1r^yfvXV<0wy)Ja%lu>b>3Rm#KI$YqtiCYIBE7uDT9== zUFSU<%_Y_aMR-qNv&&4vBxggx*5|k839HGTJk8iFz|ASd@NTBVhXh`ko{$=Yog0&t zB+OjQEkx@K9M?zGk1qt-^b}%X_C}E3hQ)yf%R&e_HKq4(mG&77k&b zW}6pS%P_rhyR_Tmqpge$k9ypL!xM|-`?d?(*>aXWyULjOV8b7)ve$d;7l`XFX|De6 zelI)SfB(L}zkhswjgg3-iL+p)U0B78S^#6FUC10#OXn0ws{Q}}KVrcwhO_E89MiKs-eWH_1uaZYo@wB4coq4|A(4v^yz0Z zR=L8P*S}trV8_3!^~;|J<@|hXCH3`owe~Dc9V{#@g^pca9jslpt#7M4D+lPSoha+E@AKKoi7wfDIQ#MUw*v`hvx{h@tqx*q_oCoH|da!bHa_&97 z$_|vOxNEN1aPwZf$2*_l&fSN+e3zeiJm7u7_cCj@3;(+h-z`!dpRa@p`^A$joT3d`9-Qyhx^#X|TM?3}c$jTkew2a8iv=&+RtCnZ%*YCj zye7uiP`JThi^HDvnunzB3Mi;Xi6(mIDEt;{jS`lgbInxnyUV@3s=uZgWG5bGJ0R1` z*OqQ^;Nh+&_HvK(2>mE_S&_*a7ZNvd@JrsSljuz{$vlENxCL&RTVY8XpvoD~{34{$ z4Ig!Q@ZiDhwc8~`R3V)~`JAK#1nJD z2pni`nX2G3!GV!s6YEtGrxKQhPOSnW&s3YkPAao-iOcwi?0gWy%E7=9vqHhK(U<9D zjNhCIjZJNh^WQG=EO7XEsIAhmn6>8tL+b9O*CgB)YEQ4RZ#o*V5=x_#G*_@DP z4iXJ~B4?gydAB&V@m{;JZK>4RMnR^Khx0xy2;*qvcPsw5_jRH(``)Pz4F-!Oj=RzA3d|cxm(V67h(W4n*m!FuXS|RdUV#Bdb8Hn00uhUO8@`> literal 0 HcmV?d00001 diff --git a/Player.py b/Player.py index 611c387..7da1794 100644 --- a/Player.py +++ b/Player.py @@ -11,6 +11,7 @@ from Weapon import Melee from CommonImports.colours import red, white from Function.createText import createText + class Player(Actor): scale = 100 factor = 640 / scale @@ -18,6 +19,12 @@ class Player(Actor): idle_frames = [ pg.transform.scale(pg.image.load(path.join("Assets/player/idle", file)).subsurface(pg.Rect(179, 169, 170, 401)), (50, 100)) for file in listdir("Assets/player/idle")] + + attack_gif = Image.open("Assets/player/Sword_Slash.gif") + attack_frames = [] + for i in range(attack_gif.n_frames): + attack_frames.append(pg.transform.scale(pil_to_game(get_gif_frame(attack_gif, i)), (200,200))) + width, height = idle_frames[0].get_size() colour = (52, 94, 235) @@ -54,7 +61,14 @@ class Player(Actor): self.state = "IDLE" self.current_frame = 0 self.display = self.idle_frames[0] - self.display_offsets = {"weapon": pg.Vector2(0, 0)} + self.display_offsets = {"weapon": pg.Vector2(0, 0), "player":pg.Vector2(0,0)} + + # def attack(self, enemy, weapon): + # super(Player, self).attack(enemy, weapon) + # self.current_frame = 0 + # self.state = "ATTACK" + # print('a') + def update(self, delta): super().update(delta) @@ -72,13 +86,16 @@ class Player(Actor): self.position, self.velocity = self.move_and_collide(self.position.copy(), self.velocity.copy(), delta) prev_direction = self.direction - if self.velocity.x == 0: - self.direction = 0 - else: - self.direction = math.copysign(1, self.velocity.x) + # if self.velocity.x == 0: + # self.direction = 0 + # else: + # self.direction = math.copysign(1, self.velocity.x) + self.direction = math.copysign(1, pg.mouse.get_pos()[0] - get_display_point(self.position).x) self.weapon.update(delta, self.position, self.direction) if self.state == "IDLE": + self.display_offsets["player"] = pg.Vector2(0,0) + frame = math.floor(self.current_frame) if self.direction == 1: self.display = self.idle_frames[math.floor(frame)] @@ -99,7 +116,29 @@ class Player(Actor): else: self.display_offsets["weapon"] = pg.Vector2(0, 0) self.current_frame = (self.current_frame + 0.1) % len(self.idle_frames) + elif self.state == "ATTACK": + frame = math.floor(self.current_frame) + if self.direction == 1: + self.display = self.attack_frames[math.floor(frame)] + self.display_offsets["player"] = pg.Vector2(-50,-50) + elif self.direction == -1: + self.display = pg.transform.flip(self.attack_frames[math.floor(frame)], True, False) + self.display_offsets["player"] = pg.Vector2(-100,-50) + + else: + self.direction = prev_direction + if prev_direction == 1: + self.display_offsets["player"] = pg.Vector2(-50,-50) + + self.display = self.attack_frames[math.floor(frame)] + elif prev_direction == -1: + self.display = pg.transform.flip(self.attack_frames[math.floor(frame)], True, False) + self.display_offsets["player"] = pg.Vector2(-100,-50) + + self.current_frame += 0.4 + if math.floor(self.current_frame) == self.attack_gif.n_frames: + self.state = "IDLE" return self.position - center def handle_input(self): @@ -145,14 +184,17 @@ class Player(Actor): if mouse_pressed[0]: # LMB if not self.weapon.attacking: self.weapon.swing() + self.state = "ATTACK" + self.current_frame = 0 for mask in self.targets: for enemy in mask: if self.weapon.get_collision_rect().colliderect(enemy.get_collision_rect()): enemy.attack(self, self.weapon) + def draw(self, surf): - self.weapon.draw(surf, self.display_offsets["weapon"]) - surf.blit(self.display, get_display_rect(self.get_collision_rect())) + # self.weapon.draw(surf, self.display_offsets["weapon"]) + surf.blit(self.display, get_display_rect(self.get_collision_rect()).topleft + self.display_offsets["player"]) # super().draw(surf) # print(self.position, self.velocity, get_display_rect(self.get_collision_rect()).topleft, Setup.camera_offset) # pg.draw.rect(surf, self.colour, get_display_rect(self.get_collision_rect()), border_radius=8) diff --git a/Setup.py b/Setup.py index b36e7e7..b9e8cb6 100644 --- a/Setup.py +++ b/Setup.py @@ -44,3 +44,15 @@ def get_display_point(vec): return vec - camera_offset from Area import Area + +from PIL import Image + +FORMAT = "RGBA" + +def pil_to_game(img): + data = img.tobytes("raw", FORMAT) + return pg.image.fromstring(data, img.size, FORMAT) + +def get_gif_frame(img, frame): + img.seek(frame) + return img.convert(FORMAT) \ No newline at end of file -- 2.54.0