From a0b9102b93fb41071adb262ea46d269be9055a6a Mon Sep 17 00:00:00 2001 From: karutoh Date: Sat, 11 Nov 2023 18:56:55 -0800 Subject: [PATCH] Backup --- .gitignore | 32 +++++++++ .idea/.gitignore | 5 ++ .idea/Pong.iml | 2 + .idea/editor.xml | 6 ++ .idea/misc.xml | 8 +++ .idea/modules.xml | 8 +++ .idea/vcs.xml | 6 ++ CMakeLists.txt | 46 +++++++++++++ Levels/Game.cpp | 168 ++++++++++++++++++++++++++++++++++++++++++++++ Levels/Game.h | 26 +++++++ Main.cpp | 70 +++++++++++++++++++ README.md | 11 +++ image.png | Bin 0 -> 8982 bytes 13 files changed, 388 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/Pong.iml create mode 100644 .idea/editor.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 CMakeLists.txt create mode 100644 Levels/Game.cpp create mode 100644 Levels/Game.h create mode 100644 Main.cpp create mode 100644 README.md create mode 100644 image.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..259148f --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/Pong.iml b/.idea/Pong.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/Pong.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/editor.xml b/.idea/editor.xml new file mode 100644 index 0000000..46540da --- /dev/null +++ b/.idea/editor.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c2cdd87 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e3ff5e9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ded3db7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.18.4) +project(Pong C CXX) + +if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows") + set(IS_OS_WINDOWS TRUE) + set(USER_HOME_DIRECTORY $ENV{USERPROFILE}) + message("Building for the Windows operating system.") +elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux") + set(IS_OS_LINUX TRUE) + set(USER_HOME_DIRECTORY $ENV{HOME}) + add_compile_options(-Wno-stringop-overflow) + message("Building for the Linux operating system.") +elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Darwin") + set(IS_OS_MAC TRUE) + set(USER_HOME_DIRECTORY $ENV{HOME}) + message("Building for the Mac operating system.") +endif () + +if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") + message("Building for AMD64 architecture.") + set(IS_ARCH_AMD64 TRUE) +elseif ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ARM64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") + message("Building for ARM64 architecture.") + set(IS_ARCH_ARM64 TRUE) +endif () + +set(CMAKE_CXX_STANDARD 20) + +add_executable(Pong + Levels/Game.h + Levels/Game.cpp + Main.cpp +) + +if (IS_OS_WINDOWS) + add_compile_definitions(VK_USE_PLATFORM_WIN32_KHR) +elseif (IS_OS_LINUX) + add_compile_definitions(VK_USE_PLATFORM_XCB_KHR) +endif() + +target_link_directories(Pong PRIVATE "${USER_HOME_DIRECTORY}/Libraries/LWE/lib") +target_include_directories(Pong PRIVATE "${USER_HOME_DIRECTORY}/Libraries/LWE/include") + +find_package(Vulkan REQUIRED) + +target_link_libraries(Pong PRIVATE Vulkan::Headers Vulkan::Vulkan xcb xcb-xfixes xcb-xinput wooting_analog_wrapper LWE z asound) \ No newline at end of file diff --git a/Levels/Game.cpp b/Levels/Game.cpp new file mode 100644 index 0000000..196f4df --- /dev/null +++ b/Levels/Game.cpp @@ -0,0 +1,168 @@ +#include "Game.h" +#include "LWE/IO/FontAtlas.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Game::~Game() +{ +} + +Game::Game() + : Level("Game") +{ +} + +Game::Game(const Game& lvl) + : Level(lvl) +{ +} + +Game& Game::operator=(const Game& lvl) +{ + if (this == &lvl) + return *this; + + Level::operator=(lvl); + + return *this; +} + +void Game::SetupResources() +{ + Level::SetupResources(); + + // Setup Resource Code Here + AddResource(new lwe::Mesh("PortraitGui", lwe::portraitGuiVerts, lwe::portraitGuiIndices)); + + 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); +} + +void Game::Setup() +{ + Level::Setup(); + + // Setup Code Here + + lwe::GameLoop* gl = (lwe::GameLoop*)GetParent("GameLoop"); + + lwe::RenderWindow* win = gl->GetWindow(); + + // Adding Systems Here + AddSystem(new lwe::Portrait2DSystem()); + AddSystem(new lwe::RigidBodySystem()); + + lwe::GuiSystem* gui = new lwe::GuiSystem(); + gui->AddResource(new lwe::FontAtlas("Resources/Fonts/Hack-Regular_48.ehf")); + AddSystem(gui); + + lwe::Vec2_f scale = win->GetSwapChain()->GetScale(); + lwe::Vec2_f center = win->GetSwapChain()->GetScale() / 2; + + // Score Gui + lwe::LabelGui* plyScore = new lwe::LabelGui("PlyScore", "Hack-Regular_48", "0"); + plyScore->SetPosition({20.0f, 20.0f}); + gui->AddGui(plyScore); + + lwe::LabelGui* aiScore = new lwe::LabelGui("AiScore", "Hack-Regular_48", "0"); + aiScore->SetPosition({scale.x - 68.0f, 20.0f}); + gui->AddGui(aiScore); + + // Bounds Entity + lwe::Entity* bounds = new lwe::Entity("Bounds"); + bounds->SetScale({win->GetSwapChain()->GetScale(), 1.0f}); + + lwe::AABB2D* collider = new lwe::AABB2D(); + bounds->AddComponent(collider); + + AddEntity(bounds); + + // Field Separator Entity + + lwe::Entity* fieldSep = new lwe::Entity("FieldSeparator"); + fieldSep->SetScale({10.0f, scale.y, 1.0f}); + fieldSep->SetPos({center.x - 5.0f, 0.0f, 0.0f}); + + lwe::Portrait2D* fieldSepImg = new lwe::Portrait2D("PaddleImg", "Circle"); + fieldSepImg->SetColor({0.75f}); + fieldSep->AddComponent(fieldSepImg); + + AddEntity(fieldSep); + + // Paddle Entity Template + lwe::Entity* paddle = new lwe::Entity("Paddle"); + paddle->SetScale({20.0f, 200.0f, 1.0f}); + + lwe::Portrait2D* paddleImg = new lwe::Portrait2D("PaddleImg", "Circle"); + paddleImg->SetColor({0.75f}); + paddle->AddComponent(paddleImg); + + AddTemplate(paddle); + + // Player's Paddle + lwe::Entity* plyPaddle = CreateEntity("Paddle", "PlyPaddle"); + plyPaddle->SetPos({50.0f, center.y - 100.0f, 0.0f}); + + // Player's Paddle + lwe::Entity* aiPaddle = CreateEntity("Paddle", "AiPaddle"); + aiPaddle->SetPos({scale.x - 50.0f, center.y - 100.0f, 0.0f}); + + // Ball Entity + lwe::Entity* ball = new lwe::Entity("Ball"); + ball->SetScale({20.0f, 20.0f, 1.0f}); + ball->SetPos({center.x - 10.0f, center.y - 10.0f, 0.0f}); + + lwe::Circle* ballCollider = new lwe::Circle("BallCollider", 50.0f); + ball->AddComponent(ballCollider); + + lwe::Portrait2D* ballImg = new lwe::Portrait2D("BallImg", "Circle"); + ballImg->SetColor({1.0f, 0.0f, 0.0f}); + ball->AddComponent(ballImg); + + AddEntity(ball); +} + +void Game::PostInitialize(lwe::GpuCmdBuffer* cmdBuffer) +{ + Level::PostInitialize(cmdBuffer); + + // Post Initialization Code Here +} + +void Game::OnUpdate(lwe::Input* input, const float delta) +{ + Level::OnUpdate(input, delta); + + // Update Code Here + + const lwe::GenericInputHandler* handler = (lwe::GenericInputHandler*)input->GetHandler("GenericInputHandler"); + + const lwe::Keyboard* keyboard = handler->GetPrimaryKeyboard(); + + lwe::Entity* plyPaddle = GetEntity("PlyPaddle"); + + if (keyboard->IsDown(lwe::Keyboard::W)) + plyPaddle->SetPos(plyPaddle->GetPos() - lwe::Vec3_f(0.0f, 400.0f, 0.0f) * delta); + + if (keyboard->IsDown(lwe::Keyboard::S)) + plyPaddle->SetPos(plyPaddle->GetPos() + lwe::Vec3_f(0.0f, 400.0f, 0.0f) * delta); +} + +void Game::PreRender(lwe::GpuCmdBuffer* cmdBuffer) +{ + Level::PreRender(cmdBuffer); + + // Pre-Render Code Here +} \ No newline at end of file diff --git a/Levels/Game.h b/Levels/Game.h new file mode 100644 index 0000000..af52646 --- /dev/null +++ b/Levels/Game.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +class Game : public lwe::Level +{ +public: + ~Game() override; + + Game(); + + Game(const Game& lvl); + + Game& operator=(const Game& lvl); + + void SetupResources() override; + + void Setup() override; + + void PostInitialize(lwe::GpuCmdBuffer* cmdBuffer) override; + + void OnUpdate(lwe::Input* input, const float delta) override; + + void PreRender(lwe::GpuCmdBuffer* cmdBuffer) override; +}; \ No newline at end of file diff --git a/Main.cpp b/Main.cpp new file mode 100644 index 0000000..4470fe0 --- /dev/null +++ b/Main.cpp @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include + +#include "Levels/Game.h" +#include "LWE/IO/HID/GenericInputHandler.h" + +void LogCallback(const lwe::Log& log) +{ + lwe::Console::Write_8(log.ToStr()); +} + +lwe::SInt_32 Main(lwe::Str_8* appName, lwe::Str_8* appVerId, lwe::Version* appVer) +{ + *appName = "Pong"; + *appVerId = "Alpha"; + *appVer = {0, 0, 1}; + + lwe::Console::Attach(); + + lwe::Log::SetCallback(LogCallback); + + #if defined(LWE_OS_WINDOWS) + lwe::GpuInstance::AddExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); + #elif defined(LWE_OS_LINUX) + lwe::GpuInstance::AddExtension(VK_KHR_XCB_SURFACE_EXTENSION_NAME); + #endif + + lwe::GpuInstance::AddExtension(VK_KHR_SURFACE_EXTENSION_NAME); + + lwe::GpuInstance::Initialize(true); + + lwe::GpuDevice primary = lwe::GpuDevice::GetBest(); + + lwe::GpuQueueFamily* family = primary.GetQueueFamily(lwe::QueueType::GRAPHICS); + + lwe::GpuInterface inf(&primary); + inf.AddExtensions(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + + lwe::GpuQueue queue(family, &inf, 1.0f); + + inf.Initialize(); + + lwe::RenderWindow win(&inf, &queue); + win.Create_8(*appName, {0, 0}, {1024, 768}); + + lwe::GameLoop gl(&win, 6, 0); + gl.GetInput()->AddHandler(new lwe::GenericInputHandler()); + + lwe::Frame* mainFrame = new lwe::Frame("Main"); + + gl.AddFrame(mainFrame); + + mainFrame->AddLevel(new Game()); + + gl.Initialize(); + gl.Start(); + gl.UnInitialize(); + + win.Close(); + + inf.Release(); + + lwe::GpuInstance::Release(); + + return 0; +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..636c7d7 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Pong + +Designed over the top of the Lone Wolf Engine. Meant to display the 2D functionality, and ease-of-use of the API. +The Lone Wolf Engine was designed from the ground, up from scratch. Very few libraries are linked to this engine. + +![](image.png) + +## Planned Features + +- Online Multiplayer +- Graphical User Interface \ No newline at end of file diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8fa50f5ec71ceaa06691e8c1135a92d5114c0a GIT binary patch literal 8982 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