X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fambient_sound.cpp;h=14df03828aa0d1f6b994ae7e2d909a792b9ca1af;hb=a98f7cee9f6a2593c0e1f3442800f159bad410df;hp=1287391b71d1a6622bf7de681c335ae9022d4738;hpb=e5efd34f1f8a286a33972b7e5de0e83faef0c475;p=supertux.git diff --git a/src/object/ambient_sound.cpp b/src/object/ambient_sound.cpp index 1287391b7..14df03828 100644 --- a/src/object/ambient_sound.cpp +++ b/src/object/ambient_sound.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "ambient_sound.hpp" #include "object_factory.hpp" @@ -30,9 +31,12 @@ #include "audio/sound_manager.hpp" #include "audio/sound_source.hpp" #include "log.hpp" +#include "scripting/squirrel_util.hpp" +#include "object/camera.hpp" AmbientSound::AmbientSound(const lisp::Lisp& lisp) { + name=""; position.x = 0; position.y = 0; @@ -49,6 +53,7 @@ AmbientSound::AmbientSound(const lisp::Lisp& lisp) log_warning << "No Position in ambient_sound" << std::endl; } + lisp.get("name" , name); lisp.get("width" , dimension.x); lisp.get("height", dimension.y); @@ -58,12 +63,12 @@ AmbientSound::AmbientSound(const lisp::Lisp& lisp) lisp.get("volume" ,maximumvolume ); // set dimension to zero if smaller than 64, which is default size in flexlay - + if ((dimension.x <= 64) || (dimension.y <= 64)) { dimension.x = 0; dimension.y = 0; } - + // square all distances (saves us a sqrt later) distance_bias*=distance_bias; @@ -72,13 +77,14 @@ AmbientSound::AmbientSound(const lisp::Lisp& lisp) // set default silence_distance if (distance_factor == 0) - silence_distance = 10e99; + silence_distance = std::numeric_limits::max(); else silence_distance = 1/distance_factor; - + lisp.get("silence_distance",silence_distance); sound_source = 0; // not playing at the beginning + sound_manager->preload(sample); latency=0; } @@ -94,11 +100,11 @@ AmbientSound::AmbientSound(Vector pos, float factor, float bias, float vol, std: distance_bias=bias*bias; maximumvolume=vol; sample=file; - + // set default silence_distance if (distance_factor == 0) - silence_distance = 10e99; + silence_distance = std::numeric_limits::max(); else silence_distance = 1/distance_factor; @@ -128,10 +134,10 @@ AmbientSound::start_playing() sound_source = sound_manager->create_sound_source(sample); if(!sound_source) throw std::runtime_error("file not found"); - + sound_source->set_gain(0); sound_source->set_looping(true); - currentvolume=targetvolume=1e-20; + currentvolume=targetvolume=1e-20f; sound_source->play(); } catch(std::exception& e) { log_warning << "Couldn't play '" << sample << "': " << e.what() << "" << std::endl; @@ -142,15 +148,16 @@ AmbientSound::start_playing() } void -AmbientSound::update(float deltat) -{ +AmbientSound::update(float deltat) +{ if (latency-- <= 0) { float px,py; float rx,ry; - // Player position - px=Sector::current()->player->get_pos().x; - py=Sector::current()->player->get_pos().y; + if (!Sector::current() || !Sector::current()->camera) return; + // Camera position + px=Sector::current()->camera->get_center().x; + py=Sector::current()->camera->get_center().y; // Relate to which point in the area rx=px0.001/distance_factor) // latency= - - if( sound_source != NULL ){ - sound_source->update(); - } } void -AmbientSound::draw(DrawingContext &) +AmbientSound::draw(DrawingContext &) +{ +} + +void +AmbientSound::expose(HSQUIRRELVM vm, SQInteger table_idx) +{ + Scripting::AmbientSound* interface = static_cast (this); + expose_object(vm, table_idx, interface, name, false); +} + +void +AmbientSound::unexpose(HSQUIRRELVM vm, SQInteger table_idx) +{ + Scripting::unexpose_object(vm, table_idx, name); +} + +void +AmbientSound::set_pos(float x, float y) +{ + position.x = x; + position.y = y; +} + +float +AmbientSound::get_pos_x() const +{ + return position.x; +} + +float +AmbientSound::get_pos_y() const { + return position.y; } IMPLEMENT_FACTORY(AmbientSound, "ambient_sound");