unified speed properly

This commit is contained in:
Filipriec
2025-12-11 16:25:12 +01:00
parent 42d07e9715
commit 50f523b52d
4 changed files with 18 additions and 13 deletions

View File

@@ -4,14 +4,12 @@
#include "../assets/obstacle_crawl_frames.h" #include "../assets/obstacle_crawl_frames.h"
#include "../assets/background_frame.h" #include "../assets/background_frame.h"
// Movable obstacle
struct MovingObstacle { struct MovingObstacle {
Obstacle data; Obstacle data;
CrawlObstacleType type; CrawlObstacleType type;
bool active; bool active;
}; };
// Fixed obstacle pool
constexpr int MAX_OBSTACLES = 6; constexpr int MAX_OBSTACLES = 6;
static MovingObstacle obstacle_pool[MAX_OBSTACLES]; static MovingObstacle obstacle_pool[MAX_OBSTACLES];
@@ -45,7 +43,7 @@ inline int spawn_obstacle(CrawlObstacleType type, int x_start) {
return -1; return -1;
} }
// Update X positions; mark inactive if offscreen // Update X positions, mark inactive if offscreen
inline void update_obstacles(int shift_speed) { inline void update_obstacles(int shift_speed) {
for (int i = 0; i < MAX_OBSTACLES; i++) { for (int i = 0; i < MAX_OBSTACLES; i++) {
if (!obstacle_pool[i].active) continue; if (!obstacle_pool[i].active) continue;

View File

@@ -130,7 +130,6 @@ void MovementState::set_motion_state_for_speed(int player_speed, int ground_spee
current_state = new_state; current_state = new_state;
} }
// TODO THIS NEEDS REDESIGN FOR WALK/RUN
void MovementState::toggle_walk_frame(float player_speed, int tick_counter) { void MovementState::toggle_walk_frame(float player_speed, int tick_counter) {
switch (current_state) { switch (current_state) {
case PlayerState::Run: case PlayerState::Run:

View File

@@ -21,5 +21,5 @@ int main(void) {
serial_port.set_format(8, BufferedSerial::None, 1); serial_port.set_format(8, BufferedSerial::None, 1);
printf("Baud: %d, Format: 8-N-1\r\n", BAUD_RATE); printf("Baud: %d, Format: 8-N-1\r\n", BAUD_RATE);
render_loop(6); render_loop(2);
} }

View File

@@ -27,16 +27,20 @@ constexpr int STACK_SIZE = 4096;
Thread logic_thread(osPriorityNormal, STACK_SIZE); Thread logic_thread(osPriorityNormal, STACK_SIZE);
Thread render_thread(osPriorityNormal, STACK_SIZE); Thread render_thread(osPriorityNormal, STACK_SIZE);
void logic_loop() { void logic_loop(void *arg) {
int speed = *(int *)arg;
MovementState player_state; MovementState player_state;
AnimationController animation; AnimationController animation;
ButtonHandler button; ButtonHandler button;
MovementController mover(PLAYER_X, VIEW_WIDTH); MovementController mover(PLAYER_X, VIEW_WIDTH);
SpeedController timing; SpeedController timing;
timing.set_ground_speed(6); timing.set_ground_speed(speed);
CharacterPosition pos = {PLAYER_X, PLAYER_Y}; CharacterPosition pos = {PLAYER_X, PLAYER_Y};
player_state.set_state(PlayerState::Walk); if (speed < 3)
player_state.set_state(PlayerState::Run);
else
player_state.set_state(PlayerState::Walk);
Timer spawn_timer; Timer spawn_timer;
spawn_timer.start(); spawn_timer.start();
@@ -51,11 +55,11 @@ void logic_loop() {
while (!game_over) { while (!game_over) {
tick_counter++; tick_counter++;
mover.update_position(6, timing.get_ground_speed()); mover.update_position(speed, timing.get_ground_speed());
pos.x = mover.get_position(); pos.x = mover.get_position();
// Spawn periodically // Spawn periodically
if (spawn_timer.elapsed_time() > 2s) { if (spawn_timer.elapsed_time() > 5s) {
spawn_timer.reset(); spawn_timer.reset();
spawn_obstacle(CrawlObstacleType::Crawl1, VIEW_WIDTH); spawn_obstacle(CrawlObstacleType::Crawl1, VIEW_WIDTH);
} }
@@ -71,7 +75,7 @@ void logic_loop() {
player_state.update(); player_state.update();
bool anim_tick = animation.tick(6); bool anim_tick = animation.tick(speed);
if (anim_tick) { if (anim_tick) {
anim_tick_counter++; anim_tick_counter++;
// move obstacles // move obstacles
@@ -84,7 +88,7 @@ void logic_loop() {
} }
} }
player_state.toggle_walk_frame(6, anim_tick_counter); player_state.toggle_walk_frame(speed, anim_tick_counter);
FrameSelection frame = player_state.get_frame_selection(); FrameSelection frame = player_state.get_frame_selection();
CharacterPosition draw_pos = CharacterPosition draw_pos =
get_aligned_frame_position(pos, frame.movement, frame.frame_index); get_aligned_frame_position(pos, frame.movement, frame.frame_index);
@@ -166,9 +170,13 @@ void render_loop(int speed) {
g_state.game_over = false; g_state.game_over = false;
g_state_mutex.unlock(); g_state_mutex.unlock();
logic_thread.start(logic_loop); int *speed_ptr = new int(speed);
logic_thread.start(callback(logic_loop, (void *)speed_ptr));
render_thread.start(render_loop_thread); render_thread.start(render_loop_thread);
logic_thread.join(); logic_thread.join();
render_thread.join(); render_thread.join();
delete speed_ptr;
} }