Start to work on dual input for P1

This commit is contained in:
2021-08-29 19:54:18 +02:00
parent 4de3d69bb8
commit 02b528ea8c
12 changed files with 110 additions and 48 deletions

View File

@@ -148,3 +148,7 @@ NEAREST
ACTIVADA ACTIVADA
## 74 - MENU DE OPCIONES ## 74 - MENU DE OPCIONES
DESACTIVADA DESACTIVADA
## 75 - MENU DE OPCIONES
ENDAVANT!
## 76 - JUEGO
1.000.000 DE PUNTS!

View File

@@ -109,9 +109,9 @@ player 1
## 54 - MARCADOR ## 54 - MARCADOR
player 2 player 2
## 55 - MARCADOR ## 55 - MARCADOR
mult - mult
## 56 - MARCADOR ## 56 - MARCADOR
high score - high score
## 57 - MARCADOR ## 57 - MARCADOR
stage stage
## 58 - MENU DE OPCIONES ## 58 - MENU DE OPCIONES
@@ -148,3 +148,7 @@ NEAREST
ON ON
## 74 - MENU DE OPCIONES ## 74 - MENU DE OPCIONES
OFF OFF
## 75 - JUEGO
GET READY!
## 76 - JUEGO
1.000.000 POINTS!

View File

@@ -109,9 +109,9 @@ jugador 1
## 54 - MARCADOR ## 54 - MARCADOR
jugador 2 jugador 2
## 55 - MARCADOR ## 55 - MARCADOR
mult - mult
## 56 - MARCADOR ## 56 - MARCADOR
max. puntuacion - max. puntuacion
## 57 - MARCADOR ## 57 - MARCADOR
fase fase
## 58 - MENU DE OPCIONES ## 58 - MENU DE OPCIONES
@@ -148,3 +148,7 @@ NEAREST
ACTIVADA ACTIVADA
## 74 - MENU DE OPCIONES ## 74 - MENU DE OPCIONES
DESACTIVADA DESACTIVADA
## 75 - MENU DE OPCIONES
ADELANTE!
## 76 - JUEGO
1.000.000 DE PUNTOS!

View File

