keyboard input, palette as part of scenes

This commit is contained in:
wgroeneveld 2018-08-02 16:26:44 +02:00
parent e9c5f5da00
commit 2765b48f85
12 changed files with 138 additions and 28 deletions

View File

@ -1 +0,0 @@
Unittest

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$/test" />
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$/" />
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>

View File

@ -2,7 +2,7 @@ SET(CMAKE_C_COMPILER arm-none-eabi-gcc)
SET(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set_property(SOURCE engine/gba/sin_lut.s PROPERTY LANGUAGE C)
add_executable(${PROJECT_NAME}.elf main.cpp engine/sprites/sprite_manager.cpp engine/sprites/sprite_manager.h engine/gba/tonc_memmap.h engine/gba/tonc_core.h engine/gba/tonc_memdef.h engine/gba/tonc_types.h engine/sprites/sprite.cpp engine/sprites/sprite.h kul.h engine/palette_manager.cpp engine/palette_manager.h engine/allocator.cpp engine/allocator.h engine/gba/tonc_oam.h engine/gba/tonc_math.h engine/gba/sin_lut.s engine/Scene.cpp engine/Scene.h engine/sprites/sprite_builder.cpp engine/sprites/sprite_builder.h engine/sprites/affine_sprite.cpp engine/sprites/affine_sprite.h flying_stuff_scene.cpp flying_stuff_scene.h engine/gba_engine.cpp engine/gba_engine.h engine/background/text_stream.cpp engine/background/text_stream.h engine/background/background.cpp engine/background/background.h engine/background/text.h)
add_executable(${PROJECT_NAME}.elf main.cpp engine/sprites/sprite_manager.cpp engine/sprites/sprite_manager.h engine/gba/tonc_memmap.h engine/gba/tonc_core.h engine/gba/tonc_memdef.h engine/gba/tonc_types.h engine/sprites/sprite.cpp engine/sprites/sprite.h kul.h engine/palette_manager.cpp engine/palette_manager.h engine/allocator.cpp engine/allocator.h engine/gba/tonc_oam.h engine/gba/tonc_math.h engine/gba/sin_lut.s engine/Scene.cpp engine/Scene.h engine/sprites/sprite_builder.cpp engine/sprites/sprite_builder.h engine/sprites/affine_sprite.cpp engine/sprites/affine_sprite.h flying_stuff_scene.cpp flying_stuff_scene.h engine/gba_engine.cpp engine/gba_engine.h engine/background/text_stream.cpp engine/background/text_stream.h engine/background/background.cpp engine/background/background.h engine/background/text.h sample_start_scene.cpp sample_start_scene.h)
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -v -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.gba

View File

@ -6,17 +6,28 @@
#define GBA_SPRITE_ENGINE_SCRENE_H
#include <vector>
#include <functional>
#include <engine/background/background.h>
#include "engine/sprites/sprite.h"
#include "palette_manager.h"
class Scene {
protected:
std::unique_ptr<ForegroundPaletteManager> foregroundPalette;
std::unique_ptr<BackgroundPaletteManager> backgroundPalette;
std::function<void (Scene&)> onNextSceneFn;
public:
// bg in here
ForegroundPaletteManager* getForegroundPalette() { return foregroundPalette.get(); }
BackgroundPaletteManager* getBackgroundPalette() { return backgroundPalette.get(); }
// bg music in here
virtual std::vector<Sprite*> sprites() = 0;
virtual std::vector<Background*> backgrounds() = 0;
virtual void load() = 0;
virtual void tick() = 0;
virtual void tick(u16 i) = 0;
void onNextScene(std::function<void(Scene &)> fn) { onNextSceneFn = fn; };
Scene() { }
~Scene() {

View File

@ -7,15 +7,20 @@
#include "gba_engine.h"
#include "allocator.h"
void GBAEngine::render() {
void GBAEngine::update() {
vsync();
spriteManager.render();
this->currentScene->tick();
u16 keys = readKeys();
this->currentScene->tick(keys);
}
u16 GBAEngine::readKeys() {
return ~REG_KEYS & KEY_ANY;
}
GBAEngine::GBAEngine() {
REG_DISPCNT = DCNT_MODE0 | DCNT_OBJ | DCNT_OBJ_1D | DCNT_BG0 | DCNT_BG1;
REG_DISPCNT = DCNT_MODE0 | DCNT_OBJ | DCNT_OBJ_1D | DCNT_BG0 | DCNT_BG1 | DCNT_BG2 | DCNT_BG3;
Allocator::free();
}
@ -23,8 +28,17 @@ void GBAEngine::setScene(Scene& scene) {
if(this->currentScene) {
cleanupPreviousScene();
}
scene.load();
auto fgPalette = scene.getForegroundPalette();
if(fgPalette) {
fgPalette->persist();
}
auto bgPalette = scene.getBackgroundPalette();
if(bgPalette) {
bgPalette->persist();
}
Allocator::free();
TextStream::instance().persist();

View File

@ -27,7 +27,8 @@ public:
GBAEngine();
void setScene(Scene& scene);
void render();
u16 readKeys();
void update();
void delay(int times) {
for(int i = 0; i < times; i++){}
}

View File

@ -21,6 +21,9 @@ std::vector<Background *> FlyingStuffScene::backgrounds() {
}
void FlyingStuffScene::load() {
foregroundPalette = std::unique_ptr<ForegroundPaletteManager>(new ForegroundPaletteManager(sharedPal, sizeof(sharedPal)));
backgroundPalette = std::unique_ptr<BackgroundPaletteManager>(new BackgroundPaletteManager(bg_palette, sizeof(bg_palette)));
SpriteBuilder<Sprite> builder;
SpriteBuilder<AffineSprite> affineBuilder;
@ -53,7 +56,7 @@ void FlyingStuffScene::load() {
bg.get()->useMapScreenBlock(16);
}
void FlyingStuffScene::tick() {
void FlyingStuffScene::tick(u16 i) {
scrollX += 1;
rotation += rotationDiff;

View File

@ -23,12 +23,12 @@ private:
int rotationDiff = 128;
public:
FlyingStuffScene() : rotation(0), rotationDiff(128), scrollX(0), scrollY(0) {}
std::vector<Sprite *> sprites() override;
std::vector<Sprite *> sprites() override;
std::vector<Background *> backgrounds() override;
void load() override;
void tick() override;
void tick(u16 i) override;
};

View File

@ -6,27 +6,23 @@
#include <engine/allocator.h>
#include "kul.h"
#include "sample_start_scene.h"
#include "flying_stuff_scene.h"
/**
* shared palette extracted from grit
* ./../grit piskel.png piskel2.png kul.png -ftc -pS -gB8 -O shared.c
* assumes 8bpp sprites
*/
int main() {
GBAEngine engine;
TextStream::instance() << "abc123 sup";
// shared palette extracted from grit
// ./../grit piskel.png piskel2.png kul.png -ftc -pS -gB8 -O shared.c
// assumes 8bpp sprites
ForegroundPaletteManager fgPalette(sharedPal, sizeof(sharedPal));
BackgroundPaletteManager bgPalette(bg_palette, sizeof(bg_palette));
fgPalette.persist();
bgPalette.persist();
FlyingStuffScene flyingStuffScene;
engine.setScene(flyingStuffScene);
SampleStartScene startScene;
engine.setScene(startScene);
while (true) {
engine.render();
//engine.delay(1000);
engine.update();
engine.delay(1000);
}
return 0;

View File

@ -0,0 +1,44 @@
//
// Created by Wouter Groeneveld on 02/08/18.
//
#include <engine/sprites/sprite_builder.h>
#include <engine/background/text_stream.h>
#include <engine/gba/tonc_memdef.h>
#include "sample_start_scene.h"
#include "kul.h"
std::vector<Background *> SampleStartScene::backgrounds() {
return {};
}
std::vector<Sprite *> SampleStartScene::sprites() {
return { smiley.get(), logo.get() };
}
void SampleStartScene::load() {
foregroundPalette = std::unique_ptr<ForegroundPaletteManager>(new ForegroundPaletteManager(sharedPal, sizeof(sharedPal)));
SpriteBuilder<Sprite> builder;
smiley = builder
.withData(piskelTiles, sizeof(piskelTiles))
.withSize(SIZE_16_16)
.withLocation(10, 10)
.buildPtr();
logo = builder
.withData(kulTiles, sizeof(kulTiles))
.withSize(SIZE_64_32)
.withLocation(50, 50)
.buildPtr();
TextStream::instance().clear();
TextStream::instance().setText("PRESS START", 3, 8);
}
void SampleStartScene::tick(u16 keys) {
if(keys & KEY_START) {
TextStream::instance() << "entered: starting next scene";
}
}

25
src/sample_start_scene.h Normal file
View File

@ -0,0 +1,25 @@
//
// Created by Wouter Groeneveld on 02/08/18.
//
#ifndef GBA_SPRITE_ENGINE_SAMPLE_START_SCENE_H
#define GBA_SPRITE_ENGINE_SAMPLE_START_SCENE_H
#include <engine/Scene.h>
class SampleStartScene : public Scene {
private:
std::unique_ptr<Sprite> logo;
std::unique_ptr<Sprite> smiley;
public:
std::vector<Sprite *> sprites() override;
std::vector<Background *> backgrounds() override;
void load() override;
void tick(u16 keys) override;
};
#endif //GBA_SPRITE_ENGINE_SAMPLE_START_SCENE_H

View File

@ -4,6 +4,7 @@
#include <engine/Scene.h>
#include <engine/sprites/sprite_builder.h>
#include <engine/gba_engine.h>
#include "gtest/gtest.h"
class SceneSuite : public ::testing::Test {
@ -21,6 +22,9 @@ private:
std::unique_ptr<Sprite> someSprite1;
std::unique_ptr<Sprite> someSprite2;
public:
void moveToNextSceneTest(Scene& next) {
this->onNextSceneFn(next);
}
std::vector<Sprite *> sprites() override {
return {
someSprite1.get(), someSprite2.get()
@ -31,7 +35,7 @@ public:
return std::vector<Background *>();
}
void tick() override {
void tick(u16 i) override {
}
void load() override {
@ -44,6 +48,19 @@ public:
}
};
TEST_F(SceneSuite, OnGoToNextScene_Callback_Test) {
SomeScene scene;
bool called = false;
auto goToNextScene = [&called](Scene& sceneFromArgs) {
called = true;
};
scene.onNextScene(goToNextScene);
scene.moveToNextSceneTest(scene);
ASSERT_TRUE(called);
}
TEST_F(SceneSuite, GetSpritesReturnsPointersOfBuiltSprites) {
SomeScene scene;
scene.load();