Implementado el cambio de paleta durante el juego

This commit is contained in:
2022-10-25 21:51:30 +02:00
parent bcb56e17f2
commit dc84ed79d6
31 changed files with 297 additions and 164 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -27,6 +27,22 @@ color=yellow
flip=true
[/enemy]
[enemy]
tileset=wave_v.png
animation=wave_v.ani
width=8
height=8
x=24
y=4
vx=0
vy=0.8
x1=24
y1=2
x2=24
y2=7
color=yellow
[/enemy]
[item]
tileset=items.png
tile=48
@@ -34,3 +50,19 @@ x=7
y=2
counter=1
[/item]
[item]
tileset=items.png
tile=48
x=1
y=14
counter=2
[/item]
[item]
tileset=items.png
tile=48
x=30
y=9
counter=3
[/item]

View File

@@ -6,18 +6,18 @@
32,32,32,32,0,0,0,0,32,32,67,68,67,68,67,68,67,68,67,68,67,68,67,68,67,68,67,68,67,68,67,68,
32,32,0,0,0,0,0,0,0,0,91,92,91,92,91,92,91,92,91,92,91,92,91,92,91,92,91,92,91,92,91,92,
93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93,
117,0,0,0,403,403,403,403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
117,0,0,0,426,427,426,427,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
141,0,0,426,427,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
32,0,0,0,426,427,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,526,403,403,403,403,403,550,0,0,0,117,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,526,426,0,0,0,0,0,427,550,0,0,117,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,526,426,0,0,0,0,0,0,0,0,403,403,117,
32,67,68,67,68,403,403,403,550,0,0,0,0,0,526,403,67,68,67,68,403,550,0,0,0,0,0,0,0,0,140,141,
32,91,92,91,92,0,0,0,427,550,0,0,0,526,426,0,91,92,91,92,0,427,550,0,0,0,0,0,0,0,0,32,
135,0,0,0,0,0,0,0,0,0,0,0,526,426,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
135,0,0,0,0,0,0,0,0,0,0,526,426,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,526,0,0,0,0,0,0,0,550,0,0,117,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,526,0,0,0,0,0,0,0,0,0,403,403,117,
32,67,68,67,68,403,403,403,403,403,403,0,0,0,526,67,68,67,68,67,68,67,68,0,0,0,0,0,0,0,140,141,
32,91,92,91,92,0,0,0,0,0,0,0,0,526,0,91,92,91,92,91,92,91,92,0,0,0,0,0,0,0,0,32,
135,0,0,0,0,0,0,0,0,0,0,0,526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
135,0,0,0,0,0,0,0,0,0,0,526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90,89,90
</data>
</layer>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -291,7 +291,7 @@ void Screen::iniSpectrumFade()
const std::vector<std::string> vColors = {"black", "blue", "red", "magenta", "green", "cyan", "yellow", "bright_white"};
for (auto v : vColors)
{
spectrumColor.push_back(stringToColor(v));
spectrumColor.push_back(stringToColor(options->palette, v));
}
}

View File

