123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- #include <math.h>
- #include <raylib.h>
- #include <stdbool.h>
- #include <stdio.h>
- #include <string.h>
- #include "bullet.h"
- #include "game.h"
- #include "ship.h"
- #define DRAG -0.001f
- void ship_draw(const ship* s)
- {
- DrawRectangleV(s->position, s->size, BLACK);
- }
- void ship_up(ship* s)
- {
- Vector2 min = { .x = -1000.0F, .y = -1000.0F };
- Vector2 max = { .x = 1000.0F, .y = 1000.0F };
- Vector2 diff = Vector2Subtract(s->direction, s->position);
- Vector2 accellv = CLITERAL(Vector2){ .x = diff.x, .y = diff.y };
- s->accel = Vector2Add(accellv, s->accel);
- s->accel = Vector2Clamp(s->accel, min, max);
- }
- void ship_stop(ship* s)
- {
- Vector2 min = { .x = 1.0F, .y = 1.0F };
- Vector2 max = { .x = 0.0F, .y = 0.0F };
- s->accel.y -= 0.0001F;
- s->accel.x -= 0.0001F;
- s->accel = Vector2Clamp(s->accel, min, max);
- }
- void ship_update(game* g, ship* s)
- {
- Vector2 drag = { .x = DRAG * s->velocity.x, .y = DRAG * s->velocity.y };
- float x = cosf(s->angle);
- float y = sinf(s->angle);
- Vector2 polar = CLITERAL(Vector2){ .x = x, .y = y };
- Vector2 pos = Vector2Add(s->position, polar);
- float x1 = 100 * cosf(s->angle);
- float y1 = 100 * sinf(s->angle);
- Vector2 polar1 = CLITERAL(Vector2){ .x = x1, .y = y1 };
- Vector2 pos1 = Vector2Add(s->position, polar1);
- s->direction.x = pos.x;
- s->direction.y = pos.y;
- s->velocity.x += s->accel.x * g->dt;
- s->velocity.y += s->accel.y * g->dt;
- s->velocity = Vector2Add(s->velocity, drag);
- s->position.x += s->velocity.x * g->dt;
- s->position.y += s->velocity.y * g->dt;
- DrawLine(s->position.x, s->position.y, pos1.x, pos1.y, RED);
- }
- void ship_fire(game* g, ship* s)
- {
- // Vector2 min = { .x = -300.0f, .y = -300.0f };
- // Vector2 max = { .x = 300.0f, .y = 300.0f };
- if (g->bullets_fired >= MAX_BULLETS) {
- g->bullets_fired = 0;
- // g->active_bullets -= 1;
- }
- float current_fire = GetFrameTime();
- float allowed_fire = 0.0002;
- if (current_fire > allowed_fire) {
- Vector2 diff = Vector2Subtract(s->direction, s->position);
- Vector2 accellv = CLITERAL(Vector2){ .x = diff.x, .y = diff.y };
- g->bullets[g->bullets_fired].accel
- = Vector2Zero(); // Vector2Scale(diff,3000);//Vector2Add(accellv, s->accel);
- g->bullets[g->bullets_fired].position = s->position;
- g->bullets[g->bullets_fired].radius = 5.0F;
- g->bullets[g->bullets_fired].velocity = Vector2Scale(diff, 3000);
- g->bullets[g->bullets_fired].active = true;
- g->bullets_fired++;
- g->active_bullets += 1;
- g->last_fire = GetFrameTime();
- }
- }
- void bullets_draw(game* g, bullet* b)
- {
- if (b->active) {
- DrawCircle(b->position.x, b->position.y, b->radius, RED);
- }
- }
- void bullets_update(game* g, bullet* b)
- {
- if (b->active) {
- b->velocity.x += b->accel.x * g->dt;
- b->velocity.y += b->accel.y * g->dt;
- b->position.x += b->velocity.x * g->dt;
- b->position.y += b->velocity.y * g->dt;
- b->velocity = Vector2ClampValue(b->velocity, -3000, 3000);
- if (b->position.x > (GetScreenWidth() - b->radius)
- || b->position.y > (GetScreenHeight() - b->radius)) {
- b->active = false;
- g->active_bullets -= 1;
- }
- if (b->position.x < b->radius || b->position.y < b->radius) {
- b->active = false;
- g->active_bullets -= 1;
- }
- // DrawLine(g->s.position.x, g->s.position.y, b->direction.x, b->direction.y, GREEN);
- }
- }
- 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;
- }
- if (IsKeyDown(KEY_SPACE)) {
- ship_fire(g, &g->s);
- }
- }
- void text(const game* g)
- {
- char ind[256] = { 0 };
- sprintf(ind,
- "ship position %fx%f\nship speed %fx%f\nship accel %fx%f\nangle: "
- "%f\ndirection %fx%f\nbullets fired %zu\nactive bullets %zu",
- g->s.position.x, g->s.position.y, g->s.velocity.x, g->s.velocity.y, g->s.accel.x,
- g->s.accel.y, g->s.angle, g->s.direction.x, g->s.direction.y, g->bullets_fired,
- g->active_bullets);
- 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;
- game g;
- g.s = s1;
- memset(g.bullets, 0, MAX_BULLETS);
- while (!WindowShouldClose()) {
- BeginDrawing();
- ClearBackground(WHITE);
- for (size_t i = 0; i < MAX_BULLETS; i++) {
- bullets_draw(&g, &g.bullets[i]);
- bullets_update(&g, &g.bullets[i]);
- }
- ship_draw(&g.s);
- ship_update(&g, &g.s);
- text(&g);
- process_inputs(&g);
- EndDrawing();
- g.dt = GetFrameTime();
- }
- return (0);
- }
|