89 lines
2.1 KiB
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;
|
|
}
|