@@ -380,11 +380,9 @@ bool checkCollision(SDL_Point &p, d_line_t &l)
}
// Devuelve un color_t a partir de un string
color_t stringToColor(std::string str)
color_t stringToColor(palette_e pal, std::string str)
{
const std::string palette = "spectrum";
if (palette == "spectrum")
if (pal == p_zxspectrum)
{
if (str == "black")
{
@@ -467,7 +465,7 @@ color_t stringToColor(std::string str)
}
}
else
else if (pal == p_zxarne)
{ // zxarne
if (str == "black")
{

View File

@@ -47,6 +47,13 @@ struct color_t
Uint8 b;
};
// Tipos de paleta
enum palette_e
{
p_zxspectrum,
p_zxarne
};
// Estructura para saber la seccion y subseccion del programa
struct section_t
{
@@ -67,6 +74,7 @@ struct options_t
bool keepAspect; // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa
bool borderEnabled; // Indica si ha de mostrar el borde en el modo de ventana
float borderSize; // Porcentaje de borde que se añade a lo ventana
palette_e palette; // Paleta de colores a usar en el juego
};
// Calcula el cuadrado de la distancia entre dos puntos
@@ -106,7 +114,7 @@ bool checkCollision(SDL_Point &p, d_line_t &l);
void normalizeLine(d_line_t &l);
// Devuelve un color_t a partir de un string
color_t stringToColor(std::string str);
color_t stringToColor(palette_e pal, std::string str);
// Convierte una cadena en un valor booleano
bool stringToBool(std::string str);

View File

@@ -1,12 +1,13 @@
#include "credits.h"
// Constructor
Credits::Credits(SDL_Renderer *renderer, Screen *screen, Asset *asset)
Credits::Credits(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options)
{
// Copia la dirección de los objetos
this->renderer = renderer;
this->screen = screen;
this->asset = asset;
this->options = options;
// Reserva memoria para los punteros
eventHandler = new SDL_Event();
@@ -25,36 +26,36 @@ Credits::Credits(SDL_Renderer *renderer, Screen *screen, Asset *asset)
sprite->setRect({194, 174, 8, 8});
// Cambia el color del borde
screen->setBorderColor(stringToColor("black"));
screen->setBorderColor(stringToColor(options->palette, "black"));
// Inicializa los textos
texts.push_back({"", stringToColor("white")});
texts.push_back({"INSTRUCTIONS:", stringToColor("yellow")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"HELP JAILDOC TO GET BACK ALL HIS", stringToColor("white")});
texts.push_back({"PROJECTS AND GO TO THE JAIL TO", stringToColor("white")});
texts.push_back({"FINISH THEM", stringToColor("white")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"INSTRUCTIONS:", stringToColor(options->palette, "yellow")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"HELP JAILDOC TO GET BACK ALL HIS", stringToColor(options->palette, "white")});
texts.push_back({"PROJECTS AND GO TO THE JAIL TO", stringToColor(options->palette, "white")});
texts.push_back({"FINISH THEM", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"KEYS:", stringToColor("yellow")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"USE CURSORS TO MOVE AND JUMP", stringToColor("white")});
texts.push_back({"F1-F4 TO CHANGE WINDOWS SIZE", stringToColor("white")});
texts.push_back({"F TO SWITCH TO FULLSCREEN", stringToColor("white")});
texts.push_back({"B TO DE/ACTIVATE THE BORDER SC.", stringToColor("white")});
texts.push_back({"M TO TURN ON/OFF THE MUSIC", stringToColor("white")});
texts.push_back({"ESC TO EXIT GAME", stringToColor("white")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"KEYS:", stringToColor(options->palette, "yellow")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"USE CURSORS TO MOVE AND JUMP", stringToColor(options->palette, "white")});
texts.push_back({"F1-F4 TO CHANGE WINDOWS SIZE", stringToColor(options->palette, "white")});
texts.push_back({"F TO SWITCH TO FULLSCREEN", stringToColor(options->palette, "white")});
texts.push_back({"B TO DE/ACTIVATE THE BORDER SC.", stringToColor(options->palette, "white")});
texts.push_back({"M TO TURN ON/OFF THE MUSIC", stringToColor(options->palette, "white")});
texts.push_back({"ESC TO EXIT GAME", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"A GAME BY JAILDESIGNER", stringToColor("yellow")});
texts.push_back({"MADE ON SUMMER/FALL 2022", stringToColor("yellow")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"A GAME BY JAILDESIGNER", stringToColor(options->palette, "yellow")});
texts.push_back({"MADE ON SUMMER/FALL 2022", stringToColor(options->palette, "yellow")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"I LOVE JAILGAMES!}", stringToColor("white")});
texts.push_back({"", stringToColor("white")});
texts.push_back({"I LOVE JAILGAMES!", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
// Crea la textura para el texto que se escribe en pantalla
textTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT);
@@ -124,7 +125,7 @@ void Credits::fillTexture()
{
// Rellena la textura de texto
SDL_SetRenderTarget(renderer, textTexture);
const color_t c = stringToColor("black");
const color_t c = stringToColor(options->palette, "black");
SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 0x00);
SDL_RenderClear(renderer);
@@ -138,6 +139,9 @@ void Credits::fillTexture()
i++;
}
// Escribe el corazón
text->writeColored(194, 176, "}", stringToColor(options->palette, "bright_red"));
SDL_SetRenderTarget(renderer, nullptr);
// Rellena la textura que cubre el texto

View File

@@ -34,6 +34,7 @@ private:
SDL_Texture *coverTexture; // Textura para cubrir el texto
Texture *texture; // Textura para el sprite de brillo
AnimatedSprite *sprite; // Sprite para el brillo del corazón
options_t *options; // Puntero a las opciones del juego
// Variables
int counter; // Contador
@@ -61,7 +62,7 @@ private:
public:
// Constructor
Credits(SDL_Renderer *renderer, Screen *screen, Asset *asset);
Credits(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options);
// Destructor
~Credits();

View File

@@ -1,7 +1,7 @@
#include "demo.h"
// Constructor
Demo::Demo(SDL_Renderer *renderer, Screen *screen, Asset *asset, Debug *debug)
Demo::Demo(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, Debug *debug)
{
// Inicia algunas variables
board.iniClock = SDL_GetTicks();
@@ -19,11 +19,12 @@ Demo::Demo(SDL_Renderer *renderer, Screen *screen, Asset *asset, Debug *debug)
this->asset = asset;
this->screen = screen;
this->debug = debug;
this->options = options;
// Crea los objetos
itemTracker = new ItemTracker();
scoreboard = new ScoreBoard(renderer, asset, &board);
room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &board.items, debug);
scoreboard = new ScoreBoard(renderer, asset, options, &board);
room = new Room(asset->get(currentRoom), renderer, screen, asset, options, itemTracker, &board.items, debug);
eventHandler = new SDL_Event();
text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer);
@@ -35,7 +36,7 @@ Demo::Demo(SDL_Renderer *renderer, Screen *screen, Asset *asset, Debug *debug)
board.items = 0;
board.rooms = 1;
const color_t c = room->getBorderColor();
board.color = (c.r + c.g + c.b == 0) ? stringToColor("white") : c; // Si el color es negro lo cambia a blanco
board.color = (c.r + c.g + c.b == 0) ? stringToColor(options->palette, "white") : c; // Si el color es negro lo cambia a blanco
board.music = !debug->getEnabled();
@@ -63,7 +64,7 @@ void Demo::checkEventHandler()
if (eventHandler->type == SDL_QUIT)
{
section.name = SECTION_PROG_QUIT;
screen->setBorderColor(stringToColor("black"));
screen->setBorderColor(stringToColor(options->palette, "black"));
break;
}
else if ((eventHandler->type == SDL_KEYDOWN) and (eventHandler->key.repeat == 0))
@@ -163,7 +164,7 @@ void Demo::renderRoomName()
{
// Texto en el centro de la pantalla
SDL_Rect rect = {0, 16 * BLOCK, PLAY_AREA_WIDTH, BLOCK * 2};
color_t color = stringToColor("white");
color_t color = stringToColor(options->palette, "white");
SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF);
SDL_RenderFillRect(renderer, &rect);
@@ -191,11 +192,11 @@ bool Demo::changeRoom(std::string file)
room = nullptr;
// Crea un objeto habitación nuevo a partir del fichero
room = new Room(asset->get(file), renderer, screen, asset, itemTracker, &board.items, debug);
room = new Room(asset->get(file), renderer, screen, asset, options, itemTracker, &board.items, debug);
// Actualiza el marcador
const color_t c = room->getBorderColor(); // Pone el color del marcador
board.color = (c.r + c.g + c.b == 0) ? stringToColor("white") : c; // Si el color es negro lo cambia a blanco
board.color = (c.r + c.g + c.b == 0) ? stringToColor(options->palette, "white") : c; // Si el color es negro lo cambia a blanco
return true;
}

View File

@@ -31,6 +31,7 @@ private:
ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador
ItemTracker *itemTracker; // Lleva el control de los objetos recogidos
Debug *debug; // Objeto para gestionar la información de debug
options_t *options; // Puntero a las opciones del juego
// Variables
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
@@ -65,7 +66,7 @@ private:
public:
// Constructor
Demo(SDL_Renderer *renderer, Screen *screen, Asset *asset, Debug *debug);
Demo(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, Debug *debug);
// Destructor
~Demo();

View File

@@ -9,7 +9,7 @@ Director::Director(std::string path)
section.name = SECTION_PROG_LOGO;
section.subsection = SUBSECTION_LOGO_TO_INTRO;
section.name = SECTION_PROG_CREDITS;
section.name = SECTION_PROG_LOGO;
// Crea el objeto que controla los ficheros de recursos
asset = new Asset(path.substr(0, path.find_last_of("\\/")));
@@ -70,6 +70,7 @@ bool Director::loadConfig()
options->keepAspect = true;
options->borderEnabled = true;
options->borderSize = 0.1f;
options->palette = p_zxspectrum;
// Indicador de éxito en la carga
bool success = true;
@@ -167,6 +168,7 @@ bool Director::saveConfig()
file << "keepAspect=" + boolToString(options->keepAspect) + "\n";
file << "borderEnabled=" + boolToString(options->borderEnabled) + "\n";
file << "borderSize=" + std::to_string(options->borderSize) + "\n";
file << "palette=" + std::to_string(options->palette) + "\n";
// Cierra el fichero
file.close();
@@ -246,6 +248,21 @@ bool Director::setOptions(options_t *options, std::string var, std::string value
}
}
else if (var == "palette")
{
const int pal = std::stoi(value);
if (pal == 0)
{
options->palette = p_zxspectrum;
}
else if (pal == 1)
{
options->palette = p_zxarne;
}
}
else if (var == "")
{
}
@@ -623,6 +640,8 @@ bool Director::setFileList()
// Intro
asset->add("/data/title/loading_screen_bn.png", t_bitmap);
asset->add("/data/title/loading_screen_color.png", t_bitmap);
asset->add("/data/title/loading_screen_bn_zxarne.png", t_bitmap);
asset->add("/data/title/loading_screen_color_zxarne.png", t_bitmap);
// Credits
asset->add("/data/credits/shine.png", t_bitmap);
@@ -652,7 +671,7 @@ void Director::setSection(section_t section)
// Ejecuta la seccion de juego con el logo
void Director::runLogo()
{
logo = new Logo(renderer, screen, asset, section.subsection);
logo = new Logo(renderer, screen, asset, options, section.subsection);
setSection(logo->run());
delete logo;
}
@@ -660,7 +679,7 @@ void Director::runLogo()
// Ejecuta la seccion de juego de la introducción
void Director::runIntro()
{
intro = new Intro(renderer, screen, asset);
intro = new Intro(renderer, screen, asset, options);
setSection(intro->run());
delete intro;
}
@@ -672,7 +691,7 @@ void Director::runTitle()
{
JA_PlayMusic(music);
}
title = new Title(renderer, screen, asset);
title = new Title(renderer, screen, asset, options);
setSection(title->run());
delete title;
}
@@ -680,7 +699,7 @@ void Director::runTitle()
// Ejecuta la seccion de los creditos del juego
void Director::runCredits()
{
credits = new Credits(renderer, screen, asset);
credits = new Credits(renderer, screen, asset, options);
setSection(credits->run());
delete credits;
}
@@ -688,7 +707,7 @@ void Director::runCredits()
// Ejecuta la seccion de la demo, donde se ven pantallas del juego
void Director::runDemo()
{
demo = new Demo(renderer, screen, asset, debug);
demo = new Demo(renderer, screen, asset, options, debug);
setSection(demo->run());
delete demo;
}
@@ -697,7 +716,7 @@ void Director::runDemo()
void Director::runGame()
{
JA_StopMusic();
game = new Game(renderer, screen, asset, input, debug);
game = new Game(renderer, screen, asset, options, input, debug);
setSection(game->run());
delete game;
}
@@ -712,18 +731,23 @@ void Director::run()
case SECTION_PROG_LOGO:
runLogo();
break;
case SECTION_PROG_INTRO:
runIntro();
break;
case SECTION_PROG_TITLE:
runTitle();
break;
case SECTION_PROG_CREDITS:
runCredits();
break;
case SECTION_PROG_DEMO:
runDemo();
break;
case SECTION_PROG_GAME:
runGame();
break;

