From 2765b48f8590e0d6942e6846f9274e57fdb4f856 Mon Sep 17 00:00:00 2001 From: wgroeneveld Date: Thu, 2 Aug 2018 16:26:44 +0200 Subject: [PATCH] keyboard input, palette as part of scenes --- .idea/.name | 1 - .idea/misc.xml | 2 +- src/CMakeLists.txt | 2 +- src/engine/Scene.h | 15 +++++++++++-- src/engine/gba_engine.cpp | 22 +++++++++++++++---- src/engine/gba_engine.h | 3 ++- src/flying_stuff_scene.cpp | 5 ++++- src/flying_stuff_scene.h | 4 ++-- src/main.cpp | 24 +++++++++------------ src/sample_start_scene.cpp | 44 ++++++++++++++++++++++++++++++++++++++ src/sample_start_scene.h | 25 ++++++++++++++++++++++ test/scenetest.cpp | 19 +++++++++++++++- 12 files changed, 138 insertions(+), 28 deletions(-) delete mode 100644 .idea/.name create mode 100644 src/sample_start_scene.cpp create mode 100644 src/sample_start_scene.h diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index ad91ab9..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -Unittest \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index b8a138f..c250ec8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d0a8c7a..8118059 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 diff --git a/src/engine/Scene.h b/src/engine/Scene.h index 3326c55..9feeebb 100644 --- a/src/engine/Scene.h +++ b/src/engine/Scene.h @@ -6,17 +6,28 @@ #define GBA_SPRITE_ENGINE_SCRENE_H #include +#include #include #include "engine/sprites/sprite.h" +#include "palette_manager.h" class Scene { +protected: + std::unique_ptr foregroundPalette; + std::unique_ptr backgroundPalette; + std::function onNextSceneFn; + public: - // bg in here + ForegroundPaletteManager* getForegroundPalette() { return foregroundPalette.get(); } + BackgroundPaletteManager* getBackgroundPalette() { return backgroundPalette.get(); } // bg music in here virtual std::vector sprites() = 0; virtual std::vector backgrounds() = 0; virtual void load() = 0; - virtual void tick() = 0; + virtual void tick(u16 i) = 0; + + void onNextScene(std::function fn) { onNextSceneFn = fn; }; + Scene() { } ~Scene() { diff --git a/src/engine/gba_engine.cpp b/src/engine/gba_engine.cpp index e02807c..3c2c507 100644 --- a/src/engine/gba_engine.cpp +++ b/src/engine/gba_engine.cpp @@ -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(); diff --git a/src/engine/gba_engine.h b/src/engine/gba_engine.h index 58b0fa4..a5841ee 100644 --- a/src/engine/gba_engine.h +++ b/src/engine/gba_engine.h @@ -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++){} } diff --git a/src/flying_stuff_scene.cpp b/src/flying_stuff_scene.cpp index 6d2fa37..04a1004 100644 --- a/src/flying_stuff_scene.cpp +++ b/src/flying_stuff_scene.cpp @@ -21,6 +21,9 @@ std::vector FlyingStuffScene::backgrounds() { } void FlyingStuffScene::load() { + foregroundPalette = std::unique_ptr(new ForegroundPaletteManager(sharedPal, sizeof(sharedPal))); + backgroundPalette = std::unique_ptr(new BackgroundPaletteManager(bg_palette, sizeof(bg_palette))); + SpriteBuilder builder; SpriteBuilder affineBuilder; @@ -53,7 +56,7 @@ void FlyingStuffScene::load() { bg.get()->useMapScreenBlock(16); } -void FlyingStuffScene::tick() { +void FlyingStuffScene::tick(u16 i) { scrollX += 1; rotation += rotationDiff; diff --git a/src/flying_stuff_scene.h b/src/flying_stuff_scene.h index 4c413e0..dc04a9b 100644 --- a/src/flying_stuff_scene.h +++ b/src/flying_stuff_scene.h @@ -23,12 +23,12 @@ private: int rotationDiff = 128; public: FlyingStuffScene() : rotation(0), rotationDiff(128), scrollX(0), scrollY(0) {} - std::vector sprites() override; + std::vector sprites() override; std::vector backgrounds() override; void load() override; - void tick() override; + void tick(u16 i) override; }; diff --git a/src/main.cpp b/src/main.cpp index 12ff871..91fefda 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,27 +6,23 @@ #include #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; diff --git a/src/sample_start_scene.cpp b/src/sample_start_scene.cpp new file mode 100644 index 0000000..8f48af7 --- /dev/null +++ b/src/sample_start_scene.cpp @@ -0,0 +1,44 @@ +// +// Created by Wouter Groeneveld on 02/08/18. +// + +#include +#include +#include +#include "sample_start_scene.h" +#include "kul.h" + +std::vector SampleStartScene::backgrounds() { + return {}; +} + +std::vector SampleStartScene::sprites() { + return { smiley.get(), logo.get() }; +} + +void SampleStartScene::load() { + foregroundPalette = std::unique_ptr(new ForegroundPaletteManager(sharedPal, sizeof(sharedPal))); + + SpriteBuilder 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"; + } +} diff --git a/src/sample_start_scene.h b/src/sample_start_scene.h new file mode 100644 index 0000000..25d5f35 --- /dev/null +++ b/src/sample_start_scene.h @@ -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 + +class SampleStartScene : public Scene { +private: + std::unique_ptr logo; + std::unique_ptr smiley; + +public: + std::vector sprites() override; + std::vector backgrounds() override; + + void load() override; + void tick(u16 keys) override; + +}; + + +#endif //GBA_SPRITE_ENGINE_SAMPLE_START_SCENE_H diff --git a/test/scenetest.cpp b/test/scenetest.cpp index 98f8c70..c2cd1f8 100644 --- a/test/scenetest.cpp +++ b/test/scenetest.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "gtest/gtest.h" class SceneSuite : public ::testing::Test { @@ -21,6 +22,9 @@ private: std::unique_ptr someSprite1; std::unique_ptr someSprite2; public: + void moveToNextSceneTest(Scene& next) { + this->onNextSceneFn(next); + } std::vector sprites() override { return { someSprite1.get(), someSprite2.get() @@ -31,7 +35,7 @@ public: return std::vector(); } - 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();