X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fambient_sound.cpp;h=bec0d9cfe654365028ddead5521a769366535f2e;hb=954adaf2af9284945185e58d8017041ea1ff4868;hp=ea7a9aa0f111a1bad50969f76da06c1cd46d6ea2;hpb=523d415707de9f777729534f467779d4c5acdf6e;p=supertux.git diff --git a/src/object/ambient_sound.cpp b/src/object/ambient_sound.cpp index ea7a9aa0f..bec0d9cfe 100644 --- a/src/object/ambient_sound.cpp +++ b/src/object/ambient_sound.cpp @@ -30,6 +30,10 @@ 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; @@ -38,14 +42,22 @@ AmbientSound::AmbientSound(const lisp::Lisp& lisp) 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 @@ -55,7 +67,6 @@ AmbientSound::AmbientSound(const lisp::Lisp& lisp) playing=-1; // not playing at the beginning latency=0; - } AmbientSound::~AmbientSound() { @@ -88,23 +99,49 @@ AmbientSound::update(float deltat) { if (latency--<=0) { - float dx=Sector::current()->player->get_pos().x-position.x; - float dy=Sector::current()->player->get_pos().y-position.y; - float sqrdistance=dx*dx+dy*dy; + 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) { + + // set the volume Mix_Volume(playing,(int)(currentvolume*maximumvolume*MIX_MAX_VOLUME)); - if (sqrdistance>=silence_distance && currentvolume<0.05) + + if (sqrdistance>=silence_distance && currentvolume<1e-3) stop_playing(); latency=0; } else { @@ -112,13 +149,16 @@ AmbientSound::update(float deltat) start_playing(); latency=0; } - else - latency=(int)(10*((sqrdistance-silence_distance)/silence_distance)); + else // set a reasonable latency + latency=(int)(0.001/distance_factor); + //(int)(10*((sqrdistance-silence_distance)/silence_distance)); } + } - } - if (latency>0.001/distance_factor) - latency=(int)(0.001/distance_factor); + // heuristically measured "good" latency maximum + + // if (latency>0.001/distance_factor) + // latency= } void