View File

@@ -1,7 +1,7 @@
#include "game.h"
// Constructor
Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, Debug *debug)
Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, Input *input, Debug *debug)
{
// Inicia algunas variables
board.iniClock = SDL_GetTicks();
@@ -14,6 +14,7 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, D
this->screen = screen;
this->input = input;
this->debug = debug;
this->options = options;
// ****
// this->debug->setEnabled(true);
@@ -24,11 +25,11 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, D
// ****
// Crea los objetos
scoreboard = new ScoreBoard(renderer, asset, &board);
scoreboard = new ScoreBoard(renderer, asset, options, &board);
itemTracker = new ItemTracker();
roomTracker = new RoomTracker();
room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &board.items, debug);
player = new Player(spawnPoint, asset->get("player.png"), asset->get("player.ani"), renderer, asset, input, room, debug);
room = new Room(asset->get(currentRoom), renderer, screen, asset, options, itemTracker, &board.items, debug);
player = new Player(spawnPoint, asset->get("player.png"), asset->get("player.ani"), renderer, asset, options, input, room, debug);
eventHandler = new SDL_Event();
text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer);
music = JA_LoadMusic(asset->get("game.ogg").c_str());
@@ -42,7 +43,7 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, D
board.items = 0;
board.rooms = 1;
const color_t c = room->getBorderColor();
board.color = (c.r + c.g + c.b == 0) ? stringToColor("white") : c; // Si el color es negro lo cambia a blanco
board.color = (c.r + c.g + c.b == 0) ? stringToColor(options->palette, "white") : c; // Si el color es negro lo cambia a blanco
roomTracker->addRoom(currentRoom);
paused = false;
blackScreen = false;
@@ -82,7 +83,7 @@ void Game::checkEventHandler()
if (eventHandler->type == SDL_QUIT)
{
section.name = SECTION_PROG_QUIT;
screen->setBorderColor(stringToColor("black"));
screen->setBorderColor(stringToColor(options->palette, "black"));
break;
}
else if ((eventHandler->type == SDL_KEYDOWN) and (eventHandler->key.repeat == 0))
@@ -152,6 +153,18 @@ void Game::checkEventHandler()
reLoadTextures();
break;
case SDL_SCANCODE_F5:
if (options->palette == p_zxspectrum)
{
options->palette = p_zxarne;
}
else
{
options->palette = p_zxspectrum;
}
reLoadTextures();
break;
default:
break;
}
@@ -273,7 +286,7 @@ void Game::renderRoomName()
{
// Texto en el centro de la pantalla
SDL_Rect rect = {0, 16 * BLOCK, PLAY_AREA_WIDTH, BLOCK * 2};
color_t color = stringToColor("white");
color_t color = stringToColor(options->palette, "white");
SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF);
SDL_RenderFillRect(renderer, &rect);
@@ -293,11 +306,11 @@ bool Game::changeRoom(std::string file)
room = nullptr;
// Crea un objeto habitación nuevo a partir del fichero
room = new Room(asset->get(file), renderer, screen, asset, itemTracker, &board.items, debug);
room = new Room(asset->get(file), renderer, screen, asset, options, itemTracker, &board.items, debug);
// Actualiza el marcador
const color_t c = room->getBorderColor(); // Pone el color del marcador
board.color = (c.r + c.g + c.b == 0) ? stringToColor("white") : c; // Si el color es negro lo cambia a blanco
board.color = (c.r + c.g + c.b == 0) ? stringToColor(options->palette, "white") : c; // Si el color es negro lo cambia a blanco
if (roomTracker->addRoom(file))
{ // Incrementa el contador de habitaciones visitadas
board.rooms++;
@@ -382,8 +395,8 @@ void Game::killPlayer()
setBlackScreen();
// Crea la nueva habitación y el nuevo jugador
room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &board.items, debug);
player = new Player(spawnPoint, asset->get("player.png"), asset->get("player.ani"), renderer, asset, input, room, debug);
room = new Room(asset->get(currentRoom), renderer, screen, asset, options, itemTracker, &board.items, debug);
player = new Player(spawnPoint, asset->get("player.png"), asset->get("player.ani"), renderer, asset, options, input, room, debug);
room->pause();
player->pause();
@@ -428,6 +441,6 @@ void Game::renderBlackScreen()
if (blackScreen)
{
screen->clean();
screen->setBorderColor(stringToColor("black"));
screen->setBorderColor(stringToColor(options->palette, "black"));
}
}

