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"?>
|
||||
<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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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++){}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
24
src/main.cpp
24
src/main.cpp
|
@ -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;
|
||||
|
|
|
@ -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/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();
|
||||
|
|
Loading…
Reference in New Issue