From ee7626159e9505d40586e0cf608b7f849f91cad9 Mon Sep 17 00:00:00 2001 From: 0xdeadbeer <64986162+0xdeadbeer@users.noreply.github.com> Date: Sun, 12 Nov 2023 19:43:14 +0100 Subject: [PATCH] 01: Add animation switching --- .imgs/icon.png | Bin 0 -> 38205 bytes 01-introduction/.imgs/showcase.png | Bin 0 -> 3115 bytes 01-introduction/README.md | 9 ++ .../assets/{player.png => player/idle.png} | Bin 01-introduction/assets/player/land.png | Bin 0 -> 1500 bytes 01-introduction/assets/player/run.png | Bin 0 -> 3254 bytes 01-introduction/src/main.c | 79 +++++++++++------- 01-introduction/src/main.o | Bin 6736 -> 7072 bytes 01-introduction/src/structs.h | 18 ++-- README | 4 - README.md | 11 +++ 11 files changed, 82 insertions(+), 39 deletions(-) create mode 100644 .imgs/icon.png create mode 100644 01-introduction/.imgs/showcase.png create mode 100644 01-introduction/README.md rename 01-introduction/assets/{player.png => player/idle.png} (100%) create mode 100644 01-introduction/assets/player/land.png create mode 100644 01-introduction/assets/player/run.png delete mode 100644 README create mode 100644 README.md diff --git a/.imgs/icon.png b/.imgs/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..de30eb0f181c40c1dee3a2f5bb8ab7f5ee1346f2 GIT binary patch literal 38205 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

6;!6H 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 + +

