keyboard input, palette as part of scenes
This commit is contained in:
parent
e9c5f5da00
commit
2765b48f85
|
@ -1 +0,0 @@
|
||||||
Unittest
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$/test" />
|
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$/" />
|
||||||
<component name="JavaScriptSettings">
|
<component name="JavaScriptSettings">
|
||||||
<option name="languageLevel" value="ES6" />
|
<option name="languageLevel" value="ES6" />
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -2,7 +2,7 @@ SET(CMAKE_C_COMPILER arm-none-eabi-gcc)
|
||||||
SET(CMAKE_CXX_COMPILER arm-none-eabi-g++)
|
SET(CMAKE_CXX_COMPILER arm-none-eabi-g++)
|
||||||
|
|
||||||
set_property(SOURCE engine/gba/sin_lut.s PROPERTY LANGUAGE C)
|
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
|
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
|
||||||
COMMAND ${CMAKE_OBJCOPY} -v -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.gba
|
COMMAND ${CMAKE_OBJCOPY} -v -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.gba
|
||||||
|
|
|
@ -6,17 +6,28 @@
|
||||||
#define GBA_SPRITE_ENGINE_SCRENE_H
|
#define GBA_SPRITE_ENGINE_SCRENE_H
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <functional>
|
||||||
#include <engine/background/background.h>
|
#include <engine/background/background.h>
|
||||||
#include "engine/sprites/sprite.h"
|
#include "engine/sprites/sprite.h"
|
||||||
|
#include "palette_manager.h"
|
||||||
|
|
||||||
class Scene {
|
class Scene {
|
||||||
|
protected:
|
||||||
|
std::unique_ptr<ForegroundPaletteManager> foregroundPalette;
|
||||||
|
std::unique_ptr<BackgroundPaletteManager> backgroundPalette;
|
||||||
|
std::function<void (Scene&)> onNextSceneFn;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// bg in here
|
ForegroundPaletteManager* getForegroundPalette() { return foregroundPalette.get(); }
|
||||||
|
BackgroundPaletteManager* getBackgroundPalette() { return backgroundPalette.get(); }
|
||||||
// bg music in here
|
// bg music in here
|
||||||
virtual std::vector<Sprite*> sprites() = 0;
|
virtual std::vector<Sprite*> sprites() = 0;
|
||||||
virtual std::vector<Background*> backgrounds() = 0;
|
virtual std::vector<Background*> backgrounds() = 0;
|
||||||
virtual void load() = 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() { }
|
||||||
~Scene() {
|
~Scene() {
|
||||||
|
|
|
@ -7,15 +7,20 @@
|
||||||
#include "gba_engine.h"
|
#include "gba_engine.h"
|
||||||
#include "allocator.h"
|
#include "allocator.h"
|
||||||
|
|
||||||
void GBAEngine::render() {
|
void GBAEngine::update() {
|
||||||
vsync();
|
vsync();
|
||||||
|
|
||||||
spriteManager.render();
|
spriteManager.render();
|
||||||
this->currentScene->tick();
|
u16 keys = readKeys();
|
||||||
|
this->currentScene->tick(keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 GBAEngine::readKeys() {
|
||||||
|
return ~REG_KEYS & KEY_ANY;
|
||||||
}
|
}
|
||||||
|
|
||||||
GBAEngine::GBAEngine() {
|
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();
|
Allocator::free();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,8 +28,17 @@ void GBAEngine::setScene(Scene& scene) {
|
||||||
if(this->currentScene) {
|
if(this->currentScene) {
|
||||||
cleanupPreviousScene();
|
cleanupPreviousScene();
|
||||||
}
|
}
|
||||||
|
|
||||||
scene.load();
|
scene.load();
|
||||||
|
|
||||||
|
auto fgPalette = scene.getForegroundPalette();
|
||||||
|
if(fgPalette) {
|
||||||
|
fgPalette->persist();
|
||||||
|
}
|
||||||
|
auto bgPalette = scene.getBackgroundPalette();
|
||||||
|
if(bgPalette) {
|
||||||
|
bgPalette->persist();
|
||||||
|
}
|
||||||
|
|
||||||
Allocator::free();
|
Allocator::free();
|
||||||
TextStream::instance().persist();
|
TextStream::instance().persist();
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,8 @@ public:
|
||||||
GBAEngine();
|
GBAEngine();
|
||||||
|
|
||||||
void setScene(Scene& scene);
|
void setScene(Scene& scene);
|
||||||
void render();
|
u16 readKeys();
|
||||||
|
void update();
|
||||||
void delay(int times) {
|
void delay(int times) {
|
||||||
for(int i = 0; i < times; i++){}
|
for(int i = 0; i < times; i++){}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,9 @@ std::vector<Background *> FlyingStuffScene::backgrounds() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlyingStuffScene::load() {
|
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<Sprite> builder;
|
||||||
SpriteBuilder<AffineSprite> affineBuilder;
|
SpriteBuilder<AffineSprite> affineBuilder;
|
||||||
|
|
||||||
|
@ -53,7 +56,7 @@ void FlyingStuffScene::load() {
|
||||||
bg.get()->useMapScreenBlock(16);
|
bg.get()->useMapScreenBlock(16);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlyingStuffScene::tick() {
|
void FlyingStuffScene::tick(u16 i) {
|
||||||
scrollX += 1;
|
scrollX += 1;
|
||||||
|
|
||||||
rotation += rotationDiff;
|
rotation += rotationDiff;
|
||||||
|
|
|
@ -23,12 +23,12 @@ private:
|
||||||
int rotationDiff = 128;
|
int rotationDiff = 128;
|
||||||
public:
|
public:
|
||||||
FlyingStuffScene() : rotation(0), rotationDiff(128), scrollX(0), scrollY(0) {}
|
FlyingStuffScene() : rotation(0), rotationDiff(128), scrollX(0), scrollY(0) {}
|
||||||
std::vector<Sprite *> sprites() override;
|
|
||||||
|
|
||||||
|
std::vector<Sprite *> sprites() override;
|
||||||
std::vector<Background *> backgrounds() override;
|
std::vector<Background *> backgrounds() override;
|
||||||
|
|
||||||
void load() override;
|
void load() override;
|
||||||
void tick() override;
|
void tick(u16 i) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
24
src/main.cpp
24
src/main.cpp
|
@ -6,27 +6,23 @@
|
||||||
#include <engine/allocator.h>
|
#include <engine/allocator.h>
|
||||||
|
|
||||||
#include "kul.h"
|
#include "kul.h"
|
||||||
|
#include "sample_start_scene.h"
|
||||||
#include "flying_stuff_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() {
|
int main() {
|
||||||
GBAEngine engine;
|
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) {
|
while (true) {
|
||||||
engine.render();
|
engine.update();
|
||||||
//engine.delay(1000);
|
engine.delay(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -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";
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include <engine/Scene.h>
|
#include <engine/Scene.h>
|
||||||
#include <engine/sprites/sprite_builder.h>
|
#include <engine/sprites/sprite_builder.h>
|
||||||
|
#include <engine/gba_engine.h>
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
class SceneSuite : public ::testing::Test {
|
class SceneSuite : public ::testing::Test {
|
||||||
|
@ -21,6 +22,9 @@ private:
|
||||||
std::unique_ptr<Sprite> someSprite1;
|
std::unique_ptr<Sprite> someSprite1;
|
||||||
std::unique_ptr<Sprite> someSprite2;
|
std::unique_ptr<Sprite> someSprite2;
|
||||||
public:
|
public:
|
||||||
|
void moveToNextSceneTest(Scene& next) {
|
||||||
|
this->onNextSceneFn(next);
|
||||||
|
}
|
||||||
std::vector<Sprite *> sprites() override {
|
std::vector<Sprite *> sprites() override {
|
||||||
return {
|
return {
|
||||||
someSprite1.get(), someSprite2.get()
|
someSprite1.get(), someSprite2.get()
|
||||||
|
@ -31,7 +35,7 @@ public:
|
||||||
return std::vector<Background *>();
|
return std::vector<Background *>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void tick() override {
|
void tick(u16 i) override {
|
||||||
}
|
}
|
||||||
|
|
||||||
void load() 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) {
|
TEST_F(SceneSuite, GetSpritesReturnsPointersOfBuiltSprites) {
|
||||||
SomeScene scene;
|
SomeScene scene;
|
||||||
scene.load();
|
scene.load();
|
||||||
|
|
Loading…
Reference in New Issue