92 lines
1.8 KiB
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);
|
|
}
|