X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Ficecrusher.cpp;h=72220a40acfe215b307f3079030f34066121659e;hb=9af7ca781183b7d57410e5cd3b8bc7f8128ed1b0;hp=043b7487a329cf5bd4e16bb37d01dc11bff6b16a;hpb=b16c2a8fdf7a76e2125132e7bf419ef184514198;p=supertux.git diff --git a/src/object/icecrusher.cpp b/src/object/icecrusher.cpp index 043b7487a..72220a40a 100644 --- a/src/object/icecrusher.cpp +++ b/src/object/icecrusher.cpp @@ -41,7 +41,7 @@ const float PAUSE_TIME_LARGE = 1.0; IceCrusher::IceCrusher(const Reader& reader) : MovingSprite(reader, "images/creatures/icecrusher/icecrusher.sprite", LAYER_OBJECTS, COLGROUP_STATIC), - state(IDLE), + state(IDLE), start_position(), physic(), cooldown_timer(0.0), @@ -52,37 +52,37 @@ IceCrusher::IceCrusher(const Reader& reader) : { // TODO: icecrusher hitting deserves its own sounds- // one for hitting the ground, one for hitting Tux - sound_manager->preload("sounds/brick.wav"); + SoundManager::current()->preload("sounds/brick.wav"); start_position = get_bbox().p1; set_state(state, true); - + float sprite_width = sprite->get_width (); if (sprite_width >= 128.0) ic_size = LARGE; - lefteye = sprite_manager->create(sprite_name); + lefteye = SpriteManager::current()->create(sprite_name); lefteye->set_action("lefteye"); - righteye = sprite_manager->create(sprite_name); + righteye = SpriteManager::current()->create(sprite_name); righteye->set_action("righteye"); - whites = sprite_manager->create(sprite_name); + whites = SpriteManager::current()->create(sprite_name); whites->set_action("whites"); } /* IceCrusher::IceCrusher(const IceCrusher& other) - : MovingSprite(other), - state(other.state), speed(other.speed) + : MovingSprite(other), + state(other.state), speed(other.speed) { start_position = get_bbox().p1; set_state(state, true); } */ -void -IceCrusher::set_state(IceCrusherState state, bool force) +void +IceCrusher::set_state(IceCrusherState state_, bool force) { - if ((this->state == state) && (!force)) return; - switch(state) { + if ((this->state == state_) && (!force)) return; + switch(state_) { case IDLE: set_group(COLGROUP_STATIC); physic.enable_gravity (false); @@ -103,7 +103,7 @@ IceCrusher::set_state(IceCrusherState state, bool force) log_debug << "IceCrusher in invalid state" << std::endl; break; } - this->state = state; + this->state = state_; } HitResponse @@ -114,7 +114,7 @@ IceCrusher::collision(GameObject& other, const CollisionHit& hit) /* If the other object is the player, and the collision is at the bottom of * the ice crusher, hurt the player. */ if (player && hit.bottom) { - sound_manager->play("sounds/brick.wav"); + SoundManager::current()->play("sounds/brick.wav"); if(player->is_invincible()) { if (state == CRUSHING) set_state(RECOVERING); @@ -131,8 +131,8 @@ IceCrusher::collision(GameObject& other, const CollisionHit& hit) } return FORCE_MOVE; } - -void + +void IceCrusher::collision_solid(const CollisionHit& hit) { switch(state) { @@ -143,35 +143,35 @@ IceCrusher::collision_solid(const CollisionHit& hit) if (ic_size == LARGE) { cooldown_timer = PAUSE_TIME_LARGE; Sector::current()->camera->shake (/* frequency = */ .125f, /* x = */ 0.0, /* y = */ 16.0); - sound_manager->play("sounds/brick.wav"); + SoundManager::current()->play("sounds/brick.wav"); // throw some particles, bigger and more for large icecrusher for(int j = 0; j < 9; j++) { - Sector::current()->add_object( - new Particles(Vector(get_bbox().p2.x - j*8 - 4, get_bbox().p2.y), - 0, 90-5*j, Vector(140, -380), Vector(0, 300), - 1, Color(.6f, .6f, .6f), 5, 1.8f, LAYER_OBJECTS+1)); - Sector::current()->add_object( - new Particles(Vector(get_bbox().p1.x + j*8 + 4, get_bbox().p2.y), - 270+5*j, 360, Vector(140, -380), Vector(0, 300), - 1, Color(.6f, .6f, .6f), 5, 1.8f, LAYER_OBJECTS+1)); + Sector::current()->add_object(std::make_shared( + Vector(get_bbox().p2.x - j*8 - 4, get_bbox().p2.y), + 0, 90-5*j, 140, 380, Vector(0, 300), + 1, Color(.6f, .6f, .6f), 5, 1.8f, LAYER_OBJECTS+1)); + Sector::current()->add_object(std::make_shared( + Vector(get_bbox().p1.x + j*8 + 4, get_bbox().p2.y), + 270+5*j, 360, 140, 380, Vector(0, 300), + 1, Color(.6f, .6f, .6f), 5, 1.8f, LAYER_OBJECTS+1)); } } else { cooldown_timer = PAUSE_TIME_NORMAL; Sector::current()->camera->shake (/* frequency = */ .1f, /* x = */ 0.0, /* y = */ 8.0); - sound_manager->play("sounds/brick.wav"); + SoundManager::current()->play("sounds/brick.wav"); // throw some particles for(int j = 0; j < 5; j++) { - Sector::current()->add_object( - new Particles(Vector(get_bbox().p2.x - j*8 - 4, get_bbox().p2.y), - 0, 90+10*j, Vector(140, -260), Vector(0, 300), - 1, Color(.6f, .6f, .6f), 4, 1.6f, LAYER_OBJECTS+1)); - Sector::current()->add_object( - new Particles(Vector(get_bbox().p1.x + j*8 + 4, get_bbox().p2.y), - 270+10*j, 360, Vector(140, -260), Vector(0, 300), - 1, Color(.6f, .6f, .6f), 4, 1.6f, LAYER_OBJECTS+1)); + Sector::current()->add_object(std::make_shared( + Vector(get_bbox().p2.x - j*8 - 4, get_bbox().p2.y), + 0, 90+10*j, 140, 260, Vector(0, 300), + 1, Color(.6f, .6f, .6f), 4, 1.6f, LAYER_OBJECTS+1)); + Sector::current()->add_object(std::make_shared( + Vector(get_bbox().p1.x + j*8 + 4, get_bbox().p2.y), + 270+10*j, 360, 140, 260, Vector(0, 300), + 1, Color(.6f, .6f, .6f), 4, 1.6f, LAYER_OBJECTS+1)); } } set_state(RECOVERING); @@ -238,14 +238,14 @@ IceCrusher::draw(DrawingContext& context) { context.push_target(); context.set_target(DrawingContext::NORMAL); - sprite->draw(context, get_pos(), layer); + sprite->draw(context, get_pos(), layer+2); if(!(state == CRUSHING) && sprite->has_action("whites")) { // draw icecrusher's eyes slightly behind - lefteye->draw(context, get_pos()+eye_position(false), layer-1); - righteye->draw(context, get_pos()+eye_position(true), layer-1); + lefteye->draw(context, get_pos()+eye_position(false), layer+1); + righteye->draw(context, get_pos()+eye_position(true), layer+1); // draw the whites of icecrusher's eyes even further behind - whites->draw(context, get_pos(), layer-2); + whites->draw(context, get_pos(), layer); } context.pop_target(); } @@ -258,9 +258,11 @@ IceCrusher::found_victim() const Rectf& player_bbox = player->get_bbox(); const Rectf& crusher_bbox = get_bbox(); + Rectf crush_area = Rectf(crusher_bbox.p1.x+1, crusher_bbox.p2.y, crusher_bbox.p2.x-1, std::max(crusher_bbox.p2.y,player_bbox.p1.y-1)); if ((player_bbox.p1.y >= crusher_bbox.p2.y) /* player is below crusher */ && (player_bbox.p2.x > (crusher_bbox.p1.x - DROP_ACTIVATION_DISTANCE)) - && (player_bbox.p1.x < (crusher_bbox.p2.x + DROP_ACTIVATION_DISTANCE))) + && (player_bbox.p1.x < (crusher_bbox.p2.x + DROP_ACTIVATION_DISTANCE)) + && (Sector::current()->is_free_of_statics(crush_area, this, false))/* and area to player is free of objects */) return true; else return false; @@ -285,7 +287,7 @@ IceCrusher::eye_position(bool right) const float displacement_y = player_focus_y - crusher_origin_y; const float displacement_mag = pow(pow(displacement_x, 2.0) + pow(displacement_y, 2.0), 0.5); // Determine weighting for eye displacement along x given icecrusher eye shape - int weight_x = sprite->get_width()/64 * ((displacement_x > 0) == right) ? 1 : 4; + int weight_x = sprite->get_width()/64 * (((displacement_x > 0) == right) ? 1 : 4); int weight_y = sprite->get_width()/64 * 2; return Vector(displacement_x/displacement_mag * weight_x, displacement_y/displacement_mag * weight_y - weight_y); @@ -294,8 +296,16 @@ IceCrusher::eye_position(bool right) else if(state == RECOVERING) { // Eyes spin while icecrusher is recovering, giving a dazed impression - return Vector(sin((right ? 1 : -1) * get_pos().y/13) * sprite->get_width()/64 * 2 - (right ? 1 : -1) * sprite->get_width()/64 * 2, - cos(((right ? 3.1415 : 0) + get_pos().y/13)) * sprite->get_width()/64 * 2 - sprite->get_width()/64 * 2); + return Vector(sin((right ? 1 : -1) * // X motion of each eye is opposite of the other + (get_pos().y/13 - // Phase factor due to y position + (ic_size==NORMAL ? RECOVER_SPEED_NORMAL : RECOVER_SPEED_LARGE) + cooldown_timer*13)) * //Phase factor due to cooldown timer + sprite->get_width()/64 * 2 - (right ? 1 : -1) * // Amplitude dependent on size + sprite->get_width()/64 * 2, // Offset to keep eyes visible + cos((right ? 3.1415 : 0) + // Eyes spin out of phase of eachother + get_pos().y/13 - // Phase factor due to y position + (ic_size==NORMAL ? RECOVER_SPEED_NORMAL : RECOVER_SPEED_LARGE) + cooldown_timer*13) * //Phase factor due to cooldown timer + sprite->get_width()/64 * 2 - // Amplitude dependent on size + sprite->get_width()/64 * 2); // Offset to keep eyes visible } return Vector(0,0);