This commit is contained in:
2025-01-02 15:17:14 -05:00
parent 18072f3b66
commit bd72263944
12 changed files with 72 additions and 17 deletions

View File

@@ -24,6 +24,8 @@ public:
void MoveLeft(float speed); void MoveLeft(float speed);
void MoveRight(float speed); void MoveRight(float speed);
void Move(float angle_rad, float speed);
void Rotate(float speed); void Rotate(float speed);
void SetRotation(float new_rotation); void SetRotation(float new_rotation);

View File

@@ -9,7 +9,8 @@ namespace Engine {
class Engine::Renderable : public Entity { class Engine::Renderable : public Entity {
public: public:
virtual void Render() {} // *must* be overridden.
virtual void Render() = 0;
public: public:
explicit Renderable(const Vector2& position, float rotation = 0.0f) : Entity(position, rotation) {} explicit Renderable(const Vector2& position, float rotation = 0.0f) : Entity(position, rotation) {}
}; };

View File

@@ -0,0 +1,30 @@
#pragma once
#include <Engine/Entity/Renderable.h>
#include <JGL/types/Texture.h>
#include <J3ML/Geometry/AABB2D.hpp>
namespace Engine {
class Sprite;
}
class Engine::Sprite : public Renderable {
protected:
Texture* texture = nullptr;
// Positive alpha mask.
Texture* alpha_mask = nullptr;
Vector2 scale = {1, 1};
// Local space, Where the face_angle rotation should be preformed about.
Vector2 origin = {0, 0};
Color4 base_color = Colors::White;
public:
[[nodiscard]] Texture* GetTexture();
// World space.
[[nodiscard]] virtual AABB2D GetBounds();
public:
void Render() override;
public:
~Sprite() override;
explicit Sprite(const Vector2& pos, const float face_angle = 0.0f, const Color4& base_color = Colors::White, Texture* texture = nullptr,
Texture* alpha_mask = nullptr) : Renderable(pos, face_angle), texture(texture), alpha_mask(alpha_mask), base_color(base_color) {}
};

View File

@@ -4,6 +4,7 @@
#include <Engine/Entity/Renderable.h> #include <Engine/Entity/Renderable.h>
#include <Engine/Entity/Hud.h> #include <Engine/Entity/Hud.h>
#include <Engine/Level/Fixed.h> #include <Engine/Level/Fixed.h>
#include <JGL/types/RenderTarget.h>
namespace Engine { namespace Engine {
class Scene; class Scene;
@@ -36,7 +37,7 @@ public:
virtual void Unload(); virtual void Unload();
virtual void Init() {} virtual void Init() {}
virtual void Update(); virtual void Update();
virtual void Render(); virtual void Render(RenderTarget* render_target = nullptr);
public: public:
explicit Scene(const std::string& name) : name(name) {} explicit Scene(const std::string& name) : name(name) {}
virtual ~Scene(); virtual ~Scene();

View File

@@ -11,6 +11,6 @@ public:
void Init() final; void Init() final;
void Update() final; void Update() final;
void Render() final; void Render(RenderTarget* render_target = nullptr) final;
~LoadingScreen() final; ~LoadingScreen() final;
}; };

View File

@@ -11,9 +11,13 @@ void Engine::Entity::MoveY(float speed) {
position.y = position.y + (speed * Globals::DeltaTime()); position.y = position.y + (speed * Globals::DeltaTime());
} }
void Engine::Entity::Move(float angle_rad, float speed) {
position.x = position.x + (speed * Globals::DeltaTime()) * Math::Cos(angle_rad);
position.y = position.y + (speed * Globals::DeltaTime()) * Math::Sin(angle_rad);
}
void Engine::Entity::MoveForward(float speed) { void Engine::Entity::MoveForward(float speed) {
position.x = position.x + (speed * Globals::DeltaTime()) * Math::Cos(face_angle); Move(face_angle, speed);
position.y = position.y + (speed * Globals::DeltaTime()) * Math::Sin(face_angle);
} }
void Engine::Entity::MoveBackward(float speed) { void Engine::Entity::MoveBackward(float speed) {
@@ -63,7 +67,6 @@ bool Engine::Entity::AppendChild(Entity* entity) {
Engine::Entity::~Entity() { Engine::Entity::~Entity() {
for (auto* e : children) for (auto* e : children)
delete e; delete e;
children = {}; children = {};
} }

View File

@@ -1 +0,0 @@

View File

@@ -0,0 +1,21 @@
#include <Engine/Entity/Sprite.h>
Engine::Sprite::~Sprite() {
delete texture;
delete alpha_mask;
}
void Engine::Sprite::Render() {
if (texture && !alpha_mask)
J2D::DrawSprite(texture, position, face_angle, origin, scale, base_color);
if (texture && alpha_mask)
J2D::DrawSprite(texture, alpha_mask, position, face_angle, origin, scale, base_color);
}
AABB2D Engine::Sprite::GetBounds() {
return { position, texture->GetDimensions() + position };
}
Texture* Engine::Sprite::GetTexture() {
return texture;
}

View File

@@ -27,18 +27,21 @@ void Engine::Scene::Update() {
e->Update(); e->Update();
} }
void Engine::Scene::Render() { void Engine::Scene::Render(RenderTarget* render_target) {
for (auto& f : FixedList) for (auto& f : FixedList)
if (f->Enabled()) if (f->Enabled())
f->Render(); f->Render();
// TODO Render order. In this system it's not possible for child entities to be rendered before the parent. // TODO Render order. In this system it's not possible for child entities to be rendered before the parent.
J2D::Begin(render_target, true);
for (auto& e : EntityList) for (auto& e : EntityList)
if (auto* r = dynamic_cast<Renderable*>(e)) if (auto* r = dynamic_cast<Renderable*>(e))
r->Render(); r->Render();
if (HeadsUpDisplay) if (HeadsUpDisplay)
HeadsUpDisplay->Render(); HeadsUpDisplay->Render();
J2D::End();
} }
Engine::Scene::~Scene() { Engine::Scene::~Scene() {

View File

@@ -1,9 +1,7 @@
#include <Game/Entity/Box.h> #include <Game/Entity/Box.h>
void Game::Box::Render() { void Game::Box::Render() {
J2D::Begin(nullptr, true);
J2D::FillRect(Colors::Red, Vector2(position), {20, 20}); J2D::FillRect(Colors::Red, Vector2(position), {20, 20});
J2D::End();
} }
void Game::Box::Update() { void Game::Box::Update() {

View File

@@ -2,8 +2,5 @@
#include <Engine/Globals.h> #include <Engine/Globals.h>
void Game::DemoGameHud::Render() { void Game::DemoGameHud::Render() {
float framerate = Globals::Window->GetRefreshRate(); J2D::DrawString(Colors::Whites::Ivory, "Framerate: " + std::to_string((int) Globals::Window->GetRefreshRate()), 0, 0, 1, 16);
J2D::Begin(nullptr, true);
J2D::DrawString(Colors::Whites::Ivory, "Framerate: " + std::to_string((int) framerate), 0, 0, 1, 16);
J2D::End();
} }

View File

@@ -14,14 +14,14 @@ void LoadingScreen::Update() {
Globals::ChangeScene("Scene0"); Globals::ChangeScene("Scene0");
} }
void LoadingScreen::Render() { void LoadingScreen::Render(RenderTarget* render_target) {
auto text_length = JGL::Fonts::Jupiteroid.MeasureString("Loading ....", 24); auto text_length = JGL::Fonts::Jupiteroid.MeasureString("Loading ....", 24);
std::string text = "Loading"; std::string text = "Loading";
int dots = static_cast<int>(floor(elapsed / 0.35)) % 4; int dots = static_cast<int>(floor(elapsed / 0.35)) % 4;
for (int i = 0; i < dots; ++i) for (int i = 0; i < dots; ++i)
text += "."; text += ".";
J2D::Begin(nullptr, true); J2D::Begin(render_target, true);
J2D::DrawSprite(RedactedSoftware, {Globals::Window->GetSize().x - RedactedSoftware->GetDimensions().x, Globals::Window->GetSize().y - RedactedSoftware->GetDimensions().y}, angle, {0.5, 0.5}); J2D::DrawSprite(RedactedSoftware, {Globals::Window->GetSize().x - RedactedSoftware->GetDimensions().x, Globals::Window->GetSize().y - RedactedSoftware->GetDimensions().y}, angle, {0.5, 0.5});
J2D::DrawString(Colors::Whites::Ivory, text, (Globals::Window->GetSize().x - text_length.x) - RedactedSoftware->GetDimensions().x , Globals::Window->GetSize().y - text_length.y * 1.125, 1, 24); J2D::DrawString(Colors::Whites::Ivory, text, (Globals::Window->GetSize().x - text_length.x) - RedactedSoftware->GetDimensions().x , Globals::Window->GetSize().y - text_length.y * 1.125, 1, 24);
J2D::End(); J2D::End();