X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fblock.cpp;h=3d5d8873bbf3762808ce75e062f9f3c269a47cc1;hb=788a9153f60fb3d25a52fd184387ebbde7636719;hp=2a0e2af8972a0d6be935d5cebf0ddd3735271786;hpb=8a14d4d16329a6ad16fb7e709270a52cc16d1dfb;p=supertux.git diff --git a/src/object/block.cpp b/src/object/block.cpp index 2a0e2af89..3d5d8873b 100644 --- a/src/object/block.cpp +++ b/src/object/block.cpp @@ -20,31 +20,31 @@ #include #include "block.hpp" + #include "log.hpp" #include -#include "resources.hpp" +#include "audio/sound_manager.hpp" +#include "badguy/badguy.hpp" +#include "constants.hpp" +#include "coin.hpp" +#include "flower.hpp" +#include "gameobjs.hpp" +#include "growup.hpp" +#include "level.hpp" +#include "lisp/lisp.hpp" +#include "lisp/list_iterator.hpp" +#include "moving_object.hpp" +#include "object_factory.hpp" +#include "oneup.hpp" #include "player.hpp" +#include "portable.hpp" #include "sector.hpp" +#include "specialriser.hpp" #include "sprite/sprite.hpp" #include "sprite/sprite_manager.hpp" -#include "video/drawing_context.hpp" -#include "lisp/lisp.hpp" -#include "gameobjs.hpp" -#include "portable.hpp" -#include "specialriser.hpp" -#include "growup.hpp" -#include "flower.hpp" -#include "oneup.hpp" #include "star.hpp" -#include "player_status.hpp" -#include "badguy/badguy.hpp" -#include "coin.hpp" -#include "object_factory.hpp" -#include "lisp/list_iterator.hpp" -#include "object_factory.hpp" -#include "level.hpp" static const float BOUNCY_BRICK_MAX_OFFSET = 8; static const float BOUNCY_BRICK_SPEED = 90; @@ -52,7 +52,7 @@ static const float EPSILON = .0001f; static const float BUMP_ROTATION_ANGLE = 10; Block::Block(Sprite* newsprite) - : sprite(newsprite), bouncing(false), breaking(false), bounce_dir(0), bounce_offset(0) + : sprite(newsprite), bouncing(false), breaking(false), bounce_dir(0), bounce_offset(0), original_y(-1) { bbox.set_size(32, 32.1f); set_group(COLGROUP_STATIC); @@ -70,17 +70,20 @@ Block::collision(GameObject& other, const CollisionHit& ) { Player* player = dynamic_cast (&other); if(player) { - if(player->get_bbox().get_top() > get_bbox().get_bottom() - 7.0) { + if(player->get_bbox().get_top() > get_bbox().get_bottom() - SHIFT_DELTA) { hit(*player); } } // only interact with other objects if... // 1) we are bouncing - // and // 2) the object is not portable (either never or not currently) + // 3) the object is being hit from below (baguys don't get killed for activating boxes) Portable* portable = dynamic_cast (&other); - if(bouncing && (portable == 0 || (!portable->is_portable()))) { + MovingObject* moving_object = dynamic_cast (&other); + bool is_portable = ((portable != 0) && portable->is_portable()); + bool hit_mo_from_below = ((moving_object == 0) || (moving_object->get_bbox().get_bottom() < (get_bbox().get_top() + SHIFT_DELTA))); + if(bouncing && !is_portable && hit_mo_from_below) { // Badguys get killed BadGuy* badguy = dynamic_cast (&other); @@ -93,6 +96,12 @@ Block::collision(GameObject& other, const CollisionHit& ) if(coin) { coin->collect(); } + + //Eggs get jumped + GrowUp* growup = dynamic_cast (&other); + if(growup) { + growup->do_jump(); + } } @@ -129,21 +138,27 @@ Block::draw(DrawingContext& context) } void -Block::start_bounce(float center_of_hitter) +Block::start_bounce(GameObject* hitter) { - original_y = bbox.p1.y; + if(original_y == -1){ + original_y = bbox.p1.y; + } bouncing = true; bounce_dir = -BOUNCY_BRICK_SPEED; bounce_offset = 0; - float offset = (get_bbox().get_middle().x - center_of_hitter)*2 / get_bbox().get_width(); - sprite->set_angle(BUMP_ROTATION_ANGLE*offset); + MovingObject* hitter_mo = dynamic_cast(hitter); + if (hitter_mo) { + float center_of_hitter = hitter_mo->get_bbox().get_middle().x; + float offset = (get_bbox().get_middle().x - center_of_hitter)*2 / get_bbox().get_width(); + sprite->set_angle(BUMP_ROTATION_ANGLE*offset); + } } void -Block::start_break(float center_of_hitter) +Block::start_break(GameObject* hitter) { - start_bounce(center_of_hitter); + start_bounce(hitter); breaking = true; } @@ -234,15 +249,15 @@ BonusBlock::collision(GameObject& other, const CollisionHit& hit){ if(badguy) { // hit contains no information for collisions with blocks. // Badguy's bottom has to be below the top of the bonusblock - // +7 is required to slide over one tile gaps. - if( badguy->can_break() && ( badguy->get_bbox().get_bottom() > get_bbox().get_top() + 7.0) ){ + // SHIFT_DELTA is required to slide over one tile gaps. + if( badguy->can_break() && ( badguy->get_bbox().get_bottom() > get_bbox().get_top() + SHIFT_DELTA) ){ try_open(); } } Portable* portable = dynamic_cast (&other); if(portable) { MovingObject* moving = dynamic_cast (&other); - if(moving->get_bbox().get_top() > get_bbox().get_bottom() - 7.0) { + if(moving->get_bbox().get_top() > get_bbox().get_bottom() - SHIFT_DELTA) { try_open(); } } @@ -310,7 +325,7 @@ BonusBlock::try_open() break; } - start_bounce(player.get_bbox().get_middle().x); + start_bounce(&player); sprite->set_action("empty"); } @@ -368,15 +383,15 @@ Brick::collision(GameObject& other, const CollisionHit& hit){ if(badguy) { // hit contains no information for collisions with blocks. // Badguy's bottom has to be below the top of the brick - // +7 is required to slide over one tile gaps. - if( badguy->can_break() && ( badguy->get_bbox().get_bottom() > get_bbox().get_top() + 7.0 ) ){ + // SHIFT_DELTA is required to slide over one tile gaps. + if( badguy->can_break() && ( badguy->get_bbox().get_bottom() > get_bbox().get_top() + SHIFT_DELTA ) ){ try_break(); } } Portable* portable = dynamic_cast (&other); if(portable) { MovingObject* moving = dynamic_cast (&other); - if(moving->get_bbox().get_top() > get_bbox().get_bottom() - 7.0) { + if(moving->get_bbox().get_top() > get_bbox().get_bottom() - SHIFT_DELTA) { try_break(); } } @@ -398,14 +413,14 @@ Brick::try_break(Player* player) player_one.get_status()->add_coins(1); if(coin_counter == 0) sprite->set_action("empty"); - start_bounce(player->get_bbox().get_middle().x); + start_bounce(player); } else if(breakable) { if(player){ if(player->is_big()){ - start_break(player->get_bbox().get_middle().x); + start_break(player); return; } else { - start_bounce(player->get_bbox().get_middle().x); + start_bounce(player); return; } }