jtmm2/src/missile.c

92 lines
1.8 KiB
C

#include "missile.h"
#include "conf.h"
#include "level.h"
#include <gint/display.h>
#include <stdlib.h>
static struct MissileManager manager = {.missiles = NULL};
static void missile_update(struct Missile *, struct VecF target);
static void missile_draw(const struct Missile *);
void
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.missiles = malloc(manager.n_missiles * sizeof(struct Missile));
i = manager.n_missiles;
while (i-- > 0)
manager.missiles[i].active = 0;
}
void
missile_manager_free(void)
{
if (manager.missiles != NULL) free(manager.missiles);
}
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);
}
void
missile_manager_draw(void)
{
int i = manager.n_missiles;
while (i-- > 0)
if (manager.missiles[i].active)
missile_draw(&manager.missiles[i]);
}
struct Missile *
missile_new(int x, int y)
{
int i = manager.n_missiles;
struct Missile *m;
while (i-- > 0 && manager.missiles[i].active)
;
m = &manager.missiles[(i > 0) ? (i) : (0)];
m->active = 1;
m->pos.x = x;
m->pos.y = y;
m->spd.x = 0.0f;
m->spd.y = 0.0f;
return m;
}
static void
missile_update(struct Missile *m, struct VecF target)
{
const struct VecF diff = {target.x - m->pos.x, target.y - m->pos.y};
const struct VecF dir = normalize(diff);
/* acceleration */
m->spd.x += dir.x * MISSILE_ACCEL;
m->spd.y += dir.y * MISSILE_ACCEL;
/* friction */
m->spd.x *= 1 - MISSILE_FRICTION;
m->spd.y *= 1 - MISSILE_FRICTION;
/* move */
m->pos.x += m->spd.x;
m->pos.y += m->spd.y;
}
static void
missile_draw(const struct Missile *m)
{
dpixel(m->pos.x + 0.5f, m->pos.y + 0.5f, C_RED);
}