From 3f15874f8ce71b0822c4c3b421296498beda1b0a Mon Sep 17 00:00:00 2001 From: Neckrat Date: Sun, 3 Aug 2025 02:23:30 +0300 Subject: [PATCH] drawing character Co-authored-by: Ivan Yuriev --- assets/sprites/character/attack.png | Bin 0 -> 4220 bytes assets/sprites/character/conf.lua | 3 ++ assets/sprites/character/hurt.png | Bin 0 -> 2233 bytes assets/sprites/character/idle.png | Bin 0 -> 1607 bytes assets/sprites/character/run.png | Bin 0 -> 2314 bytes camera.lua | 8 +-- character.lua | 74 +++++++++++++++++++++------- lib/utils.lua | 9 ++++ main.lua | 9 ++++ 9 files changed, 81 insertions(+), 22 deletions(-) create mode 100644 assets/sprites/character/attack.png create mode 100644 assets/sprites/character/conf.lua create mode 100644 assets/sprites/character/hurt.png create mode 100644 assets/sprites/character/idle.png create mode 100644 assets/sprites/character/run.png diff --git a/assets/sprites/character/attack.png b/assets/sprites/character/attack.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9b7b009c64bdd4fa82d4e13342e65878caaf6a GIT binary patch literal 4220 zcmcgv`8(9#`yN}iFhXP}C1gvsH)E`V6jZ7YmHBTM#D2xFIhUyHFMg(2(M zC&bvd!3@UCcluo4f8q0a{cv9Ay3Tby=Q;O%Klgb~tcj5h8w)=R003aq)4gvB0MLt4 z=XaPcP{#r2g`3nLji0H`JwVlv;5q;RRMESC_sPqw?Ri5FL1&@9eXMAtXD{1_EZ#?$ zw50&{eKGk)QIJWb^tJZ)`kpLL@^eSUi_B7z^{?K)u~PKAjAcVsoU`G*X<;~jGHs=c ztk|fJ?p@b0;VnpgBEmDz)`F!g#o=wKcdkv@unoNzH=*BblhsF-Fma2ROR;v~2JC?w|L_Dm&h`cqTu}E=+pq2>^sU z{i(B6Yr};@)e@`(hgTfvlM|lO#kA!0y=7S64xD-r3*mc%o}lB70^dr5E;9fU%!3O zm|m+#UG7pAP95pdt3_rcC0?}DV|<#<-x#w*+y>*Ua>MNW7=L0Td&F@(^ahA*{+oIF}4^hGiWv<(;0PoEJLlwneP zld(piM1=>)Bncn#cEv4T%BxPIb2M4TA|C#o<{K5?Qbw?M3(FO3zXeBI>fxeD^*GGy z@LOxA;zQ|{mLke}=B~{LpuLNaTCEw!s2dST2-y$T)t+H+dGwm;jBg2*@Y$-;GC~sJ zB7(yXmuOFZaTm_$Z|Rrw$5!pAlXOYu-Rn$R&jRm7IufqdUSi7pq{r!l(g( zo-y2)fVClke_$OJrhZV)cOBUUF%QD#6gOJ;sy=8F)(f16#zRSmCtlg+EnB+!l}vRa z?wmOBcvwh0>WUUs>+aU9+`0Qv43>KHUMb&rUfzo#s!^P(<9p#b3gqd6{|Jb({2UDE z;V!f|^GcHd9UVSQE!5u)@7V8lmyu zR6Mno(l7izYz>(W(|q6_zKq}i@h-5D>d_UEHQ-~?zB48+*8!Ef(*Zf%4B5~)IGU0K zgbcn776?aI(ARmkNRreR!EeU7b3GGboQ_wtJT^D*TG%xfQZZU5%gMTYb6eS$Y6|Ws zGw(}k6qU(!+|S7liwWghG6{n3C1is(z;cS1fTJ_;x%Q=HBoCFwv;dMH*B#=K*VHpS zA+O7>*+6o^$d=i^PTM%k&k{2cVjNoKWr>DOT#u@6&UMFREEm z3&(Jn?v@C2^DE@1Y~=oT$@NU~@vkc5eM<155@AELp6U0plvr8~|*7+NU{nRtZzw8|;xmuPwd1*}&sVV2GoSw^6 z7VsDNBnn3d-sXHQ%2=NT%i0_0KTJcwD7{<2qBRi-=bfvwmKudO-rer$(X@;h#w$u~ z_f77R25udWV}JH~h4)-Uov^|_PncOFfIrLTIq%Tk10|(x|s}Lr=Q+y*u zjo>x2kz?K>xEXTxkZYzdUKoI&%kg$$M~UcpL##sTc32=X%C-7^<`gxoWp) zoSY)dvrEKIj0qhTMWr3PE2Cxh&{dH?>MIgcZbEh~6&(3(;rrfhLyM~LMVP13qO`d~ z5{g+wcmr##ME+Zo*ATkG=g_8pO>zb*{dM5{hd*o`l`#)Z>YPTKd($@SK6WJtg&B=* zXllYq)1%fAdiS0I?Y=RK=3CSGvXYN3-IG8Y9dK;T?Vdv3V90xM9Y;T!8>y#d73~jZ zSa1TP_$%))%S;*q#40O8Yub;ap|=Bx>V|`66BA>VD@7CMPx@8J*>0We)DW3|l`tN) zQkgvu{ps{qLSKmo=|N-|F+%5dT~U5)YngTEt9ZP(exyoIK`Mqp8HTVnyv>()y=IZw@OTf0s+tsM_2J3E`Lo z4Wmu{DW-5Z-CmJ==!EOxab|Ihchj1Ucez-qz5Laz^zz`Sj{QBlB;C}@4JL%vx&v?t zwUqSCVLMa1p>_z_?53WUT%H@n`?q97+k)H7)`fm;kql_Ty{99wm_qekIr;g|&mFsY zh(oRowB;4$@PDpVbf`D_JpTt}H9Au~8bl%q=}77alo?o=6s!cfE!MHGKSpp!c%9pm3P4~O#ZxDh_x=>2YqpyoK>40# zXU;6%fBBxSdoSFC$xdL}RLY8Oi}#2W3m4h@O^%oGwj21 zJA{xf{dB`g%$Ua`IJF+XEbLAv7K{kfr+)ojF~;VTu__iL#FSwMw1YAOlVAf;t!-Y> zAnl@{+?}amK?(UaL0d2Q?Jac|e+`kDu`hNGXt!UFSw9AxhBogIPc+z|qT;X879zU6 zI-7;LTTdPw|JzF2t@S&d7r-d?=aI~rTsjZX+n9tdo$KgfYhw}QAx%Y@D3yyZc`!kX zWm1Z1$`9Gcqb?TH4B0a`fNUHySoP+1QfcakzkjoAbYjQ?ajf=#WsY2`LfG=$ulZ}o zZE6y9 ziZ!5%so@2r+AYY*yAf7%YdM1JcKK(vwc80H&wF7yENAY6>~qCyp&KIw{L`kTtqj`c zvtl!=ZC-!knBaVzs)#*`$AeonCo0Vu`C0?r*g@!(%v(xB#aEQdjSL)|;&Lk%Sik7{ zDNwmlEEgRF6`y}PZEX41YNGc!)rP);Oh^VMZo`mKZ}ii`+C=;6>#cR6W^ZLM5W1F? zA^~OZ2b(qwT~4vvtTKCV&51anMM!WJTEq_=yc%CPVVIY~c8ZOsjj3tw#mfYrzPtQo z#FBr$#LApi%m}%A%<@6oIP`-}@3MSW0Y4cOVys^#?{j^%Y(YCzMFVi_?(36zcJYf` zCPWdNEFJ+zmkS4>9#Rk{PM!m*l$~D*-ol%FQ{S^W@^oV8KNwAD19p=`O(2$t<`siD zA+7X%4vQ$q%5)UClW z{{9>>Y0bj^=-<)TydMZ}8O2JAM#ez|mXU(>jIU1u9#Y1Js9iIphjI3srLuptR|q(! zW>zlWt1srnfjiMP7*Dn=v9sVgGG8kcAJ%zB1YQPa0Q0AJu^uC47gk#Z14y-y=0K=D zjMyi0x|X37;GHdS7`jkTkhq&NT$MK;uM>9=CM=gP1a39f2>aJ&zAxkL;V;VM<`m0+ z65F<*iR8DVw9C6>pBphb@gNF+%qn_Rgz4tAu5>q5mRGNzEl6D)=mHNTv~^Qk*$PH5 z8Ruey7I}%rIRS--ss%Tf&4}8A+q`X_&Rez3P|&gEOX$ObvwKNW)OWyFVE#ov;FG<_ zXD{9+43DkAtv)TQpF@M!;I9KD!dq0}gI1|-UJMG9W>H<=ZPkq}6?!NMFPRqT)axo2aat`F()&m4;H2$I z8&|){7O@%t<#iU)^P(p9_#C72cPZ0hbe0Rg`NN_n&2H;Fa+P`*?NsX3vt%%6X83w5 z-Z*EQxGZB&w4I_!Viu-G%C~D6quPC z8X8uEyzWsJsUN1X69}96WON~l^UDr4uzn%9y|k~zc~=j&bQaCpPKoCZE!tl_5mhzx zNx^l(-Lut)(sMIrz_8*W)#k+!__b)Vs`&s`0DPj@q8pn#|{V32zOBd=$lS`wvqn_xcMO% literal 0 HcmV?d00001 diff --git a/assets/sprites/character/conf.lua b/assets/sprites/character/conf.lua new file mode 100644 index 0000000..a210b28 --- /dev/null +++ b/assets/sprites/character/conf.lua @@ -0,0 +1,3 @@ +return { + +} \ No newline at end of file diff --git a/assets/sprites/character/hurt.png b/assets/sprites/character/hurt.png new file mode 100644 index 0000000000000000000000000000000000000000..533cd553e5403d49f8e71ab5c29ec17188ac0aec GIT binary patch literal 2233 zcmb_d`8yO26JHT>ZH|z2RnE33_qx_y8(EC(QYR6#zRdzXkvZhQVwsU87!Z{eTC^uO9!hJO4uV*qOwDWLy0EQjd)r zGAbrQ&H0(t4=1ec1FJ5@oKD~yP)&W*VrG=0D0fEAN*SVmn(tCsc21sEpfEMj%RQgE zU^8rKtWlIGf5j7WBO~LE>)whop@uj%xM_mlzc9x_Yt>)#*!mMaM=M@Mtroi<;kNYu zF{&hP({N|KFVL4`M)1^Tu?`B8XIypJVfKhLD4!8u;-sU6reD&f8<}{{>q2TAwg}FHXP9SoL z6QmUBlW_v6Y1>HALp>y^x1IUJGrrMHmzi__%9nerY_sC{gu8e@ytVHkOU_W(ck+bU z6nhj4%uX8i8v`cxrnQ=qI2sz8P+bEZ?7OYlG+;Ysj_EfN+kp3yYig}~cE8Q_chH+| zAg_bJak0oz&hQfCxU%7|7gG5(`HLL4E82OsyNk#bAjnfTy!@6svjJ?;XKiY7e0rum zpB&xEw#fL}=c{wnCU|C`T1i=fge0kvq3mVa5D$5n0vdk~eC=N{(b3gh!eGNsB2X1= zNy1>OzSlqa6lCt~E!E52y7f!VzN!# z&z6}pu6*|Di-Rxf9VDd*94EVpZ*(fs@yB}I7Xl~4{h9c4`F$4h*Xh~9rv1iS0%Qm6 zZbIH6jpns}G<3pnH14gjX;8*_DJUcqa(L%^CFZXy??%i`42)oM z8+50E6w#`>#SF2Nf^Hc_&-FPjbe@<_E9^l)leTw^T2CQn=5b4W$FjpK0fxrZ~P!>Z82AE(_5p< z+{{G07ICVLks5ihx4&8_nb7ksmzZF)9FHeTfsxKTi#U{Z zM7Iod+;I?cbXC2Y{w!d-xE3r*-C)k%8PYxEykP?%ZYIF1HLq!xcm@wIOkW)mI zYbHhC%Sa!OhZw&R6l&*Bx&j7eIi_P&aJGswVFiM2*w}=}(dH!TA>!}i)#wJsqjK{- zjk_n6KhSuaVRD>cmuWS!9`ENUN<}-3?!&PzshH-~NrIz?JzGgbkd%DW3dxs(bVR~R z2wH;S$w`py-U*3JYYE^TTdzs?o?z!J*mN|~%LF6xRoFkOvM-Nr$yLPTpDP?B6+yMp z;Y94s(OSv=n=a)Ww|09+YSb%>_j=LfxaPMh5{$ca^+QxC?p0>ioDi0f<^;QvHEZ?Q zF*HKUnA@Ank)>Z3ia$I^UZ~9TGmtYBe}Tkqe_%u}1obX#)Jx=*y=V)OGE- zXyO>LekHr;p82Kh^4g1ENiB$y%8%3<+3&TybmbL=g4bVtb-R{c7jM{H@4s);K4UMz zd4RBzpoL>G?+T!-eQ>N|R-xda_LL@CNBSGkbGSD=9d#983)>HD>=mQg_g!mE!fli; zLghklgyvV!15+8=uXAsSWs5;H)*MH{ zWa?yUee+7G3<*gW8l}E=-~S26Jaw>WB$RWd$cw=E7{Fze^{&g)Eqi>Am@!+GLnAOE zV6pixliYZ=99)^0KP#N#5;$Sa(^YJa!JI!!m>LrJUT?eHftw;B19%!xf#2eotJiZL zgkb&Bi_6-1xH{eTXT2P;h0_y0p~)--L}GdAv*TB@M$G#EB@Ee*0|^wu3IW3$(uX_a zSxs@$B{QZqfW#)|qE-fmwxE}qoTbD#|ypT|5`EQ*G%>$No16VHK~ps#*b zN+FnoXT2!WK`v_RY;&bq_NO8R(++i?N~y^e)wP94^PTyE?=>Qd=P~!@?)F)uBF4DS z>Oaqi_$!gl7bQ5g=yOfslYdLZPTnr4YQDVQx2cZ>lJmjrx&GVM?dRun{aSvT>qUq4 zB|zId=~D=qQ`^!%L@yEfP~5f@m6+Y169^Q4DqEE@X?vAFD{q(D;?bJeqr@T3xLygV z*&rHVmLLZSn-!T*l(LBrq}H~I)vgm&5nYRl+M!%C0Hw685CsPkI3o5JnMtOvjy4C3Wvqy7N@0>Eq?ZLn5168{TXBtOvr literal 0 HcmV?d00001 diff --git a/assets/sprites/character/idle.png b/assets/sprites/character/idle.png new file mode 100644 index 0000000000000000000000000000000000000000..2068a967b33626487855a48ee45500ffd9be2052 GIT binary patch literal 1607 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 tm 2 and y > 0 then return end; - if camera.scale < 0.5 and y < 0 then return end; + if camera.scale > 50 and y > 0 then return end; + if camera.scale < 0.005 and y < 0 then return end; camera.scale = camera.scale + 0.1 * y end diff --git a/character.lua b/character.lua index 3c0289f..14858d2 100644 --- a/character.lua +++ b/character.lua @@ -1,10 +1,11 @@ local anim8 = require "lib/anim8" require 'lib/vec3' +local AssetBundle = require "lib/asset_bundle" local CHARACTER_SIZE = 64 --- Для anim8, представляет из себя с какого по какого представлены спрайты для анимации -local ANIMATION_SIZE = '1-8' +local ANIMATION_SIZE = '1-6' --- Скорость между кадрами в анимации local ANIMATION_SPEED = 0.1 -- Константы ниже представляют из себя номер строки (с единицы), в которой находится та или иная анимация @@ -28,9 +29,21 @@ Character.animationTable = { -- etc etc } --- чтобы не обновлять все анимации одновременно, храним нужную анимацию здесь ---- + +--- меняем вместе с Character.animation +Character.state = "idle" --- когда нужно сменить анимацию с idle на run например, меняем именно это поле -Character.animation = Character.animationTable.idle + +Character.spriteSheet = { + animationSpeed = 0.1, + width = 96, + height = 64, + idle = '1-6', + run = '1-8', + attack = '1-11', + hurt = '1-6' +} + ---------- Statistics ----- @@ -60,31 +73,56 @@ Character.position = Vec3({}) --- Обёртка над Character:Create -- CreateCharacter = Character.create --- ты клоун же --- какого черта у тебя конструктор объекта принимает ссылку на объект --- --- хз --- ща я в душ --- :clown: --- Создаёт персонажа, которым будет управлять или игрок или компьютер --- @param name string ---- @param imagePath string +--- @param spriteDir table --- @param level? integer -function CreateCharacter(name, imagePath, level) -- aka Character.create(self, name, imagePath, level) +function CreateCharacter(name, spriteDir, level) -- aka Character.create(self, name, imagePath, level) -- TODO: добавить asset_loader, где все необходимые ассеты будут грузиться в одном месте, -- а здесь мы добавляем ассет на загрузку в очередь - local image = love.graphics.newImage(imagePath) - local animationGrid = anim8.newGrid(CHARACTER_SIZE, CHARACTER_SIZE, image:getWidth(), image:getHeight()) - return Character { + -- local image = love.graphics.newImage(imagePath) + local animationGrid = {} + -- n: name; i: image + for n, i in pairs(spriteDir) do + local aGrid = anim8.newGrid(96, 64, i:getWidth(), i:getHeight()) + local tiles = '1-' .. math.ceil(i:getWidth() / 96) + animationGrid[n] = aGrid(tiles, 1) + end + --local animationGrid = anim8.newGrid(96, 64, image:getWidth(), image:getHeight()) + local char = { name = name, animationTable = { - idle = anim8.newAnimation(animationGrid(ANIMATION_SIZE, IDLE_ROW), ANIMATION_SPEED), - run = anim8.newAnimation(animationGrid(ANIMATION_SIZE, RUN_ROW), ANIMATION_SPEED), - attack = anim8.newAnimation(animationGrid(ANIMATION_SIZE, ATTACK_ROW), ANIMATION_SPEED) } } + char.animationTable.idle = anim8.newAnimation(animationGrid["idle"], ANIMATION_SPEED) + char.animationTable.run = anim8.newAnimation(animationGrid["run"], ANIMATION_SPEED) + char.animationTable.attack = anim8.newAnimation(animationGrid["attack"], ANIMATION_SPEED, function() + char.state = "idle" + end) + char.animationTable.hurt = anim8.newAnimation(animationGrid["hurt"], ANIMATION_SPEED, function() + char.state = "idle" + end) + + return setmetatable(char, { __index = Character }) end function Character:update(dt) - self.animation:update(dt) + if love.keyboard.isDown("r") then + self.state = "run" + end + if love.keyboard.isDown("i") then + self.state = "idle" + end + if love.keyboard.isDown("u") then + self.state = "attack" + end + if love.keyboard.isDown("h") then + self.state = "hurt" + end + self.animationTable[self.state]:update(dt) +end + +function Character:draw(camera) + self.animationTable[self.state]:draw(AssetBundle.files.sprites.character[self.state], self.position.x, + self.position.y, nil, 1 / camera.pixelsPerMeter, 1 / camera.pixelsPerMeter, 38, 47) end diff --git a/lib/utils.lua b/lib/utils.lua index 11587b4..f7ab0fa 100644 --- a/lib/utils.lua +++ b/lib/utils.lua @@ -16,6 +16,15 @@ function P.generateList(count, generator) return xs end +function P.tableMap(table, fn) + local tbl = {} + for key, value in pairs(table) do + tbl[key] = fn(value) + end + + return tbl +end + function P.sign(number) return (number > 0 and 1) or (number == 0 and 0) or -1 end diff --git a/main.lua b/main.lua index 6338f84..9e4dc41 100644 --- a/main.lua +++ b/main.lua @@ -5,12 +5,15 @@ require "character" local camera = require 'camera' local Vec3 = require "lib/vec3" local tree = require "lib/tree" +local AssetBundle = require "lib/asset_bundle" function love.conf(t) t.console = true end function love.load() + AssetBundle:load() + Camera = camera.new() Camera.position = Vec3({}) -- PlayerFaction = Faction @@ -18,6 +21,8 @@ function love.load() -- Hero1 = Character:create("Petya", 10) -- Hero2 = Character:create("Andrysha", 12) + Hero = CreateCharacter("Hero", AssetBundle.files.sprites.character) + -- PlayerFaction.characters = { Hero1, Hero2 } love.window.setMode(1080, 720, { resizable = true, msaa = 4, vsync = true }) end @@ -29,6 +34,8 @@ end function love.update(dt) Camera:update(dt) tree.instance().panning:update(dt) + + Hero:update(dt) end function love.draw() @@ -46,6 +53,8 @@ function love.draw() love.graphics.rectangle('fill', 0, 0, width, height) love.graphics.setColor(244 / 255, 67 / 255, 54 / 255, 1) love.graphics.rectangle('fill', 0, 0, 1, 1) + love.graphics.setColor(1, 1, 1, 1) + Hero:draw(Camera) Camera:detach() end