163 lines
3.8 KiB
C++
163 lines
3.8 KiB
C++
#include "GameEntity.hpp"
|
|
#include "Player.hpp"
|
|
#include "App/EditorCamera.hpp"
|
|
#include "Data/Level.hpp"
|
|
#include "JUI/Widgets/Scene.hpp"
|
|
#include "ReWindow/types/Window.h"
|
|
|
|
namespace TestGame
|
|
{
|
|
constexpr int GL_MAJOR = 2;
|
|
constexpr int GL_MINOR = 1;
|
|
|
|
constexpr int START_APP_WIDTH = 1024;
|
|
constexpr int START_APP_HEIGHT = 768;
|
|
static const std::string START_APP_TITLE = "Redacted Software 2D Level Editor - Map Testing Game";
|
|
|
|
class TestGameAppWindow : public ReWindow::OpenGLWindow
|
|
{
|
|
public:
|
|
EditorCamera camera;
|
|
Level* loaded_level = nullptr;
|
|
Tileset* loaded_tileset = nullptr;
|
|
JGL::Texture* loaded_tilesheet = nullptr;
|
|
|
|
JUI::Scene* scene = nullptr;
|
|
|
|
|
|
Player* player = nullptr;
|
|
|
|
bool data_ready = false;
|
|
|
|
std::vector<GameEntity*> entities;
|
|
|
|
TestGameAppWindow();
|
|
|
|
~TestGameAppWindow() override;
|
|
|
|
|
|
/// Initializes and styles all the JUI widgets used by the application.
|
|
/// This function is called from Load().
|
|
void CreateUI();
|
|
|
|
/// Load all resources.
|
|
/// This is called after the application window is initially opened, and the OpenGL context is created.
|
|
/// But is always called before the first pass of the gameloop (Update, Draw, Step, etc).
|
|
void Load();
|
|
|
|
bool Open() override;
|
|
|
|
/// Performs collision testing and response between entities and tiles.
|
|
void CollisionSolve(float elapsed);
|
|
|
|
void CameraUpdate(float elapsed);
|
|
|
|
void Update(float elapsed);
|
|
|
|
|
|
void DrawLayer(const Layer* layer) const;
|
|
|
|
|
|
void ApplyOriginTransformation() {
|
|
glTranslatef(GetWidth() / 2.f, GetHeight() / 2.f, 0);
|
|
}
|
|
|
|
void ApplyCameraTransformation() {
|
|
ApplyOriginTransformation();
|
|
glRotatef(camera.rotation.current, 0, 0, 1);
|
|
glScalef(camera.scale.current, camera.scale.current, 1);
|
|
glTranslatef(-camera.translation.current.x, -camera.translation.current.y, 0);
|
|
}
|
|
|
|
void DrawLevel(const Level* level) const
|
|
{
|
|
for (const auto* layer : level->layers)
|
|
{
|
|
DrawLayer(layer);
|
|
}
|
|
}
|
|
|
|
void DrawWorldSpace() {
|
|
|
|
if (!data_ready) return; // Don't try to draw the level if not loaded.
|
|
|
|
DrawLevel(loaded_level);
|
|
|
|
for (auto* entity : entities) {
|
|
entity->Draw();
|
|
}
|
|
}
|
|
|
|
void Render() {
|
|
glClearColor(0, 0, 0, 1);
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
J2D::Begin();
|
|
{
|
|
glPushMatrix();
|
|
{
|
|
ApplyCameraTransformation();
|
|
DrawWorldSpace();
|
|
}
|
|
glPopMatrix();
|
|
}
|
|
|
|
J2D::End();
|
|
|
|
scene->Draw();
|
|
|
|
}
|
|
|
|
#pragma region ReWindow Overrides
|
|
void OnRefresh(float elapsed) override
|
|
{
|
|
Update(elapsed);
|
|
Render();
|
|
SwapBuffers();
|
|
}
|
|
|
|
|
|
enum JUI::MouseButton ToJUIEnum(const MouseButton& btn) {
|
|
if (btn == MouseButtons::Left) return JUI::MouseButton::Left;
|
|
if (btn == MouseButtons::Middle) return JUI::MouseButton::Middle;
|
|
if (btn == MouseButtons::Right) return JUI::MouseButton::Right;
|
|
|
|
// Default condition.
|
|
return JUI::MouseButton::Left;
|
|
}
|
|
|
|
void OnMouseButtonDown(const ReWindow::MouseButtonDownEvent &e) override {
|
|
auto btn = ToJUIEnum(e.Button);
|
|
|
|
if (scene->ObserveMouseInput(btn, true)) return;
|
|
}
|
|
|
|
void OnMouseButtonUp(const ReWindow::MouseButtonUpEvent &e) override {
|
|
auto btn = ToJUIEnum(e.Button);
|
|
if (scene->ObserveMouseInput(btn, false)) return;
|
|
}
|
|
|
|
void OnMouseMove(const ReWindow::MouseMoveEvent &e) override {
|
|
Vector2 mposv2(e.Position.x, e.Position.y);
|
|
if (scene->ObserveMouseMovement(mposv2)) return;
|
|
}
|
|
|
|
void OnKeyDown(const ReWindow::KeyDownEvent &e) override {
|
|
if (scene->ObserveKeyInput(e.key, true)) return;
|
|
}
|
|
|
|
void OnKeyUp(const ReWindow::KeyUpEvent &e) override {
|
|
if (scene->ObserveKeyInput(e.key, false)) return;
|
|
}
|
|
|
|
void OnFocusGain(const ReWindow::RWindowEvent &e) override {
|
|
focused = true;
|
|
}
|
|
|
|
void OnFocusLost(const ReWindow::RWindowEvent &e) override {
|
|
focused = false;
|
|
}
|
|
#pragma endregion
|
|
};
|
|
|
|
}
|