#include #include #include "raylib.h" #include "raymath.h" #define DRAG -0.001f typedef struct ship_t { Vector2 position; Vector2 velocity; Vector2 accel; Vector2 size; float angle; } ship; typedef struct game_g { ship s; float dt; } game; game g; void ship_draw(const ship *s) { DrawRectangleV(s->position, s->size, BLACK); } void ship_up(ship *s) { Vector2 min = {.x = 0.0f, .y = 1.0f}; Vector2 max = {.x = 0.0f, .y = -1.0f}; float x = cosf(s->angle); float y = sinf(s->angle); Vector2 polar = CLITERAL(Vector2){.x = x, .y = y}; s->accel.y -= 0.3f; // * pos.y; s->accel = Vector2Clamp(s->accel, min, max); } void ship_stop(ship *s) { Vector2 min = {.x = 1.0, .y = 1.0}; Vector2 max = {.x = 0.0, .y = 0.0}; s->accel.y -= 0.0001f; s->accel = Vector2Clamp(s->accel, min, max); } void ship_update(ship *s) { Vector2 drag = {.x = DRAG * s->velocity.x, .y = DRAG * s->velocity.y}; s->velocity = Vector2Add(s->velocity, s->accel); s->velocity = Vector2Add(s->velocity, drag); s->position.x += s->velocity.x * g.dt; s->position.y += s->velocity.y * g.dt; float x = 100 * cosf(s->angle); float y = 100 * sinf(s->angle); Vector2 polar = CLITERAL(Vector2){.x = x, .y = y}; // polar = Vector2Normalize(polar); Vector2 pos = Vector2Add(s->position, polar); // pos = Vector2Normalize(pos); // printf("polar (%f,%f)\n", pos.x, pos.y); DrawLine(s->position.x, s->position.y, pos.x, pos.y, RED); } void process_inputs(game *g) { if (IsKeyDown(KEY_W)) { ship_up(&g->s); } else { ship_stop(&g->s); } if (IsKeyDown(KEY_D)) { g->s.angle += 1.0f * g->dt; } if (IsKeyDown(KEY_A)) { g->s.angle -= 1.0f * g->dt; } } void text(const game *g) { char ind[256] = {0}; sprintf(ind, "ship position %f\nship speed %f\nship accel %f\nangle: %f\n", g->s.position.y, g->s.velocity.y, g->s.accel.y, g->s.angle); DrawText(ind, 10, 10, 20, BLACK); } int main(void) { InitWindow(1820, 900, "Hello World"); ship s1 = {0}; s1.position.x = 910.0f; s1.position.y = 450.0f; s1.size.x = 10.0f; s1.size.y = 10.0f; s1.angle = 3 * PI / 2; g.s = s1; while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(WHITE); process_inputs(&g); ship_draw(&g.s); ship_update(&g.s); text(&g); EndDrawing(); g.dt = GetFrameTime(); } return (0); }