From 11f5eb7fd11814b06fd24af72ffd0d9fc4e3e37e Mon Sep 17 00:00:00 2001 From: Priec Date: Fri, 14 Nov 2025 23:53:45 +0100 Subject: [PATCH] multiple frames now added and working --- .../src/assets/character_crawl_frames.h | 3 ++ semestralka1/src/assets/character_frames.h | 54 ------------------- .../src/assets/character_run_frames.h | 6 ++- .../src/assets/character_walk_frames.h | 6 ++- semestralka1/src/game/state.cpp | 39 ++++++++------ semestralka1/src/game/state.h | 23 ++++---- semestralka1/src/main.cpp | 2 +- semestralka1/src/render/loop.cpp | 11 ++-- semestralka1/src/render/player.cpp | 46 +++++++++------- semestralka1/src/render/player.h | 9 +++- .../src/render/player_positioning.cpp | 33 +++++++----- semestralka1/src/render/player_positioning.h | 4 +- 12 files changed, 108 insertions(+), 128 deletions(-) delete mode 100644 semestralka1/src/assets/character_frames.h diff --git a/semestralka1/src/assets/character_crawl_frames.h b/semestralka1/src/assets/character_crawl_frames.h index 2ed7786..7c48d79 100644 --- a/semestralka1/src/assets/character_crawl_frames.h +++ b/semestralka1/src/assets/character_crawl_frames.h @@ -33,3 +33,6 @@ static const char **CHARACTER_CRAWL_FRAMES[] = { }; static const int CHARACTER_CRAWL_FRAME_COUNT = sizeof(CHARACTER_CRAWL_FRAMES) / sizeof(CHARACTER_CRAWL_FRAMES[0]); + +// Height (rows per crawl frame) +static const int CHARACTER_CRAWL_FRAME_HEIGHT = sizeof(CRAWL_FRAME_1) / sizeof(CRAWL_FRAME_1[0]); diff --git a/semestralka1/src/assets/character_frames.h b/semestralka1/src/assets/character_frames.h deleted file mode 100644 index f5f6824..0000000 --- a/semestralka1/src/assets/character_frames.h +++ /dev/null @@ -1,54 +0,0 @@ -// src/assets/character_frames.h - -#pragma once - -// Player frame 1 -static const char *CHARACTER_MASK_FRAME_1[] = { - ".....a@$..", - ".....7PF..", - "..yaM@@__y", - "..@.y@FFF~", - "..._$M@_..", - "yaa@~.`@y.", - "........@r" -}; - -// Player frame 2 -static const char *CHARACTER_MASK_FRAME_2[] = { - ".g@$", - ".7PF", - "y@$.", - "0@F.", - "4@$.", - "y$@.", - "u@.." -}; - -// Player frame 3 (triggered) -static const char *CHARACTER_MASK_FRAME_3[] = { - ".._$@.", - ".$By`.", - "4@$@@a", - "aa@W@." -}; - -enum class CharacterFrame { - Walk1 = 0, - Walk2, - Crawl1, - COUNT // number of frames, must stay last -}; - -// Combine frames for easy access -static const char **PLAYER_FRAMES[] = { - CHARACTER_MASK_FRAME_1, // Walk1 - CHARACTER_MASK_FRAME_2, // Walk1 - CHARACTER_MASK_FRAME_3 // Crawl1 -}; - -static const int CHARACTER_FRAME_COUNT = static_cast(CharacterFrame::COUNT); - -// Height per frame -static const int CHARACTER_HEIGHT_1 = sizeof(CHARACTER_MASK_FRAME_1) / sizeof(CHARACTER_MASK_FRAME_1[0]); -static const int CHARACTER_HEIGHT_2 = sizeof(CHARACTER_MASK_FRAME_2) / sizeof(CHARACTER_MASK_FRAME_2[0]); -static const int CHARACTER_HEIGHT_3 = sizeof(CHARACTER_MASK_FRAME_3) / sizeof(CHARACTER_MASK_FRAME_3[0]); diff --git a/semestralka1/src/assets/character_run_frames.h b/semestralka1/src/assets/character_run_frames.h index 31aa815..0d07e23 100644 --- a/semestralka1/src/assets/character_run_frames.h +++ b/semestralka1/src/assets/character_run_frames.h @@ -92,5 +92,7 @@ static const char **CHARACTER_RUN_FRAMES[] = { RUN_FRAME_7, }; -static const int CHARACTER_RUN_FRAME_COUNT = - sizeof(CHARACTER_RUN_FRAMES) / sizeof(CHARACTER_RUN_FRAMES[0]); +static const int CHARACTER_RUN_FRAME_COUNT = sizeof(CHARACTER_RUN_FRAMES) / sizeof(CHARACTER_RUN_FRAMES[0]); + +// Height (rows per run frame) +static const int CHARACTER_RUN_FRAME_HEIGHT = sizeof(RUN_FRAME_1) / sizeof(RUN_FRAME_1[0]); diff --git a/semestralka1/src/assets/character_walk_frames.h b/semestralka1/src/assets/character_walk_frames.h index f0314a2..3f7f4df 100644 --- a/semestralka1/src/assets/character_walk_frames.h +++ b/semestralka1/src/assets/character_walk_frames.h @@ -92,5 +92,7 @@ static const char **CHARACTER_WALK_FRAMES[] = { WALK_FRAME_7, }; -static const int CHARACTER_WALK_FRAME_COUNT = - sizeof(CHARACTER_WALK_FRAMES) / sizeof(CHARACTER_WALK_FRAMES[0]); +static const int CHARACTER_WALK_FRAME_COUNT = sizeof(CHARACTER_WALK_FRAMES) / sizeof(CHARACTER_WALK_FRAMES[0]); + +// Height (rows per walk frame) +static const int CHARACTER_WALK_FRAME_HEIGHT = sizeof(WALK_FRAME_1) / sizeof(WALK_FRAME_1[0]); diff --git a/semestralka1/src/game/state.cpp b/semestralka1/src/game/state.cpp index 6ad3829..a09620b 100644 --- a/semestralka1/src/game/state.cpp +++ b/semestralka1/src/game/state.cpp @@ -1,38 +1,43 @@ // src/game/state.cpp #include "state.h" +#include "../render/player.h" void WalkingState::update() { // stop crawling after duration - if (current_state == PlayerState::Crawl1 && + if (current_state == PlayerState::Crawl && state_timer.elapsed_time() >= CRAWL_DURATION) { - current_state = PlayerState::Walk1; + current_state = PlayerState::Walk; state_timer.stop(); } } void WalkingState::start_crawl() { - current_state = PlayerState::Crawl1; + current_state = PlayerState::Crawl; state_timer.reset(); state_timer.start(); } +// TODO THIS NEEDS REDESIGN ACCORDING TO SPEED void WalkingState::toggle_walk_frame() { - if (current_state == PlayerState::Walk1) { - current_state = PlayerState::Walk2; - } else if (current_state == PlayerState::Walk2) { - current_state = PlayerState::Walk1; - } + if (++walk_index >= 7) walk_index = 0; } -CharacterFrame WalkingState::get_character_frame() const { +FrameSelection WalkingState::get_frame_selection() const { + FrameSelection f{MovementType::Walk, 0}; + switch (current_state) { - case PlayerState::Walk1: - return CharacterFrame::Walk1; - case PlayerState::Walk2: - return CharacterFrame::Walk2; - case PlayerState::Crawl1: - return CharacterFrame::Crawl1; - default: - return CharacterFrame::Walk1; + case PlayerState::Walk: + f.movement = MovementType::Walk; + f.frame_index = walk_index; + break; + case PlayerState::Run: + f.movement = MovementType::Run; + f.frame_index = run_index; + break; + case PlayerState::Crawl: + f.movement = MovementType::Crawl; + f.frame_index = crawl_index; + break; } + return f; } diff --git a/semestralka1/src/game/state.h b/semestralka1/src/game/state.h index 2c17f1c..ad99c00 100644 --- a/semestralka1/src/game/state.h +++ b/semestralka1/src/game/state.h @@ -1,27 +1,30 @@ // src/game/state.h #pragma once #include "mbed.h" -#include "../assets/character_frames.h" +#include "../render/player.h" constexpr auto CRAWL_DURATION = 300ms; -enum class PlayerState { Walk1, Walk2, Crawl1 }; +enum class PlayerState { Walk, Run, Crawl }; + +struct FrameSelection { + MovementType movement; + int frame_index; +}; class WalkingState { private: - PlayerState current_state = PlayerState::Walk1; + PlayerState current_state = PlayerState::Walk; Timer state_timer; + int walk_index = 0; // cycles 0‑6 + int run_index = 0; // cycles 0‑6 + int crawl_index = 0; // cycles 0‑1 public: - // MOVED FROM loop.cpp - // Update state (handles crawl timeout) void update(); - - // State transitions void start_crawl(); void toggle_walk_frame(); - - // Getters + + FrameSelection get_frame_selection() const; PlayerState get_state() const { return current_state; } - CharacterFrame get_character_frame() const; }; diff --git a/semestralka1/src/main.cpp b/semestralka1/src/main.cpp index 9224c69..119483d 100644 --- a/semestralka1/src/main.cpp +++ b/semestralka1/src/main.cpp @@ -22,5 +22,5 @@ int main(void) { printf("Baud: %d, Format: 8-N-1\r\n", BAUD_RATE); // Just call into render feature - render_loop(4); + render_loop(1); } diff --git a/semestralka1/src/render/loop.cpp b/semestralka1/src/render/loop.cpp index dc73133..eb4b064 100644 --- a/semestralka1/src/render/loop.cpp +++ b/semestralka1/src/render/loop.cpp @@ -8,7 +8,7 @@ #include "../game/state.h" #include "../game/animation.h" #include "../hardware/uart.h" -#include "../assets/character_frames.h" +#include "../render/player.h" extern BufferedSerial serial_port; extern DigitalOut led; @@ -52,13 +52,12 @@ void render_loop(int speed) { if (need_redraw) { draw_mask(bg_file, animation.get_shift(), uart.get_message()); - CharacterFrame player_frame = player_state.get_character_frame(); + FrameSelection frame = player_state.get_frame_selection(); - CharacterPosition draw_pos = get_aligned_frame_position(pos, player_frame); - draw_character(draw_pos.x, draw_pos.y, player_frame); + CharacterPosition draw_pos = get_aligned_frame_position(pos, frame.movement, frame.frame_index); + draw_character(draw_pos.x, draw_pos.y, frame.movement, frame.frame_index); - // alternate between frame 0 and 1 when not crawling - if (player_state.get_state() != PlayerState::Crawl1) { + if (player_state.get_state() != PlayerState::Crawl) { player_state.toggle_walk_frame(); } diff --git a/semestralka1/src/render/player.cpp b/semestralka1/src/render/player.cpp index 4450a0a..5b72bc1 100644 --- a/semestralka1/src/render/player.cpp +++ b/semestralka1/src/render/player.cpp @@ -1,28 +1,38 @@ // src/render/player.cpp #include "player.h" -#include "../assets/character_frames.h" +#include "../assets/character_walk_frames.h" +#include "../assets/character_run_frames.h" +#include "../assets/character_crawl_frames.h" #include -void draw_character(int x, int y, CharacterFrame frame) { - int frame_index = static_cast(frame); - if (frame_index < 0 || frame_index >= CHARACTER_FRAME_COUNT) - frame_index = 0; // fallback safety - - const char **character = PLAYER_FRAMES[frame_index]; - +void draw_character(int x, int y, MovementType movement, int frame_index) { + const char **character = nullptr; int character_height = 0; - switch (frame) { - case CharacterFrame::Walk1: - character_height = CHARACTER_HEIGHT_1; + int total_frames = 0; + + switch (movement) { + case MovementType::Walk: + total_frames = CHARACTER_WALK_FRAME_COUNT; + if (frame_index < 0 || frame_index >= total_frames) + frame_index = 0; + character = CHARACTER_WALK_FRAMES[frame_index]; + character_height = CHARACTER_WALK_FRAME_HEIGHT; break; - case CharacterFrame::Walk2: - character_height = CHARACTER_HEIGHT_2; + + case MovementType::Run: + total_frames = CHARACTER_RUN_FRAME_COUNT; + if (frame_index < 0 || frame_index >= total_frames) + frame_index = 0; + character = CHARACTER_RUN_FRAMES[frame_index]; + character_height = CHARACTER_RUN_FRAME_HEIGHT; break; - case CharacterFrame::Crawl1: - character_height = CHARACTER_HEIGHT_3; - break; - default: - character_height = CHARACTER_HEIGHT_1; + + case MovementType::Crawl: + total_frames = CHARACTER_CRAWL_FRAME_COUNT; + if (frame_index < 0 || frame_index >= total_frames) + frame_index = 0; + character = CHARACTER_CRAWL_FRAMES[frame_index]; + character_height = CHARACTER_CRAWL_FRAME_HEIGHT; break; } diff --git a/semestralka1/src/render/player.h b/semestralka1/src/render/player.h index 9804392..afeb1e3 100644 --- a/semestralka1/src/render/player.h +++ b/semestralka1/src/render/player.h @@ -1,6 +1,11 @@ // src/render/player.h #pragma once -#include "../assets/character_frames.h" + +enum class MovementType { + Walk, + Run, + Crawl +}; // Draw the player object starting at given (x, y) -void draw_character(int x, int y, CharacterFrame frame); +void draw_character(int x, int y, MovementType movement, int frame_index); diff --git a/semestralka1/src/render/player_positioning.cpp b/semestralka1/src/render/player_positioning.cpp index 4c42a1a..18de27f 100644 --- a/semestralka1/src/render/player_positioning.cpp +++ b/semestralka1/src/render/player_positioning.cpp @@ -1,25 +1,30 @@ // src/render/player_positioning.cpp #include "player_positioning.h" #include "../assets/background_frame.h" +#include "../assets/character_walk_frames.h" +#include "../assets/character_run_frames.h" +#include "../assets/character_crawl_frames.h" #include -// Convert a pivot coordinate (bottom-left) to the top-left draw position -CharacterPosition get_aligned_frame_position(CharacterPosition base, CharacterFrame frame) { - int frame_index = static_cast(frame); - if (frame_index < 0 || frame_index >= CHARACTER_FRAME_COUNT) - frame_index = 0; - +CharacterPosition get_aligned_frame_position(CharacterPosition base, + MovementType movement, + int /*frame_index*/) { int character_height = 0; - if (frame_index == 0) - character_height = CHARACTER_HEIGHT_1; - else if (frame_index == 1) - character_height = CHARACTER_HEIGHT_2; - else - character_height = CHARACTER_HEIGHT_3; - CharacterPosition draw_pos; + switch (movement) { + case MovementType::Walk: + character_height = CHARACTER_WALK_FRAME_HEIGHT; + break; + case MovementType::Run: + character_height = CHARACTER_RUN_FRAME_HEIGHT; + break; + case MovementType::Crawl: + character_height = CHARACTER_CRAWL_FRAME_HEIGHT; + break; + } + + CharacterPosition draw_pos{}; draw_pos.x = base.x; draw_pos.y = (VIEW_HEIGHT - base.y) - character_height; - return draw_pos; } diff --git a/semestralka1/src/render/player_positioning.h b/semestralka1/src/render/player_positioning.h index 376e933..22c2b07 100644 --- a/semestralka1/src/render/player_positioning.h +++ b/semestralka1/src/render/player_positioning.h @@ -1,7 +1,7 @@ // src/render/player_positioning.h #pragma once #include "../assets/background_frame.h" -#include "../assets/character_frames.h" +#include "player.h" struct CharacterPosition { int x; @@ -9,4 +9,4 @@ struct CharacterPosition { }; // Calculates drawing position relative to bottom-left pivot -CharacterPosition get_aligned_frame_position(CharacterPosition base, CharacterFrame frame); +CharacterPosition get_aligned_frame_position(CharacterPosition base, MovementType movement,int frame_index);