123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #include <stdio.h>
- #include <math.h>
- #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);
- }
|