basic sound support and added some rocking sounds
parent
e73b330429
commit
9809a7318b
|
@ -62,11 +62,22 @@ int Model::OnInit (int argc, char* argv[]) {
|
||||||
|
|
||||||
mPlayerName = "Player";
|
mPlayerName = "Player";
|
||||||
|
|
||||||
|
Engine::PlayMusic ("./data/sounds/intro_music.ogg");
|
||||||
|
|
||||||
|
Engine::RegisterListener (this, EventAccelerateStart);
|
||||||
|
Engine::RegisterListener (this, EventAccelerateStop);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Model::OnReceiveEvent (const Engine::EventBasePtr &event) {
|
bool Model::OnReceiveEvent (const Engine::EventBasePtr &event) {
|
||||||
switch (event->mEventType) {
|
switch (event->mEventType) {
|
||||||
|
case EventAccelerateStart:
|
||||||
|
Engine::PlaySoundLoop("./data/sounds/thrust.wav", -1);
|
||||||
|
break;
|
||||||
|
case EventAccelerateStop:
|
||||||
|
Engine::HaltSoundLoop("./data/sounds/thrust.wav");
|
||||||
|
break;
|
||||||
case EventLevelComplete:
|
case EventLevelComplete:
|
||||||
return OnLevelComplete();
|
return OnLevelComplete();
|
||||||
break;
|
break;
|
||||||
|
@ -415,6 +426,8 @@ void Model::OnKillEntity (const Engine::EntityBase *entity) {
|
||||||
GameEntityType entity_type = (GameEntityType) entity->mType;
|
GameEntityType entity_type = (GameEntityType) entity->mType;
|
||||||
|
|
||||||
if (entity_type == GameEntityTypeAsteroid) {
|
if (entity_type == GameEntityTypeAsteroid) {
|
||||||
|
Engine::PlaySound("./data/sounds/rock_destroyed.wav");
|
||||||
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
const AsteroidEntity *asteroid = static_cast<const AsteroidEntity*>(entity);
|
const AsteroidEntity *asteroid = static_cast<const AsteroidEntity*>(entity);
|
||||||
mPoints += 150 + asteroid->mSubAsteroidsCount * 75;
|
mPoints += 150 + asteroid->mSubAsteroidsCount * 75;
|
||||||
|
|
|
@ -126,6 +126,8 @@ void ShipEntity::Attack () {
|
||||||
rocket_physics->mOrientation = entity_physic->mOrientation;
|
rocket_physics->mOrientation = entity_physic->mOrientation;
|
||||||
rocket_physics->mVelocity = attack_dir.normalize();
|
rocket_physics->mVelocity = attack_dir.normalize();
|
||||||
rocket_physics->mVelocity *= ShipEntity::VarMaxSpeed.GetFloatValue() + 0.5;
|
rocket_physics->mVelocity *= ShipEntity::VarMaxSpeed.GetFloatValue() + 0.5;
|
||||||
|
|
||||||
|
Engine::PlaySound ("./data/sounds/laser.wav");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
music.ogg DJad - Space Exploration (retrieved by Jamendo, http://www.jamendo.com/en/artist/DJad)
|
||||||
|
laser_samples.wav 93979__cormi__laser_weapon_02.wav (http://www.freesound.org/samplesViewSingle.php?id=93979)
|
||||||
|
thrust.wav http://www.freesound.org/samplesViewSingle.php?id=78559
|
||||||
|
rock0.wav http://www.shockwave-sound.com/sound-effects/explosion%20sounds/damage.wav
|
||||||
|
laser0.wav http://www.nuedge.net/mightyshrimp/MyGame/FreeGameSounds/files/Ses_20050507_2009a_210.wav
|
||||||
|
laser1.wav http://www.nuedge.net/mightyshrimp/MyGame/FreeGameSounds/files/Ses_20050507_2009d_107.wav
|
||||||
|
laser2.wav http://www.nuedge.net/mightyshrimp/MyGame/FreeGameSounds/files/Ses_20050507_2009c_102_N.wav
|
||||||
|
laser3.wav http://www.nuedge.net/mightyshrimp/MyGame/FreeGameSounds/files/Ses_20050507_2009a_002.wav
|
Binary file not shown.
|
@ -3,13 +3,12 @@ CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
|
||||||
LIST( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake )
|
LIST( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake )
|
||||||
|
|
||||||
FIND_PACKAGE (SDL REQUIRED)
|
FIND_PACKAGE (SDL REQUIRED)
|
||||||
|
FIND_PACKAGE (SDL_mixer REQUIRED)
|
||||||
FIND_PACKAGE (OpenGL REQUIRED)
|
FIND_PACKAGE (OpenGL REQUIRED)
|
||||||
FIND_PACKAGE (PNG REQUIRED)
|
FIND_PACKAGE (PNG REQUIRED)
|
||||||
FIND_PACKAGE (FreeType2 REQUIRED)
|
FIND_PACKAGE (FreeType2 REQUIRED)
|
||||||
FIND_PACKAGE (Boost COMPONENTS filesystem REQUIRED)
|
FIND_PACKAGE (Boost COMPONENTS filesystem REQUIRED)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES (${Boost_INCLUDE_DIRS} )
|
|
||||||
|
|
||||||
ADD_SUBDIRECTORY ( libraries )
|
ADD_SUBDIRECTORY ( libraries )
|
||||||
|
|
||||||
SET ( ENGINE_SRCS
|
SET ( ENGINE_SRCS
|
||||||
|
@ -17,13 +16,14 @@ SET ( ENGINE_SRCS
|
||||||
ControllerBase.cc
|
ControllerBase.cc
|
||||||
EntityBase.cc
|
EntityBase.cc
|
||||||
EntityFactoryBase.cc
|
EntityFactoryBase.cc
|
||||||
|
EventBase.cc
|
||||||
GameEntityBase.cc
|
GameEntityBase.cc
|
||||||
ModelBase.cc
|
ModelBase.cc
|
||||||
|
OverlayBase.cc
|
||||||
PhysicsBase.cc
|
PhysicsBase.cc
|
||||||
PhysicsEntityBase.cc
|
PhysicsEntityBase.cc
|
||||||
|
SoundBase.cc
|
||||||
ViewBase.cc
|
ViewBase.cc
|
||||||
EventBase.cc
|
|
||||||
OverlayBase.cc
|
|
||||||
|
|
||||||
Commands.cc
|
Commands.cc
|
||||||
DrawingsGL.cc
|
DrawingsGL.cc
|
||||||
|
@ -40,6 +40,8 @@ SET ( ENGINE_SRCS
|
||||||
)
|
)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES (
|
INCLUDE_DIRECTORIES (
|
||||||
|
${Boost_INCLUDE_DIRS}
|
||||||
|
${SDLMIXER_INCLUDE_DIRS}
|
||||||
${PROJECT_SOURCE_DIR}
|
${PROJECT_SOURCE_DIR}
|
||||||
libraries/mathlib/
|
libraries/mathlib/
|
||||||
libraries/coll2d/include
|
libraries/coll2d/include
|
||||||
|
@ -55,6 +57,7 @@ ENDIF ( WIN32 )
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES ( Engine
|
TARGET_LINK_LIBRARIES ( Engine
|
||||||
${SDL_LIBRARY}
|
${SDL_LIBRARY}
|
||||||
|
${SDLMIXER_LIBRARY}
|
||||||
${OPENGL_LIBRARIES}
|
${OPENGL_LIBRARIES}
|
||||||
${PNG_LIBRARIES}
|
${PNG_LIBRARIES}
|
||||||
${Boost_LIBRARIES}
|
${Boost_LIBRARIES}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "PhysicsBase.h"
|
#include "PhysicsBase.h"
|
||||||
#include "CameraBase.h"
|
#include "CameraBase.h"
|
||||||
|
#include "SoundBase.h"
|
||||||
|
|
||||||
#include "ViewBase.h"
|
#include "ViewBase.h"
|
||||||
#include "ModelBase.h"
|
#include "ModelBase.h"
|
||||||
|
@ -69,12 +70,16 @@ int Engine::OnInit (int argc, char* argv[]) {
|
||||||
|
|
||||||
// Initialize the SDL
|
// Initialize the SDL
|
||||||
LogDebug ("Initializing SDL");
|
LogDebug ("Initializing SDL");
|
||||||
if ( SDL_Init ( SDL_INIT_VIDEO ) < 0) {
|
if ( SDL_Init ( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0) {
|
||||||
LogError ("Error initializing SDL: %s", SDL_GetError ());
|
LogError ("Error initializing SDL: %s", SDL_GetError ());
|
||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
SDL_WM_SetCaption("Engine Initializing","Engine Initializing");
|
SDL_WM_SetCaption("Engine Initializing","Engine Initializing");
|
||||||
|
|
||||||
|
/* Sound */
|
||||||
|
mSoundManager = new SoundBase();
|
||||||
|
mSoundManager->Init (argc, argv);
|
||||||
|
|
||||||
/* Model */
|
/* Model */
|
||||||
if (mModel == NULL)
|
if (mModel == NULL)
|
||||||
mModel = new ModelBase ();
|
mModel = new ModelBase ();
|
||||||
|
@ -160,6 +165,12 @@ int Engine::OnInit (int argc, char* argv[]) {
|
||||||
void Engine::OnDestroy () {
|
void Engine::OnDestroy () {
|
||||||
SetStatus (EngineStatusDestroying);
|
SetStatus (EngineStatusDestroying);
|
||||||
|
|
||||||
|
if (mSoundManager) {
|
||||||
|
mSoundManager->Destroy();
|
||||||
|
delete mSoundManager;
|
||||||
|
mSoundManager = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Quit the SDL
|
// Quit the SDL
|
||||||
SDL_Quit ();
|
SDL_Quit ();
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ class ControllerBase;
|
||||||
class PhysicsBase;
|
class PhysicsBase;
|
||||||
class EntityFactoryBase;
|
class EntityFactoryBase;
|
||||||
class EventManager;
|
class EventManager;
|
||||||
|
class SoundBase;
|
||||||
|
|
||||||
class Logging;
|
class Logging;
|
||||||
class Commands;
|
class Commands;
|
||||||
|
@ -69,6 +70,7 @@ class Engine : public Module {
|
||||||
mVariables = NULL;
|
mVariables = NULL;
|
||||||
mEntityFactory = NULL;
|
mEntityFactory = NULL;
|
||||||
mEventManager = NULL;
|
mEventManager = NULL;
|
||||||
|
mSoundManager = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void MainLoop () {
|
virtual void MainLoop () {
|
||||||
|
@ -110,6 +112,7 @@ class Engine : public Module {
|
||||||
PhysicsBase *mPhysics;
|
PhysicsBase *mPhysics;
|
||||||
EntityFactoryBase *mEntityFactory;
|
EntityFactoryBase *mEntityFactory;
|
||||||
EventManager *mEventManager;
|
EventManager *mEventManager;
|
||||||
|
SoundBase *mSoundManager;
|
||||||
|
|
||||||
Logging *mLogging;
|
Logging *mLogging;
|
||||||
Commands *mCommands;
|
Commands *mCommands;
|
||||||
|
@ -155,5 +158,6 @@ ControllerBase* EngineGetController ();
|
||||||
#include "ModelBaseGlobal.h"
|
#include "ModelBaseGlobal.h"
|
||||||
#include "ViewBaseGlobal.h"
|
#include "ViewBaseGlobal.h"
|
||||||
#include "EventBaseGlobal.h"
|
#include "EventBaseGlobal.h"
|
||||||
|
#include "SoundBaseGlobal.h"
|
||||||
|
|
||||||
#endif // _ENGINE_H
|
#endif // _ENGINE_H
|
||||||
|
|
|
@ -0,0 +1,199 @@
|
||||||
|
#include "SoundBase.h"
|
||||||
|
#include "SoundBaseGlobal.h"
|
||||||
|
|
||||||
|
namespace Engine {
|
||||||
|
|
||||||
|
static SoundBase* SoundInstance = NULL;
|
||||||
|
|
||||||
|
/* Sound Sample */
|
||||||
|
SoundSample::~SoundSample() {
|
||||||
|
Stop();
|
||||||
|
|
||||||
|
Mix_FreeChunk(mMixChunk);
|
||||||
|
mMixChunk = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SoundSample::Load (const std::string &filename) {
|
||||||
|
assert (mMixChunk == NULL);
|
||||||
|
|
||||||
|
LogDebug("Loading SoundSample %s", filename.c_str());
|
||||||
|
mMixChunk = Mix_LoadWAV(filename.c_str());
|
||||||
|
|
||||||
|
if (mMixChunk == NULL) {
|
||||||
|
LogError("Loading of SoundSample %s failed: %s", filename.c_str(), Mix_GetError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoundSample::Play() {
|
||||||
|
mChannel = Mix_PlayChannel(-1, mMixChunk, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoundSample::Loop(int count) {
|
||||||
|
mChannel = Mix_PlayChannel(-1, mMixChunk, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoundSample::Stop() {
|
||||||
|
if (mChannel != -1)
|
||||||
|
Mix_HaltChannel(mChannel);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SoundBase::OnInit(int argc, char* argv[]) {
|
||||||
|
SoundInstance = this;
|
||||||
|
|
||||||
|
int audio_rate = 22050;
|
||||||
|
Uint16 audio_format = AUDIO_S16;
|
||||||
|
int audio_channels = 2;
|
||||||
|
int audio_buffers = 4096;
|
||||||
|
|
||||||
|
LogDebug("Sound Init");
|
||||||
|
if (Mix_OpenAudio (audio_rate, audio_format, audio_channels, audio_buffers)) {
|
||||||
|
LogError ("Unable to initialize the sound system!");
|
||||||
|
}
|
||||||
|
|
||||||
|
Mix_QuerySpec (&audio_rate, &audio_format, &audio_channels);
|
||||||
|
LogDebug("Sound: rate: %d channels: %d format: %d", audio_rate, audio_channels, audio_format);
|
||||||
|
|
||||||
|
mCurrentMusicName = "";
|
||||||
|
mCurrentMusic = NULL;
|
||||||
|
|
||||||
|
Mix_VolumeMusic(MIX_MAX_VOLUME/2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoundBase::OnDestroy() {
|
||||||
|
LogDebug ("Sound Destroy");
|
||||||
|
Mix_CloseAudio();
|
||||||
|
|
||||||
|
SoundInstance = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Module specific functions */
|
||||||
|
void SoundBase::PlaySound (const std::string &sound_name) {
|
||||||
|
if (!SoundInstance) {
|
||||||
|
LogError("Could not play sound %s: sound system not initialized!",
|
||||||
|
sound_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SampleIter iter = mSamples.find(sound_name);
|
||||||
|
|
||||||
|
if (iter == mSamples.end()) {
|
||||||
|
SoundSamplePtr sample (new SoundSample);
|
||||||
|
sample->Load(sound_name);
|
||||||
|
mSamples[sound_name] = sample;
|
||||||
|
|
||||||
|
iter = mSamples.find(sound_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
iter->second->Play();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoundBase::PlaySoundLoop (const std::string &sound_name, int count) {
|
||||||
|
if (!SoundInstance) {
|
||||||
|
LogError("Could not play sound %s: sound system not initialized!",
|
||||||
|
sound_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SampleIter iter = mSamples.find(sound_name);
|
||||||
|
|
||||||
|
if (iter == mSamples.end()) {
|
||||||
|
SoundSamplePtr sample (new SoundSample);
|
||||||
|
sample->Load(sound_name);
|
||||||
|
mSamples[sound_name] = sample;
|
||||||
|
|
||||||
|
iter = mSamples.find(sound_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
iter->second->Loop(count);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoundBase::HaltSoundLoop (const std::string &sound_name) {
|
||||||
|
if (!SoundInstance) {
|
||||||
|
LogError("Could not play sound %s: sound system not initialized!",
|
||||||
|
sound_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SampleIter iter = mSamples.find(sound_name);
|
||||||
|
|
||||||
|
if (iter == mSamples.end()) {
|
||||||
|
SoundSamplePtr sample (new SoundSample);
|
||||||
|
sample->Load(sound_name);
|
||||||
|
mSamples[sound_name] = sample;
|
||||||
|
|
||||||
|
iter = mSamples.find(sound_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
iter->second->Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoundBase::PlayMusic (const std::string &music_name) {
|
||||||
|
if (!SoundInstance) {
|
||||||
|
LogError("Could not play music %s: sound system not initialized!",
|
||||||
|
music_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (music_name == mCurrentMusicName)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (mCurrentMusic) {
|
||||||
|
Mix_HaltMusic();
|
||||||
|
Mix_FreeMusic(mCurrentMusic);
|
||||||
|
mCurrentMusic = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogDebug("Loading Music %s", music_name.c_str());
|
||||||
|
mCurrentMusic = Mix_LoadMUS(music_name.c_str());
|
||||||
|
|
||||||
|
if (mCurrentMusic == NULL) {
|
||||||
|
LogError("Loading of Music failed: %s", Mix_GetError());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mix_PlayMusic(mCurrentMusic, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global Functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
void PlaySound (const std::string &sound_name) {
|
||||||
|
if (!SoundInstance) {
|
||||||
|
LogError("Could not play sound %s: sound system not initialized!",
|
||||||
|
sound_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SoundInstance->PlaySound(sound_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayMusic (const std::string &music_name) {
|
||||||
|
if (!SoundInstance) {
|
||||||
|
LogError("Could not play sound %s: sound system not initialized!",
|
||||||
|
music_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SoundInstance->PlayMusic(music_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlaySoundLoop (const std::string &sound_name, int count) {
|
||||||
|
if (!SoundInstance) {
|
||||||
|
LogError("Could not play sound loop %s: sound system not initialized!",
|
||||||
|
sound_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SoundInstance->PlaySoundLoop(sound_name, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HaltSoundLoop (const std::string &sound_name) {
|
||||||
|
if (!SoundInstance) {
|
||||||
|
LogError("Could not halt sound %s: sound system not initialized!",
|
||||||
|
sound_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SoundInstance->HaltSoundLoop(sound_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
|
@ -0,0 +1,56 @@
|
||||||
|
#ifndef _SOUNDBASE_H
|
||||||
|
#define _SOUNDBASE_H
|
||||||
|
|
||||||
|
#include "Engine.h"
|
||||||
|
#include <SDL/SDL_mixer.h>
|
||||||
|
|
||||||
|
namespace Engine {
|
||||||
|
|
||||||
|
class Module;
|
||||||
|
|
||||||
|
class SoundSample {
|
||||||
|
public:
|
||||||
|
SoundSample() :
|
||||||
|
mMixChunk (NULL),
|
||||||
|
mChannel (-1) {
|
||||||
|
}
|
||||||
|
~SoundSample();
|
||||||
|
|
||||||
|
bool Load(const std::string &filename);
|
||||||
|
void Play();
|
||||||
|
void Loop(int count);
|
||||||
|
void Stop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int mChannel;
|
||||||
|
Mix_Chunk *mMixChunk;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef boost::shared_ptr<SoundSample> SoundSamplePtr;
|
||||||
|
|
||||||
|
/** \brief Manages loading, saving and playing of sounds and music
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class SoundBase : public Module {
|
||||||
|
public:
|
||||||
|
void PlaySound (const std::string &sound_name);
|
||||||
|
void PlaySoundLoop (const std::string &sound_name, int count);
|
||||||
|
void HaltSoundLoop (const std::string &sound_name);
|
||||||
|
void PlayMusic (const std::string &music_name);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** \brief Initializes the system */
|
||||||
|
virtual int OnInit (int argc, char* argv[]);
|
||||||
|
/** \brief Destroys the system (must be called!) */
|
||||||
|
virtual void OnDestroy ();
|
||||||
|
|
||||||
|
std::string mCurrentMusicName;
|
||||||
|
Mix_Music *mCurrentMusic;
|
||||||
|
|
||||||
|
std::map<std::string, SoundSamplePtr> mSamples;
|
||||||
|
typedef std::map<std::string, SoundSamplePtr>::iterator SampleIter;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _SOUNDBASE_H
|
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef _SOUNDGLOBAL_H
|
||||||
|
#define _SOUNDGLOBAL_H
|
||||||
|
|
||||||
|
namespace Engine {
|
||||||
|
|
||||||
|
void PlaySound (const std::string &sound_name);
|
||||||
|
void PlaySoundLoop (const std::string &sound_name, int count);
|
||||||
|
void HaltSoundLoop (const std::string &sound_name);
|
||||||
|
void PlayMusic (const std::string &music_name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _SOUNDGLOBAL_H */
|
Loading…
Reference in New Issue