+ +# Introduction + +First code I ever wrote for SDL. It contains some basic functionality for importing textures, player movement, and animations/animation switching + + diff --git a/01-introduction/assets/player.png b/01-introduction/assets/player/idle.png similarity index 100% rename from 01-introduction/assets/player.png rename to 01-introduction/assets/player/idle.png diff --git a/01-introduction/assets/player/land.png b/01-introduction/assets/player/land.png new file mode 100644 index 0000000000000000000000000000000000000000..2c24d6f4357ea83410f70d7fd04f5f77d36e323c GIT binary patch literal 1500 zcmZ`(c{J2}6rbS{W2x*>ae5=$WV|G@{V3aTh>@|yj1p0{q{&!jBIjj&mhfcI3rEw# zSfVC0<(ZPPq%vihC>}BlW-y?f66-h0knKKI`5_j_}FecV-Gx-bX?qJr{p zK|>(WHmPo*ATK==bCGUR0Zm4`pMhOwrG_(ac=d^&;s`cuczD`3a`2UekIYSi!vEhE_2gXUZ z`>2lA0aVUl!ipl4)M2G7&jk5- zueX+{Q<$RXgv^4)z7J56y{nwDTSZwLnds}I^b+R)xVg)oy3(v|zyYCV7jcl{V&`eH zR<{#p__VAnX<$KShGU_|+1i_^Y~F*;c^AEn#V&j7CST{#FtLYZ?zhKk-Ij#JNP( z0#rfL*Ot#*>Q^=%>3MH6XcTBxXbiDG@Fysm(P9h(sEC_y+^!6nanw)#nvb76OcW$m<%w>4#SF}U6? zU{5N6f*MeM5tjKeBh?%Cg;(DoU$P~Pfbxv8JqVlK6rBSfu8cg;TA(KLf6!HWVP3ia>!?%Bg zr!k$`xxOQaTe2s*&BU&(qC1oCXiBAn>$l@^t}2&aYq8$^?S4Tr<@tD`6H7WC zc&)=Z)T#7X3O5U_WHeguvNI@JejLy+hL92bmcyjF!hGCjpG-4Ayy zN%xK*Oj;}g15ohn=jPth?HF$`4>CKR~#|pOGo;Zn#Bt(0*3Jr z7c+#-+>V%CZ`$6*aKHl+8zHKVzWGp)VWSBDvJ-9nWcDR_kj1y73x#o9vS?jEPbL!E zC-Q11@w)sm?2~FutFt^j`I~dUCCN|s0~Wam-|BB-J)6m&)7Gyub1_jq$N^8Ks^f_B zG4ayxW2?#p^YbLa#vXQhYR)a;gt4hu90y1e1cL8TX?D4*=ow-8u{LQVISfmC*~Aeh zO600g?G$ut5L*)=9n`mCx^2CNfeHH%VT!kOp^^al51BJYu&<_ zd3BNjmEo}7p3TiqK}7Q|Z70)kXDr_zJ7Or!$XoQZ~kYxLu?(@_xT#dDwzVc3n=W^8ylyaMDlb zU2c$pm(XK1UK42TKTk5v8%yXN5+8>59J`N}m7O{n=;UA38v!*Poeg&GiPPr=CIoHn zl+f*^uer=Ylf|#^MZbS0gu+wg$J-oycQRlC$^4?!q4%iVEn!j#o!l`}DLh~lk4t5A urjx%H1FaTxt0ohAmlSPm_kZleXTci)B8?P-SwXx1Fr!?3Tv|`!vi<>k{PDv8 literal 0 HcmV?d00001 diff --git a/01-introduction/assets/player/run.png b/01-introduction/assets/player/run.png new file mode 100644 index 0000000000000000000000000000000000000000..615b2229f81fa53516db0910b73d045122d5c768 GIT binary patch literal 3254 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 #include "structs.h" -const int SCREEN_WIDTH = 640; +const int SCREEN_WIDTH = 1000; const int SCREEN_HEIGHT = 480; -const Uint32 WINDOW_FLAGS = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS; +const Uint32 WINDOW_FLAGS = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL; const Uint32 RENDERER_FLAGS = SDL_RENDERER_ACCELERATED; int GAME_RUNNING = 1; struct game game; -int movement_speed = 5; -int animation_frames = 100; -int frames = 0; +int movement_speed = 10; +int gravity = 8; +double delta_time; +double last_frame; void prepare_scene(void) { SDL_SetRenderDrawColor(game.renderer, 96, 128, 255, 255); @@ -22,10 +23,6 @@ void key(SDL_KeyboardEvent *event) { if (event->repeat != 0) return; - if (event->keysym.scancode == SDL_SCANCODE_W) - game.up = !game.up; - if (event->keysym.scancode == SDL_SCANCODE_S) - game.down = !game.down; if (event->keysym.scancode == SDL_SCANCODE_A) game.left = !game.left; if (event->keysym.scancode == SDL_SCANCODE_D) @@ -63,7 +60,7 @@ SDL_Texture *load_texture(const char *path) { return texture; } -struct object *create_object(const char *texture_path, int x, int y, int scale, int resolution) { +struct object *create_object(SDL_Texture *texture, int x, int y, int scale, int resolution) { struct object *object = (struct object *) calloc(1, sizeof(struct object)); if (object == NULL) { @@ -71,26 +68,22 @@ struct object *create_object(const char *texture_path, int x, int y, int scale, return NULL; } - object->texture = load_texture(texture_path); - - if (object->texture == NULL) { - fprintf(stderr, "Error: loading texture into new object\n"); - return NULL; - } - + object->texture = texture; + object->resolution = resolution; + object->animation_speed = 15; + object->scale = scale; object->x = x; object->y = y; - object->scale = scale; - object->resolution = resolution; return object; } void draw_object(struct object *object) { + int texture_width; SDL_Rect src; SDL_Rect dest; - src.x = object->state * object->resolution; + src.x = object->animation_slide * object->resolution; src.y = 0; src.w = object->resolution; @@ -101,7 +94,17 @@ void draw_object(struct object *object) { dest.w = object->resolution * object->scale; dest.h = object->resolution * object->scale; - SDL_RenderCopy(game.renderer, object->texture, &src, &dest); + SDL_RenderCopyEx(game.renderer, object->texture, &src, &dest, 0, NULL, object->flip); + + // update animation slide + SDL_QueryTexture(object->texture, NULL, NULL, &texture_width, NULL); + + object->animation_clock += object->animation_speed*(delta_time/1000); + + if (object->animation_clock >= 1) { + object->animation_clock = 0; + object->animation_slide = (object->animation_slide+1) % (texture_width / object->resolution); // clock arithmetic: jump back to first animation slide + } } void present_scene(void) { @@ -128,24 +131,40 @@ int main(int argc, char *argv[]) { return -1; } - struct object *player = create_object("assets/player.png", SCREEN_WIDTH/2, SCREEN_HEIGHT/2, 3, 48); + // load player animations + SDL_Texture *idle_animation = load_texture("assets/player/idle.png"); + SDL_Texture *run_animation = load_texture("assets/player/run.png"); + + struct object *player = create_object(idle_animation, SCREEN_WIDTH/2, 0, 4, 48); // game loop while (GAME_RUNNING) { - frames++; + double current_frame = SDL_GetTicks(); + delta_time = current_frame - last_frame; + last_frame = current_frame; + prepare_scene(); handle_input(); - if (game.up) - player->y -= movement_speed; - if (game.down) - player->y += movement_speed; - if (game.left) + if (game.left) { player->x -= movement_speed; - if (game.right) + player->flip = SDL_FLIP_HORIZONTAL; + player->texture = run_animation; + } + if (game.right) { player->x += movement_speed; + player->flip = SDL_FLIP_NONE; + player->texture = run_animation; + } + if (!game.right && !game.left) { + player->texture = idle_animation; + } - player->state = ((frames % animation_frames)/5) % 10; + player->y += gravity; + + if (player->y > SCREEN_HEIGHT-(player->resolution*player->scale)) { + player->y = SCREEN_HEIGHT-(player->resolution*player->scale); + } draw_object(player); diff --git a/01-introduction/src/main.o b/01-introduction/src/main.o index e609267d62be63ec69a1d172e885ea921aab9c63..243fdc03b30f04414a8b98d5cac234d5bbd96fa8 100644 GIT binary patch literal 7072 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 + +

+ +# SDL Playground + +My little playground for SDL. + +## License + +The code is licensed under the GPL-3.0 license. See the `LICENSE` file for more information