Implemented some basic UI

This commit is contained in:
2016-11-28 00:17:20 +02:00
parent 8173937797
commit 70f79935da
21 changed files with 846 additions and 32 deletions

View File

@@ -62,6 +62,7 @@ void FarmlandsGame::onRender()
m_gameState.sdlRenderer.renderBegin();
m_gameState.gameRenderer.render();
m_gameState.guiRenderer.render();
m_guiController.render();
m_gameState.sdlRenderer.renderEnd();
}

View File

@@ -5,7 +5,10 @@
* Author: tibi
*/
#include <GameState.h>
#include <controller/GuiController.h>
#include <gui/primitives/RenderContext.h>
#include <gui/primitives/TextArea.h>
#include <cassert>
@@ -26,13 +29,56 @@ GuiController::~GuiController()
void GuiController::initialize(GameState* gameState)
{
assert(gameState != nullptr);
assert(gameState->viewport.initialized);
m_gameState = gameState;
// Set up canvas
m_canvas.setSize(m_gameState->viewport.width, m_gameState->viewport.height);
// Add a text element
auto text = new gui::primitives::TextArea();
text->setText("Hello world!\nMy name is Tibi!\nThis is a really really long long long, even the longest ever, line.");
text->setSize(200, 100);
text->setPosition(100, 10);
text->setColor(0, 1, 0);
text->setBackColor(0.5f, 0, 0, 0.5f);
text->setTextSize(11);
text->setHorizontalWrap(gui::primitives::TextHorizontalWrapping::Ellipsis);
m_canvas.addChild(text);
}
bool GuiController::processEvent(SDL_Event& event)
{
return false;
bool handled = m_canvas.handleEvent(event);
float currentW = m_canvas.child(0)->width();
float currentH = m_canvas.child(0)->height();
if (event.type == SDL_EventType::SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_HOME)
{
m_canvas.child(0)->setSize(currentW + 50, currentH);
}
if (event.type == SDL_EventType::SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_END)
{
m_canvas.child(0)->setSize(currentW - 50, currentH);
}
return handled;
}
void GuiController::render()
{
// Compute render context
gui::primitives::RenderContext renderContext =
{
.sdlRenderer = &m_gameState->sdlRenderer,
.resManager = &m_gameState->resManager,
.uiScale = 1,
};
// Render
m_canvas.render(renderContext);
}
} /* namespace controller */

View File

@@ -8,6 +8,8 @@
#ifndef CONTROLLER_GUICONTROLLER_H_
#define CONTROLLER_GUICONTROLLER_H_
#include <gui/Canvas.h>
#include <SDL2/SDL.h>
namespace farmlands {
@@ -33,8 +35,14 @@ namespace controller {
*/
bool processEvent(SDL_Event& event);
/**
* Renders the GUI
*/
void render();
private:
GameState* m_gameState;
gui::Canvas m_canvas;
};
} /* namespace controller */

View File

@@ -39,31 +39,30 @@ void PlayerController::updateLogic()
{
// Get keyboard status
const Uint8* keys = SDL_GetKeyboardState(NULL);
const SDL_Keymod mods = SDL_GetModState();
float deltaX = 0;
float deltaY = 0;
// Compute movement delta multiplier
float deltaMultiplier = 5.0f * m_gameState->elapsedTime; // Equivalent to units per second
if ((mods & KMOD_LSHIFT) || (mods & KMOD_RSHIFT))
if (keys[m_gameState->config.keys.Run])
deltaMultiplier *= 5;
// Handle scale changes (debugging only)
if (keys[SDL_SCANCODE_KP_MINUS])
if (keys[m_gameState->config.keys.Debug_ZoomOut])
m_gameState->camera.scale *= 1.0f - 0.05f * deltaMultiplier;
if (keys[SDL_SCANCODE_KP_PLUS])
if (keys[m_gameState->config.keys.Debug_ZoomIn])
m_gameState->camera.scale *= 1.0f + 0.05f * deltaMultiplier;
// Handle movement
if (keys[SDL_SCANCODE_UP])
deltaY -= 1;
if (keys[SDL_SCANCODE_DOWN])
deltaY += 1;
if (keys[SDL_SCANCODE_LEFT])
deltaX -= 1;
if (keys[SDL_SCANCODE_RIGHT])
if (keys[m_gameState->config.keys.Right] || keys[m_gameState->config.keys.AltRight])
deltaX += 1;
if (keys[m_gameState->config.keys.Up] || keys[m_gameState->config.keys.AltUp])
deltaY -= 1;
if (keys[m_gameState->config.keys.Left] || keys[m_gameState->config.keys.AltLeft])
deltaX -= 1;
if (keys[m_gameState->config.keys.Down] || keys[m_gameState->config.keys.AltDown])
deltaY += 1;
float newX = m_gameState->player.posX + deltaX * deltaMultiplier;
float newY = m_gameState->player.posY + deltaY * deltaMultiplier;