farmlands/src/controller/FarmlandsGame.cpp

141 lines
2.6 KiB
C++

/*
* FarmlandsGame.cpp
*
* Created on: Nov 7, 2016
* Author: tibi
*/
#include <model/GameObject.h>
#include <controller/FarmlandsGame.h>
#include <graphics/backend/SdlRenderer.h>
#include <resources/Resources.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_ttf.h>
#include <unistd.h>
#include <iostream>
using namespace farmlands::graphics;
using namespace farmlands::graphics::backend;
using namespace farmlands::resources;
namespace farmlands {
namespace controller {
FarmlandsGame::FarmlandsGame() :
m_running(true),
m_time(0)
{
}
bool FarmlandsGame::initialize()
{
bool ok = true;
// Initialize render system
ok &= SdlRenderer::instance().initialize(&GameState::current().renderContext);
if (!ok)
return false;
// Initialize & load resources
ResourceManager::instance().initialize();
ResourceManager::instance().loadGame();
GameState::current().renderContext.viewport.pixelsPerUnitX = GameState::current().scene->cellWidth;
GameState::current().renderContext.viewport.pixelsPerUnitY = GameState::current().scene->cellHeight;
// Finish initialization
GameState::current().scene->root.onInitialize();
GameState::current().gameInitialized = true;
return true;
}
void FarmlandsGame::onUpdateLogic()
{
GameState::current().scene->root.onUpdateLogic();
}
void FarmlandsGame::onPreRender()
{
GameState::current().scene->root.onPreRender();
SdlRenderer::instance().renderBegin();
}
void FarmlandsGame::onRender()
{
GameState::current().scene->root.onRender();
}
void FarmlandsGame::onEvent(SDL_Event& event)
{
// Let controllers handle event
if (GameState::current().scene->root.onEvent(event))
return;
// Nobody? Handle global events
switch(event.type)
{
case SDL_QUIT:
stop();
break;
case SDL_KEYDOWN:
if (event.key.keysym.scancode == SDL_Scancode::SDL_SCANCODE_ESCAPE)
stop();
break;
case SDL_WINDOWEVENT_RESIZED:
break;
}
}
void FarmlandsGame::onPostRender()
{
SdlRenderer::instance().renderEnd();
GameState::current().scene->root.onPostRender();
}
void FarmlandsGame::onFrameEnded()
{
GameState::current().scene->root.onFrameEnded();
}
void FarmlandsGame::stop()
{
m_running = false;
GameState::current().scene->root.onDestroy();
}
int FarmlandsGame::run()
{
// Initialize game
if (!initialize())
return 1;
// Main loop
while(m_running)
{
// Update elapsed time
Uint32 now = SDL_GetTicks();
GameState::current().deltaTime = (now - m_time) * 0.001f;
m_time = now;
SDL_Event event;
while (SDL_PollEvent(&event))
onEvent(event);
onUpdateLogic();
onPreRender();
onRender();
onPostRender();
onFrameEnded();
}
// Cleanup
return 0;
}
}
}