From ac801197b41b807f986baad73118b0b43c0a530b Mon Sep 17 00:00:00 2001 From: wgroeneveld Date: Thu, 6 Dec 2018 12:15:09 +0100 Subject: [PATCH] fix 16x16 animations, fix stayWithinBounds, update demo1 to showcase 16x animation --- demos/demo1-basicfeatures/CMakeLists.txt | 2 +- .../{ => img}/flying_stuff_bg.png | Bin demos/demo1-basicfeatures/img/lama.png | Bin 0 -> 526 bytes .../demo1-basicfeatures/img/lopen_jongen.png | Bin 0 -> 456 bytes demos/demo1-basicfeatures/lama.png | Bin 1269 -> 0 bytes demos/demo1-basicfeatures/src/ff.h | 39 + demos/demo1-basicfeatures/src/lama.h | 776 ++++++------------ .../src/sample_start_scene.cpp | 14 +- .../src/sample_start_scene.h | 1 + .../sprites/sprite_builder.h | 3 +- engine/src/sprites/sprite.cpp | 3 +- 11 files changed, 287 insertions(+), 551 deletions(-) rename demos/demo1-basicfeatures/{ => img}/flying_stuff_bg.png (100%) create mode 100644 demos/demo1-basicfeatures/img/lama.png create mode 100644 demos/demo1-basicfeatures/img/lopen_jongen.png delete mode 100644 demos/demo1-basicfeatures/lama.png create mode 100644 demos/demo1-basicfeatures/src/ff.h diff --git a/demos/demo1-basicfeatures/CMakeLists.txt b/demos/demo1-basicfeatures/CMakeLists.txt index 528be55..a65fa44 100644 --- a/demos/demo1-basicfeatures/CMakeLists.txt +++ b/demos/demo1-basicfeatures/CMakeLists.txt @@ -8,7 +8,7 @@ add_executable(${PROJECT_NAME}.elf src/sample_sound.h src/kul.h src/flying_stuff_scene.cpp - src/flying_stuff_scene.h) + src/flying_stuff_scene.h src/ff.h) target_link_libraries(${PROJECT_NAME}.elf gba-sprite-engine) diff --git a/demos/demo1-basicfeatures/flying_stuff_bg.png b/demos/demo1-basicfeatures/img/flying_stuff_bg.png similarity index 100% rename from demos/demo1-basicfeatures/flying_stuff_bg.png rename to demos/demo1-basicfeatures/img/flying_stuff_bg.png diff --git a/demos/demo1-basicfeatures/img/lama.png b/demos/demo1-basicfeatures/img/lama.png new file mode 100644 index 0000000000000000000000000000000000000000..31c654efd297a50027c3a24bd84bc1f10307148f GIT binary patch literal 526 zcmV+p0`dKcP)BnOD#zgGNV)o%~_CAhT00001bW%=J06^y0W&i*H0b)x> zL;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_000McNliru;tU203nA1Cgn$450W(QN zK~z}7?U?J1f-n$9X>qJ$y_7}TrG5YR+^|@G=;Fu4L|12$mL_wOAtC1rP!w-fS{sx1 zIe^yQpH6w719V6TDTOf59tEt|AsDj+Xj@}aS^_Yq)V9k2X785)&Ut_5Y2E{fXb_-t z4Fd5y{+8Bq&EZ@>CKEHF5*;lhstD{j0H`0=6R$B!4O&zG11^)QwM`2{mLJiCzw z;v{*yyD)UH%6b4foCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#5f2+Tw?OOFmR&$0+02lL z66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g9Vq_7)5S4F;&O6ALV}2hNCE@n z#CNs53S!Ck-`!pBsMGmE{O;`C(vlKOVr!>IG`mPdJ2}UeaWH(<&{mh!hzGc}|>_NV9sL(h{(JTs>%HK*+S z!XFUnjVQavKie2TFnyO|3=Pn!hwBvci(5!O%>>5-o^gLU_rG`*?~Kk zPcW4BE8Vee4ESE-TExG2<}=m1C%YVuSuOtcI;)#Sq9sgorG<7Tmw|^?r_@dW-V%E0f)s>7Q9+Q@ zL(ro_ffxpcfglld(ZKF4+C?|!Kb~P{cE`D$bG{?YzWmvpar~X{oU=3EcaG{B_@#q? zzZL_;3V15eShGB14AinjA&uADL*M9U+&&LFsMQ5vExdESo*Fei`Ge}2E2C81K7TU$ z)3Z_8D!HBv2Vj&8|d5oHsJu118td^SxqY}$lq%%Ef45GdqV})sugo5CjQa;@}${|t>?x=%?2F~@UE*m zGn3J@@6(H@1*J>OK5xJIDSykEP;&|-E0d9CgKhvASNJjo0_bnvKmf0bi+oMp?Hi|T z=P?ED-ZSqB9gotUQ#<ggYZR0NfeD0hDn@aBs-&OR+VJtr<53Vrv##v)G!&)(mdVoL%5$Qk(Wn z(+#mGQ%NZPjV2H%3aRo~->!_1Rd0>d5b6 zs>5UNJ$+_AkE<&KP`|T^00;ZtQgyy(Eo8uM$Adcgd1aHabf-1|lT)NY^)+&p0TAI2 z11SIp5aAC4DF6o$VNe4ppbP*{gBnT!H~`P3yHE;90g$zJsC$`HqrXM29TGry_kInv zc8CWs-0@UjzlK^nq?JXY4b{DeQ&b<{ zAGU=MtjpYv2eIfj1z-U45sS_Ud_5ByfTA4o!UN##kOM0K2jK0H11kUr;O&qDE1(Pj zFNYjj0XP6Jha6e~DF8Aox-WY!(xO`cD2t8{2|DqlRbw5u+ffk$kyFZ835T1IY$9FfNY1HqW}!RIUC&W1UiB9a1d03IPlBn6}Zh)zjJ0Y94Kc6;$B?*jFiPJ5SCmkR4Q6 f0H~Y@4)7n@hmARVSPMk}0000 SampleStartScene::backgrounds() { @@ -18,22 +19,29 @@ std::vector SampleStartScene::backgrounds() { } std::vector SampleStartScene::sprites() { - return { animation.get() }; + return { animation.get(), finalFantasyGuy.get() }; } void SampleStartScene::load() { - foregroundPalette = std::unique_ptr(new ForegroundPaletteManager(lama_palette, sizeof(lama_palette))); + foregroundPalette = std::unique_ptr(new ForegroundPaletteManager(sharedPal, sizeof(sharedPal))); backgroundPalette = std::unique_ptr(new BackgroundPaletteManager()); SpriteBuilder builder; animation = builder - .withData(lama_data, sizeof(lama_data)) + .withData(lamaTiles, sizeof(lamaTiles)) .withSize(SIZE_32_32) .withAnimated(6, 3) .withLocation(50, 50) .buildPtr(); + finalFantasyGuy = builder + .withData(lopen_jongenTiles, sizeof(lopen_jongenTiles)) + .withSize(SIZE_16_16) + .withAnimated(2, 10) + .withLocation(10, 10) + .buildPtr(); + TextStream::instance().setText("PRESS START", 3, 8); engine->enqueueMusic(zelda_music_16K_mono, zelda_music_16K_mono_bytes); } diff --git a/demos/demo1-basicfeatures/src/sample_start_scene.h b/demos/demo1-basicfeatures/src/sample_start_scene.h index aedb5db..9e68c60 100644 --- a/demos/demo1-basicfeatures/src/sample_start_scene.h +++ b/demos/demo1-basicfeatures/src/sample_start_scene.h @@ -10,6 +10,7 @@ class SampleStartScene : public Scene { private: std::unique_ptr animation; + std::unique_ptr finalFantasyGuy; std::unique_ptr smiley; public: diff --git a/engine/include/libgba-sprite-engine/sprites/sprite_builder.h b/engine/include/libgba-sprite-engine/sprites/sprite_builder.h index 86f7f8c..5712514 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite_builder.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite_builder.h @@ -10,7 +10,7 @@ template class SpriteBuilder { private: u32 imageSize; - bool stayWithinBounds; + bool stayWithinBounds = false; const void *imageData; u32 x, y, dx, dy; u32 numberOfFrames, animationDelay; @@ -20,6 +20,7 @@ private: void reset() { imageSize = x = y = dx = dy = numberOfFrames = animationDelay = 0; imageData = nullptr; + stayWithinBounds = false; size = SIZE_16_16; } public: diff --git a/engine/src/sprites/sprite.cpp b/engine/src/sprites/sprite.cpp index 5a2f95f..19df17d 100644 --- a/engine/src/sprites/sprite.cpp +++ b/engine/src/sprites/sprite.cpp @@ -53,7 +53,8 @@ void Sprite::syncVelocity() { void Sprite::syncAnimation() { int offset = w == 64 ? 2 : 1; // 64xY sprites don't seem to cut currFrame * w - int newTileIndex = this->tileIndex + (currentFrame * w * offset); + int width = w == 16 ? 8 : w; // 16xY sprites: frame 192 -> 200 (x8) (skip last 2 bpps) + int newTileIndex = this->tileIndex + (currentFrame * width * offset); oam->attr2 &= OAM_TILE_OFFSET_CLEAR; oam->attr2 |= (newTileIndex & OAM_TILE_OFFSET_NEW);