X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fambient_sound.cpp;h=bec0d9cfe654365028ddead5521a769366535f2e;hb=954adaf2af9284945185e58d8017041ea1ff4868;hp=e50e946f59874382cca34d068c0947aac086033d;hpb=a21fb5079827ea71ff263a6ad3311b89976b445e;p=supertux.git diff --git a/src/object/ambient_sound.cpp b/src/object/ambient_sound.cpp index e50e946f5..bec0d9cfe 100644 --- a/src/object/ambient_sound.cpp +++ b/src/object/ambient_sound.cpp @@ -30,26 +30,48 @@ AmbientSound::AmbientSound(const lisp::Lisp& lisp) position.x=0; position.y=0; + + dimension.x=0; + dimension.y=0; + distance_factor=0; distance_bias=0; + maximumvolume=1; sample=""; if (!(lisp.get("x", position.x)&&lisp.get("y", position.y))) { std::cerr << "No Position in ambient_sound" << std::endl; } + + lisp.get("width" , dimension.x); + lisp.get("height", dimension.y); + lisp.get("distance_factor",distance_factor); lisp.get("distance_bias" ,distance_bias ); lisp.get("sample" ,sample ); + lisp.get("volume" ,maximumvolume ); + + // square all distances (saves us a sqrt later) + + distance_bias*=distance_bias; + distance_factor*=distance_factor; + + // set default silence_distance if (distance_factor == 0) silence_distance = 10e99; else - silence_distance = distance_factor*10e2; + silence_distance = 1/distance_factor; + + lisp.get("silence_distance",silence_distance); - playing=0; - startPlaying(); + playing=-1; // not playing at the beginning + latency=0; } +AmbientSound::~AmbientSound() { + stop_playing(); +} void AmbientSound::hit(Player& ) @@ -57,7 +79,15 @@ AmbientSound::hit(Player& ) } void -AmbientSound::startPlaying() +AmbientSound::stop_playing() { + if (playing>=0) { + Mix_HaltChannel(playing); + playing=-1; + } +} + +void +AmbientSound::start_playing() { playing=sound_manager->play_sound(sample,-1); Mix_Volume(playing,0); @@ -65,24 +95,70 @@ AmbientSound::startPlaying() } void -AmbientSound::action(float) +AmbientSound::update(float deltat) { - float dx=Sector::current()->player->get_pos().x-position.x; - float dy=Sector::current()->player->get_pos().y-position.y; - float distance=sqrt(dx*dx+dy*dy); + 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; + + // Relate to which point in the area + + rx=px=0) { - distance-=distance_bias; + // set the volume + Mix_Volume(playing,(int)(currentvolume*maximumvolume*MIX_MAX_VOLUME)); - if (distance<0) - distance=0; + if (sqrdistance>=silence_distance && currentvolume<1e-3) + stop_playing(); + latency=0; + } else { + if (sqrdistance0.001/distance_factor) + // latency= } void