@@ -42,6 +42,8 @@ Director::Director(std::string path)
// Crea los objetos // Crea los objetos
mInput1 = new Input(mOptions->player1Input); mInput1 = new Input(mOptions->player1Input);
mInput2 = new Input(mOptions->player2Input); mInput2 = new Input(mOptions->player2Input);
//mInput[0] = new Input(INPUT_USE_KEYBOARD);
//mInput[1] = new Input(INPUT_USE_GAMECONTROLLER);
// Inicializa SDL // Inicializa SDL
initSDL(); initSDL();
@@ -140,12 +142,11 @@ void Director::initJailAudio()
// Arranca SDL y crea la ventana // Arranca SDL y crea la ventana
bool Director::initSDL() bool Director::initSDL()
{ {
// Indicador de inicialización // Indicador de éxito
bool success = true; bool success = true;
// Inicializa SDL // Inicializa SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER | SDL_INIT_AUDIO | SDL_INIT_HAPTIC) < 0) if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER | SDL_INIT_AUDIO) < 0)
//if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
{ {
printf("SDL could not initialize!\nSDL Error: %s\n", SDL_GetError()); printf("SDL could not initialize!\nSDL Error: %s\n", SDL_GetError());
success = false; success = false;

View File

@@ -34,13 +34,12 @@ private:
SDL_Window *mWindow; // La ventana donde dibujamos SDL_Window *mWindow; // La ventana donde dibujamos
SDL_Renderer *mRenderer; // El renderizador de la ventana SDL_Renderer *mRenderer; // El renderizador de la ventana
Input *mInput1; // Objeto Input para gestionar las entradas
Input *mInput2; // Objeto Input para gestionar las entradas
Logo *mLogo; // Objeto para la sección del logo Logo *mLogo; // Objeto para la sección del logo
Intro *mIntro; // Objeto para la sección de la intro Intro *mIntro; // Objeto para la sección de la intro
Title *mTitle; // Objeto para la sección del titulo y el menu de opciones Title *mTitle; // Objeto para la sección del titulo y el menu de opciones
Game *mGame; // Objeto para la sección del juego Game *mGame; // Objeto para la sección del juego
Input *mInput1; // Objeto Input para gestionar las entradas
Input *mInput2; // Objeto Input para gestionar las entradas
Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas
std::string mFileList[MAX_FILE_LIST]; // Vector con las rutas a los ficheros de recursos std::string mFileList[MAX_FILE_LIST]; // Vector con las rutas a los ficheros de recursos

View File

@@ -315,6 +315,10 @@ void Game::init()
mMenaceThreshold = 0; mMenaceThreshold = 0;
mHiScoreAchieved = false; mHiScoreAchieved = false;
mCurrentStage = 0; mCurrentStage = 0;
// BORRAR
mCurrentStage = 9;
mStageBitmapCounter = STAGE_COUNTER; mStageBitmapCounter = STAGE_COUNTER;
mDeathCounter = DEATH_COUNTER; mDeathCounter = DEATH_COUNTER;
mExplosionTime = false; mExplosionTime = false;
@@ -366,6 +370,9 @@ void Game::init()
initEnemyPools(); initEnemyPools();
initGameStages(); initGameStages();
// BORRAR
mStage[mCurrentStage].currentPower = mStage[mCurrentStage].powerToComplete - 10;
// Modo debug // Modo debug
mDebug.enabled = false; mDebug.enabled = false;
mDebug.enemySet = 0; mDebug.enemySet = 0;
@@ -1704,7 +1711,10 @@ void Game::updateStage()
mStage[mCurrentStage].currentPower = 0; // Deja el poder a cero para que no vuelva a entrar en esta condición mStage[mCurrentStage].currentPower = 0; // Deja el poder a cero para que no vuelva a entrar en esta condición
destroyAllBalloons(); // Destruye a todos los enemigos destroyAllBalloons(); // Destruye a todos los enemigos
mStage[mCurrentStage].currentPower = 0; // Vuelve a dejar el poder a cero, por lo que hubiera podido subir al destruir todos lo globos mStage[mCurrentStage].currentPower = 0; // Vuelve a dejar el poder a cero, por lo que hubiera podido subir al destruir todos lo globos
mMenaceCurrent = 255; mMenaceCurrent = 255; // Sube el nivel de amenaza para que no cree mas globos
for (int i = 0; i < mNumPlayers; i++) // Añade un millon de puntos a los jugadores que queden vivos
if (mPlayer[i]->isAlive())
mPlayer[i]->addScore(1000000);
JA_StopMusic(); JA_StopMusic();
} }
JA_PlaySound(mSoundStageChange); JA_PlaySound(mSoundStageChange);
@@ -2946,15 +2956,16 @@ void Game::renderMessages()
if ((mCounter < STAGE_COUNTER) && (!mDemo.enabled)) if ((mCounter < STAGE_COUNTER) && (!mDemo.enabled))
{ {
mSpriteGetReady->setPosX((int)mGetReadyBitmapPath[mCounter]); mSpriteGetReady->setPosX((int)mGetReadyBitmapPath[mCounter]);
mSpriteGetReady->render(); //mSpriteGetReady->render();
const color_t color = {0x17, 0x17, 0x26};
mTextBig->writeShadowed((int)mGetReadyBitmapPath[mCounter], PLAY_AREA_CENTER_Y - 8, mLang->getText(75), color, 2);
} }
// Time Stopped // Time Stopped
if (mTimeStopped) if (mTimeStopped)
{ {
if ((mTimeStoppedCounter > 100) || (mTimeStoppedCounter % 10 > 4)) if ((mTimeStoppedCounter > 100) || (mTimeStoppedCounter % 10 > 4))
//mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, "Time Stopped: " + std::to_string(mTimeStoppedCounter / 10)); mText->writeDX(TXT_CENTER | TXT_STROKE, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, mLang->getText(36) + std::to_string(mTimeStoppedCounter / 10), 1, noColor, 1, shdwTxtColor);
mText->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, mLang->getText(36) + std::to_string(mTimeStoppedCounter / 10), 1, noColor, 1, shdwTxtColor);
if (mTimeStoppedCounter > 100) if (mTimeStoppedCounter > 100)
{ {
@@ -2975,11 +2986,19 @@ void Game::renderMessages()
// STAGE NUMBER // STAGE NUMBER
std::string text = mLang->getText(38) + std::to_string(mStage[mCurrentStage].number); std::string text = mLang->getText(38) + std::to_string(mStage[mCurrentStage].number);
if (mGameCompleted) // Texto de juego completado
text = mLang->getText(50);
if (mStageBitmapCounter < STAGE_COUNTER) if (mStageBitmapCounter < STAGE_COUNTER)
mTextBig->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, mStageBitmapPath[mStageBitmapCounter], text, 1, noColor, 2, shdwTxtColor); {
if (!mGameCompleted)
{
mTextBig->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, mStageBitmapPath[mStageBitmapCounter], text, 1, noColor, 2, shdwTxtColor);
}
else
{ // Texto de juego completado
text = mLang->getText(50);
mTextBig->writeDX(TXT_CENTER | TXT_STROKE, PLAY_AREA_CENTER_X, mStageBitmapPath[mStageBitmapCounter], text, 1, noColor, 1, shdwTxtColor);
mText->writeDX(TXT_CENTER | TXT_STROKE, PLAY_AREA_CENTER_X, mStageBitmapPath[mStageBitmapCounter] + 17, mLang->getText(76), 1, noColor, 1, shdwTxtColor);
}
}
} }
// Habilita el efecto del item de detener el tiempo // Habilita el efecto del item de detener el tiempo

View File

@@ -141,7 +141,7 @@ bool Input::discoverGameController()
int nJoysticks = SDL_NumJoysticks(); int nJoysticks = SDL_NumJoysticks();
mNumGamepads = 0; mNumGamepads = 0;
// Count how many controllers there are // Cuenta el numero de mandos
for (int i = 0; i < nJoysticks; i++) for (int i = 0; i < nJoysticks; i++)
if (SDL_IsGameController(i)) if (SDL_IsGameController(i))
mNumGamepads++; mNumGamepads++;
@@ -154,7 +154,7 @@ bool Input::discoverGameController()
for (int i = 0; i < mNumGamepads; i++) for (int i = 0; i < mNumGamepads; i++)
{ {
// Open the controller and add it to our list // Abre el mando y lo añade a la lista
SDL_GameController *pad = SDL_GameControllerOpen(i); SDL_GameController *pad = SDL_GameControllerOpen(i);
if (SDL_GameControllerGetAttached(pad) == 1) if (SDL_GameControllerGetAttached(pad) == 1)
mConnectedControllers.push_back(pad); mConnectedControllers.push_back(pad);
@@ -168,3 +168,9 @@ bool Input::discoverGameController()
return found; return found;
} }
// Establece el método de entrada
void Input::setSource(Uint8 value)
{
mSource = value;
}

View File

@@ -54,6 +54,9 @@ private:
int mSource; // Indica si el objeto usará un mando o un teclado int mSource; // Indica si el objeto usará un mando o un teclado
// Comprueba si hay un mando conectado
bool discoverGameController();
public: public:
// Constructor // Constructor
Input(int source); Input(int source);
@@ -70,8 +73,8 @@ public:
// Comprueba si un input esta activo // Comprueba si un input esta activo
bool checkInput(Uint8 input, bool repeat); bool checkInput(Uint8 input, bool repeat);
// Comprueba si hay un mando conectado // Establece el método de entrada
bool discoverGameController(); void setSource(Uint8 value);
}; };
#endif #endif

