coro/example.c

89 lines
2.1 KiB
C

#include <raylib.h>
#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;
}