#include #include "coro.h" typedef struct { Coro coro; int x_pos, y_pos; bool alive; } DrawCoro; static void draw(DrawCoro *c) CORO_BEGIN(&c->coro) CORO_BEGIN_REPEAT(1.0) CORO_BEGIN_REPEAT(0.1) DrawText("Now", c->x_pos, c->y_pos, 20, LIGHTGRAY); CORO_END_REPEAT() CORO_BEGIN_REPEAT(0.1) DrawText("Now", c->x_pos, c->y_pos, 20, BLACK); CORO_END_REPEAT() CORO_END_REPEAT() CORO_BEGIN_REPEAT(1.0) DrawText("1s later", c->x_pos, c->y_pos, 20, LIGHTGRAY); CORO_END_REPEAT() CORO_BEGIN_REPEAT(1.0) DrawText("2s later", c->x_pos, c->y_pos, 20, LIGHTGRAY); CORO_END_REPEAT() CORO_BEGIN_REPEAT(0.5) DrawText("Bye", c->x_pos, c->y_pos, 20, LIGHTGRAY); CORO_END_REPEAT() CORO_END() int main(void) { size_t n_coros = 0; DrawCoro coros[64]; size_t n_free_coros = 0; size_t free_coros[64]; const int screenWidth = 800; const int screenHeight = 450; InitWindow(screenWidth, screenHeight, "Simple coroutine example"); SetTargetFPS(60); while (!WindowShouldClose()) { printf("Coros size: %zu, Free list size: %zu \r", n_coros, n_free_coros); if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { size_t coro; if (n_free_coros > 0) { coro = free_coros[--n_free_coros]; } else { if (n_coros+1 > 64) { fprintf(stderr, "All coroutines in use!\n"); abort(); } coro = n_coros++; } coros[coro] = (DrawCoro){0}; coros[coro].alive = true; coros[coro].x_pos = GetMouseX(); coros[coro].y_pos = GetMouseY(); } BeginDrawing(); ClearBackground(RAYWHITE); for (size_t i = 0; i < n_coros; i++) { if (!coros[i].alive) continue; if (coros[i].coro.done) { coros[i].alive = false; if (n_free_coros+1 > 64) { fprintf(stderr, "Coroutine free list overflow!\n"); abort(); } free_coros[n_free_coros++] = i; } else { draw(&coros[i]); coros[i].coro.time += GetFrameTime(); } } EndDrawing(); } CloseWindow(); return 0; }