View File

@@ -98,6 +98,7 @@ void Text::writeDX(Uint8 flags, int x, int y, std::string text, int kerning, col
const bool centered = ((flags & TXT_CENTER) == TXT_CENTER); const bool centered = ((flags & TXT_CENTER) == TXT_CENTER);
const bool shadowed = ((flags & TXT_SHADOW) == TXT_SHADOW); const bool shadowed = ((flags & TXT_SHADOW) == TXT_SHADOW);
const bool colored = ((flags & TXT_COLOR) == TXT_COLOR); const bool colored = ((flags & TXT_COLOR) == TXT_COLOR);
const bool stroked = ((flags & TXT_STROKE) == TXT_STROKE);
if (centered) if (centered)
x -= (Text::lenght(text, kerning) / 2); x -= (Text::lenght(text, kerning) / 2);
@@ -105,6 +106,19 @@ void Text::writeDX(Uint8 flags, int x, int y, std::string text, int kerning, col
if (shadowed) if (shadowed)
writeColored(x + shadowDistance, y + shadowDistance, text, shadowColor, kerning, lenght); writeColored(x + shadowDistance, y + shadowDistance, text, shadowColor, kerning, lenght);
if (stroked)
{
writeColored(x + shadowDistance, y + shadowDistance, text, shadowColor, kerning, lenght);
writeColored(x - shadowDistance, y + shadowDistance, text, shadowColor, kerning, lenght);
writeColored(x + shadowDistance, y - shadowDistance, text, shadowColor, kerning, lenght);
writeColored(x - shadowDistance, y - shadowDistance, text, shadowColor, kerning, lenght);
writeColored(x, y + shadowDistance, text, shadowColor, kerning, lenght);
writeColored(x, y - shadowDistance, text, shadowColor, kerning, lenght);
writeColored(x + shadowDistance, y, text, shadowColor, kerning, lenght);
writeColored(x - shadowDistance, y, text, shadowColor, kerning, lenght);
}
if (colored) if (colored)
writeColored(x, y, text, textColor, kerning, lenght); writeColored(x, y, text, textColor, kerning, lenght);
else else

View File

@@ -8,6 +8,7 @@
#define TXT_COLOR 1 #define TXT_COLOR 1
#define TXT_SHADOW 2 #define TXT_SHADOW 2
#define TXT_CENTER 4 #define TXT_CENTER 4
#define TXT_STROKE 8
// Clase texto. Pinta texto en pantalla a partir de un bitmap // Clase texto. Pinta texto en pantalla a partir de un bitmap
class Text class Text

View File

@@ -219,21 +219,7 @@ void Title::init(bool demo, Uint8 subsection)
mEvents[i] = EVENT_WAITING; mEvents[i] = EVENT_WAITING;
// Crea el mosaico de fondo del titulo // Crea el mosaico de fondo del titulo
SDL_SetRenderTarget(mRenderer, mBackground); createTiledBackground();
SDL_SetRenderDrawColor(mRenderer, 0x43, 0x43, 0x4F, 0xFF);
SDL_RenderClear(mRenderer);
mTile->init(0, 0, 64, 64, mTitleTexture, mRenderer);
mTile->setSpriteClip(192, 0, 64, 64);
for (int i = 0; i < 8; i++)
for (int j = 0; j < 6; j++)
{
mTile->setPosX(i * 64);
mTile->setPosY(j * 64);
mTile->render();
}
SDL_SetRenderTarget(mRenderer, nullptr);
mBackgroundWindow.x = 0; mBackgroundWindow.x = 0;
mBackgroundWindow.y = 0; mBackgroundWindow.y = 0;
@@ -251,13 +237,10 @@ void Title::init(bool demo, Uint8 subsection)
mMenu.title->addItem(mLang->getText(51)); // 1 PLAYER mMenu.title->addItem(mLang->getText(51)); // 1 PLAYER
mMenu.title->addItem(mLang->getText(52), 0, 5); // 2 PLAYERS mMenu.title->addItem(mLang->getText(52), 0, 5); // 2 PLAYERS
mMenu.title->addItem(mLang->getText(1), 0, 5); // OPTIONS mMenu.title->addItem(mLang->getText(1), 0, 5); // OPTIONS
//mMenu.title->addItem(mLang->getText(2), 0, 5); // HOW TO PLAY mMenu.title->addItem(mLang->getText(3)); // QUIT
mMenu.title->addItem(mLang->getText(3)); // QUIT
mMenu.title->setDefaultActionWhenCancel(3); mMenu.title->setDefaultActionWhenCancel(3);
mMenu.title->setBackgroundColor(0x30, 0x30, 0x40, 192); mMenu.title->setBackgroundColor(0x30, 0x30, 0x40, 192);
//mMenu.title->setSelectorColor(0xe5, 0x1c, 0x23, 255);
mMenu.title->setSelectorColor(0xe5, 0x1c, 0x23, 0); mMenu.title->setSelectorColor(0xe5, 0x1c, 0x23, 0);
//mMenu.title->setSelectorTextColor(0xFF, 0xF1, 0x76);
mMenu.title->setSelectorTextColor(0xFF, 0xB4, 0x00); mMenu.title->setSelectorTextColor(0xFF, 0xB4, 0x00);
mMenu.title->centerMenuOnX(SCREEN_CENTER_X); mMenu.title->centerMenuOnX(SCREEN_CENTER_X);
mMenu.title->centerMenuElementsOnX(); mMenu.title->centerMenuElementsOnX();
@@ -493,6 +476,7 @@ void Title::applyOptions()
mLang->setLang(mOptions->language); mLang->setLang(mOptions->language);
updateMenuLabels(); updateMenuLabels();
createTiledBackground();
} }
// Bucle para el titulo del juego // Bucle para el titulo del juego
@@ -909,3 +893,23 @@ void Title::SwitchInputs(int value)
mOptions->player1Input = mOptions->player2Input; mOptions->player1Input = mOptions->player2Input;
mOptions->player2Input = temp; mOptions->player2Input = temp;
} }
// Crea el mosaico de fondo del titulo
void Title::createTiledBackground()
{
SDL_SetRenderTarget(mRenderer, mBackground);
SDL_SetRenderDrawColor(mRenderer, 0x43, 0x43, 0x4F, 0xFF);
SDL_RenderClear(mRenderer);
mTile->init(0, 0, 64, 64, mTitleTexture, mRenderer);
mTile->setSpriteClip(192, 0, 64, 64);
for (int i = 0; i < 8; i++)
for (int j = 0; j < 6; j++)
{
mTile->setPosX(i * 64);
mTile->setPosY(j * 64);
mTile->render();
}
SDL_SetRenderTarget(mRenderer, nullptr);
}

View File

@@ -94,6 +94,9 @@ private:
// Modifica las opciones para los controles de los jugadores // Modifica las opciones para los controles de los jugadores
void SwitchInputs(int value); void SwitchInputs(int value);
// Crea el mosaico de fondo del titulo
void createTiledBackground();
public: public:
// Constructor // Constructor
Title(SDL_Window *window, SDL_Renderer *renderer, Input *input, std::string *fileList, options_t *options, Lang *lang); Title(SDL_Window *window, SDL_Renderer *renderer, Input *input, std::string *fileList, options_t *options, Lang *lang);