From 97f96883038d74cca7250ed468c49479eff9f7bc Mon Sep 17 00:00:00 2001 From: Stiffly Date: Tue, 29 Sep 2015 13:41:50 +0200 Subject: [PATCH 1/4] deleted .orig --- src/game/Game/LevelSystem.cpp.orig | 372 ---------------------------- src/game/Game/PadSystem.cpp.orig | 313 ----------------------- src/game/Sound/SoundSystem.cpp.orig | 183 -------------- 3 files changed, 868 deletions(-) delete mode 100644 src/game/Game/LevelSystem.cpp.orig delete mode 100755 src/game/Game/PadSystem.cpp.orig delete mode 100644 src/game/Sound/SoundSystem.cpp.orig diff --git a/src/game/Game/LevelSystem.cpp.orig b/src/game/Game/LevelSystem.cpp.orig deleted file mode 100644 index b1d1139..0000000 --- a/src/game/Game/LevelSystem.cpp.orig +++ /dev/null @@ -1,372 +0,0 @@ -// -// Created by Adniklastrator on 2015-09-09. -// - - -#include "PrecompiledHeader.h" -#include "Game/LevelSystem.h" - - -void dd::Systems::LevelSystem::Initialize() -{ - EVENT_SUBSCRIBE_MEMBER(m_EContact, LevelSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::OnLifeLost); - EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::OnScoreEvent); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::OnMultiBall); - EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, LevelSystem::OnCreatePowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, LevelSystem::OnPowerUpTaken); - EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, LevelSystem::OnStageCleared); - - for (int i = 0; i < Lives(); i++) { - CreateLife(i); - } - - return; -} - -void dd::Systems::LevelSystem::CreateLife(int number) -{ - auto life = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(life); - transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); - transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); - - std::shared_ptr lifeNr = m_World->AddComponent(life); - lifeNr->Number = number; - - auto model = m_World->AddComponent(life); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - - m_World->CommitEntity(life); -} - -void dd::Systems::LevelSystem::Update(double dt) -{ - if (!m_Initialized) { - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); - m_Initialized = true; - } - - if (Lives() < 0) - { - SetLives(3); - Events::GameOver e; - EventBroker->Publish(e); - } -} - -void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - auto ball = m_World->GetComponent(entity); - - if (ball != nullptr) { - auto transformBall = m_World->GetComponent(entity); - if (glm::abs(transformBall->Velocity.y) < 2) { - if (transformBall->Velocity.y > 0) { - transformBall->Velocity.y = 2; - } else { - transformBall->Velocity.y = -2; - } - } - if (transformBall->Position.y < -EdgeY() - 4) { - if (MultiBalls() != 0) { - SetMultiBalls(MultiBalls() - 1); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - } else if (Lives() == PastLives()) { - Events::ResetBall be; - EventBroker->Publish(be); - Events::LifeLost e; - e.Entity = entity; - EventBroker->Publish(e); - return; - } - } else if (transformBall->Position.x > EdgeX()) { - if (transformBall->Velocity.x > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.x < -EdgeX()) { - if (transformBall->Velocity.x < 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(-1, 0)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } else if (transformBall->Position.y > EdgeY()) { - if (transformBall->Velocity.y > 0) { - glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(0, 1)); - transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); - } - } - } - - if (Lives() != PastLives()) { - auto life = m_World->GetComponent(entity); - if (life != nullptr) { - if (life->Number + 1 == PastLives()) { -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - SetPastLives(Lives()); - } - } - } - if (NumberOfBricks() <= 0) { - /*SetRestarting(true); - if (MultiBalls() <= 0 && PowerUps() <= 0) { - Events::ResetBall e; - EventBroker->Publish(e); - Events::ScoreEvent es; - es.Score = 500; - EventBroker->Publish(es); - Events::StageCleared ec; - EventBroker->Publish(ec); - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); - } else { - if (ball != nullptr && MultiBalls() > 0) { - SetMultiBalls(MultiBalls() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - auto transformBall = m_World->GetComponent(entity); - } else { - auto powerUp = m_World->GetComponent(entity); - if (powerUp != nullptr) { - SetPowerUps(PowerUps() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveEntity(entity); - } - } - }*/ - } -} - -void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 spacesBetweenBricks, float spaceToEdge) -{ - SetNumberOfBricks(rows * lines); - std::cout << "You're only doing this once, right?" << std::endl; - int num = 0; - for (int i = 0; i < rows; i++) { - num++; - for (int j = 0; j < Lines(); j++) { - CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num); - } - if (num == 7) - num = 0; - } - - SetNumberOfBricks(rows * lines); - SetRestarting(false); - return; -} - -void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBetweenBricks, float spaceToEdge, int num) -{ - auto brick = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(brick); - auto model = m_World->AddComponent(brick); - std::shared_ptr cBrick = m_World->AddComponent(brick); - std::shared_ptr cRec = m_World->AddComponent(brick); - std::shared_ptr cPhys = m_World->AddComponent(brick); - cPhys->Static = false; - cPhys->GravityScale = 0.f; - cPhys->Category = CollisionLayer::Type::Brick; - cPhys->Mask = CollisionLayer::Type::Ball; - - std::string fileName = "Textures/Bricks/"; - fileName.append(std::to_string(num)); - fileName.append(".png"); - //sprite->SpriteFile = fileName; - model->ModelFile = "Models/Test/Brick/Brick.obj"; - if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 6 && row == 6)) { - std::shared_ptr cPow = m_World->AddComponent(brick); - } - float x = line * spacesBetweenBricks.x; - float y = row * spacesBetweenBricks.y; - transform->Scale = glm::vec3(0.8, 0.2, 0.2); - transform->Position = glm::vec3(x - 3, 5 - spaceToEdge - y , -10.f); - cBrick->Score = 10 * num; - - //sound - auto collisionSound = m_World->AddComponent(brick); - collisionSound->filePath = "Sounds/Brick/shortbrickbreak.wav"; - - m_World->CommitEntity(brick); - return; -} - -void dd::Systems::LevelSystem::ProcessCollision() -{ - // Like, go into brick component and check what it does upon collision. Maybe not done here? - return; -} - -void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) -{ - auto brick = m_World->GetComponent(entity); - if (brick != nullptr) { - SetNumberOfBricks(NumberOfBricks() - 1); - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - /*if (numberOfBricks < 1) { - EndLevel(); - }*/ - } - return; -} - -bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) -{ - EntityID entityBrick; - EntityID entityBall; - auto ball = m_World->GetComponent(event.Entity2); - auto brick = m_World->GetComponent(event.Entity1); - if (brick != nullptr) { - entityBrick = event.Entity1; - } else { - brick = m_World->GetComponent(event.Entity2); - if (brick != nullptr) { - entityBrick = event.Entity2; - } else { - return false; - } - } - if (ball != nullptr) { - entityBall = event.Entity2; - } else { - ball = m_World->GetComponent(event.Entity1); - if (ball != nullptr) { - entityBall = event.Entity1; - } else { - return false; - } - } - - brick = m_World->GetComponent(entityBrick); - if (brick == nullptr) { - return false; - } - - auto power = m_World->GetComponent(entityBrick); - if (power != nullptr) { - Events::CreatePowerUp e; - auto transform = m_World->GetComponent(entityBrick); - e.Position = transform->Position; - EventBroker->Publish(e); - } - - if (ball != nullptr && Restarting() == false) { - auto ballTransform = m_World->GetComponent(entityBall); - -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveEntity(entityBrick); - - auto physicsComponent = m_World->GetComponent(entityBrick); - physicsComponent->GravityScale = 1.f; - physicsComponent->Mask = CollisionLayer::Type::Water | CollisionLayer::Type::Wall; - - auto transformComponentBrick = m_World->GetComponent(entityBrick); - auto transformComponentBall = m_World->GetComponent(entityBall); - - Events::SetImpulse e; - e.Entity = entityBrick; - - glm::vec2 point = glm::vec2(transformComponentBrick->Position.x + ((transformComponentBrick->Position.x - transformComponentBall->Position.x)/4), transformComponentBrick->Position.y + ((transformComponentBrick->Position.y - transformComponentBall->Position.y )/4)); - - e.Impulse = glm::normalize(point)/2.f; - e.Point = point; - EventBroker->Publish(e); - //TODO: Bricks dont collide with walls D= - - SetNumberOfBricks(NumberOfBricks() - 1); - if (NumberOfBricks() <= 0) { - SetMultiBalls(MultiBalls() + 1); - } - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - -<<<<<<< HEAD - // std::cout << NumberOfBricks() << std::endl; -======= - //std::cout << NumberOfBricks() << std::endl; ->>>>>>> origin/master - //std::cout << "Score: " << Score() << std::endl; - } - - return true; -} - -bool dd::Systems::LevelSystem::OnLifeLost(const dd::Events::LifeLost &event) -{ - SetLives(Lives() - 1); - - return true; -} - -bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) -{ - SetScore(Score() += event.Score); - - return true; -} - -bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) -{ - SetMultiBalls(MultiBalls()+2); -} - -bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp &event) -{ - SetPowerUps(PowerUps() + 1); - auto powerUp = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(powerUp); - auto model = m_World->AddComponent(powerUp); - std::shared_ptr cRec = m_World->AddComponent(powerUp); - std::shared_ptr cPhys = m_World->AddComponent(powerUp); - cPhys->Static = false; - cPhys->Category = CollisionLayer::Type::PowerUp; - cPhys->Mask = CollisionLayer::Type::Pad; - - std::shared_ptr cPow = m_World->AddComponent(powerUp); - - - transform->Position = event.Position; - transform->Scale = glm::vec3(0.2, 0.2, 0.2); - transform->Velocity = glm::vec3(0, -4, 0); - - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - m_World->CommitEntity(powerUp); - - return true; -} - -bool dd::Systems::LevelSystem::OnPowerUpTaken(const dd::Events::PowerUpTaken &event) -{ - SetPowerUps(PowerUps() - 1); - return true; -} - -bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &event) -{ - return true; -} - -void dd::Systems::LevelSystem::EndLevel() -{ - Events::StageCleared e; - EventBroker->Publish(e); - return; -} - diff --git a/src/game/Game/PadSystem.cpp.orig b/src/game/Game/PadSystem.cpp.orig deleted file mode 100755 index 7d21606..0000000 --- a/src/game/Game/PadSystem.cpp.orig +++ /dev/null @@ -1,313 +0,0 @@ -// -// Created by Adniklastrator on 2015-09-10. -// - -#include "PrecompiledHeader.h" -#include "Game/PadSystem.h" -#include "Core/World.h" -#include -#include -#include - - -void dd::Systems::PadSystem::Initialize() -{ - Events::BindKey r; - r.KeyCode = GLFW_KEY_RIGHT; - r.Command = "right"; - EventBroker->Publish(r); - - Events::BindKey l; - l.KeyCode = GLFW_KEY_LEFT; - l.Command = "left"; - EventBroker->Publish(l); - - EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PadSystem::OnKeyDown); - EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PadSystem::OnKeyUp); - EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_EContactPowerUp, &PadSystem::OnContactPowerUp); - EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); - EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &PadSystem::OnMultiBall); - EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PadSystem::OnStageCleared); -} - -void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) -{ - auto ball = m_World->GetComponent(entity); - if (ball != nullptr) { - if (ReplaceBall() == true) { - SetReplaceBall(false); - - auto transform = m_World->GetComponent(entity); - transform->Position = glm::vec3(0.0f, 0.26f, -10.f); - transform->Velocity = glm::vec3(0.0f, -ball->Speed, 0.f); - } - } -} - -void dd::Systems::PadSystem::Update(double dt) -{ - if (Entity() == 0) { - for (auto it = m_World->GetEntities()->begin(); it != m_World->GetEntities()->end(); it++) { - if (m_World->GetProperty(it->first, "Name") == "Pad") { - SetEntity(it->first); - SetTransform(m_World->GetComponent(Entity())); - SetPad(m_World->GetComponent(Entity())); - break; - } - } - } - - auto transform = Transform(); - auto pad = Pad(); - auto acceleration = Acceleration(); - - if (transform->Velocity.x < -pad->MaxSpeed) { - transform->Velocity.x = -pad->MaxSpeed; - } - else if (transform->Velocity.x > pad->MaxSpeed) { - transform->Velocity.x = pad->MaxSpeed; - } - transform->Position += transform->Velocity * (float)dt; - transform->Velocity += acceleration * (float)dt; - transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float)dt; - - - if (Left()) { - acceleration.x = -pad->AccelerationSpeed; -<<<<<<< HEAD - } - else if (Right()) { -======= - } else if (Right()) { ->>>>>>> 72413dc0a93bd3a2f6ab9fa7e19bbc3b846232db - acceleration.x = pad->AccelerationSpeed; - } else { - acceleration.x = 0.f; - } - - SetTransform(transform); - SetPad(pad); - SetAcceleration(acceleration); - - if (MultiBall() == true) { - SetMultiBall(false); - - Events::MultiBall e; - e.padTransform = transform; - EventBroker->Publish(e); - } - - return; -} - -EntityID dd::Systems::PadSystem::CreateBall() -{ - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.5f, 0.26f, -10.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - //auto pointlight = m_World->AddComponent(ent); - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr cball = m_World->AddComponent(ent); - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - - cball->Speed = 10; - - m_World->CommitEntity(ent); - - return ent; -} - -bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) -{ - int val = event.KeyCode; - if (val == GLFW_KEY_UP) { - //std::cout << "Up!" << std::endl; - } else if (val == GLFW_KEY_DOWN) { - //std::cout << "Down!" << std::endl; - } else if (val == GLFW_KEY_LEFT) { - //std::cout << "Left!" << std::endl; - //acceleration.x = -0.01f; - SetLeft(true); - } else if (val == GLFW_KEY_RIGHT) { - //std::cout << "Right!" << std::endl; - //acceleration.x = 0.01f; - SetRight(true); - } else if (val == GLFW_KEY_R) { - SetReplaceBall(true); - } else if (val == GLFW_KEY_M) { - SetMultiBall(true); - } else if (val == GLFW_KEY_D) { - return false; - } - return true; -} - -bool dd::Systems::PadSystem::OnKeyUp(const dd::Events::KeyUp &event) -{ - int val = event.KeyCode; - if (val == GLFW_KEY_UP) { - - } else if (val == GLFW_KEY_DOWN) { - - } else if (val == GLFW_KEY_LEFT) { - SetLeft(false); - } else if (val == GLFW_KEY_RIGHT) { - SetRight(false); - } - return true; -} - -bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) -{ - /* - EntityID entityBall = event.Entity2; - auto ball = m_World->GetComponent(entityBall); - if (ball == NULL) { - return false; - } - EntityID entityPad = event.Entity1; - auto pad = m_World->GetComponent(entityPad); - if (pad == NULL) { - return false; - } - auto transformBall = m_World->GetComponent(entityBall); - auto transformPad = m_World->GetComponent(entityPad); - - float movementMultiplier = 0.5f; - - //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; - //float movementY = glm::cos((abs(movementX) / (3.2f * movementMultiplier)) * 3.14159265359f / 2) * 2.f; - if (whatX > 0) { - movementX = movementMultiplier * whatX; - //std::cout << "Right!" << std::endl; - } else { - movementX = movementMultiplier * whatX; - //std::cout << "Left!" << std::endl; - } - - // std::cout << movementX << " " << movementY << std::endl; - - //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; -<<<<<<< HEAD - float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2) + 1; -======= - float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2)+ 0.2; ->>>>>>> 72413dc0a93bd3a2f6ab9fa7e19bbc3b846232db - - //std::cout << movementX << " " << movementY << std::endl; - - float len = glm::length(transformBall->Velocity); - //auto pointlight = m_World->AddComponent(ent); - - - transformBall->Velocity += glm::vec3(transformPad->Velocity.x, 0, 0); - transformBall->Velocity = glm::normalize(transformBall->Velocity) * len; - - - //transform->Velocity = glm::vec3(movementX, movementY, 0.f); - */ -} - -bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) -{ - EntityID entityPower; - EntityID entityPad; - auto powerUp = m_World->GetComponent(event.Entity1); - auto pad = m_World->GetComponent(event.Entity2); - if (powerUp != nullptr) { - entityPower = event.Entity1; - } else { - powerUp = m_World->GetComponent(event.Entity2); - if (powerUp != nullptr) { - entityPower = event.Entity2; - } - } - if (pad != nullptr) { - entityPad = event.Entity2; - } else { - pad = m_World->GetComponent(event.Entity1); - if (pad != nullptr) { - entityPad = event.Entity1; - } - } - - if (entityPower == NULL || entityPad == NULL) { - return false; - } - - pad = m_World->GetComponent(entityPad); - if (pad == nullptr) { - return false; - } - - m_World->RemoveComponent(entityPower); - m_World->RemoveComponent(entityPower); - m_World->RemoveComponent(entityPower); - m_World->RemoveEntity(entityPower); - Events::PowerUpTaken ep; - ep.Name = "Something"; - EventBroker->Publish(ep); - - Events::MultiBall e; - auto transform = m_World->GetComponent(entityPad); - e.padTransform = transform; - EventBroker->Publish(e); - return true; -} - -bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) -{ - SetReplaceBall(true); - return true; -} - -bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) -{ - auto ent1 = CreateBall(); - auto ent2 = CreateBall(); - auto transform1 = m_World->GetComponent(ent1); - auto transform2 = m_World->GetComponent(ent2); - auto ball1 = m_World->GetComponent(ent1); - auto ball2 = m_World->GetComponent(ent2); - auto padTransform = event.padTransform; - float x1 = padTransform->Position.x - 2, x2 = padTransform->Position.x + 2; - if (x1 < -3.1) { - x1 = 3; - } - if (x2 > 3.1) { - x2 = -3; - } - transform1->Position = glm::vec3(x1, -5.5, -10); - transform2->Position = glm::vec3(x2, -5.5, -10); - - transform1->Velocity = glm::normalize(glm::vec3(5, 5 ,0.f)) * ball1->Speed; - transform2->Velocity = glm::normalize(glm::vec3(-5, 5 ,0.f)) * ball2->Speed; - - return true; -} - -bool dd::Systems::PadSystem::OnStageCleared(const dd::Events::StageCleared &event) -{ - auto entity = CreateBall(); - return true; -} - -bool dd::Systems::PadSystem::PadSteeringInputController::OnCommand(const Events::InputCommand &event) -{ - std::string command = event.Command; - - std::cout << "Command!" << std::endl; - - if (command == "right") { - std::cout << "Right!" << std::endl; - } else if (command == "left") { - std::cout << "Left!" << std::endl; - } - - return true; -} \ No newline at end of file diff --git a/src/game/Sound/SoundSystem.cpp.orig b/src/game/Sound/SoundSystem.cpp.orig deleted file mode 100644 index bc7e9b3..0000000 --- a/src/game/Sound/SoundSystem.cpp.orig +++ /dev/null @@ -1,183 +0,0 @@ -#include "PrecompiledHeader.h" -#include "Sound/SoundSystem.h" - -dd::Systems::SoundSystem::~SoundSystem() -{ - alcCloseDevice(m_Device); -}; - -void dd::Systems::SoundSystem::Initialize() -{ - //initialize OpenAL - m_Device = alcOpenDevice(NULL); - ALCcontext* context; - - if (m_Device) { - context = alcCreateContext(m_Device, NULL); - alcMakeContextCurrent(context); - } - else { - LOG_ERROR("OpenAL failed to initialize."); - } - alGetError(); - - //Subscribe to events - EVENT_SUBSCRIBE_MEMBER(m_EContact, &SoundSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_EPlaySFX, &SoundSystem::OnPlaySound); - EVENT_SUBSCRIBE_MEMBER(m_EStopSound, &SoundSystem::OnStopSound); - EVENT_SUBSCRIBE_MEMBER(m_EMasterVolume, &SoundSystem::OnMasterVolume); - -<<<<<<< HEAD - //Todo: Move this - { - dd::Events::PlaySound e; - e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; - e.IsAmbient = true; - EventBroker->Publish(e); - } - { - dd::Events::PlaySound e; - e.FilePath = "Sounds/BGM/water-flowing.wav"; - e.Gain = 0.3f; - e.IsAmbient = true; - EventBroker->Publish(e); - } -======= - - ->>>>>>> origin/master -} - -void dd::Systems::SoundSystem::Update(double dt) -{ - //Clean up none-active sources - //Only used for SFX's. BGM's are handled on stop sound. - std::vector deleteList; - for (auto& item : m_SFXSourcesToBuffers) { - ALint sourceState; - alGetSourcei(item.first, AL_SOURCE_STATE, &sourceState); - if (sourceState == AL_STOPPED) { - deleteList.push_back(item.first); - } - } - - for (int i = 0; i < deleteList.size(); i++) { - alDeleteSources(1, &deleteList[i]); - //alDeleteBuffers(1, &m_SourcesToBuffers[deleteList[i]]); - m_SFXSourcesToBuffers.erase(deleteList[i]); - } -} - -ALuint dd::Systems::SoundSystem::CreateSource() -{ - ALuint source; - alGenSources((ALuint)1, &source); - - return source; -} - -bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event) -{ - //Loading and binding sound buffer to source - Sound *sound = ResourceManager::Load(event.FilePath); - if (sound == nullptr) { - return false; - } - ALuint source = CreateSource(); - ALuint buffer = sound->Buffer(); - alSourcei(source, AL_BUFFER, buffer); - - //Sound settings - float relativeVolume = 1.f; - if (event.IsAmbient) { - alSourcei(source, AL_LOOPING, AL_TRUE); - relativeVolume = m_BGMMasterVolume; - m_BGMSourcesToBuffers[source] = sound; - - } - else if (!event.IsAmbient) - { - m_SFXSourcesToBuffers[source] = sound; - alSourcei(source, AL_LOOPING, AL_FALSE); - relativeVolume = m_SFXMasterVolume; - } - - alSourcef(source, AL_GAIN, (event.Gain * relativeVolume)); - alSourcef(source, AL_PITCH, event.Pitch); - - - //Play - alSourcePlay(source); - return true; -} - -bool dd::Systems::SoundSystem::OnStopSound(const dd::Events::StopSound &event) -{ - ALuint itemToDeleted; - for (auto& item : m_BGMSourcesToBuffers) - { - if (item.second->Path() == event.FilePath) { - itemToDeleted = item.first; - break; - } - } - alSourceStop(itemToDeleted); - alDeleteSources(1, &itemToDeleted); - m_BGMSourcesToBuffers.erase(itemToDeleted); - - //Should not happen because SFX's should be very short. - for (auto item : m_SFXSourcesToBuffers) - { - if (item.second->Path() == event.FilePath) { - alSourceStop(item.first); - return true; - } - } - return false; -} - -bool dd::Systems::SoundSystem::OnMasterVolume(const dd::Events::MasterVolume &event) -{ - //TODO: Make the Gain depend on the value given when stored. - //TODO: .. now it ONLY uses the master Gain - if (event.IsAmbient) { - m_BGMMasterVolume = event.Gain; - for (auto& item : m_BGMSourcesToBuffers) - { - alSourcef(item.first, AL_GAIN, event.Gain); - } - return true; - } - else if (!event.IsAmbient) { - m_SFXMasterVolume = event.Gain; - for (auto& item : m_SFXSourcesToBuffers) - { - alSourcef(item.first, AL_GAIN, event.Gain); - } - return true; - } - return false; -} - -bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) -{ - //Check which entity has the collisionSound component. - auto collisionSound = m_World->GetComponent(event.Entity1); - if (collisionSound == nullptr) { - collisionSound = m_World->GetComponent(event.Entity2); - if (collisionSound == nullptr) { - //None of the entities had a collisionSound component. - return false; - } - } - - //Send play-sound event - dd::Events::PlaySound e; - e.FilePath = collisionSound->FilePath; - e.IsAmbient = false; - EventBroker->Publish(e); - return true; -} - - - From bb23d5a8c4acaa9313e20eb3cc9ad62c66de5aca Mon Sep 17 00:00:00 2001 From: Stiffly Date: Thu, 15 Oct 2015 11:43:10 +0200 Subject: [PATCH 2/4] Added hover and click sounds. Cleanup in SoundSystem. --- assets/Sounds/GUI/click.wav | Bin 0 -> 44144 bytes assets/Sounds/GUI/hover.wav | Bin 0 -> 14942 bytes include/Sound/Sound.h | 1 + include/Sound/SoundSystem.h | 10 ++++++---- src/game/Sound/Sound.cpp | 5 +++++ src/game/Sound/SoundSystem.cpp | 24 ++++++++++++++++++------ 6 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 assets/Sounds/GUI/click.wav create mode 100644 assets/Sounds/GUI/hover.wav diff --git a/assets/Sounds/GUI/click.wav b/assets/Sounds/GUI/click.wav new file mode 100644 index 0000000000000000000000000000000000000000..cda8f60afc4efcffd34badbbffafa021d795ef21 GIT binary patch literal 44144 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 literal 0 HcmV?d00001 diff --git a/assets/Sounds/GUI/hover.wav b/assets/Sounds/GUI/hover.wav new file mode 100644 index 0000000000000000000000000000000000000000..8d3baefd279269c331387748db6bd65fbb51d132 GIT binary patch literal 14942 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 z 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 m_BGMSourcesToBuffers; std::map m_SFXSourcesToBuffers; ALCdevice* m_Device = nullptr; + ALCcontext* m_Context = nullptr; //Events dd::EventRelay m_EPlaySFX; diff --git a/src/game/Sound/Sound.cpp b/src/game/Sound/Sound.cpp index f98f8eb..0fb9da2 100644 --- a/src/game/Sound/Sound.cpp +++ b/src/game/Sound/Sound.cpp @@ -6,6 +6,11 @@ dd::Sound::Sound(std::string path) m_Path = path; } +dd::Sound::~Sound() +{ + alDeleteBuffers(1, &m_Buffer); +} + ALuint dd::Sound::LoadFile(std::string path) { if (m_BufferCache.find(path) != m_BufferCache.end()) { diff --git a/src/game/Sound/SoundSystem.cpp b/src/game/Sound/SoundSystem.cpp index c11d84e..65465e3 100644 --- a/src/game/Sound/SoundSystem.cpp +++ b/src/game/Sound/SoundSystem.cpp @@ -3,6 +3,19 @@ dd::Systems::SoundSystem::~SoundSystem() { + for (auto &bgm : m_BGMSourcesToBuffers) { + alSourceStop(bgm.first); + alDeleteSources(1, &bgm.first); + bgm.second->~Sound(); + } + for (auto &sfx : m_SFXSourcesToBuffers) { + alSourceStop(sfx.first); + alDeleteSources(1, &sfx.first); + sfx.second->~Sound(); + } + m_BGMSourcesToBuffers.clear(); + m_SFXSourcesToBuffers.clear(); + alcDestroyContext(m_Context); alcCloseDevice(m_Device); } @@ -10,16 +23,16 @@ void dd::Systems::SoundSystem::Initialize() { //initialize OpenAL m_Device = alcOpenDevice(NULL); - ALCcontext* context; + if (m_Device) { - context = alcCreateContext(m_Device, NULL); - alcMakeContextCurrent(context); + m_Context = alcCreateContext(m_Device, NULL); + alcMakeContextCurrent(m_Context); } else { LOG_ERROR("OpenAL failed to initialize."); } - alGetError(); + //alGetError(); //Subscribe to events EVENT_SUBSCRIBE_MEMBER(m_EContact, &SoundSystem::OnContact); @@ -60,7 +73,6 @@ void dd::Systems::SoundSystem::Update(double dt) for (int i = 0; i < deleteList.size(); i++) { alDeleteSources(1, &deleteList[i]); - //alDeleteBuffers(1, &m_SourcesToBuffers[deleteList[i]]); m_SFXSourcesToBuffers.erase(deleteList[i]); } } @@ -76,7 +88,7 @@ ALuint dd::Systems::SoundSystem::CreateSource() bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event) { //Loading and binding sound buffer to source - Sound *sound = ResourceManager::Load(event.FilePath); + Sound *sound = ResourceManager::Load(event.FilePath); if (sound == nullptr) { return false; } From 64f903a6b6abe7b582f8bcaa0295ca53321cb8ac Mon Sep 17 00:00:00 2001 From: Stiffly Date: Thu, 15 Oct 2015 13:48:05 +0200 Subject: [PATCH 3/4] WIP --- include/Core/Engine.h | 20 +++++++++------- include/GUI/Button.h | 4 ++++ include/GUI/Slider.h | 6 +++++ include/GUI/TextureFrame.h | 1 + src/game/Sound/SoundSystem.cpp | 44 ++++++++++++++++------------------ 5 files changed, 43 insertions(+), 32 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 905eea4..b31458f 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -391,6 +391,8 @@ public: // I apologize about this. ScreenShakeUpdate(dt); + } else { + m_EventBroker->Process(); } m_EventBroker->Process(); m_FrameStack->UpdateLayered(dt); @@ -610,17 +612,17 @@ private: m_GameIsRunning = true; //Todo: Move this { - dd::Events::PlaySound e; - e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; - e.IsAmbient = true; - m_EventBroker->Publish(e); +// dd::Events::PlaySound e; +// e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; +// e.IsAmbient = true; +// m_EventBroker->Publish(e); } { - dd::Events::PlaySound e; - e.FilePath = "Sounds/BGM/water-flowing.wav"; - e.Gain = 0.3f; - e.IsAmbient = true; - m_EventBroker->Publish(e); +// dd::Events::PlaySound e; +// e.FilePath = "Sounds/BGM/water-flowing.wav"; +// e.Gain = 0.3f; +// e.IsAmbient = true; +// m_EventBroker->Publish(e); } return true; diff --git a/include/GUI/Button.h b/include/GUI/Button.h index dcfdae6..e25f8c0 100644 --- a/include/GUI/Button.h +++ b/include/GUI/Button.h @@ -75,6 +75,10 @@ protected: Events::ButtonEnter e; e.FrameName = m_Name; EventBroker->Publish(e); + Events::PlaySound soundEvent; + soundEvent.FilePath = "Sounds/GUI/hover.wav"; + EventBroker->Publish(soundEvent); + } else if (!isOver && m_MouseIsOver) { // Leave if (!m_IsDown) { if (!m_TextureReleased.empty()) { diff --git a/include/GUI/Slider.h b/include/GUI/Slider.h index de53245..a4987a6 100644 --- a/include/GUI/Slider.h +++ b/include/GUI/Slider.h @@ -7,6 +7,7 @@ #include "GUI/EButtonRelease.h" #include "GUI/ESliderUpdate.h" #include "Core/EMouseMove.h" +#include "Sound/EPlaySound.h" namespace dd { @@ -79,6 +80,11 @@ private: if (event.Button == m_SliderButton) { m_IsGrabbed = true; } + else { + Events::PlaySound e; + e.FilePath = "Sounds/GUI/click.wav"; + EventBroker->Publish(e); + } return true; } diff --git a/include/GUI/TextureFrame.h b/include/GUI/TextureFrame.h index 5db574c..1bc340d 100644 --- a/include/GUI/TextureFrame.h +++ b/include/GUI/TextureFrame.h @@ -62,6 +62,7 @@ public: if (m_Texture == nullptr) { m_Texture = ResourceManager::Load("Textures/Core/ErrorTexture.png"); } + SizeToTexture(); } diff --git a/src/game/Sound/SoundSystem.cpp b/src/game/Sound/SoundSystem.cpp index 65465e3..1e12456 100644 --- a/src/game/Sound/SoundSystem.cpp +++ b/src/game/Sound/SoundSystem.cpp @@ -6,12 +6,12 @@ dd::Systems::SoundSystem::~SoundSystem() for (auto &bgm : m_BGMSourcesToBuffers) { alSourceStop(bgm.first); alDeleteSources(1, &bgm.first); - bgm.second->~Sound(); + //bgm.second->~Sound(); } for (auto &sfx : m_SFXSourcesToBuffers) { alSourceStop(sfx.first); alDeleteSources(1, &sfx.first); - sfx.second->~Sound(); + //sfx.second->~Sound(); } m_BGMSourcesToBuffers.clear(); m_SFXSourcesToBuffers.clear(); @@ -40,22 +40,20 @@ void dd::Systems::SoundSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EStopSound, &SoundSystem::OnStopSound); EVENT_SUBSCRIBE_MEMBER(m_EMasterVolume, &SoundSystem::OnMasterVolume); - //Todo: Move this - { - dd::Events::PlaySound e; - e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; - e.IsAmbient = true; - EventBroker->Publish(e); - } - { - dd::Events::PlaySound e; - e.FilePath = "Sounds/BGM/water-flowing.wav"; - e.Gain = 0.3f; - e.IsAmbient = true; - EventBroker->Publish(e); - } - - +// //Todo: Move this +// { +// dd::Events::PlaySound e; +// e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; +// e.IsAmbient = true; +// EventBroker->Publish(e); +// } +// { +// dd::Events::PlaySound e; +// e.FilePath = "Sounds/BGM/water-flowing.wav"; +// e.Gain = 0.3f; +// e.IsAmbient = true; +// EventBroker->Publish(e); +// } } void dd::Systems::SoundSystem::Update(double dt) @@ -88,7 +86,7 @@ ALuint dd::Systems::SoundSystem::CreateSource() bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event) { //Loading and binding sound buffer to source - Sound *sound = ResourceManager::Load(event.FilePath); + Sound *sound = ResourceManager::Load(event.FilePath); if (sound == nullptr) { return false; } @@ -181,10 +179,10 @@ bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) //Send play-sound event { - dd::Events::PlaySound e; - e.FilePath = collisionSound->FilePath; - e.IsAmbient = false; - EventBroker->Publish(e); +// dd::Events::PlaySound e; +// e.FilePath = collisionSound->FilePath; +// e.IsAmbient = false; +// EventBroker->Publish(e); } return true; From dc2ec46cfa6d5fdb8cad9615db67e21be4265bc0 Mon Sep 17 00:00:00 2001 From: Stiffly Date: Mon, 19 Oct 2015 13:53:42 +0200 Subject: [PATCH 4/4] Playing sound on EGameStart. Menu sounds. --- include/Game/EGameStart.h | 4 ---- include/Sound/SoundSystem.h | 4 ++++ src/game/Sound/SoundSystem.cpp | 43 +++++++++++++++++++--------------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/include/Game/EGameStart.h b/include/Game/EGameStart.h index bfee0fd..faf89a2 100644 --- a/include/Game/EGameStart.h +++ b/include/Game/EGameStart.h @@ -1,7 +1,3 @@ -// -// Created by Adam on 2015-09-25. -// - #ifndef EVENTS_EGAMESTART_H__ #define EVENTS_EGAMESTART_H__ diff --git a/include/Sound/SoundSystem.h b/include/Sound/SoundSystem.h index 3d02ef2..5349258 100644 --- a/include/Sound/SoundSystem.h +++ b/include/Sound/SoundSystem.h @@ -19,6 +19,7 @@ #include "Sound/EMasterVolume.h" #include "Physics/ECreateParticleSequence.h" #include "Physics/EContact.h" +#include "Game/EGameStart.h" namespace dd @@ -54,6 +55,9 @@ private: bool OnStopSound(const dd::Events::StopSound &event); dd::EventRelay m_EMasterVolume; bool OnMasterVolume(const dd::Events::MasterVolume &event); + dd::EventRelay m_EGameStart; + bool OnGameStart(const dd::Events::GameStart &event); + ALuint CreateSource(); }; diff --git a/src/game/Sound/SoundSystem.cpp b/src/game/Sound/SoundSystem.cpp index 78def4e..7580b99 100644 --- a/src/game/Sound/SoundSystem.cpp +++ b/src/game/Sound/SoundSystem.cpp @@ -39,24 +39,10 @@ void dd::Systems::SoundSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EPlaySFX, &SoundSystem::OnPlaySound); EVENT_SUBSCRIBE_MEMBER(m_EStopSound, &SoundSystem::OnStopSound); EVENT_SUBSCRIBE_MEMBER(m_EMasterVolume, &SoundSystem::OnMasterVolume); + EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &SoundSystem::OnGameStart); m_SFXMasterVolume = ResourceManager::Load("Config.ini")->GetValue("Audio.SFXVolume", 1.f); m_BGMMasterVolume = ResourceManager::Load("Config.ini")->GetValue("Audio.BGMVolume", 1.f); - -// //Todo: Move this -// { -// dd::Events::PlaySound e; -// e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; -// e.IsAmbient = true; -// EventBroker->Publish(e); -// } -// { -// dd::Events::PlaySound e; -// e.FilePath = "Sounds/BGM/water-flowing.wav"; -// e.Gain = 0.3f; -// e.IsAmbient = true; -// EventBroker->Publish(e); -// } } void dd::Systems::SoundSystem::Update(double dt) @@ -182,14 +168,33 @@ bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) //Send play-sound event { -// dd::Events::PlaySound e; -// e.FilePath = collisionSound->FilePath; -// e.IsAmbient = false; -// EventBroker->Publish(e); + dd::Events::PlaySound e; + e.FilePath = collisionSound->FilePath; + e.IsAmbient = false; + e.Gain = 0.8f; + EventBroker->Publish(e); } return true; } +bool dd::Systems::SoundSystem::OnGameStart(const dd::Events::GameStart &event) +{ + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; + e.IsAmbient = true; + EventBroker->Publish(e); + } + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/BGM/water-flowing.wav"; + e.Gain = 0.3f; + e.IsAmbient = true; + EventBroker->Publish(e); + } + return true; +} +