#include "twn_game_api.h" #include "state.h" #include #include #include #include #define GRAY ((Color){130, 130, 130, 255}) #define BLACK ((Color){0, 0, 0, 255}) #define LEFT_CLICK_ADD 20 #define RIGHT_CLICK_ADD 500 void handle_input(void) { State *state = ctx.udata; if (ctx.mouse_window_position.y <= 60) return; if (input_is_action_pressed("add_a_bit")) { // Left click for (int i = 0; i < LEFT_CLICK_ADD; i++) { if (state->bunniesCount < MAX_BUNNIES) { state->bunnies[state->bunniesCount].position = input_get_action_position("add_a_bit"); state->bunnies[state->bunniesCount].speed.x = (float)(rand() % 500 - 250) / 60.0; state->bunnies[state->bunniesCount].speed.y = (float)(rand() % 500 - 250) / 60.0; state->bunnies[state->bunniesCount].color = (Color){rand() % 190 + 50, rand() % 160 + 80, rand() % 140 + 100, 255}; state->bunniesCount++; } } } if (input_is_action_pressed("add_a_lot")) { // Right click for (int i = 0; i < RIGHT_CLICK_ADD; i++) { if (state->bunniesCount < MAX_BUNNIES) { state->bunnies[state->bunniesCount].position = input_get_action_position("add_a_lot"); state->bunnies[state->bunniesCount].speed.x = (float)(rand() % 500 - 250) / 60.0; state->bunnies[state->bunniesCount].speed.y = (float)(rand() % 500 - 250) / 60.0; state->bunnies[state->bunniesCount].color = (Color){rand() % 190 + 50, rand() % 160 + 80, rand() % 140 + 100, 255}; state->bunniesCount++; } } } } void game_tick(void) { char bunny_count_text[64]; // State *state = ctx.udata; if (ctx.initialization_needed) { // First tick, initalizing data // Allocating State struct to store data there if (!ctx.udata) ctx.udata = ccalloc(1, sizeof(State)); input_add_action("add_a_bit"); input_bind_action_control("add_a_bit", CONTROL_LEFT_MOUSE); input_add_action("add_a_lot"); input_bind_action_control("add_a_lot", CONTROL_RIGHT_MOUSE); } State *state = ctx.udata; const double delta = (double)(ctx.delta_time) / 1000.0; // Receiving floating point delta value (diving by 1000 based on vibe) for (int i = 0; i < state->bunniesCount; i++) { state->bunnies[i].position.x += state->bunnies[i].speed.x; state->bunnies[i].position.y += state->bunnies[i].speed.y; if (((state->bunnies[i].position.x + BUNNY_W / 2) > ctx.window_w) || ((state->bunnies[i].position.x + BUNNY_W / 2) < 0)) state->bunnies[i].speed.x *= -1; if (((state->bunnies[i].position.y + BUNNY_H / 2) > ctx.window_h) || ((state->bunnies[i].position.y + BUNNY_H / 2 - 60) < 0)) state->bunnies[i].speed.y *= -1; } handle_input(); // Clear window with Gray color (set the background color this way) draw_rectangle((Rect){0, 0, ctx.window_w, ctx.window_h}, GRAY); for (int i = 0; i < state->bunniesCount; i++) { // Draw each bunny based on their position and color, also scale accordingly m_sprite(m_set(path, "wabbit_alpha.png"), m_set(rect, ((Rect){.x = (int)state->bunnies[i].position.x, .y = (int)state->bunnies[i].position.y, .w = BUNNY_W * SPRITE_SCALE, .h = BUNNY_H * SPRITE_SCALE})), m_opt(color, (state->bunnies[i].color)), m_opt(stretch, true), ); } // Formatting text to display, might want to add FPS here too snprintf(bunny_count_text, 64, "Bunnies: %d", state->bunniesCount); draw_text(bunny_count_text, (Vec2){0, 0}, 40, BLACK, "/fonts/kenney-pixel.ttf"); } void game_end(void) { State *state = ctx.udata; // Free state when game ends free(state); }