|
|
|
@@ -3,15 +3,16 @@
|
|
|
|
|
|
|
|
|
|
#include <LWE/GameLoop.h>
|
|
|
|
|
#include <LWE/IO/RenderWindow.h>
|
|
|
|
|
#include <LWE/Systems/AudioSystem.h>
|
|
|
|
|
#include <LWE/Systems/RigidBodySystem.h>
|
|
|
|
|
#include <LWE/Systems/Portrait2DSystem.h>
|
|
|
|
|
#include <LWE/Systems/DynamicsSystem.h>
|
|
|
|
|
#include <LWE/Systems/GuiSystem.h>
|
|
|
|
|
#include <LWE/Components/AudioSource.h>
|
|
|
|
|
#include <LWE/Components/AABB2D.h>
|
|
|
|
|
#include <LWE/Components/Circle.h>
|
|
|
|
|
#include <LWE/Components/Portrait2D.h>
|
|
|
|
|
#include <LWE/Components/Dynamics.h>
|
|
|
|
|
#include <LWE/Gui/LabelGui.h>
|
|
|
|
|
#include <LWE/IO/Audio/Audio.h>
|
|
|
|
|
#include <LWE/IO/HID/Input.h>
|
|
|
|
|
#include <LWE/IO/HID/GenericInputHandler.h>
|
|
|
|
|
#include <LWE/IO/HID/Keyboard.h>
|
|
|
|
@@ -19,19 +20,19 @@
|
|
|
|
|
#include <LWE/System/CPU.h>
|
|
|
|
|
|
|
|
|
|
const float Game::paddleSpeed = 400.0f;
|
|
|
|
|
const float Game::ballSpeed = 400.0f;
|
|
|
|
|
const float Game::ballSpeed = 5000.0f;
|
|
|
|
|
|
|
|
|
|
Game::~Game()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Game::Game()
|
|
|
|
|
: Level("Game"), plyScore(0), aiScore(0)
|
|
|
|
|
: Level("Game"), plyScore(0), aiScore(0), started(false)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Game::Game(const Game& lvl)
|
|
|
|
|
: Level(lvl), plyScore(lvl.plyScore), aiScore(lvl.aiScore)
|
|
|
|
|
: Level(lvl), plyScore(lvl.plyScore), aiScore(lvl.aiScore), started(lvl.started)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -44,6 +45,7 @@ Game& Game::operator=(const Game& lvl)
|
|
|
|
|
|
|
|
|
|
plyScore = lvl.plyScore;
|
|
|
|
|
aiScore = lvl.aiScore;
|
|
|
|
|
started = lvl.started;
|
|
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
@@ -55,6 +57,10 @@ void Game::SetupResources()
|
|
|
|
|
// Setup Resource Code Here
|
|
|
|
|
AddResource(new lwe::Mesh("PortraitGui", lwe::portraitGuiVerts, lwe::portraitGuiIndices));
|
|
|
|
|
|
|
|
|
|
AddResource(lwe::Audio::FromFile_Heap("Resources/Audio/Wall.wav", lwe::DataType::FLOAT));
|
|
|
|
|
AddResource(lwe::Audio::FromFile_Heap("Resources/Audio/Paddle.wav", lwe::DataType::FLOAT));
|
|
|
|
|
AddResource(lwe::Audio::FromFile_Heap("Resources/Audio/Score.wav", lwe::DataType::FLOAT));
|
|
|
|
|
|
|
|
|
|
constexpr lwe::UInt_8 circleData[] = {255, 255, 255, 255};
|
|
|
|
|
lwe::Img* circle = new lwe::Img("Circle", 8, 4, 1, 1, (lwe::Byte*)circleData, lwe::ImgAspect::IMG_ASPECT_COLOR);
|
|
|
|
|
AddResource(circle);
|
|
|
|
@@ -71,9 +77,9 @@ void Game::Setup()
|
|
|
|
|
lwe::RenderWindow* win = gl->GetWindow();
|
|
|
|
|
|
|
|
|
|
// Adding Systems Here
|
|
|
|
|
AddSystem(new lwe::AudioSystem());
|
|
|
|
|
AddSystem(new lwe::Portrait2DSystem());
|
|
|
|
|
AddSystem(new lwe::RigidBodySystem());
|
|
|
|
|
AddSystem(new lwe::DynamicsSystem());
|
|
|
|
|
|
|
|
|
|
lwe::GuiSystem* gui = new lwe::GuiSystem();
|
|
|
|
|
gui->AddResource(new lwe::FontAtlas("Resources/Fonts/Hack-Regular_48.ehf"));
|
|
|
|
@@ -95,9 +101,9 @@ void Game::Setup()
|
|
|
|
|
lwe::Entity* bounds = new lwe::Entity("Bounds");
|
|
|
|
|
bounds->SetScale({win->GetSwapChain()->GetScale(), 1.0f});
|
|
|
|
|
|
|
|
|
|
lwe::AABB2D* collider = new lwe::AABB2D();
|
|
|
|
|
lwe::AABB2D* collider = new lwe::AABB2D("BoundsCollider", 0.0f, 0.0f);
|
|
|
|
|
collider->SetInverted(true);
|
|
|
|
|
collider->EnableStatic(true);
|
|
|
|
|
collider->SetStatic(true);
|
|
|
|
|
bounds->AddComponent(collider);
|
|
|
|
|
|
|
|
|
|
AddEntity(bounds);
|
|
|
|
@@ -118,8 +124,8 @@ void Game::Setup()
|
|
|
|
|
lwe::Entity* paddle = new lwe::Entity("Paddle");
|
|
|
|
|
paddle->SetScale({20.0f, 200.0f, 1.0f});
|
|
|
|
|
|
|
|
|
|
lwe::AABB2D* paddleCollider = new lwe::AABB2D("Collider");
|
|
|
|
|
paddleCollider->EnableStatic(true);
|
|
|
|
|
lwe::AABB2D* paddleCollider = new lwe::AABB2D("PaddleCollider", 0.0f, 0.0f);
|
|
|
|
|
paddleCollider->SetStatic(true);
|
|
|
|
|
paddle->AddComponent(paddleCollider);
|
|
|
|
|
|
|
|
|
|
lwe::Portrait2D* paddleImg = new lwe::Portrait2D("PaddleImg", "Circle");
|
|
|
|
@@ -141,11 +147,32 @@ void Game::Setup()
|
|
|
|
|
ball->SetScale({20.0f, 20.0f, 1.0f});
|
|
|
|
|
ball->SetPos({center.x - 10.0f, center.y - 10.0f, 0.0f});
|
|
|
|
|
|
|
|
|
|
lwe::AABB2D* ballCollider = new lwe::AABB2D("Collider");
|
|
|
|
|
ball->AddComponent(ballCollider);
|
|
|
|
|
lwe::AABB2D* ballCollider = new lwe::AABB2D("BallCollider", 0.5f, 1.1f);
|
|
|
|
|
ballCollider->SetCollidedCb([](lwe::RigidBody* a, lwe::RigidBody* b)
|
|
|
|
|
{
|
|
|
|
|
lwe::Entity* aOwner = (lwe::Entity*)a->GetParent();
|
|
|
|
|
lwe::Entity* bOwner = (lwe::Entity*)b->GetParent();
|
|
|
|
|
|
|
|
|
|
lwe::Dynamics* ballDynamics = new lwe::Dynamics(1.0f, 1.01f);
|
|
|
|
|
ball->AddComponent(ballDynamics);
|
|
|
|
|
static lwe::UInt_64 id = 0;
|
|
|
|
|
|
|
|
|
|
if (bOwner->GetId() == "Bounds")
|
|
|
|
|
{
|
|
|
|
|
lwe::AudioSource* audio = new lwe::AudioSource("Audio_" + lwe::Str_8::FromNum(id++),"Wall");
|
|
|
|
|
audio->EnableAutoDelete(true);
|
|
|
|
|
audio->EnableLoop(false);
|
|
|
|
|
audio->Play();
|
|
|
|
|
aOwner->AddComponent(audio);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
lwe::AudioSource* audio = new lwe::AudioSource("Audio_" + lwe::Str_8::FromNum(id++),"Paddle");
|
|
|
|
|
audio->EnableAutoDelete(true);
|
|
|
|
|
audio->EnableLoop(false);
|
|
|
|
|
audio->Play();
|
|
|
|
|
aOwner->AddComponent(audio);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
ball->AddComponent(ballCollider);
|
|
|
|
|
|
|
|
|
|
lwe::Portrait2D* ballImg = new lwe::Portrait2D("BallImg", "Circle");
|
|
|
|
|
ballImg->SetColor({1.0f, 0.0f, 0.0f});
|
|
|
|
@@ -177,7 +204,7 @@ void Game::OnUpdate(lwe::Input* input, const float delta)
|
|
|
|
|
lwe::Vec3_f ballPos = ball->GetPos();
|
|
|
|
|
lwe::Vec3_f ballScale = ball->GetScale();
|
|
|
|
|
|
|
|
|
|
if (ballPos.x <= bounds->GetPos().x)
|
|
|
|
|
if (ballPos.x <= bounds->GetPos().x + 10.0f)
|
|
|
|
|
{
|
|
|
|
|
aiScore++;
|
|
|
|
|
|
|
|
|
@@ -187,7 +214,7 @@ void Game::OnUpdate(lwe::Input* input, const float delta)
|
|
|
|
|
|
|
|
|
|
ResetGame(bounds, ball);
|
|
|
|
|
}
|
|
|
|
|
else if (ballPos.x + ballScale.x >= bounds->GetScale().x)
|
|
|
|
|
else if (ballPos.x + ballScale.x >= bounds->GetScale().x - 10.0f)
|
|
|
|
|
{
|
|
|
|
|
plyScore++;
|
|
|
|
|
|
|
|
|
@@ -205,18 +232,16 @@ void Game::OnUpdate(lwe::Input* input, const float delta)
|
|
|
|
|
if (!lwe::CPU::HasRDRND())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
lwe::Dynamics* ballDynamics = (lwe::Dynamics*)ball->GetComponent("Dynamics", "");
|
|
|
|
|
//ballDynamics->ApplyForce({0.0f, ballSpeed, 0.0f});
|
|
|
|
|
lwe::AABB2D* ballCollider = (lwe::AABB2D*)ball->GetComponent("AABB2D");
|
|
|
|
|
|
|
|
|
|
lwe::UInt_8 result = lwe::HRNG::Generate_s8(0, 4);
|
|
|
|
|
if (result == 0)
|
|
|
|
|
ballDynamics->ApplyForce({ballSpeed, ballSpeed, 0.0f});
|
|
|
|
|
if (const lwe::UInt_8 result = lwe::HRNG::Generate_s8(0, 4); result == 0)
|
|
|
|
|
ballCollider->ApplyForce({ballSpeed, ballSpeed, 0.0f});
|
|
|
|
|
else if (result == 1)
|
|
|
|
|
ballDynamics->ApplyForce({-ballSpeed, ballSpeed, 0.0f});
|
|
|
|
|
ballCollider->ApplyForce({-ballSpeed, ballSpeed, 0.0f});
|
|
|
|
|
else if (result == 2)
|
|
|
|
|
ballDynamics->ApplyForce({ballSpeed, -ballSpeed, 0.0f});
|
|
|
|
|
ballCollider->ApplyForce({ballSpeed, -ballSpeed, 0.0f});
|
|
|
|
|
else if (result == 3)
|
|
|
|
|
ballDynamics->ApplyForce({-ballSpeed, -ballSpeed, 0.0f});
|
|
|
|
|
ballCollider->ApplyForce({-ballSpeed, -ballSpeed, 0.0f});
|
|
|
|
|
|
|
|
|
|
started = true;
|
|
|
|
|
}
|
|
|
|
@@ -245,7 +270,7 @@ void Game::OnUpdate(lwe::Input* input, const float delta)
|
|
|
|
|
|
|
|
|
|
if (aiPaddlePos.y + aiPaddleScale.y / 2.0f < ballPos.y + ballScale.y / 2.0f)
|
|
|
|
|
{
|
|
|
|
|
aiPaddlePos = aiPaddlePos + lwe::Vec3_f(0.0f, paddleSpeed, 0.0f) * delta;
|
|
|
|
|
aiPaddlePos = aiPaddlePos + lwe::Vec3_f(0.0f, paddleSpeed * 2.0f, 0.0f) * delta;
|
|
|
|
|
if (aiPaddlePos.y + aiPaddleScale.y / 2.0f > ballPos.y + ballScale.y / 2.0f)
|
|
|
|
|
aiPaddlePos.y = ballPos.y + ballScale.y / 2.0f - aiPaddleScale.y / 2.0f;
|
|
|
|
|
|
|
|
|
@@ -256,7 +281,7 @@ void Game::OnUpdate(lwe::Input* input, const float delta)
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
aiPaddlePos = aiPaddlePos - lwe::Vec3_f(0.0f, paddleSpeed, 0.0f) * delta;
|
|
|
|
|
aiPaddlePos = aiPaddlePos - lwe::Vec3_f(0.0f, paddleSpeed * 2.0f, 0.0f) * delta;
|
|
|
|
|
if (aiPaddlePos.y + aiPaddleScale.y / 2.0f < ballPos.y + ballScale.y / 2.0f)
|
|
|
|
|
aiPaddlePos.y = ballPos.y + ballScale.y / 2.0f - aiPaddleScale.y / 2.0f;
|
|
|
|
|
|
|
|
|
@@ -276,10 +301,16 @@ void Game::PreRender(lwe::GpuCmdBuffer* cmdBuffer)
|
|
|
|
|
|
|
|
|
|
void Game::ResetGame(const lwe::Entity* bounds, lwe::Entity* ball)
|
|
|
|
|
{
|
|
|
|
|
lwe::AudioSource* audio = new lwe::AudioSource("Score", "Score");
|
|
|
|
|
audio->EnableAutoDelete(true);
|
|
|
|
|
audio->EnableLoop(false);
|
|
|
|
|
audio->Play();
|
|
|
|
|
ball->AddComponent(audio);
|
|
|
|
|
|
|
|
|
|
ball->SetPos(bounds->GetScale() / 2.0f - ball->GetScale() / 2.0f);
|
|
|
|
|
|
|
|
|
|
lwe::Dynamics* ballDyn = (lwe::Dynamics*)ball->GetComponent("Dynamics");
|
|
|
|
|
ballDyn->SetVelocity(0.0f);
|
|
|
|
|
lwe::AABB2D* ballCollider = (lwe::AABB2D*)ball->GetComponent("AABB2D");
|
|
|
|
|
ballCollider->ResetVelocity();
|
|
|
|
|
|
|
|
|
|
started = false;
|
|
|
|
|
}
|
|
|
|
|