added batch rendering
This commit is contained in:
@@ -7,6 +7,7 @@ class ControlLayer : public OpenEngine::Layer
|
||||
{
|
||||
public:
|
||||
ControlLayer(OpenEngine::Ref<OpenEngine::Layer> layer);
|
||||
ControlLayer();
|
||||
~ControlLayer() = default;
|
||||
|
||||
void OnUpdate() override;
|
||||
@@ -17,6 +18,7 @@ class ControlLayer : public OpenEngine::Layer
|
||||
|
||||
private:
|
||||
bool SwitchLayer(OpenEngine::KeyPressedEvent& event);
|
||||
bool SwitchExistingLayer(OpenEngine::KeyPressedEvent& event);
|
||||
bool StopRunning(OpenEngine::KeyPressedEvent& event);
|
||||
|
||||
OpenEngine::Ref<OpenEngine::Layer> active_layer;
|
||||
|
||||
@@ -8,19 +8,18 @@
|
||||
"""
|
||||
*/
|
||||
|
||||
#include <glm/ext/matrix_clip_space.hpp>
|
||||
#include <open_engine.hpp>
|
||||
|
||||
#include <glm/ext/matrix_clip_space.hpp>
|
||||
#include "freetype/fttypes.h"
|
||||
#include "open_engine/events/event.hpp"
|
||||
#include "open_engine/logging.hpp"
|
||||
#include "open_engine/renderer/shader.hpp"
|
||||
#include "open_engine/ref_scope.hpp"
|
||||
#include "shmup.hpp"
|
||||
#include <freetype2/ft2build.h>
|
||||
#include FT_FREETYPE_H
|
||||
|
||||
#include <glad/glad.h>
|
||||
#include <map>
|
||||
|
||||
|
||||
struct Character {
|
||||
unsigned int texture_id; // ID handle of the glyph texture
|
||||
glm::ivec2 size; // Size of glyph
|
||||
@@ -31,7 +30,8 @@ struct Character {
|
||||
class Overlay : public OpenEngine::Layer
|
||||
{
|
||||
public:
|
||||
Overlay()
|
||||
Overlay(OpenEngine::Ref<Shmup>& shmup)
|
||||
: game_layer(shmup)
|
||||
{};
|
||||
|
||||
~Overlay() {};
|
||||
@@ -205,7 +205,36 @@ class Overlay : public OpenEngine::Layer
|
||||
|
||||
float x = height - 40;
|
||||
float y = 0;
|
||||
//RenderText("Test String", 0.0f, 0.0f, 1.0f, {0.8f, 0.3f, 0.2f});
|
||||
|
||||
switch (game_layer->GetGameState()) {
|
||||
case GameState::GameOver:
|
||||
{
|
||||
auto& window = OpenEngine::Application::Get().GetWindow();
|
||||
int width = window.GetWidth();
|
||||
int height = window.GetHeight();
|
||||
|
||||
float x = width / 2.0f;
|
||||
float y = height / 2.0f;
|
||||
RenderTextCentered("Game Over!", x, y, 1.0f, glm::vec3(0.8f, 0.2f, 0.3f));
|
||||
break;
|
||||
}
|
||||
case GameState::Paused:
|
||||
RenderTextCentered("Paused", x, y, 1.0f, glm::vec3(0.8f, 0.2f, 0.3f));
|
||||
break;
|
||||
case GameState::Playing:
|
||||
break;
|
||||
}
|
||||
|
||||
std::string s_score = "Score: " + std::to_string(game_layer->GetScore());
|
||||
std::string s_lives = std::to_string(game_layer->GetLives()) + " lives";
|
||||
RenderText(s_score, 10, OpenEngine::Application::Get().GetWindow().GetHeight() - 50, 1.0f, {0.8f, 0.2f, 0.3f});
|
||||
RenderText(
|
||||
s_lives,
|
||||
OpenEngine::Application::Get().GetWindow().GetWidth() - 220,
|
||||
OpenEngine::Application::Get().GetWindow().GetHeight() - 50,
|
||||
1.0f,
|
||||
{0.8f, 0.2f, 0.3f});
|
||||
|
||||
};
|
||||
|
||||
void OnEvent(OpenEngine::Event& event) override
|
||||
@@ -216,6 +245,7 @@ class Overlay : public OpenEngine::Layer
|
||||
std::map<char, Character> characters;
|
||||
OpenEngine::Ref<OpenEngine::Shader> text_shader;
|
||||
glm::mat4 projection;
|
||||
OpenEngine::Ref<Shmup> game_layer;
|
||||
|
||||
unsigned int VAO, VBO;
|
||||
};
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
#ifndef SANDBOX_HPP
|
||||
#define SANDBOX_HPP
|
||||
|
||||
#include "open_engine/core/time.hpp"
|
||||
#include <glm/fwd.hpp>
|
||||
#include <open_engine.hpp>
|
||||
#include "open_engine/core/time.hpp"
|
||||
|
||||
#include <glm/ext/matrix_transform.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
|
||||
#include <glm/fwd.hpp>
|
||||
#include <imgui.h>
|
||||
#include <glad/glad.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
#ifndef SHMUP_HPP
|
||||
#define SHMUP_HPP
|
||||
|
||||
#include <iostream>
|
||||
#include <open_engine.hpp>
|
||||
|
||||
#include "imgui.h"
|
||||
#include "overlay.hpp"
|
||||
|
||||
#include <fstream>
|
||||
#include <dlfcn.h>
|
||||
#include <glm/ext/matrix_transform.hpp>
|
||||
@@ -16,12 +12,18 @@
|
||||
#include <unistd.h>
|
||||
#include <vector>
|
||||
|
||||
enum class GameState
|
||||
{
|
||||
Playing,
|
||||
Paused,
|
||||
GameOver
|
||||
};
|
||||
|
||||
class Shmup : public OpenEngine::Layer
|
||||
{
|
||||
public:
|
||||
Shmup(OpenEngine::Ref<Overlay>& overlay)
|
||||
: OpenEngine::Layer("shmup"), overlay(overlay),
|
||||
camera((float)OpenEngine::Application::Get().GetWindow().GetWidth() /
|
||||
Shmup()
|
||||
: camera((float)OpenEngine::Application::Get().GetWindow().GetWidth() /
|
||||
OpenEngine::Application::Get().GetWindow().GetHeight(), 1.0f)
|
||||
{
|
||||
}
|
||||
@@ -37,8 +39,6 @@ class Shmup : public OpenEngine::Layer
|
||||
bullet_tx = OpenEngine::Texture2D::Create("assets/textures/shmup/bullet.png");
|
||||
}
|
||||
|
||||
tr1 = {glm::vec3(0.0f, -0.9f, 1.0f), glm::vec3(0.1f), 0.0f};
|
||||
|
||||
LoadMap();
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ class Shmup : public OpenEngine::Layer
|
||||
return overlapX && overlapY;
|
||||
}
|
||||
|
||||
void MoveShip()
|
||||
void MovePlayerShip()
|
||||
{
|
||||
double delta = OpenEngine::Time::DeltaTime();
|
||||
if (OpenEngine::Input::IsKeyPressed(OpenEngine::KeyCode::Up)) {
|
||||
@@ -95,30 +95,77 @@ class Shmup : public OpenEngine::Layer
|
||||
tr1.position.x = 0.8;
|
||||
}
|
||||
|
||||
bool MovePlayerShipDiscrete(OpenEngine::KeyPressedEvent& event)
|
||||
{
|
||||
if (state == GameState::Playing) {
|
||||
double delta = OpenEngine::Time::DeltaTime();
|
||||
if (event.GetKeyCode() == OpenEngine::KeyCode::Right) {
|
||||
tr1.position.x += 0.1f;
|
||||
}
|
||||
if (event.GetKeyCode() == OpenEngine::KeyCode::Left) {
|
||||
tr1.position.x -= 0.1f;
|
||||
}
|
||||
|
||||
if (tr1.position.y <= -0.9)
|
||||
tr1.position.y = -0.9;
|
||||
if (tr1.position.y >= -0.3)
|
||||
tr1.position.y = -0.3;
|
||||
if (tr1.position.x <= -0.8)
|
||||
tr1.position.x = -0.8;
|
||||
if (tr1.position.x >= 0.8)
|
||||
tr1.position.x = 0.8;
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void MoveEntities(double time_step) {
|
||||
double delta = time_step;
|
||||
|
||||
// Updating enemy positions
|
||||
for (auto& enemy : enemies) {
|
||||
enemy.position.y -= 0.3 * delta;
|
||||
if (state == GameState::Playing && (enemy.position.y <= -1.1 || CheckCollision(
|
||||
GetBounds(enemy.position, enemy.size),
|
||||
GetBounds(tr1.position, tr1.size))))
|
||||
lives--;
|
||||
}
|
||||
|
||||
// Updating friendly bullets positions
|
||||
for (auto& bullet : bullets) {
|
||||
bullet.position.y += 1.1 * delta;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateEntity()
|
||||
{
|
||||
double delta = OpenEngine::Time::DeltaTime();
|
||||
|
||||
for (auto& enemy : enemies) {
|
||||
enemy.position.y -= 0.3 * delta;
|
||||
if (enemy.position.y <= -1.1 || CheckCollision(
|
||||
GetBounds(enemy.position, enemy.size),
|
||||
GetBounds(tr1.position, tr1.size))){
|
||||
lives--;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& bullet : bullets) {
|
||||
bullet.position.y += 1.1 * delta;
|
||||
}
|
||||
MoveEntities(delta);
|
||||
|
||||
// Deletes enemies offscreen
|
||||
std::erase_if(enemies, [](const auto& enemy) {
|
||||
return enemy.position.y <= -1.1f;
|
||||
});
|
||||
// Deletes bullets offscreen
|
||||
std::erase_if(bullets, [](const auto& bullet) {
|
||||
return bullet.position.y >= 1.2f;
|
||||
});
|
||||
|
||||
// Lowers lives upon collision between player and enemy
|
||||
for (auto& enemy : enemies) {
|
||||
if (state == GameState::Playing) {
|
||||
if (enemy.position.y <= -1.1)
|
||||
lives--;
|
||||
|
||||
if (CheckCollision(
|
||||
GetBounds(enemy.position, enemy.size),
|
||||
GetBounds(tr1.position, tr1.size)))
|
||||
lives = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Deletes enemy and bullet and increases score after collision
|
||||
for (auto& bullet : bullets) {
|
||||
for (auto& enemy : enemies) {
|
||||
Bounds bullet_bounds = GetBounds(bullet.position, bullet.size);
|
||||
@@ -135,33 +182,15 @@ class Shmup : public OpenEngine::Layer
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void GameOver()
|
||||
void Render()
|
||||
{
|
||||
paused = true;
|
||||
|
||||
auto& window = OpenEngine::Application::Get().GetWindow();
|
||||
int width = window.GetWidth();
|
||||
int height = window.GetHeight();
|
||||
|
||||
enemies.clear();
|
||||
bullets.clear();
|
||||
|
||||
float x = width / 2.0f;
|
||||
float y = height / 2.0f;
|
||||
|
||||
overlay->RenderTextCentered("Game Over!", x, y, 1.0f, glm::vec3(0.8f, 0.2f, 0.3f));
|
||||
};
|
||||
|
||||
void OnUpdate() override
|
||||
{
|
||||
float delta = OpenEngine::Time::DeltaTime();
|
||||
OE_PROFILE_FUNCTION()
|
||||
{
|
||||
OE_PROFILE_SCOPE("Setting up Rendering");
|
||||
//OpenEngine::RenderCommand::SetClearColor({0.11f, 0.11f, 0.15f, 1.0f});
|
||||
OpenEngine::RenderCommand::SetClearColor({1.0f, 1.0f, 1.0f, 1.0f});
|
||||
OpenEngine::RenderCommand::SetClearColor({0.11f, 0.11f, 0.15f, 1.0f});
|
||||
OpenEngine::RenderCommand::Clear();
|
||||
OpenEngine::Renderer2D::BeginScene(camera.GetCamera());
|
||||
}
|
||||
@@ -177,75 +206,69 @@ class Shmup : public OpenEngine::Layer
|
||||
|
||||
OpenEngine::Renderer2D::EndScene();
|
||||
|
||||
if (!paused) {
|
||||
}
|
||||
|
||||
void OnUpdate() override
|
||||
{
|
||||
float delta = OpenEngine::Time::DeltaTime();
|
||||
|
||||
Render();
|
||||
|
||||
UpdateEntity();
|
||||
|
||||
if (state == GameState::Playing) {
|
||||
if (spawn_cooldown >= spawn_min_time) {
|
||||
SpawnEnemyRandom();
|
||||
//ReadMap();
|
||||
//SpawnEnemyRandom();
|
||||
ReadMap();
|
||||
spawn_cooldown = 0;
|
||||
if (spawn_min_time > 0.5)
|
||||
spawn_min_time -= 0.01;
|
||||
}
|
||||
|
||||
MoveShip();
|
||||
UpdateEntity();
|
||||
//MovePlayerShip();
|
||||
|
||||
if (shooting)
|
||||
SpawnBullet();
|
||||
|
||||
for (auto& enemy : enemies) {
|
||||
if (CheckCollision(GetBounds(enemy.position, enemy.size), GetBounds(tr1.position, tr1.size)))
|
||||
game_over = true;
|
||||
}
|
||||
|
||||
shot_cooldown += delta;
|
||||
spawn_cooldown += delta;
|
||||
}
|
||||
|
||||
if (lives <= 0)
|
||||
game_over = true;
|
||||
|
||||
if (game_over)
|
||||
GameOver();
|
||||
|
||||
std::string s_score = "Score: " + std::to_string(score);
|
||||
std::string s_lives = std::to_string(lives) + " lives";
|
||||
overlay->RenderText(s_score, 10, OpenEngine::Application::Get().GetWindow().GetHeight() - 50, 1.0f, {0.8f, 0.2f, 0.3f});
|
||||
overlay->RenderText(
|
||||
s_lives,
|
||||
OpenEngine::Application::Get().GetWindow().GetWidth() - 220,
|
||||
OpenEngine::Application::Get().GetWindow().GetHeight() - 50,
|
||||
1.0f,
|
||||
{0.8f, 0.2f, 0.3f});
|
||||
state = GameState::GameOver;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
tr1 = {glm::vec3(0.0f, -0.9f, 1.0f), glm::vec3(0.1f), 0.0f};
|
||||
tr1 = {glm::vec3(0.0f, -0.9f, -0.1f), glm::vec3(0.1f), 0.0f};
|
||||
|
||||
score = 0;
|
||||
lives = 5;
|
||||
game_over = false;
|
||||
paused = false;
|
||||
|
||||
bullets.clear();
|
||||
enemies.clear();
|
||||
|
||||
state = GameState::Playing;
|
||||
}
|
||||
|
||||
void SpawnEnemyRandom()
|
||||
{
|
||||
static std::uniform_int_distribution<int> dist{-8, 8};
|
||||
|
||||
OpenEngine::Transform enemy_tr({glm::vec3(dist(rd)/10.0f, 1.2f, -0.1f), glm::vec3(0.1f), 180.0f});
|
||||
enemies.emplace_back(enemy_tr);
|
||||
|
||||
SpawnEnemy(dist(rd));
|
||||
};
|
||||
|
||||
void SpawnEnemy(int x)
|
||||
{
|
||||
OpenEngine::Transform enemy_tr({{x/10.0f, 1.2f, 0.0f}, glm::vec3(0.1f), 180.0f});
|
||||
OpenEngine::Transform enemy_tr({{x/10.0f, 1.2f, 0.1f}, glm::vec3(0.1f), 180.0f});
|
||||
enemies.emplace_back(enemy_tr);
|
||||
};
|
||||
|
||||
void LoadMap()
|
||||
void LoadMap(const char* path = "assets/maps/lvl1.txt")
|
||||
{
|
||||
std::string buffer;
|
||||
|
||||
std::ifstream map_file("assets/maps/lvl1.txt");
|
||||
std::ifstream map_file(path);
|
||||
|
||||
while (std::getline(map_file, buffer)) {
|
||||
map.emplace_back(buffer);
|
||||
@@ -289,7 +312,7 @@ class Shmup : public OpenEngine::Layer
|
||||
if (event.GetKeyCode() == OpenEngine::KeyCode::Space) {
|
||||
shooting = true;
|
||||
}
|
||||
if (game_over && event.GetKeyCode() == OpenEngine::KeyCode::Enter) {
|
||||
if (state == GameState::GameOver && event.GetKeyCode() == OpenEngine::KeyCode::Enter) {
|
||||
Reset();
|
||||
}
|
||||
|
||||
@@ -310,6 +333,7 @@ class Shmup : public OpenEngine::Layer
|
||||
OpenEngine::EventDispatcher dispatcher(event);
|
||||
|
||||
dispatcher.Dispatch<OpenEngine::KeyPressedEvent>(BIND_EVENT_FN(Shmup::ProcessKeyPressedEvents));
|
||||
dispatcher.Dispatch<OpenEngine::KeyPressedEvent>(BIND_EVENT_FN(Shmup::MovePlayerShipDiscrete));
|
||||
dispatcher.Dispatch<OpenEngine::KeyReleasedEvent>(BIND_EVENT_FN(Shmup::ProcessKeyReleased));
|
||||
{
|
||||
OE_PROFILE_SCOPE("Camera OnEvent");
|
||||
@@ -317,26 +341,23 @@ class Shmup : public OpenEngine::Layer
|
||||
}
|
||||
}
|
||||
|
||||
void OnImGuiRender() override
|
||||
{
|
||||
ImGuiIO io = ImGui::GetIO();
|
||||
static auto m_Font = io.Fonts->AddFontFromFileTTF("/usr/share/fonts/TTF/JetBrainsMono-Regular.ttf", 120.0f);
|
||||
//void OnImGuiRender() override
|
||||
//{
|
||||
// ImGuiIO io = ImGui::GetIO();
|
||||
// static auto m_Font = io.Fonts->AddFontFromFileTTF("/usr/share/fonts/TTF/JetBrainsMono-Regular.ttf", 120.0f);
|
||||
|
||||
ImGui::GetForegroundDrawList()->AddText(m_Font, 48.0f, {5.0f, 5.0f}, 0xffffffff, "test");
|
||||
}
|
||||
// ImGui::GetForegroundDrawList()->AddText(m_Font, 48.0f, {5.0f, 5.0f}, 0xffffffff, "test");
|
||||
//}
|
||||
|
||||
GameState GetGameState() { return state; };
|
||||
int GetScore() { return score; };
|
||||
int GetLives() { return lives; };
|
||||
|
||||
private:
|
||||
//glm::vec3 square_pos = glm::vec3(0.0f);
|
||||
//glm::vec4 square_color = glm::vec4(1.0f);
|
||||
|
||||
bool paused = false;
|
||||
bool game_over = false;
|
||||
|
||||
//float color[4] = {0.5f, 0.3f, 0.4f, 1.0f};
|
||||
OpenEngine::Ref<OpenEngine::Texture2D> ship;
|
||||
OpenEngine::Ref<OpenEngine::Texture2D> enemy_ship;
|
||||
OpenEngine::Ref<OpenEngine::Texture2D> bullet_tx;
|
||||
OpenEngine::Transform tr1;
|
||||
OpenEngine::Transform tr1 = {glm::vec3(0.0f, -0.9f, -0.1f), glm::vec3(0.1f), 0.0f};
|
||||
std::vector<OpenEngine::Transform> enemies, bullets;
|
||||
int score = 0;
|
||||
int lives = 5;
|
||||
@@ -349,12 +370,10 @@ class Shmup : public OpenEngine::Layer
|
||||
std::random_device rd;
|
||||
std::mt19937 e{rd()}; // or std::default_random_engine e{rd()};
|
||||
|
||||
//std::unordered_map<std::string, unsigned int> bindings;
|
||||
OpenEngine::OrthographicCameraController camera;
|
||||
GameState state = GameState::Playing;
|
||||
|
||||
OpenEngine::Ref<Overlay> overlay;
|
||||
|
||||
//std::vector<OpenEngine::Time::ProfilingResult> profiling_results;
|
||||
//OpenEngine::Ref<Overlay> overlay;
|
||||
};
|
||||
|
||||
#endif // SHMUP_HPP
|
||||
|
||||
Reference in New Issue
Block a user