From 5202f0afa3185db275c56ca9b67e441f96440d29 Mon Sep 17 00:00:00 2001 From: /nick haya <74699483+The-SGPT@users.noreply.github.com> Date: Mon, 7 Feb 2022 15:14:52 +0800 Subject: [PATCH] Animated sprites --- bin/data/smile.png | Bin 2035 -> 2184 bytes src/Main.cpp | 5 ++++- src/Render.cpp | 34 +++++++++++++++++++++++++++++++++- src/Render.hpp | 32 ++++++++++++++++++++++++++++---- 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/bin/data/smile.png b/bin/data/smile.png index fdbd57ec009d0f3a7790eed76dee4bc4aa9689eb..7cb9d2ed39557893bfba2c840b26a81971767406 100644 GIT binary patch delta 1384 zcmV-u1(*8s4~P*ViBL{Q4GJ0x0000DNk~Le0001F0000o2m=5B0G;cOjIkj!1AoE* z01moN2vA2I7`W% znwpyGiZ>q*RWtEiP~ZP{^Po?nxOLUGJ1vBb%m$S{!IHIc)3)jc+l8AGXd;T9?xy1S zJGlwZsOt2P`6qGXn}oR*qfaVrxae@X$0tOl%;5Vwe;(7B4()>1nun&T1AoK|)>-2+ zz24YIf}agz`w|0~oT34c`p2ou{*0Mx(Pf?;CxbFX-$<9ewe?&t zHS*b4%=8lWip@=wCCST>+m{N3L2oP}ny z`N8DEdOBo(lE*;)pRFIXn$l#Yz z&C|c(zWVm)m;j+R=AWR65?zh2&cFR|XmUqkVE9?aGU)eX0gf~k#0N2nKUAi&AsBW( z$#{Uq@;lp$;h&!ipRvcluZFP{E1fvW#<@yJxVHk*EFRJ`R(}Y{>!mKnj%OQ~ z>^8)dZj3Wp>0GsRCI@>B3;yS>ncRAyP7jR{gG}!oZ1d~idKsltwv&lb;%P_9? zc*f0!fGtpaD-ojI3n@^;Iu;7U7fT4fKeJGD>2l}9#KC_*SosJ}2vQzTCho`p=Y+K}+0J!`c znLq@63)+KOER*xTVEs@)lr4h;(Ut&2Er`#eHp8S7 z<4I6ICAW+vSby8nt!u5-r5|nHeTuX)-6$)R z@irpE{eSJ5I+#J`cz+8)75zq)6}=>Of|KvDA{98{H{lOUL5BGgte{r-OGQD|^B28> z^UHsHm2@KRMx>~x^0rh(UkC1wgQD*o?`KZg7n}Ekt?2H-d-VV)xJB_^q7>Z+xvztY zZnnG^TLAwZo%@PT!28@PAg6mbTkgRvnr1AoH+ z01m?e$8V@)000DhNklzUb;Oc0a0}JG?ygI zC(VNob76v(N0g|H<)ipK@C5f6s|F~v$!A%Jdn;Yo-4Pvk zLC`^L(Yejn44n8*jM=w>dtiAV0v!q5^M&75)N`_kdsu4;cH-LR&s|Q~qG&}8l6x`g zf$5Zc8sYXNagP&L+O&J2SAV0oBIjHT_f)HI!tFN5UO;G|ihiHFBZ;Nn{i?pic6(B} zlXe3Nsc#AM0y3)d!%0(#lqMsKF}9+ahAgsevXMeM8_B$s0m=Pt5R7_AS{JYwqXd#$ zSoR2}oMK+l<;}@7);7E_R94ow59|_??Dm$dbNc#NnMb9 z%TE6@k|dKwXrKP-yMKJ8M!!Rp2C3=S_T$EEXR!~^ZjM}Lg7^ke>f}evc=9iF-zP9$ z96_(Y$71VYy33gf)?CE^?{EjpG99OeeII5a$~3-_MH9QR#)GV@z*>~peRe~dfu06c zMBX{NtUb%&(0R!<77V8mJQK!jL0C#RNxFNZt)}e5Eql&5$bWNxf&NifW6#~oSd#WI zq9fV7%Y#41ff1t1pxbF0|{-J?uzt>wrc$AuQ zERQ=v&>elpN9CkhsAG$4d{3gocBH;`zjaXl+mi+}=R1IaxK~?7 zXLT76FInc)L_v6Fbr*H2f?HoF&U?r*>igen8KJvH+`VqylkVxXe?S#s+5MBXwXN0q w{oBhTH7EZvg$KV7V{B}!Q9tvD{woCGZ%XBxb=Ba&(*OVf07*qoM6N<$g8r3b5dZ)H diff --git a/src/Main.cpp b/src/Main.cpp index f411635..d4c7274 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -10,13 +10,16 @@ using namespace std; using namespace Render; class MainState : public State { - Object objs; + AnimatedObject objs; Object title; virtual void Create() { title.create(0, 0, "data/bg.png"); AddObject(&title); objs.create(50, 50, "data/smile.png"); AddObject(&objs); + objs.AddAnimation("idle", {{0, 0, 50, 50}, {50, 0, 50, 50}}); + objs.PlayAnimation("idle"); + objs.framerate = 1; title.scale.y = 0; title.center.x = WINDOW_WIDTH/2; title.center.y = WINDOW_HEIGHT/2; diff --git a/src/Render.cpp b/src/Render.cpp index e0799fe..45d4a8e 100644 --- a/src/Render.cpp +++ b/src/Render.cpp @@ -59,6 +59,11 @@ void Render::Object::create(int x, int y, string path){ _ori_h = h_; } +void Render::AnimatedObject::create(int x, int y, string path){ + Render::Object::create(x,y,path); + startTime = SDL_GetTicks(); +} + void Render::State::AddObject(Render::Object* object) { object->id = obj.size(); this->obj.push_back(object); @@ -79,6 +84,33 @@ void Render::Object::Draw(float dt) { _sc_h = _h-cam_rect.h; } +void Render::AnimatedObject::Draw(float dt) { + Render::Object::Draw(dt); + + if (current_framename != "") { + int frameToDraw = ((SDL_GetTicks() - startTime) * framerate / 1000) % frameRects[current_framename].size(); + current_frame = frameToDraw; + + int sx = frameRects[current_framename][current_frame].x; + int sy = frameRects[current_framename][current_frame].y; + int sw = frameRects[current_framename][current_frame].w; + int sh = frameRects[current_framename][current_frame].h; + + _sc_w = frameRects[current_framename][current_frame].w; + _sc_h = frameRects[current_framename][current_frame].h; + + src_rect = {sx, sy, sw, sh}; + } +} + +void Render::AnimatedObject::AddAnimation(string anim_name, vector points) { + frameRects.insert({anim_name, points}); +} + +void Render::AnimatedObject::PlayAnimation(string anim_name) { + current_framename = anim_name; +} + void Render::Object::centerSelf(AXIS axis) { switch (axis) { case X: @@ -162,7 +194,7 @@ bool Render::Update() { lastUpdate = current; - current_state->Draw(); + current_state->Draw(dT); int end = SDL_GetPerformanceCounter(); diff --git a/src/Render.hpp b/src/Render.hpp index 1f51e32..2b93953 100644 --- a/src/Render.hpp +++ b/src/Render.hpp @@ -46,7 +46,7 @@ namespace Render { void create(int x = 0, int y = 0, string path = ""); - void Draw(float dt); + virtual void Draw(float dt); int x, y, w, h; @@ -61,6 +61,10 @@ namespace Render { SDL_Texture* _tex = nullptr; void set_property(string name, bool value); + SDL_Rect get_src() {return src_rect;}; + + SDL_Rect src_rect = {0, 0, 0, 0}; + void centerSelf(AXIS axis = XY); private: int _x, _y, _w, _h; @@ -69,6 +73,22 @@ namespace Render { map _properties; }; + class AnimatedObject : public Object { + public: + void create(int x = 0, int y = 0, string path = ""); + void AddAnimation(string anim_name, vector points); + void PlayAnimation(string anim_name); + virtual void Draw(float dt); + + int framerate = 24; + map> frameRects; + string current_framename = ""; + int current_frame = 0; + + private: + int startTime; + }; + /* * A state is where you would contain said objects. */ @@ -89,13 +109,17 @@ namespace Render { /* * State draw point. Make sure to call State::Draw() first when overriding this!!! */ - virtual void Draw(){ + virtual void Draw(float dt){ SDL_RenderClear(renderer); if (obj.size() > 0) for (int i = 0; i < obj.size(); i++) { - obj[i]->Draw(0); + obj[i]->Draw(dt); SDL_Rect r = {obj[i]->_sc_x, obj[i]->_sc_y, obj[i]->_sc_w, obj[i]->_sc_h}; - SDL_RenderCopyEx(renderer, obj[i]->_tex, NULL, &r, obj[i]->angle, &obj[i]->center, SDL_FLIP_NONE); + SDL_Rect r2 = obj[i]->src_rect; + if (r2.w != 0 && r2.h != 0) + SDL_RenderCopyEx(renderer, obj[i]->_tex, &r2, &r, obj[i]->angle, &obj[i]->center, SDL_FLIP_NONE); + else + SDL_RenderCopyEx(renderer, obj[i]->_tex, NULL, &r, obj[i]->angle, &obj[i]->center, SDL_FLIP_NONE); } SDL_RenderPresent(renderer); }