X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fbullet.cpp;h=30e6dfaa0e0cc005ed0e85af97129a9d36c3a3b9;hb=555d1b7bebb45326d82d934e07463209837309b0;hp=7f0e49194ceca6ea222a58fe3c27078c09b8745d;hpb=a113d3bd1feddd510e3b2852b0d42522735eee40;p=supertux.git diff --git a/src/object/bullet.cpp b/src/object/bullet.cpp index 7f0e49194..30e6dfaa0 100644 --- a/src/object/bullet.cpp +++ b/src/object/bullet.cpp @@ -33,17 +33,25 @@ namespace { const float BULLET_STARTING_YM = 0; } -Bullet::Bullet(const Vector& pos, float xm, int dir) - : life_count(3) +Bullet::Bullet(const Vector& pos, float xm, int dir, BonusType type) + : life_count(3), type(type) { - sprite.reset(sprite_manager->create("images/objects/bullets/firebullet.sprite")); + float speed = dir == RIGHT ? BULLET_XM : -BULLET_XM; + physic.set_velocity_x(speed + xm); + + if(type == FIRE_BONUS) { + sprite.reset(sprite_manager->create("images/objects/bullets/firebullet.sprite")); + } else if(type == ICE_BONUS) { + life_count = 10; + sprite.reset(sprite_manager->create("images/objects/bullets/icebullet.sprite")); + } else { + log_warning << "Bullet::Bullet called with unknown BonusType" << std::endl; + life_count = 10; + sprite.reset(sprite_manager->create("images/objects/bullets/firebullet.sprite")); + } bbox.set_pos(pos); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); - - float speed = dir == RIGHT ? BULLET_XM : -BULLET_XM; - physic.set_velocity_x(speed + xm); - physic.set_velocity_y(BULLET_STARTING_YM); } Bullet::~Bullet() @@ -53,14 +61,7 @@ Bullet::~Bullet() void Bullet::update(float elapsed_time) { - // @not completely framerate independant :-/ - physic.set_velocity_y(physic.get_velocity_y() + 50 * elapsed_time); - - if(physic.get_velocity_y() > 900) - physic.set_velocity_y(900); - else if(physic.get_velocity_y() < -900) - physic.set_velocity_y(-900); - + // remove bullet when it's offscreen float scroll_x = Sector::current()->camera->get_translation().x; float scroll_y = @@ -90,10 +91,20 @@ Bullet::collision_solid(const CollisionHit& hit) physic.set_velocity_y(-physic.get_velocity_y()); life_count--; } else if(hit.left || hit.right) { - remove_me(); + if(type == ICE_BONUS) { + physic.set_velocity_x(-physic.get_velocity_x()); + life_count--; + } else + remove_me(); } } +void +Bullet::ricochet(GameObject& , const CollisionHit& hit) +{ + collision_solid(hit); +} + HitResponse Bullet::collision(GameObject& , const CollisionHit& ) {