View File

@@ -37,6 +37,7 @@ private:
Text *text; // Objeto para los textos del juego
ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador
Debug *debug; // Objeto para gestionar la información de debug
options_t *options; // Puntero a las opciones del juego
Test *test;
// Variables
@@ -105,7 +106,7 @@ private:
public:
// Constructor
Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, Debug *debug);
Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, Input *input, Debug *debug);
// Destructor
~Game();

View File

@@ -1,17 +1,26 @@
#include "intro.h"
// Constructor
Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset)
Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options)
{
// Copia la dirección de los objetos
this->renderer = renderer;
this->screen = screen;
this->asset = asset;
this->options = options;
// Reserva memoria para los punteros
eventHandler = new SDL_Event();
if (options->palette == p_zxspectrum)
{
loadingScreenTexture1 = new Texture(renderer, asset->get("loading_screen_bn.png"));
loadingScreenTexture2 = new Texture(renderer, asset->get("loading_screen_color.png"));
}
else if (options->palette == p_zxarne)
{
loadingScreenTexture1 = new Texture(renderer, asset->get("loading_screen_bn_zxarne.png"));
loadingScreenTexture2 = new Texture(renderer, asset->get("loading_screen_color_zxarne.png"));
}
sprite1 = new Sprite(0, 0, loadingScreenTexture1->getWidth(), loadingScreenTexture1->getHeight(), loadingScreenTexture1, renderer);
sprite2 = new Sprite(0, 0, loadingScreenTexture2->getWidth(), loadingScreenTexture2->getHeight(), loadingScreenTexture2, renderer);
loadingSound1 = JA_LoadMusic(asset->get("loading_sound1.ogg").c_str());
@@ -57,7 +66,7 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset)
}
// Cambia el color del borde
screen->setBorderColor(stringToColor("black"));
screen->setBorderColor(stringToColor(options->palette, "black"));
}
// Destructor

