From d61dcdcc384249ec7ea60c9cc18aab9df1f80577 Mon Sep 17 00:00:00 2001 From: quou Date: Thu, 4 May 2023 14:10:41 +1000 Subject: Add shooting. --- bullet.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 bullet.c (limited to 'bullet.c') diff --git a/bullet.c b/bullet.c new file mode 100644 index 0000000..f2e1a2e --- /dev/null +++ b/bullet.c @@ -0,0 +1,80 @@ +#include "bullet.h" +#include "components.h" +#include "error.h" +#include "platform.h" +#include "sprite.h" +#include "world.h" + +Entity new_player_bullet( + World* world, + int x, + int y, + int vx, + int vy, + int life +) { + Entity e; + CBullet* bullet; + CPosition* pos; + CSprite* sprite; + Sprite_ID sprid; + + e = new_entity(world); + + add_components( + world, + e, + ctype_sprite | + ctype_position | + ctype_bullet | + ctype_player_bullet + ); + pos = &world->positions[e]; + sprite = &world->sprites[e]; + bullet = &world->bullets[e]; + pos->x = x; + pos->y = y; + + bullet->vx = vx; + bullet->vy = vy; + bullet->life = life; + + if (vx < 0) { + sprid = sprite_player_bullet_left; + } else if (vx > 0) { + sprid = sprite_player_bullet_right; + } else if (vy < 0) { + sprid = sprite_player_bullet_up; + } else if (vy > 0) { + sprid = sprite_player_bullet_down; + } +#ifdef DEBUG + else { + platform_log("Player bullets must have velocity\n"); + platform_abort(error_gameplay_error); + } +#endif + + init_csprite(sprite, sprid); + + return e; +} + +void bullet_system(World* world) { + int i; + unsigned bits; + CPosition* pos; + CBullet* bullet; + + for (i = 0; i < world->entity_count; i++) { + bits = world->bitmask[i]; + if ((bits & ctype_position) && (bits & ctype_bullet)) { + pos = &world->positions[i]; + bullet = &world->bullets[i]; + + pos->x += bullet->vx; + pos->y += bullet->vy; + bullet->life--; + } + } +} -- cgit v1.2.3-54-g00ecf