// Play de un sonido no localizado (volumen constante) void SoundMan::playSound(const std::string& name) const { if(soundExists(name)) { Mix_Chunk* m = sound_map.find(name)->second; Mix_VolumeChunk(m, MIX_MAX_VOLUME); // Setteamos el volumen // Play Mix_PlayChannel(-1, m, 0); }else{ std::stringstream ss; ss << "Error, invalid sound <" << name << "> requested\n"; err_log.escribir(ss.str()); } }
// Agrega el recurso con nombre name ubicado en el path dado por path // Devuelve true o false y loggea en caso de error bool SoundMan::addSound(const std::string& name, const std::string& path) { if(soundExists(name)) { std::cerr << "Error loading " << name << "; resource already exists\n"; return false; } Mix_Chunk* m = Mix_LoadWAV(path.c_str()); if(m == NULL) { std::cerr << "Error loading <" << name << ">: " << path << "\n"; std::cerr << "Err: " << Mix_GetError() << "\n"; return false; }else{ sound_map[name] = m; } return true; }
// Devuelve un puntero a la Surface asociada con name void SoundMan::playSound(const std::string& name, int source_x, int source_y) const { if(soundExists(name)) { Mix_Chunk* m = sound_map.find(name)->second; // Cambiamos el volumen de acuerdo a la distancia con el personaje int v = int(MIX_MAX_VOLUME - ( float(MIX_MAX_VOLUME) / float(this->MAX_AUDIBLE_DISTANCE) * ::distance<float>(source_x, source_y, pjl->getX(), pjl->getY()) )); if(v < 0) v = 0; // Cap por menor //std::cout << "Sound: " << name << "\n"; //std::cout << "Source: (" << source_x << "," << source_y << ")\n"; //std::cout << "Listener: (" << pjl->getX() << "," << pjl->getY() << ")\n"; //std::cout << "Distance: " << ::distance<float>(source_x, source_y, pjl->getX(), pjl->getY()) << "\n"; //std::cout << "Sound volume: " << v << "\n"; Mix_VolumeChunk(m, v); // Play Mix_PlayChannel(-1, m, 0); }else{ std::stringstream ss; ss << "Error, invalid sound <" << name << "> requested\n"; err_log.escribir(ss.str()); } }
int RosalilaSound::playSound(std::string variable, int channel, int loops, int panning, bool uses_camera) { if(!soundExists(variable)) { rosalila()->utility->writeLogLine("Error: "+variable+" sound does not exists."); return -1; } if(sounds[variable]!=NULL) { int return_channel = Mix_PlayChannel( channel, sounds[variable], loops); if(panning != 0) { if(uses_camera) panning -= rosalila()->graphics->camera_x; int left = panning*255/rosalila()->graphics->screen_width; Mix_SetPanning(return_channel, 254 - left, left); } return return_channel; } return -1; }