From 5b3bb08167fc4060269d08f70745b5b121ba8585 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Tue, 21 Dec 2021 18:22:23 +0100 Subject: [PATCH] last half of smart missiles Implements: https://todo.sr.ht/~kikoodx/jtmm2/2 --- CMakeLists.txt | 1 + inc/conf.h | 2 +- inc/missile.h | 6 +++--- res/editor_cursor.png | Bin 4994 -> 239 bytes res/missile.png | Bin 0 -> 97 bytes res/tileset.png | Bin 13788 -> 1491 bytes src/level.c | 8 ++++++++ src/main.c | 2 -- src/missile.c | 46 +++++++++++++++++++++++++----------------- 9 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 res/missile.png diff --git a/CMakeLists.txt b/CMakeLists.txt index ff3e9dd..46bf132 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ set(SOURCES set(ASSETS res/tileset.png + res/missile.png res/editor_cursor.png res/test.kble res/burn.kble diff --git a/inc/conf.h b/inc/conf.h index e679506..85f169c 100644 --- a/inc/conf.h +++ b/inc/conf.h @@ -22,7 +22,7 @@ #define BOUNCE_SPEED -2.0f #define DRAW_OFF_X -2 #define GRAVS_MARGIN 0 -#define MISSILE_SIZE 6 #define MISSILE_MAX_SPEED 4.0f #define MISSILE_ACCEL 0.06f #define MISSILE_FRICTION (MISSILE_ACCEL / MISSILE_MAX_SPEED) +#define MISSILE_COOLDOWN (TARGET_FPS / 2) diff --git a/inc/missile.h b/inc/missile.h index 322faba..61b2c97 100644 --- a/inc/missile.h +++ b/inc/missile.h @@ -3,8 +3,8 @@ #include "vec.h" struct Missile { - int active; - struct VecF pos, spd; + int active, cooldown; + struct VecF spawn, pos, spd; }; struct MissileManager { @@ -16,5 +16,5 @@ void missile_manager_init(void); void missile_manager_free(void); void missile_manager_update(struct VecF target); void missile_manager_draw(void); -struct Missile *missile_new(int x, int y); +void missile_new(int x, int y); int missile_collide_player(const struct Player *); diff --git a/res/editor_cursor.png b/res/editor_cursor.png index 6ce82c7f9c0afd4d0bd9ce1b5319be1df02f3ddc..95e0403ff6fcd63c65cb3a74c44dcd53cee76d75 100644 GIT binary patch delta 10 RcmZotf6q8UdGa=)GXNK91atrZ literal 4994 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 N5(^^)Uj?tu{Vxk#bpikY diff --git a/res/missile.png b/res/missile.png new file mode 100644 index 0000000000000000000000000000000000000000..e59e3a3682ada8b12da420d80ef56d434893efa0 GIT binary patch literal 97 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 0) + if (level.data[i] == TILE_MISSILE_LAUNCHER) + missile_new(i % level.width * TILE_SIZE + TILE_SIZE / 2, + (int)(i / level.width) * TILE_SIZE + + TILE_SIZE / 2); } void diff --git a/src/main.c b/src/main.c index 62f8aab..d912f04 100644 --- a/src/main.c +++ b/src/main.c @@ -84,8 +84,6 @@ update(void) player_update(&player); /* enter editor */ if (input_pressed(K_EDITOR)) editor(); - /* debug: spawn missile */ - if (input_pressed(K_DEBUG)) missile_new(DWIDTH / 2, DHEIGHT / 2); } static void diff --git a/src/missile.c b/src/missile.c index d7c86ed..f8a67f8 100644 --- a/src/missile.c +++ b/src/missile.c @@ -8,6 +8,7 @@ static struct MissileManager manager = {.missiles = NULL}; +static void missile_init(struct Missile *); static void missile_update(struct Missile *, struct VecF target); static void missile_draw(const struct Missile *); static int collide(int x, int y, int tile); @@ -18,13 +19,14 @@ missile_manager_init(void) { int i; missile_manager_free(); - /* debug: remove the `1 + ` later on */ - manager.n_missiles = 1 + level_count(TILE_MISSILE_LAUNCHER); + manager.n_missiles = level_count(TILE_MISSILE_LAUNCHER); manager.missiles = malloc(manager.n_missiles * sizeof(struct Missile)); i = manager.n_missiles; - while (i-- > 0) + while (i-- > 0) { manager.missiles[i].active = 0; + manager.missiles[i].cooldown = MISSILE_COOLDOWN; + } } void @@ -37,9 +39,13 @@ void missile_manager_update(struct VecF target) { int i = manager.n_missiles; - while (i-- > 0) - if (manager.missiles[i].active) - missile_update(&manager.missiles[i], target); + while (i-- > 0) { + struct Missile *const m = &manager.missiles[i]; + if (m->active) + missile_update(m, target); + else if (m->cooldown && !--m->cooldown) + missile_init(m); + } } void @@ -51,7 +57,7 @@ missile_manager_draw(void) missile_draw(&manager.missiles[i]); } -struct Missile * +void missile_new(int x, int y) { int i = manager.n_missiles; @@ -60,13 +66,20 @@ missile_new(int x, int y) ; m = &manager.missiles[(i > 0) ? (i) : (0)]; + m->spawn.x = x; + m->spawn.y = y; + missile_init(m); +} + +void +missile_init(struct Missile *m) +{ m->active = 1; - m->pos.x = x; - m->pos.y = y; + m->cooldown = MISSILE_COOLDOWN; + m->pos.x = m->spawn.x; + m->pos.y = m->spawn.y; m->spd.x = 0.0f; m->spd.y = 0.0f; - - return m; } int @@ -112,13 +125,10 @@ missile_update(struct Missile *m, struct VecF target) static void missile_draw(const struct Missile *m) { - const int x = m->pos.x + 0.5f; - const int y = m->pos.y + 0.5f; - const int x1 = x - MISSILE_SIZE / 2; - const int x2 = x + MISSILE_SIZE / 2 - 1; - const int y1 = y - MISSILE_SIZE / 2; - const int y2 = y + MISSILE_SIZE / 2 - 1; - drect(x1, y1, x2, y2, C_RED); + extern bopti_image_t bimg_missile; + const int x = (int)(m->pos.x + 0.5f) - bimg_missile.width / 2; + const int y = (int)(m->pos.y + 0.5f) - bimg_missile.height / 2; + dimage(x, y, &bimg_missile); } static int