View File

@@ -27,6 +27,7 @@ private:
SDL_Event *eventHandler; // Manejador de eventos
Sprite *sprite1; // Sprite para manejar la textura loadingScreenTexture1
Sprite *sprite2; // Sprite para manejar la textura loadingScreenTexture2
options_t *options; // Puntero a las opciones del juego
// Variables
int preCounter; // Contador previo para realizar una pausa inicial
@@ -63,7 +64,7 @@ private:
public:
// Constructor
Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset);
Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options);
// Destructor
~Intro();

View File

@@ -1,12 +1,13 @@
#include "logo.h"
// Constructor
Logo::Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset, int subsection)
Logo::Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, int subsection)
{
// Copia la dirección de los objetos
this->renderer = renderer;
this->screen = screen;
this->asset = asset;
this->options = options;
// Reserva memoria para los punteros
eventHandler = new SDL_Event();
@@ -21,13 +22,13 @@ Logo::Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset, int subsection)
sprite.push_back(new Sprite(0, i, texture->getWidth(), 1, texture, renderer));
if (i % 2 == 0)
{
sprite[i]->setPosX(256 + (i * 3));
sprite.at(i)->setPosX(256 + (i * 3));
}
else
{
sprite[i]->setPosX(-181 - (i * 3));
sprite.at(i)->setPosX(-181 - (i * 3));
}
sprite[i]->setPosY(83 + i);
sprite.at(i)->setPosY(83 + i);
}
// Inicializa variables
@@ -44,11 +45,11 @@ Logo::Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset, int subsection)
const std::vector<std::string> vColors = {"black", "blue", "red", "magenta", "green", "cyan", "yellow", "bright_white"};
for (auto v : vColors)
{
color.push_back(stringToColor(v));
color.push_back(stringToColor(options->palette, v));
}
// Cambia el color del borde
screen->setBorderColor(stringToColor("black"));
screen->setBorderColor(stringToColor(options->palette, "black"));
}
// Destructor
@@ -97,22 +98,22 @@ void Logo::updateJAILGAMES()
{
const int speed = 8;
const int dest = 37;
if (sprite[i]->getPosX() != 37)
if (sprite.at(i)->getPosX() != 37)
{
if (i % 2 == 0)
{
sprite[i]->incPosX(-speed);
if (sprite[i]->getPosX() < dest)
sprite.at(i)->incPosX(-speed);
if (sprite.at(i)->getPosX() < dest)
{
sprite[i]->setPosX(dest);
sprite.at(i)->setPosX(dest);
}
}
else
{
sprite[i]->incPosX(speed);
if (sprite[i]->getPosX() > dest)
sprite.at(i)->incPosX(speed);
if (sprite.at(i)->getPosX() > dest)
{
sprite[i]->setPosX(dest);
sprite.at(i)->setPosX(dest);
}
}
}
@@ -128,72 +129,72 @@ void Logo::updateTextureColors()
if (counter == ini + inc * 0)
{
texture2->setColor(color[0].r, color[0].g, color[0].b);
texture2->setColor(color.at(0).r, color.at(0).g, color.at(0).b);
}
else if (counter == ini + inc * 1)
{
texture2->setColor(color[1].r, color[1].g, color[1].b);
texture2->setColor(color.at(1).r, color.at(1).g, color.at(1).b);
}
else if (counter == ini + inc * 2)
{
texture2->setColor(color[2].r, color[2].g, color[2].b);
texture2->setColor(color.at(2).r, color.at(2).g, color.at(2).b);
}
else if (counter == ini + inc * 3)
{
texture2->setColor(color[3].r, color[3].g, color[3].b);
texture2->setColor(color.at(3).r, color.at(3).g, color.at(3).b);
}
else if (counter == ini + inc * 4)
{
texture2->setColor(color[4].r, color[4].g, color[4].b);
texture2->setColor(color.at(4).r, color.at(4).g, color.at(4).b);
}
else if (counter == ini + inc * 5)
{
texture2->setColor(color[5].r, color[5].g, color[5].b);
texture2->setColor(color.at(5).r, color.at(5).g, color.at(5).b);
}
else if (counter == ini + inc * 6)
{
texture2->setColor(color[6].r, color[6].g, color[6].b);
texture2->setColor(color.at(6).r, color.at(6).g, color.at(6).b);
}
else if (counter == ini + inc * 7)
{
texture2->setColor(color[7].r, color[7].g, color[7].b);
texture2->setColor(color.at(7).r, color.at(7).g, color.at(7).b);
}
else if (counter == initFade + inc * 0)
{
texture->setColor(color[6].r, color[6].g, color[6].b);
texture2->setColor(color[6].r, color[6].g, color[6].b);
texture->setColor(color.at(6).r, color.at(6).g, color.at(6).b);
texture2->setColor(color.at(6).r, color.at(6).g, color.at(6).b);
}
else if (counter == initFade + inc * 1)
{
texture->setColor(color[5].r, color[5].g, color[5].b);
texture2->setColor(color[5].r, color[5].g, color[5].b);
texture->setColor(color.at(5).r, color.at(5).g, color.at(5).b);
texture2->setColor(color.at(5).r, color.at(5).g, color.at(5).b);
}
else if (counter == initFade + inc * 2)
{
texture->setColor(color[4].r, color[4].g, color[4].b);
texture2->setColor(color[4].r, color[4].g, color[4].b);
texture->setColor(color.at(4).r, color.at(4).g, color.at(4).b);
texture2->setColor(color.at(4).r, color.at(4).g, color.at(4).b);
}
else if (counter == initFade + inc * 3)
{
texture->setColor(color[3].r, color[3].g, color[3].b);
texture2->setColor(color[3].r, color[3].g, color[3].b);
texture->setColor(color.at(3).r, color.at(3).g, color.at(3).b);
texture2->setColor(color.at(3).r, color.at(3).g, color.at(3).b);
}
else if (counter == initFade + inc * 4)
{
texture->setColor(color[2].r, color[2].g, color[2].b);
texture2->setColor(color[2].r, color[2].g, color[2].b);
texture->setColor(color.at(2).r, color.at(2).g, color.at(2).b);
texture2->setColor(color.at(2).r, color.at(2).g, color.at(2).b);
}
else if (counter == initFade + inc * 5)
{
texture->setColor(color[1].r, color[1].g, color[1].b);
texture2->setColor(color[1].r, color[1].g, color[1].b);
texture->setColor(color.at(1).r, color.at(1).g, color.at(1).b);
texture2->setColor(color.at(1).r, color.at(1).g, color.at(1).b);
}
else if (counter == initFade + inc * 6)
{
texture->setColor(color[0].r, color[0].g, color[0].b);
texture2->setColor(color[0].r, color[0].g, color[0].b);
texture->setColor(color.at(0).r, color.at(0).g, color.at(0).b);
texture2->setColor(color.at(0).r, color.at(0).g, color.at(0).b);
}
}

