Hella optimized the game + fixed bug with dying animation (now dying snake is more stagnant)

This commit is contained in:
Андреев Григорий 2026-04-08 01:40:51 +03:00
parent 07c0b10280
commit ebbdb67f1f

View File

@ -69,6 +69,7 @@ typedef enum {
} waiting_reason_t; } waiting_reason_t;
struct Snake { struct Snake {
bool i_require_redraw;
bool is_space_pressed; bool is_space_pressed;
bool is_shift_pressed; bool is_shift_pressed;
game_screen_t game_screen; game_screen_t game_screen;
@ -108,6 +109,7 @@ struct Snake {
} snake = {1}; } snake = {1};
void init_snake() { void init_snake() {
snake.i_require_redraw = false;
snake.is_space_pressed = false; snake.is_space_pressed = false;
snake.is_shift_pressed = false; snake.is_shift_pressed = false;
snake.game_screen = game_screen_pause; snake.game_screen = game_screen_pause;
@ -554,6 +556,7 @@ void draw_frame() {
void handle_gaming_keycode(uint8_t keycode) { void handle_gaming_keycode(uint8_t keycode) {
if (keycode == KEYCODE_ESCAPE) { if (keycode == KEYCODE_ESCAPE) {
snake.game_screen = game_screen_pause; snake.game_screen = game_screen_pause;
snake.i_require_redraw = true;
} }
if (!snake.is_dying) { if (!snake.is_dying) {
if (is_keycode_for_press_left(keycode) && if (is_keycode_for_press_left(keycode) &&
@ -574,6 +577,9 @@ void handle_gaming_keycode(uint8_t keycode) {
/* return 1 if we are quitting */ /* return 1 if we are quitting */
int handle_incoming_keycode_after_halt(uint8_t keycode) { int handle_incoming_keycode_after_halt(uint8_t keycode) {
/* All keypresses force a redraw */
snake.i_require_redraw = true;
if (keycode == KEYCODE_SPACE) { if (keycode == KEYCODE_SPACE) {
snake.is_space_pressed = true; snake.is_space_pressed = true;
} else if (keycode == (KEYCODE_SPACE | 0x80)) { } else if (keycode == (KEYCODE_SPACE | 0x80)) {
@ -655,6 +661,8 @@ void handle_time_difference(uint32_t time_diff) {
} }
if (snake.waiting_time > target_required_time) { if (snake.waiting_time > target_required_time) {
snake.waiting_time -= target_required_time; snake.waiting_time -= target_required_time;
snake.i_require_redraw = true;
if (snake.waiting_reason == waiting_reason_step) { if (snake.waiting_reason == waiting_reason_step) {
ivec2 tile_pos_ahead = world_walk_direction( ivec2 tile_pos_ahead = world_walk_direction(
snake.snake_head, snake.new_snake_direction); snake.snake_head, snake.new_snake_direction);
@ -690,7 +698,10 @@ void handle_time_difference(uint32_t time_diff) {
construct_snake_tile( construct_snake_tile(
get_opposite_direction(snake.cur_snake_direction), get_opposite_direction(snake.cur_snake_direction),
snake.new_snake_direction)); snake.new_snake_direction));
if (!snake.is_dying) {
// Don't think about it
snake.cur_snake_direction = snake.new_snake_direction; snake.cur_snake_direction = snake.new_snake_direction;
}
/* Steps 3... */ /* Steps 3... */
if (is_tile_pupa(get_tile(snake.snake_tail))) { if (is_tile_pupa(get_tile(snake.snake_tail))) {
@ -769,8 +780,10 @@ void handle_time_difference(uint32_t time_diff) {
void after_awake_action(uint32_t time_diff) { void after_awake_action(uint32_t time_diff) {
handle_time_difference(time_diff); handle_time_difference(time_diff);
snake.animation_speed_boost = 0; snake.animation_speed_boost = 0;
if (snake.i_require_redraw) {
draw_frame(); draw_frame();
syscall(SYS_swap_frame, (uintptr_t)frame); syscall(SYS_swap_frame, (uintptr_t)frame);
}
} }
int main(void) { int main(void) {