X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fbullet.cpp;h=c761735d5be41e29960e2b4390db9858b7132c46;hb=04a3157ef478169b5a3fc05dae00ed6ee6a1fae2;hp=7f0e49194ceca6ea222a58fe3c27078c09b8745d;hpb=a113d3bd1feddd510e3b2852b0d42522735eee40;p=supertux.git diff --git a/src/object/bullet.cpp b/src/object/bullet.cpp index 7f0e49194..c761735d5 100644 --- a/src/object/bullet.cpp +++ b/src/object/bullet.cpp @@ -33,17 +33,21 @@ 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")); + } 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 +57,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 +87,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& ) {