diff --git a/Makefile b/Makefile index 245008e..38b9291 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SRC=main.c ninja.c keys.c +SRC=main.c ninja.c keys.c bullet.c EXE=voleur CC=gcc diff --git a/bullet.c b/bullet.c new file mode 100644 index 0000000..33886ee --- /dev/null +++ b/bullet.c @@ -0,0 +1,51 @@ +#include +#include "raylib.h" +#include "raymath.h" + +#include "bullet.h" + +typedef struct Bullet { + BulletType type; + Vector2 pos; + float time; + float angle; +} Bullet; + +#define BULLET_MAX 500 + +Bullet bullets[BULLET_MAX] = {0}; + +Texture textures[BULLET_COUNT]; + +void bullet_load() +{ + textures[BULLET_SHURIKEN] = LoadTexture("data/shuriken.png"); +} + +void bullet_spawn(BulletType type, Vector2 pos, float angle) +{ + for (int i = 0; i < BULLET_MAX; i++) { + if (bullets[i].time >= EPSILON) + continue; + bullets[i].time = 5; + bullets[i].angle = angle; + bullets[i].pos.x = pos.x - textures[type].width/2; + bullets[i].pos.y = pos.y - textures[type].height/2; + bullets[i].type = type; + break; + } +} + +void draw_bullets(Camera2D *cam) +{ + for (int i = 0; i < BULLET_MAX; i++) { + if (bullets[i].time <= EPSILON) + continue; + + float angle = bullets[i].angle * PI/180; + Vector2 toward = Vector2Normalize((Vector2) {cos(angle), sin(angle)}); + bullets[i].pos = Vector2Add(bullets[i].pos, Vector2Scale(toward, 50)); + bullets[i].time -= GetFrameTime(); + DrawTexture(textures[bullets[i].type], bullets[i].pos.x, bullets[i].pos.y, WHITE); + } +} diff --git a/bullet.h b/bullet.h new file mode 100644 index 0000000..c5138eb --- /dev/null +++ b/bullet.h @@ -0,0 +1,15 @@ +#ifndef BULLET_H +#define BULLET_H + +typedef enum BulletType { + BULLET_SHURIKEN, + BULLET_COUNT, +} BulletType; + +void bullet_load(); + +void bullet_spawn(BulletType type, Vector2 pos, float angle); + +void draw_bullets(Camera2D *cam); + +#endif // BULLET_H diff --git a/data/bullet.aseprite b/data/bullet.aseprite new file mode 100644 index 0000000..8566a76 Binary files /dev/null and b/data/bullet.aseprite differ diff --git a/data/shuriken.png b/data/shuriken.png new file mode 100644 index 0000000..d544f0f Binary files /dev/null and b/data/shuriken.png differ diff --git a/data/shurkien.png b/data/shurkien.png new file mode 100644 index 0000000..d544f0f Binary files /dev/null and b/data/shurkien.png differ diff --git a/main.c b/main.c index 4b5c843..89a9988 100644 --- a/main.c +++ b/main.c @@ -3,6 +3,7 @@ #include "raylib.h" #include "raymath.h" +#include "bullet.h" #include "keys.h" #include "ninja.h" @@ -70,6 +71,7 @@ int main(void) change_layout_azerty(); load_ninja(); + bullet_load(); while (!WindowShouldClose()) { float DT = GetFrameTime(); @@ -109,6 +111,7 @@ int main(void) BeginMode2D(effect_camera); { DrawTexture(map.texture, map.box.x, map.box.y, WHITE); + draw_bullets(&camera); } EndMode2D(); draw_ninja(Vector2Add(SCREEN_MIDDLE, cam_shake), &camera); diff --git a/ninja.c b/ninja.c index 2a0659e..ae18c13 100644 --- a/ninja.c +++ b/ninja.c @@ -3,6 +3,7 @@ #include "stdio.h" #include "keys.h" +#include "bullet.h" Texture ninja_texture; Texture ninja_attack_texture; @@ -91,6 +92,10 @@ void draw_ninja(Vector2 pos, Camera2D *cam) float angle = -Vector2LineAngle(pos, GetMousePosition()); angle *= 180/PI; angle += 90; + + if (key_pressed(KC_SPECIAL)) + bullet_spawn(BULLET_SHURIKEN, GetScreenToWorld2D(pos, *cam), angle - 90); + DrawTexturePro(n, source, dest, origin, angle, WHITE); // hit_hitbox(pos, angle);