diff options
author | quou <quou@disroot.org> | 2023-05-04 14:10:41 +1000 |
---|---|---|
committer | quou <quou@disroot.org> | 2023-05-04 14:10:50 +1000 |
commit | d61dcdcc384249ec7ea60c9cc18aab9df1f80577 (patch) | |
tree | 563e985e6a1f480461177f2c341d70ce5dd1498d /bullet.c | |
parent | c4ac81cffcf925963acb0c02584ab22626427a73 (diff) |
Add shooting.
Diffstat (limited to 'bullet.c')
-rw-r--r-- | bullet.c | 80 |
1 files changed, 80 insertions, 0 deletions
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--; + } + } +} |