Compare commits

...

3 Commits

17 changed files with 236 additions and 158 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

BIN
data/config/demo1.bin Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
data/config/demo2.bin Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,6 +1,7 @@
#GAME #GAME
gameWidth 320 gameWidth 320
gameHeight 240 gameHeight 240
itemSize 20
#FADE #FADE
numSquaresWidth 160 numSquaresWidth 160

Binary file not shown.

Before

Width:  |  Height:  |  Size: 623 B

After

Width:  |  Height:  |  Size: 623 B

View File

@@ -1,5 +1,5 @@
frameWidth=30 frameWidth=28
frameHeight=39 frameHeight=37
[animation] [animation]
name=default name=default

Binary file not shown.

Before

Width:  |  Height:  |  Size: 972 B

After

Width:  |  Height:  |  Size: 835 B

View File

@@ -171,6 +171,7 @@ struct param_t
{ {
int gameWidth; // Ancho de la resolucion nativa del juego int gameWidth; // Ancho de la resolucion nativa del juego
int gameHeight; // Alto de la resolucion nativa del juego int gameHeight; // Alto de la resolucion nativa del juego
int itemSize; // Tamañoi de los items del juego
SDL_Rect scoreboard; // Posición y tamaño del marcador SDL_Rect scoreboard; // Posición y tamaño del marcador

View File

@@ -16,7 +16,12 @@ Director::Director(int argc, char *argv[])
{ {
// Inicializa variables // Inicializa variables
section = new section_t(); section = new section_t();
#ifdef RECORDING
section->name = SECTION_PROG_GAME;
section->subsection = SUBSECTION_GAME_PLAY_1P;
#else
section->name = SECTION_PROG_LOGO; section->name = SECTION_PROG_LOGO;
#endif
// Comprueba los parametros del programa // Comprueba los parametros del programa
checkProgramArguments(argc, argv); checkProgramArguments(argc, argv);
@@ -279,7 +284,8 @@ bool Director::setFileList()
asset->add(systemFolder + "/config.txt", t_data, false, true); asset->add(systemFolder + "/config.txt", t_data, false, true);
asset->add(systemFolder + "/score.bin", t_data, false, true); asset->add(systemFolder + "/score.bin", t_data, false, true);
asset->add(prefix + "/data/config/param.txt", t_data); asset->add(prefix + "/data/config/param.txt", t_data);
asset->add(prefix + "/data/config/demo.bin", t_data); asset->add(prefix + "/data/config/demo1.bin", t_data);
asset->add(prefix + "/data/config/demo2.bin", t_data);
asset->add(prefix + "/data/config/gamecontrollerdb.txt", t_data); asset->add(prefix + "/data/config/gamecontrollerdb.txt", t_data);
// Notificaciones // Notificaciones
@@ -419,7 +425,11 @@ void Director::initOptions()
// Pone unos valores por defecto para las opciones // Pone unos valores por defecto para las opciones
// Opciones varias // Opciones varias
#ifdef VERBOSE
options->console = true;
#else
options->console = false; options->console = false;
#endif
// Opciones de video // Opciones de video
options->video.mode = 0; options->video.mode = 0;
@@ -818,7 +828,8 @@ void Director::runInstructions()
// Ejecuta el juego en modo demo // Ejecuta el juego en modo demo
void Director::runDemoGame() void Director::runDemoGame()
{ {
demoGame = new Game(1, 0, renderer, screen, asset, lang, input, true, param, options, section, nullptr); const int playerID = (rand() % 2) + 1;
demoGame = new Game(playerID, 0, renderer, screen, asset, lang, input, true, param, options, section, nullptr);
demoGame->run(); demoGame->run();
delete demoGame; delete demoGame;
} }

View File

@@ -31,8 +31,15 @@ Game::Game(int playerID, int currentStage, SDL_Renderer *renderer, Screen *scree
// Carga los recursos // Carga los recursos
loadMedia(); loadMedia();
// Carga ficheros // Inicializa los vectores con los datos para la demo
loadDemoFile(); if (demo)
{
// Aleatoriza la asignación del fichero
const int index1 = rand() % 2;
const int index2 = (index1 + 1) % 2;
loadDemoFile(asset->get("demo1.bin"), &this->demo.dataFile[index1]);
loadDemoFile(asset->get("demo2.bin"), &this->demo.dataFile[index2]);
}
// Establece la máxima puntuación desde fichero o desde las puntuaciones online // Establece la máxima puntuación desde fichero o desde las puntuaciones online
setHiScore(); setHiScore();
@@ -171,14 +178,14 @@ void Game::init(int playerID)
}; };
players.clear(); players.clear();
// Crea los jugadores // Crea los dos jugadores
Player *player1 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, renderer, playerTextures[0], playerAnimations); Player *player1 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, renderer, playerTextures[0], playerAnimations);
players.push_back(player1); players.push_back(player1);
Player *player2 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, renderer, playerTextures[1], playerAnimations); Player *player2 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, renderer, playerTextures[1], playerAnimations);
players.push_back(player2); players.push_back(player2);
// playerID es player 1 o player 2 // Habilita el jugador seleccionado. playerID es player 1 o player 2
players[playerID - 1]->enable(true); players[playerID - 1]->enable(true);
// Variables relacionadas con la dificultad // Variables relacionadas con la dificultad
@@ -243,6 +250,7 @@ void Game::init(int playerID)
powerBallCounter = 0; powerBallCounter = 0;
coffeeMachineEnabled = false; coffeeMachineEnabled = false;
// Inicializa las variables para el modo demo
if (demo.enabled) if (demo.enabled)
{ {
// Selecciona una pantalla al azar // Selecciona una pantalla al azar
@@ -258,6 +266,13 @@ void Game::init(int playerID)
currentStage = 6; currentStage = 6;
} }
// Activa o no al otro jugador
if (rand() % 3 == 0)
{
const int otherPlayer = playerID == 1 ? 2 : 1;
players[otherPlayer - 1]->enable(true);
}
// Añade 0, 1 o 2 cafes al jugador // Añade 0, 1 o 2 cafes al jugador
for (int i = 0; i < rand() % 3; ++i) for (int i = 0; i < rand() % 3; ++i)
{ {
@@ -286,7 +301,7 @@ void Game::init(int playerID)
totalPowerToCompleteGame += stage[i].powerToComplete; totalPowerToCompleteGame += stage[i].powerToComplete;
} }
// Modo demo // Modo grabar demo
#ifdef RECORDING #ifdef RECORDING
demo.recording = true; demo.recording = true;
#else #else
@@ -603,13 +618,12 @@ bool Game::loadScoreFile()
} }
// Carga el fichero de datos para la demo // Carga el fichero de datos para la demo
bool Game::loadDemoFile() bool Game::loadDemoFile(std::string f, demoKeys_t (*dataFile)[TOTAL_DEMO_DATA])
{ {
// Indicador de éxito en la carga // Indicador de éxito en la carga
bool success = true; bool success = true;
const std::string p = asset->get("demo.bin"); const std::string filename = f.substr(f.find_last_of("\\/") + 1);
const std::string filename = p.substr(p.find_last_of("\\/") + 1); SDL_RWops *file = SDL_RWFromFile(f.c_str(), "r+b");
SDL_RWops *file = SDL_RWFromFile(p.c_str(), "r+b");
// El fichero no existe // El fichero no existe
if (file == nullptr) if (file == nullptr)
@@ -620,7 +634,9 @@ bool Game::loadDemoFile()
} }
// Creamos el fichero para escritura // Creamos el fichero para escritura
file = SDL_RWFromFile(p.c_str(), "w+b"); file = SDL_RWFromFile(f.c_str(), "w+b");
// Si no existe el fichero
if (file != nullptr) if (file != nullptr)
{ {
if (options->console) if (options->console)
@@ -628,24 +644,25 @@ bool Game::loadDemoFile()
std::cout << "New file (" << filename.c_str() << ") created!" << std::endl; std::cout << "New file (" << filename.c_str() << ") created!" << std::endl;
} }
// Inicializamos los datos // Inicializas los datos y los guarda en el fichero
for (int i = 0; i < TOTAL_DEMO_DATA; ++i) for (int i = 0; i < TOTAL_DEMO_DATA; ++i)
{ {
demo.keys.left = 0; demoKeys_t tmp;
demo.keys.right = 0; tmp.left = 0;
demo.keys.noInput = 0; tmp.right = 0;
demo.keys.fire = 0; tmp.noInput = 0;
demo.keys.fireLeft = 0; tmp.fire = 0;
demo.keys.fireRight = 0; tmp.fireLeft = 0;
demo.dataFile[i] = demo.keys; tmp.fireRight = 0;
SDL_RWwrite(file, &demo.dataFile[i], sizeof(demoKeys_t), 1); (*dataFile)[i] = tmp;
SDL_RWwrite(file, &tmp, sizeof(demoKeys_t), 1);
} }
// Cerramos el fichero // Cerramos el fichero
SDL_RWclose(file); SDL_RWclose(file);
} }
else else
{ { // Si no puede crear el fichero
if (options->console) if (options->console)
{ {
std::cout << "Error: Unable to create file " << filename.c_str() << std::endl; std::cout << "Error: Unable to create file " << filename.c_str() << std::endl;
@@ -656,13 +673,19 @@ bool Game::loadDemoFile()
// El fichero existe // El fichero existe
else else
{ {
// Cargamos los datos // Mensaje de proceder a la carga de los datos
if (options->console) if (options->console)
{ {
std::cout << "Reading file " << filename.c_str() << std::endl; std::cout << "Reading file " << filename.c_str() << std::endl;
} }
// Lee todos los datos del fichero y los deja en el destino
for (int i = 0; i < TOTAL_DEMO_DATA; ++i) for (int i = 0; i < TOTAL_DEMO_DATA; ++i)
SDL_RWread(file, &demo.dataFile[i], sizeof(demoKeys_t), 1); {
demoKeys_t tmp;
SDL_RWread(file, &tmp, sizeof(demoKeys_t), 1);
(*dataFile)[i] = tmp;
}
// Cierra el fichero // Cierra el fichero
SDL_RWclose(file); SDL_RWclose(file);
@@ -709,35 +732,34 @@ bool Game::saveScoreFile()
bool Game::saveDemoFile() bool Game::saveDemoFile()
{ {
bool success = true; bool success = true;
const std::string p = asset->get("demo.bin"); const std::string p = asset->get("demo1.bin");
const std::string filename = p.substr(p.find_last_of("\\/") + 1); const std::string filename = p.substr(p.find_last_of("\\/") + 1);
if (demo.recording)
SDL_RWops *file = SDL_RWFromFile(p.c_str(), "w+b");
if (file != nullptr)
{ {
SDL_RWops *file = SDL_RWFromFile(p.c_str(), "w+b"); // Guardamos los datos
if (file != nullptr) for (int i = 0; i < TOTAL_DEMO_DATA; ++i)
{ {
// Guardamos los datos SDL_RWwrite(file, &demo.dataFile[0][i], sizeof(demoKeys_t), 1);
for (int i = 0; i < TOTAL_DEMO_DATA; ++i)
{
SDL_RWwrite(file, &demo.dataFile[i], sizeof(demoKeys_t), 1);
}
if (options->console)
{
std::cout << "Writing file " << filename.c_str() << std::endl;
}
// Cerramos el fichero
SDL_RWclose(file);
} }
else
if (options->console)
{ {
if (options->console) std::cout << "Writing file " << filename.c_str() << std::endl;
{ }
std::cout << "Error: Unable to save " << filename.c_str() << " file! " << SDL_GetError() << std::endl;
} // Cerramos el fichero
SDL_RWclose(file);
}
else
{
if (options->console)
{
std::cout << "Error: Unable to save " << filename.c_str() << " file! " << SDL_GetError() << std::endl;
} }
} }
return success; return success;
} }
#endif #endif
@@ -1551,7 +1573,7 @@ void Game::updatePlayers()
{ {
killPlayer(player); killPlayer(player);
if (demo.enabled && !player->isAlive()) if (demo.enabled && allPlayersAreDead())
{ {
fade->setType(FADE_RANDOM_SQUARE); fade->setType(FADE_RANDOM_SQUARE);
fade->activate(); fade->activate();
@@ -1631,13 +1653,7 @@ void Game::updateStage()
void Game::updateDeath() void Game::updateDeath()
{ {
// Comprueba si todos los jugadores estan muertos // Comprueba si todos los jugadores estan muertos
bool allPlayersAreDead = true; if (allPlayersAreDead())
for (auto player : players)
{
allPlayersAreDead &= (!player->isAlive() || !player->isEnabled());
}
if (allPlayersAreDead)
{ {
if (deathCounter > 0) if (deathCounter > 0)
{ {
@@ -2376,8 +2392,8 @@ void Game::throwCoffee(int x, int y)
ss->setPosX(x - 8); ss->setPosX(x - 8);
ss->setPosY(y - 8); ss->setPosY(y - 8);
ss->setWidth(16); ss->setWidth(param->itemSize);
ss->setHeight(16); ss->setHeight(param->itemSize);
ss->setVelX(-1.0f + ((rand() % 5) * 0.5f)); ss->setVelX(-1.0f + ((rand() % 5) * 0.5f));
ss->setVelY(-4.0f); ss->setVelY(-4.0f);
ss->setAccelX(0.0f); ss->setAccelX(0.0f);
@@ -2386,7 +2402,7 @@ void Game::throwCoffee(int x, int y)
ss->setDestY(param->gameHeight + 1); ss->setDestY(param->gameHeight + 1);
ss->setEnabled(true); ss->setEnabled(true);
ss->setEnabledCounter(1); ss->setEnabledCounter(1);
ss->setSpriteClip(0, 0, 16, 16); ss->setSpriteClip(0, param->itemSize, param->itemSize, param->itemSize);
ss->setRotate(true); ss->setRotate(true);
ss->setRotateSpeed(10); ss->setRotateSpeed(10);
ss->setRotateAmount(90.0); ss->setRotateAmount(90.0);
@@ -2533,24 +2549,22 @@ void Game::update()
// Actualiza el contador de juego // Actualiza el contador de juego
counter++; counter++;
// Incrementa el contador de la demo
if (demo.enabled) if (demo.enabled)
{ {
// Incrementa el contador de la demo
if (demo.counter < TOTAL_DEMO_DATA) if (demo.counter < TOTAL_DEMO_DATA)
{ {
demo.counter++; demo.counter++;
if (demo.counter == TOTAL_DEMO_DATA - 200)
{
fade->setType(FADE_RANDOM_SQUARE);
fade->activate();
}
}
else
{
section->name = SECTION_PROG_HI_SCORE_TABLE;
return;
} }
// Activa el fundido antes de acabar con los datos de la demo
if (demo.counter == TOTAL_DEMO_DATA - 200)
{
fade->setType(FADE_RANDOM_SQUARE);
fade->activate();
}
// Si ha terminado el fundido, cambia de sección
if (fade->hasEnded()) if (fade->hasEnded())
{ {
section->name = SECTION_PROG_HI_SCORE_TABLE; section->name = SECTION_PROG_HI_SCORE_TABLE;
@@ -2559,15 +2573,20 @@ void Game::update()
} }
#ifdef RECORDING #ifdef RECORDING
// Solo mira y guarda el input en cada update
checkInput(); checkInput();
if (demo.recording) // Incrementa el contador de la demo
if (demo.counter < TOTAL_DEMO_DATA)
{ {
if (demo.counter >= TOTAL_DEMO_DATA) demo.counter++;
{ }
section->name = SECTION_PROG_QUIT;
return; // Si se ha llenado el vector con datos, sale del programa
} else
{
section->name = SECTION_PROG_QUIT;
return;
} }
#endif #endif
@@ -2760,59 +2779,67 @@ void Game::checkInput()
// Modo Demo activo // Modo Demo activo
if (demo.enabled) if (demo.enabled)
{ {
const int index = 0; int i = 0;
// Comprueba direcciones for (auto player : players)
if (demo.dataFile[demo.counter].left == 1)
{ {
players[index]->setInput(input_left); if (player->isAlive() && player->isEnabled())
}
else if (demo.dataFile[demo.counter].right == 1)
{
players[index]->setInput(input_right);
}
else if (demo.dataFile[demo.counter].noInput == 1)
{
players[index]->setInput(input_null);
}
// Comprueba botones
if (demo.dataFile[demo.counter].fire == 1)
{
if (players[index]->canFire())
{ {
players[index]->setInput(input_fire_center); // Comprueba direcciones
createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_UP, players[index]->isPowerUp(), index); if (demo.dataFile[i][demo.counter].left == 1)
players[index]->setFireCooldown(10); {
} player->setInput(input_left);
} }
else if (demo.dataFile[demo.counter].fireLeft == 1) else if (demo.dataFile[i][demo.counter].right == 1)
{ {
if (players[index]->canFire()) player->setInput(input_right);
{ }
players[index]->setInput(input_fire_left);
createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_LEFT, players[index]->isPowerUp(), index);
players[index]->setFireCooldown(10);
}
}
else if (demo.dataFile[demo.counter].fireRight == 1) else if (demo.dataFile[i][demo.counter].noInput == 1)
{ {
if (players[index]->canFire()) player->setInput(input_null);
{ }
players[index]->setInput(input_fire_right);
createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_RIGHT, players[index]->isPowerUp(), index);
players[index]->setFireCooldown(10);
}
}
// Si se pulsa cualquier tecla, se sale del modo demo // Comprueba botones
if (input->checkAnyButtonPressed()) if (demo.dataFile[i][demo.counter].fire == 1)
{ {
section->name = SECTION_PROG_TITLE; if (player->canFire())
return; {
player->setInput(input_fire_center);
createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_UP, player->isPowerUp(), i);
player->setFireCooldown(10);
}
}
else if (demo.dataFile[i][demo.counter].fireLeft == 1)
{
if (player->canFire())
{
player->setInput(input_fire_left);
createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_LEFT, player->isPowerUp(), i);
player->setFireCooldown(10);
}
}
else if (demo.dataFile[i][demo.counter].fireRight == 1)
{
if (player->canFire())
{
player->setInput(input_fire_right);
createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_RIGHT, player->isPowerUp(), i);
player->setFireCooldown(10);
}
}
// Si se pulsa cualquier tecla, se sale del modo demo
if (input->checkAnyButtonPressed())
{
section->name = SECTION_PROG_TITLE;
return;
}
}
i++;
} }
} }
// Modo Demo no activo // Modo Demo no activo
@@ -2914,7 +2941,7 @@ void Game::checkInput()
{ {
if (demo.counter < TOTAL_DEMO_DATA) if (demo.counter < TOTAL_DEMO_DATA)
{ {
demo.dataFile[demo.counter] = demo.keys; demo.dataFile[0][demo.counter] = demo.keys;
} }
} }
#endif #endif
@@ -2956,7 +2983,7 @@ void Game::renderMessages()
{ {
if (timeStoppedCounter % 30 == 0) if (timeStoppedCounter % 30 == 0)
{ {
//JA_PlaySound(clockSound, false); // JA_PlaySound(clockSound, false);
JA_PlaySound(clockSound); JA_PlaySound(clockSound);
} }
} }
@@ -2964,7 +2991,7 @@ void Game::renderMessages()
{ {
if (timeStoppedCounter % 15 == 0) if (timeStoppedCounter % 15 == 0)
{ {
//JA_PlaySound(clockSound, false); // JA_PlaySound(clockSound, false);
JA_PlaySound(clockSound); JA_PlaySound(clockSound);
} }
} }
@@ -3220,7 +3247,7 @@ bool Game::allPlayersAreDead()
bool success = true; bool success = true;
for (auto player : players) for (auto player : players)
{ {
success &= (!player->isAlive()); success &= (!player->isAlive() || !player->isEnabled());
} }
return success; return success;
@@ -3355,10 +3382,15 @@ void Game::setHiScore()
// Actualiza el marcador // Actualiza el marcador
void Game::updateScoreboard() void Game::updateScoreboard()
{ {
// Jugador 1
scoreboard->setScore1(players[0]->getScore()); scoreboard->setScore1(players[0]->getScore());
scoreboard->setMult1(players[0]->getScoreMultiplier()); scoreboard->setMult1(players[0]->getScoreMultiplier());
scoreboard->setScore2(players[0]->getScore());
scoreboard->setMult2(players[0]->getScoreMultiplier()); // Jugador 2
scoreboard->setScore2(players[1]->getScore());
scoreboard->setMult2(players[1]->getScoreMultiplier());
// Resto de marcador
scoreboard->setStage(stage[currentStage].number); scoreboard->setStage(stage[currentStage].number);
scoreboard->setPower((float)stage[currentStage].currentPower / (float)stage[currentStage].powerToComplete); scoreboard->setPower((float)stage[currentStage].currentPower / (float)stage[currentStage].powerToComplete);
scoreboard->setHiScore(hiScore); scoreboard->setHiScore(hiScore);

View File

@@ -100,11 +100,11 @@ private:
struct demo_t struct demo_t
{ {
bool enabled; // Indica si está activo el modo demo bool enabled; // Indica si está activo el modo demo
bool recording; // Indica si está activado el modo para grabar la demo bool recording; // Indica si está activado el modo para grabar la demo
Uint16 counter; // Contador para el modo demo int counter; // Contador para el modo demo
demoKeys_t keys; // Variable con las pulsaciones de teclas del modo demo demoKeys_t keys; // Variable con las pulsaciones de teclas del modo demo
demoKeys_t dataFile[TOTAL_DEMO_DATA]; // Datos del fichero con los movimientos para la demo demoKeys_t dataFile[2][TOTAL_DEMO_DATA]; // Vector con diferentes sets de datos con los movimientos para la demo
}; };
// Objetos y punteros // Objetos y punteros
@@ -232,7 +232,7 @@ private:
bool loadScoreFile(); bool loadScoreFile();
// Carga el fichero de datos para la demo // Carga el fichero de datos para la demo
bool loadDemoFile(); bool loadDemoFile(std::string fileName, demoKeys_t (*dataFile)[TOTAL_DEMO_DATA]);
// Guarda el fichero de puntos // Guarda el fichero de puntos
bool saveScoreFile(); bool saveScoreFile();

View File

@@ -35,7 +35,7 @@ Instructions::Instructions(SDL_Renderer *renderer, Screen *screen, Asset *asset,
counterEnd = 700; counterEnd = 700;
view = {0, 0, param->gameWidth, param->gameHeight}; view = {0, 0, param->gameWidth, param->gameHeight};
spritePos = {0, 0}; spritePos = {0, 0};
itemSize = 20; itemSpace = 2;
// Inicializa objetos // Inicializa objetos
fade->setColor(fadeColor.r, fadeColor.g, fadeColor.b); fade->setColor(fadeColor.r, fadeColor.g, fadeColor.b);
@@ -96,12 +96,10 @@ void Instructions::iniSprites()
itemTextures.push_back(item5); itemTextures.push_back(item5);
// Inicializa los sprites // Inicializa los sprites
const int desp = spritePos.y - 4;
for (int i = 0; i < (int)itemTextures.size(); ++i) for (int i = 0; i < (int)itemTextures.size(); ++i)
{ {
Sprite *sprite = new Sprite(0, 0, itemSize, itemSize, itemTextures[i], renderer); Sprite *sprite = new Sprite(0, 0, param->itemSize, param->itemSize, itemTextures[i], renderer);
sprite->setPos({spritePos.x, desp + ((itemSize + 2) * i), itemSize, itemSize}); sprite->setPos({spritePos.x, spritePos.y + ((param->itemSize + itemSpace) * i), param->itemSize, param->itemSize});
sprites.push_back(sprite); sprites.push_back(sprite);
} }
} }
@@ -109,34 +107,33 @@ void Instructions::iniSprites()
// Actualiza los sprites // Actualiza los sprites
void Instructions::updateSprites() void Instructions::updateSprites()
{ {
SDL_Rect srcRect = {0, 0, itemSize, itemSize}; SDL_Rect srcRect = {0, 0, param->itemSize, param->itemSize};
// Disquito // Disquito
srcRect.y = itemSize * (((counter + 12) / 36) % 2); srcRect.y = param->itemSize * (((counter + 12) / 36) % 2);
sprites[0]->setSpriteClip(srcRect); sprites[0]->setSpriteClip(srcRect);
// Gavineixon // Gavineixon
srcRect.y = itemSize * (((counter + 9) / 36) % 2); srcRect.y = param->itemSize * (((counter + 9) / 36) % 2);
sprites[1]->setSpriteClip(srcRect); sprites[1]->setSpriteClip(srcRect);
// Pacmar // Pacmar
srcRect.y = itemSize * (((counter + 6) / 36) % 2); srcRect.y = param->itemSize * (((counter + 6) / 36) % 2);
sprites[2]->setSpriteClip(srcRect); sprites[2]->setSpriteClip(srcRect);
// Time Stopper // Time Stopper
srcRect.y = itemSize * (((counter + 3) / 36) % 2); srcRect.y = param->itemSize * (((counter + 3) / 36) % 2);
sprites[3]->setSpriteClip(srcRect); sprites[3]->setSpriteClip(srcRect);
// Coffee // Coffee
srcRect.y = itemSize * (((counter + 0) / 36) % 2); srcRect.y = param->itemSize * (((counter + 0) / 36) % 2);
sprites[4]->setSpriteClip(srcRect); sprites[4]->setSpriteClip(srcRect);
} }
// Rellena la textura de texto // Rellena la textura de texto
void Instructions::fillTexture() void Instructions::fillTexture()
{ {
const int despX = itemSize + 8; const int despX = param->itemSize + 8;
const int despY = (itemSize - text->getCharacterSize() / 2);
// Modifica el renderizador para pintar en la textura // Modifica el renderizador para pintar en la textura
SDL_Texture *temp = SDL_GetRenderTarget(renderer); SDL_Texture *temp = SDL_GetRenderTarget(renderer);
@@ -155,7 +152,7 @@ void Instructions::fillTexture()
const int spacePostHeader = 20; const int spacePostHeader = 20;
const int spacePreHeader = 28; const int spacePreHeader = 28;
const int spaceBetweenLines = text->getCharacterSize() * 1.5f; const int spaceBetweenLines = text->getCharacterSize() * 1.5f;
const int spaceBetweenItemLines = itemSize + 2; const int spaceBetweenItemLines = param->itemSize + itemSpace;
const int spaceNewParagraph = spaceBetweenLines * 0.5f; const int spaceNewParagraph = spaceBetweenLines * 0.5f;
const int size = (numLines * spaceBetweenLines) + (numItemLines * spaceBetweenItemLines) + (numPostHeaders * spacePostHeader) + (numPreHeaders * spacePreHeader) + (spaceNewParagraph); const int size = (numLines * spaceBetweenLines) + (numItemLines * spaceBetweenItemLines) + (numPostHeaders * spacePostHeader) + (numPreHeaders * spacePreHeader) + (spaceNewParagraph);
@@ -184,18 +181,19 @@ void Instructions::fillTexture()
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, GAMECANVAS_CENTER_X, anchor2, lang->getText(16), 1, orangeColor, 1, shdwTxtColor); text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, GAMECANVAS_CENTER_X, anchor2, lang->getText(16), 1, orangeColor, 1, shdwTxtColor);
const int anchor3 = anchor2 + spacePostHeader; const int anchor3 = anchor2 + spacePostHeader;
text->writeShadowed(anchorItem + despX, despY + anchor3 + spaceBetweenItemLines * 0, lang->getText(17), shdwTxtColor); //const int anchor4 = anchor3 + ((param->itemSize + text->getCharacterSize()) / 2);
text->writeShadowed(anchorItem + despX, despY + anchor3 + spaceBetweenItemLines * 1, lang->getText(18), shdwTxtColor); text->writeShadowed(anchorItem + despX, anchor3 + spaceBetweenItemLines * 0, lang->getText(17), shdwTxtColor);
text->writeShadowed(anchorItem + despX, despY + anchor3 + spaceBetweenItemLines * 2, lang->getText(19), shdwTxtColor); text->writeShadowed(anchorItem + despX, anchor3 + spaceBetweenItemLines * 1, lang->getText(18), shdwTxtColor);
text->writeShadowed(anchorItem + despX, despY + anchor3 + spaceBetweenItemLines * 3, lang->getText(20), shdwTxtColor); text->writeShadowed(anchorItem + despX, anchor3 + spaceBetweenItemLines * 2, lang->getText(19), shdwTxtColor);
text->writeShadowed(anchorItem + despX, despY + anchor3 + spaceBetweenItemLines * 4, lang->getText(21), shdwTxtColor); text->writeShadowed(anchorItem + despX, anchor3 + spaceBetweenItemLines * 3, lang->getText(20), shdwTxtColor);
text->writeShadowed(anchorItem + despX, anchor3 + spaceBetweenItemLines * 4, lang->getText(21), shdwTxtColor);
// Deja el renderizador como estaba // Deja el renderizador como estaba
SDL_SetRenderTarget(renderer, temp); SDL_SetRenderTarget(renderer, temp);
// Da valor a la variable // Da valor a la variable
spritePos.x = anchorItem; spritePos.x = anchorItem;
spritePos.y = anchor3; spritePos.y = anchor3 - ((param->itemSize - text->getCharacterSize()) / 2);
} }
// Rellena el backbuffer // Rellena el backbuffer

View File

@@ -44,7 +44,7 @@ private:
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
SDL_Rect view; // Vista del backbuffer que se va amostrar por pantalla SDL_Rect view; // Vista del backbuffer que se va amostrar por pantalla
SDL_Point spritePos; // Posición del primer sprite SDL_Point spritePos; // Posición del primer sprite
int itemSize; // Tamaño de los items int itemSpace; // Espacio entre los items
// Actualiza las variables // Actualiza las variables
void update(); void update();

View File

@@ -14,8 +14,8 @@ Item::Item(Uint8 kind, float x, float y, Texture *texture, std::vector<std::stri
if (kind == ITEM_COFFEE_MACHINE) if (kind == ITEM_COFFEE_MACHINE)
{ {
width = 30; width = 28;
height = 39; height = 37;
posX = (((int)x + (PLAY_AREA_WIDTH / 2)) % (PLAY_AREA_WIDTH - width - 5)) + 2; posX = (((int)x + (PLAY_AREA_WIDTH / 2)) % (PLAY_AREA_WIDTH - width - 5)) + 2;
posY = PLAY_AREA_TOP - height; posY = PLAY_AREA_TOP - height;
velX = 0.0f; velX = 0.0f;

View File

@@ -11,6 +11,7 @@ void initParam(param_t *param)
// Tamaño original del juego // Tamaño original del juego
param->gameWidth = 320; param->gameWidth = 320;
param->gameHeight = 240; param->gameHeight = 240;
param->itemSize = 20;
// Tamaño para el marcador // Tamaño para el marcador
param->scoreboard = {0, 208, 320, 32}; param->scoreboard = {0, 208, 320, 32};
@@ -131,6 +132,11 @@ bool setOptions(param_t *param, std::string var, std::string value)
param->gameHeight = std::stoi(value); param->gameHeight = std::stoi(value);
} }
else if (var == "itemSize")
{
param->itemSize = std::stoi(value);
}
else if (var == "numSquaresWidth") else if (var == "numSquaresWidth")
{ {
param->numSquaresWidth = std::stoi(value); param->numSquaresWidth = std::stoi(value);

View File

@@ -95,52 +95,62 @@ void Scoreboard::render()
SDL_RenderCopy(renderer, background, nullptr, &rect); SDL_RenderCopy(renderer, background, nullptr, &rect);
} }
// Establece el valor de la variable
void Scoreboard::setScore1(int score) void Scoreboard::setScore1(int score)
{ {
score1 = score; score1 = score;
} }
// Establece el valor de la variable
void Scoreboard::setScore2(int score) void Scoreboard::setScore2(int score)
{ {
score2 = score; score2 = score;
} }
// Establece el valor de la variable
void Scoreboard::setMult1(float mult) void Scoreboard::setMult1(float mult)
{ {
mult1 = mult; mult1 = mult;
} }
// Establece el valor de la variable
void Scoreboard::setMult2(float mult) void Scoreboard::setMult2(float mult)
{ {
mult2 = mult; mult2 = mult;
} }
// Establece el valor de la variable
void Scoreboard::setStage(int stage) void Scoreboard::setStage(int stage)
{ {
this->stage = stage; this->stage = stage;
} }
// Establece el valor de la variable
void Scoreboard::setHiScore(int hiScore) void Scoreboard::setHiScore(int hiScore)
{ {
this->hiScore = hiScore; this->hiScore = hiScore;
} }
// Establece el valor de la variable
void Scoreboard::setPower(float power) void Scoreboard::setPower(float power)
{ {
this->power = power; this->power = power;
} }
// Establece el valor de la variable
void Scoreboard::setHiScoreName(std::string name) void Scoreboard::setHiScoreName(std::string name)
{ {
hiScoreName = name; hiScoreName = name;
} }
// Establece el valor de la variable
void Scoreboard::setColor(color_t color) void Scoreboard::setColor(color_t color)
{ {
this->color = color; this->color = color;
fillBackgroundTexture(); fillBackgroundTexture();
} }
// Establece el valor de la variable
void Scoreboard::setPos(SDL_Rect rect) void Scoreboard::setPos(SDL_Rect rect)
{ {
this->rect = rect; this->rect = rect;

View File

@@ -74,15 +74,34 @@ public:
// Pinta el marcador // Pinta el marcador
void render(); void render();
// Establece el valor de la variable
void setScore1(int score); void setScore1(int score);
// Establece el valor de la variable
void setScore2(int score); void setScore2(int score);
// Establece el valor de la variable
void setMult1(float mult); void setMult1(float mult);
// Establece el valor de la variable
void setMult2(float mult); void setMult2(float mult);
// Establece el valor de la variable
void setStage(int stage); void setStage(int stage);
// Establece el valor de la variable
void setHiScore(int hiScore); void setHiScore(int hiScore);
// Establece el valor de la variable
void setPower(float power); void setPower(float power);
// Establece el valor de la variable
void setHiScoreName(std::string name); void setHiScoreName(std::string name);
// Establece el valor de la variable
void setColor(color_t color); void setColor(color_t color);
// Establece el valor de la variable
void setPos(SDL_Rect rect); void setPos(SDL_Rect rect);
}; };