View File

@@ -24,6 +24,7 @@ private:
SDL_Event *eventHandler; // Manejador de eventos
std::vector<Sprite *> sprite; // Vector con los sprites de cada linea que forman el bitmap JAILGAMES
Sprite *sprite2; // Sprite para manejar la textura2
options_t *options; // Puntero a las opciones del juego
// Variables
std::vector<color_t> color; // Vector con los colores para el fade
@@ -52,7 +53,7 @@ private:
public:
// Constructor
Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset, int subsection);
Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, int subsection);
// Destructor
~Logo();

View File

@@ -3,7 +3,7 @@
#include <sstream>
// Constructor
Player::Player(player_t ini, std::string tileset, std::string animation, SDL_Renderer *renderer, Asset *asset, Input *input, Room *room, Debug *debug)
Player::Player(player_t ini, std::string tileset, std::string animation, SDL_Renderer *renderer, Asset *asset, options_t *options, Input *input, Room *room, Debug *debug)
{
// Obten punteros a objetos
this->asset = asset;
@@ -11,13 +11,14 @@ Player::Player(player_t ini, std::string tileset, std::string animation, SDL_Ren
this->input = input;
this->room = room;
this->debug = debug;
this->options = options;
// Crea objetos
texture = new Texture(renderer, asset->get(tileset));
sprite = new AnimatedSprite(texture, renderer, animation);
// Inicializa variables
color = stringToColor("white");
color = stringToColor(options->palette, "white");
onBorder = false;
border = BORDER_TOP;
invincible = false;

View File

@@ -43,6 +43,7 @@ public:
Texture *texture; // Textura con los graficos del enemigo
AnimatedSprite *sprite; // Sprite del enemigo
Debug *debug; // Objeto para gestionar la información de debug
options_t *options; // Puntero a las opciones del juego
// Variables
float x; // Posición del jugador en el eje X
@@ -127,7 +128,7 @@ public:
public:
// Constructor
Player(player_t ini, std::string tileset, std::string animation, SDL_Renderer *renderer, Asset *asset, Input *input, Room *room, Debug *debug);
Player(player_t ini, std::string tileset, std::string animation, SDL_Renderer *renderer, Asset *asset, options_t *options, Input *input, Room *room, Debug *debug);
// Destructor
~Player();

View File

@@ -4,18 +4,8 @@
#include <sstream>
// Constructor
Room::Room(std::string file, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *itemTracker, int *items, Debug *debug)
Room::Room(std::string file, SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, ItemTracker *itemTracker, int *items, Debug *debug)
{
// Inicializa variables
tileSize = 8;
mapWidth = 32;
mapHeight = 16;
paused = false;
itemColor1 = stringToColor("magenta");
itemColor2 = stringToColor("yellow");
autoSurfaceDirection = 1;
counter = 0;
// Copia los punteros a objetos
this->renderer = renderer;
this->asset = asset;
@@ -23,6 +13,17 @@ Room::Room(std::string file, SDL_Renderer *renderer, Screen *screen, Asset *asse
this->itemTracker = itemTracker;
this->itemsPicked = items;
this->debug = debug;
this->options = options;
// Inicializa variables
tileSize = 8;
mapWidth = 32;
mapHeight = 16;
paused = false;
itemColor1 = stringToColor(options->palette, "magenta");
itemColor2 = stringToColor(options->palette, "yellow");
autoSurfaceDirection = 1;
counter = 0;
// Crea los objetos
loadMapFile(file);
@@ -297,27 +298,35 @@ bool Room::setVars(std::string var, std::string value)
else if (var == "bgColor")
{
bgColor = stringToColor(value);
bgColor = stringToColor(options->palette, value);
}
else if (var == "border")
{
borderColor = stringToColor(value);
borderColor = stringToColor(options->palette, value);
}
else if (var == "itemColor1")
{
itemColor1 = stringToColor(value);
itemColor1 = stringToColor(options->palette, value);
}
else if (var == "itemColor2")
{
itemColor2 = stringToColor(value);
itemColor2 = stringToColor(options->palette, value);
}
else if (var == "tileset")
{
tileset = value;
if (options->palette == p_zxspectrum)
{
tileset = "standard.png";
}
else if (options->palette == p_zxarne)
{
tileset = "standard_zxarne.png";
}
}
else if (var == "roomUp")
@@ -437,7 +446,7 @@ bool Room::setEnemy(enemy_t *enemy, std::string var, std::string value)
else if (var == "color")
{
enemy->color = stringToColor(value);
enemy->color = stringToColor(options->palette, value);
}
else if (var == "[/enemy]")
@@ -810,7 +819,15 @@ bool Room::itemCollision(SDL_Rect &rect)
// Recarga la textura
void Room::reLoadTexture()
{
texture->reLoad();
if (options->palette == p_zxspectrum)
{
texture->loadFromFile(asset->get("standard.png"), renderer);
}
else if (options->palette == p_zxarne)
{
texture->loadFromFile(asset->get("standard_zxarne.png"), renderer);
}
// texture->reLoad();
fillMapTexture();
for (auto enemy : enemies)
{

View File

@@ -48,6 +48,7 @@ private:
SDL_Texture *mapTexture; // Textura para dibujar el mapa de la habitación
int *itemsPicked; // Puntero a la cantidad de items recogidos que lleva el juego
Debug *debug; // Objeto para gestionar la información de debug
options_t *options; // Puntero a las opciones del juego
// Variables
std::string name; // Nombre de la habitación
@@ -132,7 +133,7 @@ private:
public:
// Constructor
Room(std::string file, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *item_tracker, int *items, Debug *debug);
Room(std::string file, SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, ItemTracker *item_tracker, int *items, Debug *debug);
// Destructor
~Room();

View File

@@ -3,12 +3,13 @@
#include <sstream>
// Constructor
ScoreBoard::ScoreBoard(SDL_Renderer *renderer, Asset *asset, board_t *board)
ScoreBoard::ScoreBoard(SDL_Renderer *renderer, Asset *asset, options_t *options, board_t *board)
{
// Obten punteros a objetos
this->asset = asset;
this->renderer = renderer;
this->board = board;
this->options = options;
// Reserva memoria para los objetos
playerTexture = new Texture(renderer, asset->get("player.png"));
@@ -28,7 +29,7 @@ ScoreBoard::ScoreBoard(SDL_Renderer *renderer, Asset *asset, board_t *board)
const std::vector<std::string> vColors = {"blue", "magenta", "green", "cyan", "yellow", "white", "bright_blue", "bright_magenta", "bright_green", "bright_cyan", "bright_yellow", "bright_white"};
for (auto v : vColors)
{
color.push_back(stringToColor(v));
color.push_back(stringToColor(options->palette, v));
}
}
@@ -53,7 +54,6 @@ void ScoreBoard::render()
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderFillRect(renderer, &rect);
// Dibuja las vidas
const int desp = (counter / 40) % 8;
const int frame = desp % 4;
@@ -80,13 +80,13 @@ void ScoreBoard::render()
const std::string timeTxt = std::to_string((clock.minutes % 60) / 10) + std::to_string(clock.minutes % 10) + clock.separator + std::to_string((clock.seconds % 60) / 10) + std::to_string(clock.seconds % 10);
const std::string itemsTxt = std::to_string(board->items / 100) + std::to_string((board->items % 100) / 10) + std::to_string(board->items % 10);
this->text->writeColored(BLOCK, line1, "Items collected ", board->color);
this->text->writeColored(17 * BLOCK, line1, itemsTxt, stringToColor("white"));
this->text->writeColored(17 * BLOCK, line1, itemsTxt, stringToColor(options->palette, "white"));
this->text->writeColored(20 * BLOCK, line1, " Time ", board->color);
this->text->writeColored(26 * BLOCK, line1, timeTxt, stringToColor("white"));
this->text->writeColored(26 * BLOCK, line1, timeTxt, stringToColor(options->palette, "white"));
const std::string roomsTxt = std::to_string(board->rooms / 100) + std::to_string((board->rooms % 100) / 10) + std::to_string(board->rooms % 10);
this->text->writeColored(22 * BLOCK, line2, "Rooms", stringToColor("white"));
this->text->writeColored(28 * BLOCK, line2, roomsTxt, stringToColor("white"));
this->text->writeColored(22 * BLOCK, line2, "Rooms", stringToColor(options->palette, "white"));
this->text->writeColored(28 * BLOCK, line2, roomsTxt, stringToColor(options->palette, "white"));
}
// Actualiza las variables del objeto
@@ -121,6 +121,14 @@ void ScoreBoard::reLoadTexture()
playerTexture->reLoad();
itemTexture->reLoad();
text->reLoadTexture();
// Reinicia el vector de colores
const std::vector<std::string> vColors = {"blue", "magenta", "green", "cyan", "yellow", "white", "bright_blue", "bright_magenta", "bright_green", "bright_cyan", "bright_yellow", "bright_white"};
color.clear();
for (auto v : vColors)
{
color.push_back(stringToColor(options->palette, v));
}
}
// Pone el marcador en modo pausa

View File

@@ -40,6 +40,7 @@ private:
Text *text; // Objeto para escribir texto
Texture *itemTexture; // Textura con los graficos para las vidas
board_t *board; // Contiene las variables a mostrar en el marcador
options_t *options; // Puntero a las opciones del juego
// Variables
std::vector<color_t> color; // Vector con los colores del objeto
@@ -55,7 +56,7 @@ private:
public:
// Constructor
ScoreBoard(SDL_Renderer *renderer, Asset *asset, board_t *board);
ScoreBoard(SDL_Renderer *renderer, Asset *asset, options_t *options, board_t *board);
// Destructor
~ScoreBoard();

View File

@@ -1,16 +1,24 @@
#include "title.h"
// Constructor
Title::Title(SDL_Renderer *renderer, Screen *screen, Asset *asset)
Title::Title(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options)
{
// Copia la dirección de los objetos
this->renderer = renderer;
this->screen = screen;
this->asset = asset;
this->options = options;
// Reserva memoria para los punteros
eventHandler = new SDL_Event();
if (options->palette == p_zxspectrum)
{
texture = new Texture(renderer, asset->get("loading_screen_color.png"));
}
else if (options->palette == p_zxarne)
{
texture = new Texture(renderer, asset->get("loading_screen_color_zxarne.png"));
}
sprite = new Sprite(0, 0, texture->getWidth(), texture->getHeight(), texture, renderer);
text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer);
@@ -33,7 +41,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Asset *asset)
letters[0].enabled = true;
// Cambia el color del borde
screen->setBorderColor(stringToColor("bright_blue"));
screen->setBorderColor(stringToColor(options->palette, "bright_blue"));
}
// Destructor
@@ -134,8 +142,7 @@ void Title::renderMarquee()
{
if (l.enabled)
{
// text->writeColored(l.x, 176, l.letter, {0, 0, 0});
text->write(l.x, 184, l.letter);
text->writeColored(l.x, 184, l.letter, stringToColor(options->palette, "white"));
}
}
}
@@ -188,10 +195,11 @@ void Title::render()
// text->writeCentered(256 / 2, 192 / 5 * 4, "PRESS ENTER TO PLAY");
//}
// Dibuja el texto de PRESS ENTER TO PLAY
if (counter % 80 < 60)
{
const color_t textColor = stringToColor("white");
const color_t strokeColor = stringToColor("bright_blue");
const color_t textColor = stringToColor(options->palette, "white");
const color_t strokeColor = stringToColor(options->palette, "bright_blue");
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, 256 / 2, 192 / 5 * 4, "PRESS ENTER TO PLAY", 1, textColor, 1, strokeColor);
}

View File

@@ -31,6 +31,7 @@ private:
Texture *texture; // Textura con los graficos
Sprite *sprite; // Sprite para manejar la textura
Text *text; // Objeto para escribir texto en pantalla
options_t *options; // Puntero a las opciones del juego
// Variables
int counter; // Contador
@@ -57,7 +58,7 @@ private:
public:
// Constructor
Title(SDL_Renderer *renderer, Screen *screen, Asset *asset);
Title(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options);
// Destructor
~Title();