X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Frock.cpp;h=aa883a1ae545f229aff700fd46af9be64cf6f903;hb=8a627e73d824b5a14249cfe066dc2fdc643ce28d;hp=467377ce5d72aade1b3aff7357c843e8fc41dcde;hpb=6f92944e2238c19283a0776e63f469b3345bccd2;p=supertux.git diff --git a/src/object/rock.cpp b/src/object/rock.cpp index 467377ce5..aa883a1ae 100644 --- a/src/object/rock.cpp +++ b/src/object/rock.cpp @@ -21,15 +21,21 @@ #include "rock.hpp" #include "lisp/writer.hpp" -#include "video/drawing_context.hpp" -#include "resources.hpp" #include "object_factory.hpp" +#include "audio/sound_manager.hpp" + +namespace { + const std::string ROCK_SOUND = "sounds/brick.wav"; //TODO use own sound. +} Rock::Rock(const lisp::Lisp& reader) : MovingSprite(reader, "images/objects/rock/rock.sprite") { + sound_manager->preload( ROCK_SOUND ); on_ground = false; - flags |= FLAG_SOLID | FLAG_PORTABLE; + grabbed = false; + set_solid(true); + set_portable(true); } void @@ -46,17 +52,25 @@ Rock::write(lisp::Writer& writer) void Rock::update(float elapsed_time) { - if( !on_ground ) { - movement = physic.get_movement(elapsed_time); - } + if( grabbed ) + return; + + movement = physic.get_movement(elapsed_time); } void Rock::collision_solid(const CollisionHit& hit) { - physic.set_velocity(0, 0); - if( hit.bottom ){ - on_ground = true; + if( hit.top || hit.bottom ) + physic.set_velocity_y( 0 ); + if( hit.left || hit.right ) + physic.set_velocity_x( 0 ); + if( hit.crush ) + physic.set_velocity(0, 0); + + if( hit.bottom && !on_ground ){ + sound_manager->play( ROCK_SOUND, get_pos() ); + on_ground = true; } } @@ -66,16 +80,16 @@ Rock::collision(GameObject& other, const CollisionHit& hit) if( !on_ground ){ return FORCE_MOVE; } - - //Fake being solid for moving_object. + + //Fake being solid for moving_object. MovingObject* moving_object = dynamic_cast (&other); if( moving_object ){ if( hit.top ){ float inside = moving_object->get_bbox().get_bottom() - get_bbox().get_top(); if( inside > 0 ){ Vector pos = moving_object->get_pos(); - pos.y -= inside; - moving_object->set_pos( pos ); + pos.y -= inside; + moving_object->set_pos( pos ); } } CollisionHit hit_other = hit; @@ -92,7 +106,8 @@ Rock::grab(MovingObject& , const Vector& pos, Direction) movement = pos - get_pos(); set_group( COLGROUP_DISABLED ); on_ground = true; - + grabbed = true; + } void @@ -100,7 +115,7 @@ Rock::ungrab(MovingObject& , Direction ){ set_group( COLGROUP_MOVING ); on_ground = false; physic.set_velocity(0, 0); + grabbed = false; } IMPLEMENT_FACTORY(Rock, "rock"); -