gba-sprite-engine/src/engine/gba_engine.cpp

75 lines
1.7 KiB
C++
Raw Normal View History

2018-08-01 16:03:16 +02:00
//
// Created by Wouter Groeneveld on 28/07/18.
//
#include <engine/gba/tonc_memdef.h>
#include <engine/background/text_stream.h>
#include "gba_engine.h"
#include "allocator.h"
void GBAEngine::update() {
2018-08-01 16:03:16 +02:00
vsync();
2018-08-04 10:43:27 +02:00
if(sceneToTransitionTo) {
currentEffectForTransition->update();
if(currentEffectForTransition->isDone()) {
setScene(sceneToTransitionTo);
}
}
2018-08-01 16:03:16 +02:00
spriteManager.render();
u16 keys = readKeys();
this->currentScene->tick(keys);
}
2018-08-04 10:43:27 +02:00
void GBAEngine::transitionIntoScene(Scene *scene, SceneEffect* effect) {
sceneToTransitionTo = scene;
currentEffectForTransition = effect;
currentEffectForTransition->setSceneToAffect(this->currentScene);
}
u16 GBAEngine::readKeys() {
return ~REG_KEYS & KEY_ANY;
2018-08-01 16:03:16 +02:00
}
GBAEngine::GBAEngine() {
REG_DISPCNT = DCNT_MODE0 | DCNT_OBJ | DCNT_OBJ_1D | DCNT_BG0 | DCNT_BG1 | DCNT_BG2 | DCNT_BG3;
2018-08-01 16:03:16 +02:00
Allocator::free();
}
2018-08-05 13:47:37 +02:00
void GBAEngine::cleanupPreviousScene() {
delete currentScene;
sceneToTransitionTo = nullptr;
delete currentEffectForTransition;
}
void GBAEngine::setScene(Scene* scene) {
2018-08-01 16:03:16 +02:00
if(this->currentScene) {
cleanupPreviousScene();
TextStream::instance().clear();
2018-08-01 16:03:16 +02:00
}
scene->load();
auto fgPalette = scene->getForegroundPalette();
if(fgPalette) {
fgPalette->persist();
}
auto bgPalette = scene->getBackgroundPalette();
if(bgPalette) {
bgPalette->persist();
}
2018-08-01 16:03:16 +02:00
Allocator::free();
TextStream::instance().persist();
spriteManager.set(scene->sprites());
2018-08-01 16:03:16 +02:00
spriteManager.persist();
for(const auto bg : scene->backgrounds()) {
2018-08-01 16:03:16 +02:00
bg->persist();
}
this->currentScene = scene;
2018-08-01 16:03:16 +02:00
}