feat(title): fons title_bg.gif i outline 4-dir off-white als textos taronges

This commit is contained in:
JailDesigner committed 2026-05-06 11:27:45 +02:00
1 parent e7a024bcdb
commit 9233bd8d75
4 files changed
+34 -10

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

+8 -2
View File
@@ -211,6 +211,12 @@ Director::Director() {
constexpr const char* MINI_LOGO_KEY = "logo_jailgames_mini.gif"; constexpr const char* MINI_LOGO_KEY = "logo_jailgames_mini.gif";
Resource::Cache::get().loadSurface(MINI_LOGO_KEY, "data/logo/logo_jailgames_mini.gif"); Resource::Cache::get().loadSurface(MINI_LOGO_KEY, "data/logo/logo_jailgames_mini.gif");
auto mini_logo_surface = Resource::Cache::get().getSurface(MINI_LOGO_KEY); auto mini_logo_surface = Resource::Cache::get().getSurface(MINI_LOGO_KEY);
// Fons sencer de la TITLE (320×240). Igual que el minilogo, conserva
// la seua paleta nadiua perquè el GIF ja porta els colors finals.
constexpr const char* TITLE_BG_KEY = "title_bg.gif";
Resource::Cache::get().loadSurface(TITLE_BG_KEY, "data/title/title_bg.gif");
auto title_bg_surface = Resource::Cache::get().getSurface(TITLE_BG_KEY);
ServiceMenu::get().init(menu_title_text, menu_items_text, ui_palette); ServiceMenu::get().init(menu_title_text, menu_items_text, ui_palette);
// Overlay hook: Screen::present() cridarà aquesta lambda al principi, // Overlay hook: Screen::present() cridarà aquesta lambda al principi,
@@ -259,8 +265,8 @@ Director::Director() {
auto make_intro = [placeholder_text, make_game]() -> std::unique_ptr<Scene> { auto make_intro = [placeholder_text, make_game]() -> std::unique_ptr<Scene> {
return std::make_unique<IntroScene>(placeholder_text, make_game); return std::make_unique<IntroScene>(placeholder_text, make_game);
}; };
auto make_title = [menu_title_text, placeholder_text, mini_logo_surface, make_intro]() -> std::unique_ptr<Scene> { auto make_title = [menu_title_text, placeholder_text, title_bg_surface, mini_logo_surface, make_intro]() -> std::unique_ptr<Scene> {
return std::make_unique<TitleScene>(menu_title_text, placeholder_text, mini_logo_surface, make_intro); return std::make_unique<TitleScene>(menu_title_text, placeholder_text, title_bg_surface, mini_logo_surface, make_intro);
}; };
switch (START) { switch (START) {
+24 -7
View File
@@ -48,9 +48,10 @@ namespace {
} // namespace } // namespace
TitleScene::TitleScene(std::shared_ptr<Text> display_font, std::shared_ptr<Text> condensed_font, std::shared_ptr<Surface> mini_logo, SceneFactory next_factory) TitleScene::TitleScene(std::shared_ptr<Text> display_font, std::shared_ptr<Text> condensed_font, std::shared_ptr<Surface> background, std::shared_ptr<Surface> mini_logo, SceneFactory next_factory)
: display_font_(std::move(display_font)), : display_font_(std::move(display_font)),
condensed_font_(std::move(condensed_font)), condensed_font_(std::move(condensed_font)),
background_(std::move(background)),
mini_logo_(std::move(mini_logo)), mini_logo_(std::move(mini_logo)),
next_factory_(std::move(next_factory)), next_factory_(std::move(next_factory)),
timer_ms_(UiConfig::get().titleDurationMs()) { timer_ms_(UiConfig::get().titleDurationMs()) {
@@ -85,24 +86,38 @@ void TitleScene::render() {
const auto& ui_config = UiConfig::get(); const auto& ui_config = UiConfig::get();
const auto& palette = Resource::Cache::get().getPalette("ui"); const auto& palette = Resource::Cache::get().getPalette("ui");
// Fons: la imatge si està disponible (cobreix tot el canvas amb la
// seua paleta nadiua); en cas contrari, color pla de la paleta UI
// com a fallback defensiu.
if (background_) {
background_->render(0, 0);
} else {
Screen::get().fillRect(0, 0, GameCanvas::WIDTH, GameCanvas::HEIGHT, palette[ui_config.titleBgColor()]); Screen::get().fillRect(0, 0, GameCanvas::WIDTH, GameCanvas::HEIGHT, palette[ui_config.titleBgColor()]);
}
const Uint8 TEXT_COLOR = ui_config.titleTextColor(); const Uint8 TEXT_COLOR = ui_config.titleTextColor();
const Uint8 OUTLINE_COLOR = ui_config.titleCopyrightColor();
constexpr Uint8 OUTLINE_DIST = 1;
constexpr Uint8 STROKE4 = Text::CENTER_FLAG | Text::COLOR_FLAG | Text::STROKE4_FLAG;
if (display_font_) { if (display_font_) {
const int TITLE_Y = (GameCanvas::HEIGHT * TITLE_Y_PERCENT) / 100; const int TITLE_Y = (GameCanvas::HEIGHT * TITLE_Y_PERCENT) / 100;
display_font_->writeDX(Text::CENTER_FLAG | Text::COLOR_FLAG, display_font_->writeDX(STROKE4,
GameCanvas::CENTER_X, GameCanvas::CENTER_X,
TITLE_Y, TITLE_Y,
TITLE_LINE_1, TITLE_LINE_1,
display_font_->getDefaultKerning(), display_font_->getDefaultKerning(),
TEXT_COLOR); TEXT_COLOR,
display_font_->writeDX(Text::CENTER_FLAG | Text::COLOR_FLAG, OUTLINE_DIST,
OUTLINE_COLOR);
display_font_->writeDX(STROKE4,
GameCanvas::CENTER_X, GameCanvas::CENTER_X,
TITLE_Y + titleLineGap(*display_font_), TITLE_Y + titleLineGap(*display_font_),
TITLE_LINE_2, TITLE_LINE_2,
display_font_->getDefaultKerning(), display_font_->getDefaultKerning(),
TEXT_COLOR); TEXT_COLOR,
OUTLINE_DIST,
OUTLINE_COLOR);
} }
if (condensed_font_) { if (condensed_font_) {
@@ -115,12 +130,14 @@ void TitleScene::render() {
if (VISIBLE) { if (VISIBLE) {
const int PROMPT_Y = (GameCanvas::HEIGHT * PROMPT_Y_PERCENT) / 100; const int PROMPT_Y = (GameCanvas::HEIGHT * PROMPT_Y_PERCENT) / 100;
condensed_font_->writeDX(Text::CENTER_FLAG | Text::COLOR_FLAG, condensed_font_->writeDX(STROKE4,
GameCanvas::CENTER_X, GameCanvas::CENTER_X,
PROMPT_Y, PROMPT_Y,
Locale::get().text("title.press_start"), Locale::get().text("title.press_start"),
condensed_font_->getDefaultKerning() - 1, condensed_font_->getDefaultKerning() - 1,
TEXT_COLOR); TEXT_COLOR,
OUTLINE_DIST,
OUTLINE_COLOR);
} }
} }
+2 -1
View File
@@ -16,7 +16,7 @@ class TitleScene : public Scene {
public: public:
using SceneFactory = std::function<std::unique_ptr<Scene>()>; using SceneFactory = std::function<std::unique_ptr<Scene>()>;
TitleScene(std::shared_ptr<Text> display_font, std::shared_ptr<Text> condensed_font, std::shared_ptr<Surface> mini_logo, SceneFactory next_factory); TitleScene(std::shared_ptr<Text> display_font, std::shared_ptr<Text> condensed_font, std::shared_ptr<Surface> background, std::shared_ptr<Surface> mini_logo, SceneFactory next_factory);
~TitleScene() override; ~TitleScene() override;
void update(int delta_ms) override; void update(int delta_ms) override;
@@ -25,6 +25,7 @@ class TitleScene : public Scene {
private: private:
std::shared_ptr<Text> display_font_; std::shared_ptr<Text> display_font_;
std::shared_ptr<Text> condensed_font_; std::shared_ptr<Text> condensed_font_;
std::shared_ptr<Surface> background_;
std::shared_ptr<Surface> mini_logo_; std::shared_ptr<Surface> mini_logo_;
SceneFactory next_factory_; SceneFactory next_factory_;
int timer_ms_; int timer_ms_;