X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fhaywire.cpp;h=01a4b917963157e25dba269574b959cbee005369;hb=7e413dc6f0aa8315b97b1b433e38613308e1ccbd;hp=a99cb3b204550aa4df828fcf4a6d1f875d331082;hpb=9fffdbce9180b050176ecd6a7114cd0f190ab3a5;p=supertux.git diff --git a/src/badguy/haywire.cpp b/src/badguy/haywire.cpp index a99cb3b20..01a4b9179 100644 --- a/src/badguy/haywire.cpp +++ b/src/badguy/haywire.cpp @@ -34,13 +34,15 @@ Haywire::Haywire(const Reader& reader) : is_exploding(false), time_until_explosion(0.0f), is_stunned(false), - time_stunned(0.0f) + time_stunned(0.0f), + ticking(), + grunting() { walk_speed = 80; max_drop_height = 16; //Prevent stutter when Tux jumps on Mr Bomb - sound_manager->preload("sounds/explosion.wav"); + SoundManager::current()->preload("sounds/explosion.wav"); //Check if we need another sprite if( !reader.get( "sprite", sprite_name ) ){ @@ -51,20 +53,7 @@ Haywire::Haywire(const Reader& reader) : return; } //Replace sprite - sprite = sprite_manager->create( sprite_name ); -} - -/* Haywire created by a dispenser always gets default sprite atm.*/ -Haywire::Haywire(const Vector& pos, Direction d) : - WalkingBadguy(pos, d, "images/creatures/haywire/haywire.sprite", "left", "right"), - is_exploding(false), - time_until_explosion(0.0f), - is_stunned(false), - time_stunned(0.0f) -{ - walk_speed = 80; - max_drop_height = 16; - sound_manager->preload("sounds/explosion.wav"); + sprite = SpriteManager::current()->create( sprite_name ); } HitResponse @@ -90,10 +79,15 @@ Haywire::collision_squished(GameObject& object) } if (is_stunned) { - player->bounce (*this); + if (player) + player->bounce (*this); return true; } + if(WalkingBadguy::is_frozen()) { + WalkingBadguy::unfreeze(); + } + if (!is_exploding) { set_action ((dir == LEFT) ? "ticking-left" : "ticking-right", /* loops = */ -1); walk_left_action = "ticking-left"; @@ -101,12 +95,27 @@ Haywire::collision_squished(GameObject& object) set_walk_speed (160); time_until_explosion = TIME_EXPLOSION; is_exploding = true; + + ticking = SoundManager::current()->create_sound_source("sounds/fizz.wav"); + ticking->set_position(get_pos()); + ticking->set_looping(true); + ticking->set_reference_distance(32); + ticking->play(); + grunting = SoundManager::current()->create_sound_source("sounds/grunts.ogg"); + grunting->set_position(get_pos()); + grunting->set_looping(true); + grunting->set_reference_distance(32); + grunting->play(); } time_stunned = TIME_STUNNED; is_stunned = true; + physic.set_velocity_x (0.0); + physic.set_acceleration_x (0.0); + + if (player) + player->bounce (*this); - player->bounce (*this); return true; } @@ -114,6 +123,8 @@ void Haywire::active_update(float elapsed_time) { if (is_exploding) { + ticking->set_position(get_pos()); + grunting->set_position(get_pos()); if (elapsed_time >= time_until_explosion) { kill_fall (); return; @@ -134,42 +145,41 @@ Haywire::active_update(float elapsed_time) } } - if (is_exploding && !turn_around_timer.started()) { + if (is_exploding) { Player *p = this->get_nearest_player (); + float target_velocity = 0.0; if (p) { - Direction player_dir = LEFT; - + /* Player is on the right */ if (p->get_pos ().x > this->get_pos ().x) - player_dir = RIGHT; + target_velocity = walk_speed; + else /* player in on the left */ + target_velocity = (-1.0) * walk_speed; + } /* if (player) */ - if (player_dir != dir) - turn_around (); - } + WalkingBadguy::active_update(elapsed_time, target_velocity); + } + else { + WalkingBadguy::active_update(elapsed_time); } - - WalkingBadguy::active_update(elapsed_time); } void Haywire::kill_fall() { + if(is_exploding) { + ticking->stop(); + grunting->stop(); + } if(is_valid()) { remove_me(); - Explosion* explosion = new Explosion(get_bbox().get_middle()); + auto explosion = std::make_shared(get_bbox().get_middle()); Sector::current()->add_object(explosion); } run_dead_script(); } -void -Haywire::freeze() -{ - WalkingBadguy::freeze(); - sprite->set_action(dir == LEFT ? "iced-left" : "iced-right"); -} - bool Haywire::is_freezable() const {