#include "bullet.h" #include "components.h" #include "error.h" #include "platform.h" #include "sprite.h" #include "standard.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; CCollider* col; Sprite_ID sprid; e = new_entity(world); add_components( world, e, ctype_sprite | ctype_position | ctype_bullet | ctype_player_bullet | ctype_collider ); pos = &world->positions[e]; sprite = &world->sprites[e]; bullet = &world->bullets[e]; col = &world->colliders[e]; pos->x = x; pos->y = y; bullet->vx = vx; bullet->vy = vy; bullet->life = life; col->x = 0; col->y = 0; if (vx < 0) { sprid = sprite_player_bullet_left; col->w = 9 << fbits; col->h = 14 << fbits; } else if (vx > 0) { sprid = sprite_player_bullet_right; col->w = 9 << fbits; col->h = 14 << fbits; } else if (vy < 0) { sprid = sprite_player_bullet_up; col->w = 9 << fbits; col->h = 14 << fbits; } else if (vy > 0) { sprid = sprite_player_bullet_down; col->w = 9 << fbits; col->h = 14 << fbits; } #ifdef DEBUG else { platform_log("Player bullets must have velocity\n"); platform_abort(error_gameplay_error); } #endif init_csprite(sprite, sprid); return e; } int new_enemy_bullet( struct World* world, int x, int y, int vx, int vy ) { Entity e; CBullet* bullet; CPosition* pos; CSprite* sprite; CCollider* col; e = new_entity(world); add_components( world, e, ctype_sprite | ctype_position | ctype_bullet | ctype_enemy_bullet | ctype_collider ); pos = &world->positions[e]; sprite = &world->sprites[e]; bullet = &world->bullets[e]; col = &world->colliders[e]; pos->x = x; pos->y = y; bullet->vx = vx; bullet->vy = vy; bullet->life = 500; col->x = 1 << fbits; col->y = 1 << fbits; col->w = 3 << fbits; col->h = 3 << fbits; init_csprite(sprite, sprite_enemy_bullet); 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--; if (bullet->life <= 0) { destroy_entity(world, i); } } } }