afegit resource::cache

normalitzat Audio
This commit is contained in:
2026-04-18 11:41:34 +02:00
parent 7409c799c3
commit 94aa69cffe
29 changed files with 1420 additions and 134 deletions

View File

@@ -2,7 +2,7 @@
#include <cstdlib>
#include "core/jail/jail_audio.hpp"
#include "core/audio/audio.hpp"
#include "core/jail/jdraw8.hpp"
#include "core/jail/jinput.hpp"
#include "game/info.hpp"
@@ -52,7 +52,7 @@ namespace scenes {
remaining_ms_ -= delta_ms;
}
if (remaining_ms_ <= 0) {
JA_FadeOutMusic(250);
Audio::get()->fadeOutMusic(250);
fade_.startFadeOut();
phase_ = Phase::FadingOut;
}

View File

@@ -0,0 +1,55 @@
#include "scenes/boot_loader_scene.hpp"
#include "core/jail/jdraw8.hpp"
#include "core/resources/resource_cache.hpp"
namespace scenes {
namespace {
constexpr int SCREEN_W = 320;
constexpr Uint8 BG_COLOR = 0; // negre
constexpr Uint8 BAR_COLOR = 1; // blanc
constexpr int BAR_X = 60;
constexpr int BAR_Y = 170;
constexpr int BAR_W = SCREEN_W - (BAR_X * 2); // 200
constexpr int BAR_H = 6;
} // namespace
BootLoaderScene::BootLoaderScene() = default;
void BootLoaderScene::onEnter() {
// Inicialitza la paleta mínima per a la barra. La resta de
// colors queden a negre — després cada escena del joc carregarà
// la seua pròpia paleta.
JD8_SetPaletteColor(BG_COLOR, 0, 0, 0);
JD8_SetPaletteColor(BAR_COLOR, 63, 63, 63);
}
void BootLoaderScene::tick(int /*delta_ms*/) {
if (Resource::Cache::get()->loadStep(8)) {
done_ = true;
}
render();
}
void BootLoaderScene::render() const {
JD8_ClearScreen(BG_COLOR);
const float pct = Resource::Cache::get()->getProgress();
const int filled = static_cast<int>(static_cast<float>(BAR_W) * pct);
// Vora de la barra (línia 1 píxel a dalt i a baix).
JD8_FillRect(BAR_X - 1, BAR_Y - 1, BAR_W + 2, 1, BAR_COLOR);
JD8_FillRect(BAR_X - 1, BAR_Y + BAR_H, BAR_W + 2, 1, BAR_COLOR);
JD8_FillRect(BAR_X - 1, BAR_Y, 1, BAR_H, BAR_COLOR);
JD8_FillRect(BAR_X + BAR_W, BAR_Y, 1, BAR_H, BAR_COLOR);
// Ompliment proporcional al progrés.
if (filled > 0) {
JD8_FillRect(BAR_X, BAR_Y, filled, BAR_H, BAR_COLOR);
}
}
} // namespace scenes

View File

@@ -0,0 +1,27 @@
#pragma once
#include "scenes/scene.hpp"
namespace scenes {
// Escena de boot que conduix la càrrega incremental del Resource::Cache.
// tick() crida loadStep amb un pressupost de ~8ms i pinta una barra
// de progrés mentre dura. Quan el Cache marca isLoadDone, l'escena
// marca done() i el Director passa al següent state (intro = 255).
class BootLoaderScene : public Scene {
public:
BootLoaderScene();
~BootLoaderScene() override = default;
void onEnter() override;
void tick(int delta_ms) override;
bool done() const override { return done_; }
int nextState() const override { return 1; } // 1 → SceneRegistry::tryCreate(num_piramide=255 → intro)
private:
void render() const;
bool done_{false};
};
} // namespace scenes

View File

@@ -3,7 +3,7 @@
#include <cstdio>
#include <cstdlib>
#include "core/jail/jail_audio.hpp"
#include "core/audio/audio.hpp"
#include "core/jail/jdraw8.hpp"
#include "core/jail/jinput.hpp"
#include "game/info.hpp"
@@ -46,7 +46,7 @@ namespace scenes {
// amb piramide_inicial=8) no hi ha res que heretar, així que
// arranquem la mateixa pista només si no sona res. Inocu en el
// flux normal: JA_MUSIC_PLAYING fa que no la tornem a tocar.
if (JA_GetMusicState() != JA_MUSIC_PLAYING) {
if (Audio::getRealMusicState() != Audio::MusicState::PLAYING) {
playMusic("music/final.ogg");
}

View File

@@ -1,22 +1,22 @@
#include "scenes/scene_utils.hpp"
#include <SDL3/SDL.h>
#include <string>
#include "core/jail/jail_audio.hpp"
#include "core/resources/resource_helper.hpp"
#include "core/audio/audio.hpp"
namespace scenes {
namespace {
std::string basename(const char* path) {
std::string s = path;
auto pos = s.find_last_of("/\\");
return pos == std::string::npos ? s : s.substr(pos + 1);
}
} // namespace
void playMusic(const char* filename, int loop) {
if (!filename) return;
auto buffer = ResourceHelper::loadFile(filename);
if (buffer.empty()) return;
// JA_LoadMusic fa una còpia interna del OGG comprimit (via SDL_malloc)
// per a stb_vorbis. El `buffer` local es destruirà en sortir d'àmbit.
JA_PlayMusic(JA_LoadMusic(buffer.data(),
static_cast<Uint32>(buffer.size()),
filename),
loop);
Audio::get()->playMusic(basename(filename), loop);
}
} // namespace scenes

View File

@@ -4,7 +4,7 @@
#include <cstdlib>
#include <cstring>
#include "core/jail/jail_audio.hpp"
#include "core/audio/audio.hpp"
#include "core/jail/jdraw8.hpp"
#include "core/jail/jinput.hpp"
#include "game/info.hpp"
@@ -76,7 +76,7 @@ namespace scenes {
}
void SecretaScene::beginFinalFade() {
JA_FadeOutMusic(250);
Audio::get()->fadeOutMusic(250);
fade_.startFadeOut();
phase_ = Phase::FinalFadeOut;
}

View File

@@ -4,7 +4,7 @@
#include <cstdlib>
#include <cstring>
#include "core/jail/jail_audio.hpp"
#include "core/audio/audio.hpp"
#include "core/jail/jdraw8.hpp"
#include "core/jail/jinput.hpp"
#include "game/info.hpp"
@@ -93,7 +93,7 @@ namespace scenes {
void SlidesScene::beginFinalFade() {
if (num_piramide_at_start_ != 7) {
JA_FadeOutMusic(250);
Audio::get()->fadeOutMusic(250);
}
fade_.startFadeOut();
phase_ = Phase::FadeFinal;
@@ -105,7 +105,7 @@ namespace scenes {
// el final natural crida JA_FadeOutMusic (beginFinalFade() distingeix).
if (!skip_triggered_ && JI_AnyKey()) {
skip_triggered_ = true;
if (num_piramide_at_start_ != 7) JA_FadeOutMusic(250);
if (num_piramide_at_start_ != 7) Audio::get()->fadeOutMusic(250);
fade_.startFadeOut();
phase_ = Phase::FadeFinal;
}