Compare commits
6 Commits
2024-11-20
...
2024-11-27
| Author | SHA1 | Date | |
|---|---|---|---|
| 736bf7e544 | |||
| a2d4331430 | |||
| fd7beee5a1 | |||
| a36120cf0c | |||
| ad221243cb | |||
| b8d4c8f17c |
BIN
data/music/credits.ogg
Normal file
BIN
data/music/credits.ogg
Normal file
Binary file not shown.
@@ -7,7 +7,7 @@
|
|||||||
#include "texture.h" // Para Texture
|
#include "texture.h" // Para Texture
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
Balloon::Balloon(float x, float y, BalloonType type, BalloonSize size, float vel_x, float speed, Uint16 creation_timer, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation)
|
Balloon::Balloon(float x, float y, BalloonType type, BalloonSize size, float vel_x, float speed, Uint16 creation_timer, SDL_Rect play_area, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation)
|
||||||
: sprite_(std::make_unique<AnimatedSprite>(texture, animation)),
|
: sprite_(std::make_unique<AnimatedSprite>(texture, animation)),
|
||||||
x_(x),
|
x_(x),
|
||||||
y_(y),
|
y_(y),
|
||||||
@@ -19,7 +19,8 @@ Balloon::Balloon(float x, float y, BalloonType type, BalloonSize size, float vel
|
|||||||
creation_counter_ini_(creation_timer),
|
creation_counter_ini_(creation_timer),
|
||||||
type_(type),
|
type_(type),
|
||||||
size_(size),
|
size_(size),
|
||||||
speed_(speed)
|
speed_(speed),
|
||||||
|
play_area_(play_area)
|
||||||
{
|
{
|
||||||
switch (type_)
|
switch (type_)
|
||||||
{
|
{
|
||||||
@@ -91,8 +92,8 @@ Balloon::Balloon(float x, float y, BalloonType type, BalloonSize size, float vel
|
|||||||
void Balloon::alignTo(int x)
|
void Balloon::alignTo(int x)
|
||||||
{
|
{
|
||||||
x_ = static_cast<float>(x - (w_ / 2));
|
x_ = static_cast<float>(x - (w_ / 2));
|
||||||
const int min_x = param.game.play_area.rect.x;
|
const int min_x = play_area_.x;
|
||||||
const int max_x = param.game.play_area.rect.w - w_;
|
const int max_x = play_area_.w - w_;
|
||||||
x_ = std::clamp(x_, static_cast<float>(min_x), static_cast<float>(max_x));
|
x_ = std::clamp(x_, static_cast<float>(min_x), static_cast<float>(max_x));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,8 +150,8 @@ void Balloon::move()
|
|||||||
|
|
||||||
// Colisión en las partes laterales de la zona de juego
|
// Colisión en las partes laterales de la zona de juego
|
||||||
const int clip = 2;
|
const int clip = 2;
|
||||||
const float min_x = param.game.play_area.rect.x - clip;
|
const float min_x = play_area_.x - clip;
|
||||||
const float max_x = param.game.play_area.rect.w - w_ + clip;
|
const float max_x = play_area_.w - w_ + clip;
|
||||||
if (x_ < min_x || x_ > max_x)
|
if (x_ < min_x || x_ > max_x)
|
||||||
{
|
{
|
||||||
x_ = std::clamp(x_, min_x, max_x);
|
x_ = std::clamp(x_, min_x, max_x);
|
||||||
@@ -170,9 +171,21 @@ void Balloon::move()
|
|||||||
y_ += vy_ * speed_;
|
y_ += vy_ * speed_;
|
||||||
|
|
||||||
// Colisión en la parte superior de la zona de juego excepto para la PowerBall
|
// Colisión en la parte superior de la zona de juego excepto para la PowerBall
|
||||||
if (type_ != BalloonType::POWERBALL)
|
/*if (type_ != BalloonType::POWERBALL)
|
||||||
{
|
{
|
||||||
const int min_y = param.game.play_area.rect.y;
|
const int min_y = play_area_.y;
|
||||||
|
if (y_ < min_y)
|
||||||
|
{
|
||||||
|
y_ = min_y;
|
||||||
|
vy_ = -vy_;
|
||||||
|
enableBounce();
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
// Colisión en la parte superior solo si el globo va de subida
|
||||||
|
if (vy_ < 0)
|
||||||
|
{
|
||||||
|
const int min_y = play_area_.y;
|
||||||
if (y_ < min_y)
|
if (y_ < min_y)
|
||||||
{
|
{
|
||||||
y_ = min_y;
|
y_ = min_y;
|
||||||
@@ -182,7 +195,7 @@ void Balloon::move()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Colisión en la parte inferior de la zona de juego
|
// Colisión en la parte inferior de la zona de juego
|
||||||
const int max_y = param.game.play_area.rect.h - h_;
|
const int max_y = play_area_.h - h_;
|
||||||
if (y_ > max_y)
|
if (y_ > max_y)
|
||||||
{
|
{
|
||||||
y_ = max_y;
|
y_ = max_y;
|
||||||
@@ -254,8 +267,8 @@ void Balloon::updateState()
|
|||||||
x_ += vx_;
|
x_ += vx_;
|
||||||
|
|
||||||
// Comprueba no se salga por los laterales
|
// Comprueba no se salga por los laterales
|
||||||
const int min_x = param.game.play_area.rect.x;
|
const int min_x = play_area_.x;
|
||||||
const int max_x = param.game.play_area.rect.w - w_;
|
const int max_x = play_area_.w - w_;
|
||||||
|
|
||||||
if (x_ < min_x || x_ > max_x)
|
if (x_ < min_x || x_ > max_x)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <SDL2/SDL_rect.h> // Para SDL_Rect
|
||||||
#include <SDL2/SDL_stdinc.h> // Para Uint8, Uint16, Uint32
|
#include <SDL2/SDL_stdinc.h> // Para Uint8, Uint16, Uint32
|
||||||
#include <memory> // Para shared_ptr, unique_ptr
|
#include <memory> // Para shared_ptr, unique_ptr
|
||||||
#include <string> // Para string
|
#include <string> // Para string
|
||||||
#include <vector> // Para vector
|
#include <vector> // Para vector
|
||||||
#include "animated_sprite.h" // Para AnimatedSprite
|
#include "animated_sprite.h" // Para AnimatedSprite
|
||||||
#include "utils.h" // Para Circle
|
#include "utils.h" // Para Circle
|
||||||
class Texture; // lines 10-10
|
class Texture; // lines 9-9
|
||||||
|
|
||||||
// Cantidad de elementos del vector con los valores de la deformación del globo al rebotar
|
// Cantidad de elementos del vector con los valores de la deformación del globo al rebotar
|
||||||
constexpr int MAX_BOUNCE = 10;
|
constexpr int MAX_BOUNCE = 10;
|
||||||
@@ -111,6 +112,7 @@ private:
|
|||||||
float travel_y_ = 1.0f; // Distancia que ha de recorrer el globo en el eje Y antes de que se le aplique la gravedad
|
float travel_y_ = 1.0f; // Distancia que ha de recorrer el globo en el eje Y antes de que se le aplique la gravedad
|
||||||
float speed_; // Velocidad a la que se mueven los globos
|
float speed_; // Velocidad a la que se mueven los globos
|
||||||
Uint8 power_; // Cantidad de poder que alberga el globo
|
Uint8 power_; // Cantidad de poder que alberga el globo
|
||||||
|
SDL_Rect play_area_; // Zona por donde se puede mover el globo
|
||||||
|
|
||||||
// Alinea el circulo de colisión con la posición del objeto globo
|
// Alinea el circulo de colisión con la posición del objeto globo
|
||||||
void shiftColliders();
|
void shiftColliders();
|
||||||
@@ -138,7 +140,17 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Constructor
|
// Constructor
|
||||||
Balloon(float x, float y, BalloonType type, BalloonSize size, float vel_x, float speed, Uint16 creation_timer, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation);
|
Balloon(
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
BalloonType type,
|
||||||
|
BalloonSize size,
|
||||||
|
float vel_x,
|
||||||
|
float speed,
|
||||||
|
Uint16 creation_timer,
|
||||||
|
SDL_Rect play_area,
|
||||||
|
std::shared_ptr<Texture> texture,
|
||||||
|
const std::vector<std::string> &animation);
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~Balloon() = default;
|
~Balloon() = default;
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ struct BalloonFormationUnit
|
|||||||
BalloonFormationUnit() : number_of_balloons(0), init() {}
|
BalloonFormationUnit() : number_of_balloons(0), init() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
using BalloonFormationPool = std::vector<const BalloonFormationUnit *>;
|
using BalloonFormationPool = std::vector<const BalloonFormationUnit *>;
|
||||||
|
|
||||||
class BalloonFormations
|
class BalloonFormations
|
||||||
@@ -67,4 +66,5 @@ public:
|
|||||||
// Getters
|
// Getters
|
||||||
const BalloonFormationPool &getPool(int pool) { return balloon_formation_pool_.at(pool); }
|
const BalloonFormationPool &getPool(int pool) { return balloon_formation_pool_.at(pool); }
|
||||||
const BalloonFormationUnit &getSet(int pool, int set) { return *balloon_formation_pool_.at(pool).at(set); }
|
const BalloonFormationUnit &getSet(int pool, int set) { return *balloon_formation_pool_.at(pool).at(set); }
|
||||||
|
const BalloonFormationUnit &getSet(int set) const { return balloon_formation_.at(set); }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -119,6 +119,30 @@ void BalloonManager::deployBalloonFormation(int stage)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Crea una formación de enemigos específica
|
||||||
|
void BalloonManager::deploySet(int set_number)
|
||||||
|
{
|
||||||
|
const auto set = balloon_formations_->getSet(set_number);
|
||||||
|
const auto numEnemies = set.number_of_balloons;
|
||||||
|
for (int i = 0; i < numEnemies; ++i)
|
||||||
|
{
|
||||||
|
auto p = set.init[i];
|
||||||
|
createBalloon(p.x, p.y, p.type, p.size, p.vel_x, balloon_speed_, p.creation_counter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crea una formación de enemigos específica
|
||||||
|
void BalloonManager::deploySet(int set_number, int y)
|
||||||
|
{
|
||||||
|
const auto set = balloon_formations_->getSet(set_number);
|
||||||
|
const auto numEnemies = set.number_of_balloons;
|
||||||
|
for (int i = 0; i < numEnemies; ++i)
|
||||||
|
{
|
||||||
|
auto p = set.init[i];
|
||||||
|
createBalloon(p.x, y, p.type, p.size, p.vel_x, balloon_speed_, p.creation_counter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Vacia del vector de globos los globos que ya no sirven
|
// Vacia del vector de globos los globos que ya no sirven
|
||||||
void BalloonManager::freeBalloons()
|
void BalloonManager::freeBalloons()
|
||||||
{
|
{
|
||||||
@@ -150,7 +174,7 @@ int BalloonManager::calculateScreenPower()
|
|||||||
std::shared_ptr<Balloon> BalloonManager::createBalloon(float x, int y, BalloonType type, BalloonSize size, float velx, float speed, int creation_timer)
|
std::shared_ptr<Balloon> BalloonManager::createBalloon(float x, int y, BalloonType type, BalloonSize size, float velx, float speed, int creation_timer)
|
||||||
{
|
{
|
||||||
const int index = static_cast<int>(size);
|
const int index = static_cast<int>(size);
|
||||||
balloons_.emplace_back(std::make_shared<Balloon>(x, y, type, size, velx, speed, creation_timer, balloon_textures_.at(index), balloon_animations_.at(index)));
|
balloons_.emplace_back(std::make_shared<Balloon>(x, y, type, size, velx, speed, creation_timer, play_area_, balloon_textures_.at(index), balloon_animations_.at(index)));
|
||||||
return balloons_.back();
|
return balloons_.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,7 +212,7 @@ void BalloonManager::createPowerBall()
|
|||||||
const int x[values] = {left, left, center, center, right, right};
|
const int x[values] = {left, left, center, center, right, right};
|
||||||
const float vx[values] = {BALLOON_VELX_POSITIVE, BALLOON_VELX_POSITIVE, BALLOON_VELX_POSITIVE, BALLOON_VELX_NEGATIVE, BALLOON_VELX_NEGATIVE, BALLOON_VELX_NEGATIVE};
|
const float vx[values] = {BALLOON_VELX_POSITIVE, BALLOON_VELX_POSITIVE, BALLOON_VELX_POSITIVE, BALLOON_VELX_NEGATIVE, BALLOON_VELX_NEGATIVE, BALLOON_VELX_NEGATIVE};
|
||||||
|
|
||||||
balloons_.emplace_back(std::make_unique<Balloon>(x[luck], pos_y, BalloonType::POWERBALL, BalloonSize::SIZE4, vx[luck], balloon_speed_, creation_time, balloon_textures_[4], balloon_animations_[4]));
|
balloons_.emplace_back(std::make_unique<Balloon>(x[luck], pos_y, BalloonType::POWERBALL, BalloonSize::SIZE4, vx[luck], balloon_speed_, creation_time, play_area_, balloon_textures_[4], balloon_animations_[4]));
|
||||||
|
|
||||||
power_ball_enabled_ = true;
|
power_ball_enabled_ = true;
|
||||||
power_ball_counter_ = POWERBALL_COUNTER;
|
power_ball_counter_ = POWERBALL_COUNTER;
|
||||||
@@ -339,13 +363,7 @@ void BalloonManager::reLoad()
|
|||||||
// Crea dos globos gordos
|
// Crea dos globos gordos
|
||||||
void BalloonManager::createTwoBigBalloons()
|
void BalloonManager::createTwoBigBalloons()
|
||||||
{
|
{
|
||||||
const auto set = balloon_formations_->getSet(0, 1);
|
deploySet(1);
|
||||||
const auto numEnemies = set.number_of_balloons;
|
|
||||||
for (int i = 0; i < numEnemies; ++i)
|
|
||||||
{
|
|
||||||
auto p = set.init[i];
|
|
||||||
createBalloon(p.x, p.y, p.type, p.size, p.vel_x, balloon_speed_, p.creation_counter);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Obtiene el nivel de ameza actual generado por los globos
|
// Obtiene el nivel de ameza actual generado por los globos
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <SDL2/SDL_rect.h> // Para SDL_Rect
|
||||||
#include <memory> // Para shared_ptr, unique_ptr
|
#include <memory> // Para shared_ptr, unique_ptr
|
||||||
#include <string> // Para string
|
#include <string> // Para string
|
||||||
#include <vector> // Para vector
|
#include <vector> // Para vector
|
||||||
#include "balloon.h" // Para BALLOON_SPEED, Balloon
|
#include "balloon.h" // Para BALLOON_SPEED, Balloon
|
||||||
#include "balloon_formations.h" // Para BalloonFormations
|
#include "balloon_formations.h" // Para BalloonFormations
|
||||||
#include "explosions.h" // Para Explosions
|
#include "explosions.h" // Para Explosions
|
||||||
class Texture;
|
#include "param.h" // Para Param, ParamGame, param
|
||||||
|
#include "utils.h" // Para Zone
|
||||||
|
class Texture; // lines 10-10
|
||||||
|
|
||||||
using Balloons = std::vector<std::shared_ptr<Balloon>>;
|
using Balloons = std::vector<std::shared_ptr<Balloon>>;
|
||||||
|
|
||||||
@@ -29,6 +32,7 @@ private:
|
|||||||
bool power_ball_enabled_ = false; // Indica si hay una powerball ya activa
|
bool power_ball_enabled_ = false; // Indica si hay una powerball ya activa
|
||||||
int power_ball_counter_ = 0; // Contador de formaciones enemigas entre la aparicion de una PowerBall y otra
|
int power_ball_counter_ = 0; // Contador de formaciones enemigas entre la aparicion de una PowerBall y otra
|
||||||
int last_balloon_deploy_ = 0; // Guarda cual ha sido la última formación desplegada para no repetir;
|
int last_balloon_deploy_ = 0; // Guarda cual ha sido la última formación desplegada para no repetir;
|
||||||
|
SDL_Rect play_area_ = param.game.play_area.rect; // Zona por donde se moveran los globos
|
||||||
|
|
||||||
// Inicializa
|
// Inicializa
|
||||||
void init();
|
void init();
|
||||||
@@ -49,9 +53,13 @@ public:
|
|||||||
// Vacia del vector de globos los globos que ya no sirven
|
// Vacia del vector de globos los globos que ya no sirven
|
||||||
void freeBalloons();
|
void freeBalloons();
|
||||||
|
|
||||||
// Crea una formación de enemigos
|
// Crea una formación de enemigos al azar
|
||||||
void deployBalloonFormation(int stage);
|
void deployBalloonFormation(int stage);
|
||||||
|
|
||||||
|
// Crea una formación de enemigos específica
|
||||||
|
void deploySet(int set);
|
||||||
|
void deploySet(int set, int y);
|
||||||
|
|
||||||
// Actualiza la variable enemyDeployCounter
|
// Actualiza la variable enemyDeployCounter
|
||||||
void updateBalloonDeployCounter();
|
void updateBalloonDeployCounter();
|
||||||
|
|
||||||
@@ -110,4 +118,5 @@ public:
|
|||||||
// Setters
|
// Setters
|
||||||
void setDefaultBalloonSpeed(float speed) { default_balloon_speed_ = speed; }
|
void setDefaultBalloonSpeed(float speed) { default_balloon_speed_ = speed; }
|
||||||
void resetBalloonSpeed() { setBalloonSpeed(default_balloon_speed_); }
|
void resetBalloonSpeed() { setBalloonSpeed(default_balloon_speed_); }
|
||||||
|
void setPlayArea(SDL_Rect play_area) { play_area_ = play_area; }
|
||||||
};
|
};
|
||||||
462
source/credits.cpp
Normal file
462
source/credits.cpp
Normal file
@@ -0,0 +1,462 @@
|
|||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include "credits.h"
|
||||||
|
#include <SDL2/SDL_blendmode.h> // Para SDL_BLENDMODE_BLEND
|
||||||
|
#include <SDL2/SDL_events.h> // Para SDL_PollEvent, SDL_Event, SDL_QUIT
|
||||||
|
#include <SDL2/SDL_pixels.h> // Para SDL_PIXELFORMAT_RGBA8888
|
||||||
|
#include <SDL2/SDL_rect.h> // Para SDL_Rect
|
||||||
|
#include <SDL2/SDL_timer.h> // Para SDL_GetTicks
|
||||||
|
#include <string> // Para basic_string, string
|
||||||
|
#include <vector> // Para vector
|
||||||
|
#include "balloon_manager.h" // Para BalloonManager
|
||||||
|
#include "global_inputs.h" // Para check
|
||||||
|
#include "input.h" // Para Input
|
||||||
|
#include "jail_audio.h" // Para JA_PlayMusic, JA_StopMusic
|
||||||
|
#include "param.h" // Para Param, ParamGame, param
|
||||||
|
#include "resource.h" // Para Resource
|
||||||
|
#include "screen.h" // Para Screen
|
||||||
|
#include "section.h" // Para Name, name, Options, options
|
||||||
|
#include "text.h" // Para Text, TEXT_CENTER, TEXT_SHADOW
|
||||||
|
#include "tiled_bg.h" // Para TiledBG, TiledBGMode
|
||||||
|
#include "utils.h" // Para Color, no_color, shdw_txt_color, Zone
|
||||||
|
#include "player.h"
|
||||||
|
#include "fade.h"
|
||||||
|
|
||||||
|
// Textos
|
||||||
|
constexpr const char TEXT_COPYRIGHT[] = "@2020,2024 JailDesigner";
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
Credits::Credits()
|
||||||
|
: balloon_manager_(std::make_unique<BalloonManager>()),
|
||||||
|
text_texture_(SDL_CreateTexture(Screen::get()->getRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)),
|
||||||
|
tiled_bg_(std::make_unique<TiledBG>(param.game.game_area.rect, TiledBGMode::DIAGONAL)),
|
||||||
|
fade_in_(std::make_unique<Fade>()),
|
||||||
|
fade_out_(std::make_unique<Fade>())
|
||||||
|
{
|
||||||
|
section::name = section::Name::CREDITS;
|
||||||
|
top_black_rect_ = {play_area_.x, 0, play_area_.w, black_bars_size_};
|
||||||
|
bottom_black_rect_ = {play_area_.x, param.game.game_area.rect.h - black_bars_size_, play_area_.w, black_bars_size_};
|
||||||
|
balloon_manager_->setPlayArea(play_area_);
|
||||||
|
fade_in_->setColor(fade_color.r, fade_color.g, fade_color.b);
|
||||||
|
fade_in_->setType(FadeType::FULLSCREEN);
|
||||||
|
fade_in_->setPost(50);
|
||||||
|
fade_in_->setMode(FadeMode::IN);
|
||||||
|
fade_in_->activate();
|
||||||
|
fade_out_->setColor(0, 0, 0);
|
||||||
|
fade_out_->setType(FadeType::FULLSCREEN);
|
||||||
|
fade_out_->setPost(400);
|
||||||
|
initPlayers();
|
||||||
|
SDL_SetTextureBlendMode(text_texture_, SDL_BLENDMODE_BLEND);
|
||||||
|
fillTextTexture();
|
||||||
|
// JA_PlayMusic(Resource::get()->getMusic("credits.ogg"));
|
||||||
|
steps_ = std::abs((top_black_rect_.h - param.game.game_area.center_y - 1) + ((left_black_rect_.w - param.game.game_area.center_x) / 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
Credits::~Credits()
|
||||||
|
{
|
||||||
|
SDL_DestroyTexture(text_texture_);
|
||||||
|
resetVolume();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bucle principal
|
||||||
|
void Credits::run()
|
||||||
|
{
|
||||||
|
while (section::name == section::Name::CREDITS)
|
||||||
|
{
|
||||||
|
checkInput();
|
||||||
|
update();
|
||||||
|
checkEvents(); // Tiene que ir antes del render
|
||||||
|
render();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actualiza las variables
|
||||||
|
void Credits::update()
|
||||||
|
{
|
||||||
|
if (SDL_GetTicks() - ticks_ > ticks_speed_)
|
||||||
|
{
|
||||||
|
ticks_ = SDL_GetTicks();
|
||||||
|
tiled_bg_->update();
|
||||||
|
balloon_manager_->update();
|
||||||
|
updateTextureDstRects();
|
||||||
|
throwBalloons();
|
||||||
|
for (auto &player : players_)
|
||||||
|
{
|
||||||
|
player->update();
|
||||||
|
}
|
||||||
|
updateAllFades();
|
||||||
|
Screen::get()->update();
|
||||||
|
++counter_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dibuja Credits::en patalla
|
||||||
|
void Credits::render()
|
||||||
|
{
|
||||||
|
// Prepara para empezar a dibujar en la textura de juego
|
||||||
|
Screen::get()->start();
|
||||||
|
|
||||||
|
// Limpia la pantalla
|
||||||
|
Screen::get()->clean();
|
||||||
|
|
||||||
|
// Dibuja el fondo, los globos y los jugadores
|
||||||
|
tiled_bg_->render();
|
||||||
|
balloon_manager_->render();
|
||||||
|
for (auto const &player : players_)
|
||||||
|
{
|
||||||
|
player->render();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dibuja los titulos de credito
|
||||||
|
SDL_RenderCopy(Screen::get()->getRenderer(), text_texture_, &credits_rect_src_, &credits_rect_dst_);
|
||||||
|
|
||||||
|
// Dibuja el mini_logo
|
||||||
|
SDL_RenderCopy(Screen::get()->getRenderer(), text_texture_, &mini_logo_rect_src_, &mini_logo_rect_dst_);
|
||||||
|
|
||||||
|
// Dibuja los rectangulos negros
|
||||||
|
// SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0x27, 0x27, 0x36, 255);
|
||||||
|
SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0, 0, 0, 255);
|
||||||
|
SDL_RenderFillRect(Screen::get()->getRenderer(), &top_black_rect_);
|
||||||
|
SDL_RenderFillRect(Screen::get()->getRenderer(), &bottom_black_rect_);
|
||||||
|
SDL_RenderFillRect(Screen::get()->getRenderer(), &left_black_rect_);
|
||||||
|
SDL_RenderFillRect(Screen::get()->getRenderer(), &right_black_rect_);
|
||||||
|
|
||||||
|
// Si el mini_logo está en su destino, lo dibuja encima del resto
|
||||||
|
if (mini_logo_on_position_)
|
||||||
|
{
|
||||||
|
SDL_RenderCopy(Screen::get()->getRenderer(), text_texture_, &mini_logo_rect_src_, &mini_logo_rect_dst_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dibuja el fade sobre el resto
|
||||||
|
fade_in_->render();
|
||||||
|
fade_out_->render();
|
||||||
|
|
||||||
|
// Vuelca el contenido del renderizador en pantalla
|
||||||
|
Screen::get()->blit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comprueba el manejador de eventos
|
||||||
|
void Credits::checkEvents()
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
// Comprueba los eventos que hay en la cola
|
||||||
|
while (SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
// Evento de salida de la aplicación
|
||||||
|
if (event.type == SDL_QUIT)
|
||||||
|
{
|
||||||
|
section::name = section::Name::QUIT;
|
||||||
|
section::options = section::Options::QUIT_FROM_EVENT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comprueba las entradas
|
||||||
|
void Credits::checkInput()
|
||||||
|
{
|
||||||
|
// Comprueba si se ha pulsado cualquier botón (de los usados para jugar)
|
||||||
|
if (Input::get()->checkAnyButtonPressed())
|
||||||
|
{
|
||||||
|
if (mini_logo_on_position_)
|
||||||
|
{
|
||||||
|
// Si el mini_logo ha llegado a su posición final, al pulsar cualquier tecla se activa el fundido
|
||||||
|
fading_ = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Si todavía estan los creditos en marcha, se pasan solos a toda pastilla
|
||||||
|
want_to_pass_ = true;
|
||||||
|
ticks_speed_ = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comprueba los inputs que se pueden introducir en cualquier sección del juego
|
||||||
|
globalInputs::check();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crea la textura con el texto
|
||||||
|
void Credits::fillTextTexture()
|
||||||
|
{
|
||||||
|
auto text = Resource::get()->getText("smb2");
|
||||||
|
SDL_SetRenderTarget(Screen::get()->getRenderer(), text_texture_);
|
||||||
|
|
||||||
|
SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0, 0, 0, 0);
|
||||||
|
SDL_RenderClear(Screen::get()->getRenderer());
|
||||||
|
|
||||||
|
std::vector<std::string> texts = {
|
||||||
|
"PROGRAMACIO I DISSENY",
|
||||||
|
"GRAFICS",
|
||||||
|
"MUSICA",
|
||||||
|
"SONS",
|
||||||
|
"JAILDESIGNER",
|
||||||
|
"JAILDOCTOR (INTRO)",
|
||||||
|
"ERIC MATYAS (SOUNDIMAGE.ORG)",
|
||||||
|
"WWW.THEMOTIONMONKEY.CO.UK",
|
||||||
|
"WWW.KENNEY.NL",
|
||||||
|
"JAILDOCTOR"};
|
||||||
|
|
||||||
|
const int space_post_title = 3 + text->getCharacterSize();
|
||||||
|
const int space_pre_title = text->getCharacterSize() * 4;
|
||||||
|
const int texts_height = 1 * text->getCharacterSize() + 7 * space_post_title + 3 * space_pre_title;
|
||||||
|
credits_rect_dst_.h = credits_rect_src_.h = texts_height;
|
||||||
|
|
||||||
|
int y = (param.game.height - texts_height) / 2;
|
||||||
|
y = 0;
|
||||||
|
text->setPalette(1);
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(0), 1, no_color, 1, shdw_txt_color);
|
||||||
|
|
||||||
|
text->setPalette(0);
|
||||||
|
y += space_post_title;
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(4), 1, no_color, 1, shdw_txt_color);
|
||||||
|
|
||||||
|
y += space_pre_title;
|
||||||
|
text->setPalette(1);
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(1), 1, no_color, 1, shdw_txt_color);
|
||||||
|
text->setPalette(0);
|
||||||
|
y += space_post_title;
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(4), 1, no_color, 1, shdw_txt_color);
|
||||||
|
|
||||||
|
y += space_pre_title;
|
||||||
|
text->setPalette(1);
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(2), 1, no_color, 1, shdw_txt_color);
|
||||||
|
text->setPalette(0);
|
||||||
|
|
||||||
|
y += space_post_title;
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(5), 1, no_color, 1, shdw_txt_color);
|
||||||
|
y += space_post_title;
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(6), 1, no_color, 1, shdw_txt_color);
|
||||||
|
|
||||||
|
y += space_pre_title;
|
||||||
|
text->setPalette(1);
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(3), 1, no_color, 1, shdw_txt_color);
|
||||||
|
text->setPalette(0);
|
||||||
|
y += space_post_title;
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(7), 1, no_color, 1, shdw_txt_color);
|
||||||
|
y += space_post_title;
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(8), 1, no_color, 1, shdw_txt_color);
|
||||||
|
y += space_post_title;
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, texts.at(9), 1, no_color, 1, shdw_txt_color);
|
||||||
|
|
||||||
|
// Mini logo
|
||||||
|
y += space_pre_title;
|
||||||
|
mini_logo_rect_src_.y = y;
|
||||||
|
auto mini_logo_sprite = std::make_unique<Sprite>(Resource::get()->getTexture("logo_jailgames_mini.png"));
|
||||||
|
mini_logo_sprite->setPosition(1 + param.game.game_area.center_x - mini_logo_sprite->getWidth() / 2, 1 + y);
|
||||||
|
Resource::get()->getTexture("logo_jailgames_mini.png")->setColor(shdw_txt_color.r, shdw_txt_color.g, shdw_txt_color.b);
|
||||||
|
mini_logo_sprite->render();
|
||||||
|
|
||||||
|
mini_logo_sprite->setPosition(param.game.game_area.center_x - mini_logo_sprite->getWidth() / 2, y);
|
||||||
|
Resource::get()->getTexture("logo_jailgames_mini.png")->setColor(255, 255, 255);
|
||||||
|
mini_logo_sprite->render();
|
||||||
|
|
||||||
|
// Texto con el copyright
|
||||||
|
y += mini_logo_sprite->getHeight() + 3;
|
||||||
|
text->writeDX(TEXT_CENTER | TEXT_SHADOW, param.game.game_area.center_x, y, TEXT_COPYRIGHT, 1, no_color, 1, shdw_txt_color);
|
||||||
|
|
||||||
|
mini_logo_rect_dst_.h = mini_logo_rect_src_.h = mini_logo_sprite->getHeight() + 3 + text->getCharacterSize();
|
||||||
|
|
||||||
|
SDL_SetRenderTarget(Screen::get()->getRenderer(), nullptr);
|
||||||
|
|
||||||
|
credits_rect_dst_.y = param.game.game_area.rect.h;
|
||||||
|
mini_logo_rect_dst_.y = credits_rect_dst_.y + credits_rect_dst_.h + 30;
|
||||||
|
mini_logo_final_pos_ = param.game.game_area.center_y - mini_logo_rect_src_.h / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actualiza el destino de los rectangulos de las texturas
|
||||||
|
void Credits::updateTextureDstRects()
|
||||||
|
{
|
||||||
|
if (counter_ % 10 == 0)
|
||||||
|
{
|
||||||
|
// Comprueba la posición de la textura con los titulos de credito
|
||||||
|
if (credits_rect_dst_.y + credits_rect_dst_.h > play_area_.y)
|
||||||
|
{
|
||||||
|
--credits_rect_dst_.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comprueba la posición de la textura con el mini_logo
|
||||||
|
if (mini_logo_rect_dst_.y == mini_logo_final_pos_)
|
||||||
|
{
|
||||||
|
mini_logo_on_position_ = true;
|
||||||
|
|
||||||
|
// Si el jugador quiere pasar los titulos de credito, el fade se inicia solo
|
||||||
|
if (want_to_pass_)
|
||||||
|
{
|
||||||
|
fading_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Se activa el contador para evitar que la sección sea infinita
|
||||||
|
if (counter_prevent_endless_ == 1000)
|
||||||
|
{
|
||||||
|
fading_ = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++counter_prevent_endless_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
--mini_logo_rect_dst_.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tira globos al escenario
|
||||||
|
void Credits::throwBalloons()
|
||||||
|
{
|
||||||
|
constexpr int speed = 200;
|
||||||
|
const std::vector<int> sets = {0, 63, 25, 67, 17, 75, 13, 50};
|
||||||
|
|
||||||
|
if (counter_ > ((sets.size() - 1) * speed) * 3)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (counter_ % speed == 0)
|
||||||
|
{
|
||||||
|
const int index = (counter_ / speed) % sets.size();
|
||||||
|
balloon_manager_->deploySet(sets.at(index), -50);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (counter_ % (speed * 4) == 0 && counter_ > 0)
|
||||||
|
{
|
||||||
|
balloon_manager_->createPowerBall();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inicializa los jugadores
|
||||||
|
void Credits::initPlayers()
|
||||||
|
{
|
||||||
|
std::vector<std::vector<std::shared_ptr<Texture>>> player_textures; // Vector con todas las texturas de los jugadores;
|
||||||
|
std::vector<std::vector<std::string>> player_animations; // Vector con las animaciones del jugador
|
||||||
|
|
||||||
|
// Texturas - Player1
|
||||||
|
{
|
||||||
|
std::vector<std::shared_ptr<Texture>> player_texture;
|
||||||
|
player_texture.emplace_back(Resource::get()->getTexture("player1.gif"));
|
||||||
|
player_texture.emplace_back(Resource::get()->getTexture("player1_power.png"));
|
||||||
|
player_textures.push_back(player_texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Texturas - Player2
|
||||||
|
{
|
||||||
|
std::vector<std::shared_ptr<Texture>> player_texture;
|
||||||
|
player_texture.emplace_back(Resource::get()->getTexture("player2.gif"));
|
||||||
|
player_texture.emplace_back(Resource::get()->getTexture("player2_power.png"));
|
||||||
|
player_textures.push_back(player_texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Animaciones -- Jugador
|
||||||
|
{
|
||||||
|
player_animations.emplace_back(Resource::get()->getAnimation("player.ani"));
|
||||||
|
player_animations.emplace_back(Resource::get()->getAnimation("player_power.ani"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crea los dos jugadores
|
||||||
|
constexpr int player_width = 30;
|
||||||
|
const int y = play_area_.h - player_width;
|
||||||
|
constexpr bool demo = false;
|
||||||
|
constexpr int away_distance = 700;
|
||||||
|
players_.emplace_back(std::make_unique<Player>(1, play_area_.x - away_distance - player_width, y, demo, play_area_, player_textures.at(0), player_animations));
|
||||||
|
players_.back()->setWalkingState(PlayerState::WALKING_RIGHT);
|
||||||
|
players_.back()->setPlayingState(PlayerState::CREDITS);
|
||||||
|
players_.back()->setInvulnerable(false);
|
||||||
|
|
||||||
|
players_.emplace_back(std::make_unique<Player>(2, play_area_.x + play_area_.w + away_distance, y, demo, play_area_, player_textures.at(1), player_animations));
|
||||||
|
players_.back()->setWalkingState(PlayerState::WALKING_LEFT);
|
||||||
|
players_.back()->setPlayingState(PlayerState::CREDITS);
|
||||||
|
players_.back()->setInvulnerable(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actualiza los rectangulos negros
|
||||||
|
void Credits::updateBlackRects()
|
||||||
|
{
|
||||||
|
static int current_step = steps_;
|
||||||
|
if (top_black_rect_.h != param.game.game_area.center_y - 1 && bottom_black_rect_.y != param.game.game_area.center_y + 1)
|
||||||
|
{
|
||||||
|
// Si los rectangulos superior e inferior no han llegado al centro
|
||||||
|
if (counter_ % 4 == 0)
|
||||||
|
{
|
||||||
|
// Incrementa la altura del rectangulo superior
|
||||||
|
top_black_rect_.h = std::min(top_black_rect_.h + 1, param.game.game_area.center_y - 1);
|
||||||
|
|
||||||
|
// Incrementa la altura y modifica la posición del rectangulo inferior
|
||||||
|
++bottom_black_rect_.h;
|
||||||
|
bottom_black_rect_.y = std::max(bottom_black_rect_.y - 1, param.game.game_area.center_y + 1);
|
||||||
|
|
||||||
|
--current_step;
|
||||||
|
setVolume(static_cast<int>(initial_volume_ * current_step / steps_));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Si los rectangulos superior e inferior han llegado al centro
|
||||||
|
if (left_black_rect_.w != param.game.game_area.center_x && right_black_rect_.x != param.game.game_area.center_x)
|
||||||
|
{
|
||||||
|
// Si los rectangulos izquierdo y derecho no han llegado al centro
|
||||||
|
// Incrementa la anchura del rectangulo situado a la izquierda
|
||||||
|
left_black_rect_.w = std::min(left_black_rect_.w + 4, param.game.game_area.center_x);
|
||||||
|
|
||||||
|
// Incrementa la anchura y modifica la posición del rectangulo situado a la derecha
|
||||||
|
right_black_rect_.w += 4;
|
||||||
|
right_black_rect_.x = std::max(right_black_rect_.x - 4, param.game.game_area.center_x);
|
||||||
|
|
||||||
|
--current_step;
|
||||||
|
setVolume(static_cast<int>(initial_volume_ * current_step / steps_));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Si los rectangulos izquierdo y derecho han llegado al centro
|
||||||
|
setVolume(0);
|
||||||
|
JA_StopMusic();
|
||||||
|
if (counter_pre_fade_ == 400)
|
||||||
|
{
|
||||||
|
fade_out_->activate();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++counter_pre_fade_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actualiza el estado de fade
|
||||||
|
void Credits::updateAllFades()
|
||||||
|
{
|
||||||
|
if (fading_)
|
||||||
|
{
|
||||||
|
updateBlackRects();
|
||||||
|
}
|
||||||
|
|
||||||
|
fade_in_->update();
|
||||||
|
if (fade_in_->hasEnded())
|
||||||
|
{
|
||||||
|
if (JA_GetMusicState() == JA_MUSIC_INVALID || JA_GetMusicState() == JA_MUSIC_STOPPED)
|
||||||
|
{
|
||||||
|
JA_PlayMusic(Resource::get()->getMusic("credits.ogg"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fade_out_->update();
|
||||||
|
if (fade_out_->hasEnded())
|
||||||
|
{
|
||||||
|
section::name = section::Name::LOGO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Establece el nivel de volumen
|
||||||
|
void Credits::setVolume(int amount)
|
||||||
|
{
|
||||||
|
options.audio.music.volume = std::clamp(amount, 0, 100);
|
||||||
|
JA_SetMusicVolume(to_JA_volume(options.audio.music.volume));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reestablece el nivel de volumen
|
||||||
|
void Credits::resetVolume()
|
||||||
|
{
|
||||||
|
options.audio.music.volume = initial_volume_;
|
||||||
|
JA_SetMusicVolume(to_JA_volume(options.audio.music.volume));
|
||||||
|
}
|
||||||
98
source/credits.h
Normal file
98
source/credits.h
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SDL2/SDL_render.h> // Para SDL_Texture
|
||||||
|
#include <SDL2/SDL_stdinc.h> // Para Uint32
|
||||||
|
#include <memory> // Para unique_ptr
|
||||||
|
#include "param.h"
|
||||||
|
#include "options.h"
|
||||||
|
class BalloonManager;
|
||||||
|
class TiledBG;
|
||||||
|
class Player;
|
||||||
|
class Fade;
|
||||||
|
|
||||||
|
class Credits
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
// Objetos
|
||||||
|
std::unique_ptr<BalloonManager> balloon_manager_; // Objeto para gestionar los globos
|
||||||
|
SDL_Texture *text_texture_; // Textura con el texto
|
||||||
|
std::unique_ptr<TiledBG> tiled_bg_; // Objeto para dibujar el mosaico animado de fondo
|
||||||
|
std::unique_ptr<Fade> fade_in_; // Objeto para realizar el fundido de entrada
|
||||||
|
std::unique_ptr<Fade> fade_out_; // Objeto para realizar el fundido de salida
|
||||||
|
std::vector<std::shared_ptr<Player>> players_; // Vector con los jugadores
|
||||||
|
|
||||||
|
// Variables
|
||||||
|
Uint32 ticks_ = 0; // Contador de ticks para ajustar la velocidad del programa
|
||||||
|
Uint32 ticks_speed_ = 15; // Velocidad del bucle update
|
||||||
|
Uint32 counter_ = 0; // Contador para la lógica de la clase
|
||||||
|
Uint32 counter_pre_fade_ = 0; // Contador para activar el fundido final
|
||||||
|
Uint32 counter_prevent_endless_ = 0; // Contador para evitar que el juego se quede para siempre en los creditos
|
||||||
|
int black_bars_size_ = 28; // Tamaño de las barras negras
|
||||||
|
int mini_logo_final_pos_ = 0; // Ubicación donde se detiene el minilogo
|
||||||
|
bool fading_ = false; // Indica si se está realizando el fade final
|
||||||
|
bool want_to_pass_ = false; // Indica si el jugador quiere saltarse los titulos de crédito
|
||||||
|
bool mini_logo_on_position_ = false; // Indica si el minilogo ya se ha quedado en su posición
|
||||||
|
int initial_volume_ = options.audio.music.volume; // Volumen actual al crear el objeto
|
||||||
|
int steps_ = 0; // Cantidad de pasos a dar para ir reduciendo el audio
|
||||||
|
|
||||||
|
// Rectangulos
|
||||||
|
SDL_Rect credits_rect_src_ = param.game.game_area.rect; // Rectangulo con el texto de los créditos (origen)
|
||||||
|
SDL_Rect credits_rect_dst_ = param.game.game_area.rect; // Rectangulo con el texto de los créditos (destino)
|
||||||
|
SDL_Rect mini_logo_rect_src_ = param.game.game_area.rect; // Rectangulo con el mini logo de JailGames y el texto de copyright (origen)
|
||||||
|
SDL_Rect mini_logo_rect_dst_ = param.game.game_area.rect; // Rectangulo con el mini logo de JailGames y el texto de copyright (destino)
|
||||||
|
SDL_Rect play_area_ = {
|
||||||
|
param.game.game_area.rect.x,
|
||||||
|
param.game.game_area.rect.y + black_bars_size_,
|
||||||
|
param.game.game_area.rect.w,
|
||||||
|
param.game.game_area.rect.h - black_bars_size_}; // Area visible para los creditos
|
||||||
|
SDL_Rect top_black_rect_ = {play_area_.x, 0, play_area_.w, black_bars_size_}; // Rectangulo negro superior
|
||||||
|
SDL_Rect bottom_black_rect_ = {play_area_.x, param.game.game_area.rect.h - black_bars_size_, play_area_.w, black_bars_size_}; // Rectangulo negro inferior
|
||||||
|
SDL_Rect left_black_rect_ = {play_area_.x, param.game.game_area.center_y - 1, 0, 2}; // Rectangulo negro situado a la izquierda
|
||||||
|
SDL_Rect right_black_rect_ = {play_area_.x + play_area_.w, param.game.game_area.center_y - 1, 0, 2}; // Rectangulo negro situado a la derecha
|
||||||
|
|
||||||
|
// Actualiza las variables
|
||||||
|
void update();
|
||||||
|
|
||||||
|
// Dibuja en pantalla
|
||||||
|
void render();
|
||||||
|
|
||||||
|
// Comprueba el manejador de eventos
|
||||||
|
void checkEvents();
|
||||||
|
|
||||||
|
// Comprueba las entradas
|
||||||
|
void checkInput();
|
||||||
|
|
||||||
|
// Crea la textura con el texto
|
||||||
|
void fillTextTexture();
|
||||||
|
|
||||||
|
// Actualiza el destino de los rectangulos de las texturas
|
||||||
|
void updateTextureDstRects();
|
||||||
|
|
||||||
|
// Tira globos al escenario
|
||||||
|
void throwBalloons();
|
||||||
|
|
||||||
|
// Inicializa los jugadores
|
||||||
|
void initPlayers();
|
||||||
|
|
||||||
|
// Actualiza los rectangulos negros
|
||||||
|
void updateBlackRects();
|
||||||
|
|
||||||
|
// Actualiza el estado de fade
|
||||||
|
void updateAllFades();
|
||||||
|
|
||||||
|
// Establece el nivel de volumen
|
||||||
|
void setVolume(int amount);
|
||||||
|
|
||||||
|
// Reestablece el nivel de volumen
|
||||||
|
void resetVolume();
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Constructor
|
||||||
|
Credits();
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
~Credits();
|
||||||
|
|
||||||
|
// Bucle principal
|
||||||
|
void run();
|
||||||
|
};
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
#include <string> // Para operator+, char_traits, allocator
|
#include <string> // Para operator+, char_traits, allocator
|
||||||
#include <vector> // Para vector
|
#include <vector> // Para vector
|
||||||
#include "asset.h" // Para Asset, AssetType
|
#include "asset.h" // Para Asset, AssetType
|
||||||
|
#include "credits.h"
|
||||||
#include "dbgtxt.h" // Para dbg_init
|
#include "dbgtxt.h" // Para dbg_init
|
||||||
#include "game.h" // Para Game, GAME_MODE_DEMO_OFF, GAME_...
|
#include "game.h" // Para Game, GAME_MODE_DEMO_OFF, GAME_...
|
||||||
#include "global_inputs.h" // Para init
|
#include "global_inputs.h" // Para init
|
||||||
@@ -60,7 +61,7 @@ Director::Director(int argc, const char *argv[])
|
|||||||
section::options = section::Options::GAME_PLAY_1P;
|
section::options = section::Options::GAME_PLAY_1P;
|
||||||
#elif DEBUG
|
#elif DEBUG
|
||||||
section::name = section::Name::LOGO;
|
section::name = section::Name::LOGO;
|
||||||
#else
|
#else // NORMAL GAME
|
||||||
section::name = section::Name::LOGO;
|
section::name = section::Name::LOGO;
|
||||||
section::attract_mode = section::AttractMode::TITLE_TO_DEMO;
|
section::attract_mode = section::AttractMode::TITLE_TO_DEMO;
|
||||||
#endif
|
#endif
|
||||||
@@ -361,6 +362,7 @@ void Director::setFileList()
|
|||||||
Asset::get()->add(prefix + "/data/music/intro.ogg", AssetType::MUSIC);
|
Asset::get()->add(prefix + "/data/music/intro.ogg", AssetType::MUSIC);
|
||||||
Asset::get()->add(prefix + "/data/music/playing.ogg", AssetType::MUSIC);
|
Asset::get()->add(prefix + "/data/music/playing.ogg", AssetType::MUSIC);
|
||||||
Asset::get()->add(prefix + "/data/music/title.ogg", AssetType::MUSIC);
|
Asset::get()->add(prefix + "/data/music/title.ogg", AssetType::MUSIC);
|
||||||
|
Asset::get()->add(prefix + "/data/music/credits.ogg", AssetType::MUSIC);
|
||||||
|
|
||||||
// Sonidos
|
// Sonidos
|
||||||
Asset::get()->add(prefix + "/data/sound/balloon.wav", AssetType::SOUND);
|
Asset::get()->add(prefix + "/data/sound/balloon.wav", AssetType::SOUND);
|
||||||
@@ -630,6 +632,13 @@ void Director::runInstructions()
|
|||||||
instructions->run();
|
instructions->run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ejecuta la sección donde se muestran los creditos del programa
|
||||||
|
void Director::runCredits()
|
||||||
|
{
|
||||||
|
auto credits = std::make_unique<Credits>();
|
||||||
|
credits->run();
|
||||||
|
}
|
||||||
|
|
||||||
// Ejecuta la sección donde se muestra la tabla de puntuaciones
|
// Ejecuta la sección donde se muestra la tabla de puntuaciones
|
||||||
void Director::runHiScoreTable()
|
void Director::runHiScoreTable()
|
||||||
{
|
{
|
||||||
@@ -677,6 +686,9 @@ int Director::run()
|
|||||||
case section::Name::INSTRUCTIONS:
|
case section::Name::INSTRUCTIONS:
|
||||||
runInstructions();
|
runInstructions();
|
||||||
break;
|
break;
|
||||||
|
case section::Name::CREDITS:
|
||||||
|
runCredits();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ private:
|
|||||||
// Ejecuta la sección donde se muestran las instrucciones
|
// Ejecuta la sección donde se muestran las instrucciones
|
||||||
void runInstructions();
|
void runInstructions();
|
||||||
|
|
||||||
|
// Ejecuta la sección donde se muestran los creditos del programa
|
||||||
|
void runCredits();
|
||||||
|
|
||||||
// Ejecuta la sección donde se muestra la tabla de puntuaciones
|
// Ejecuta la sección donde se muestra la tabla de puntuaciones
|
||||||
void runHiScoreTable();
|
void runHiScoreTable();
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include "balloon.h" // Para Balloon, BALLOON_SPEED
|
#include "balloon.h" // Para Balloon, BALLOON_SPEED
|
||||||
#include "balloon_manager.h" // Para BalloonManager
|
#include "balloon_manager.h" // Para BalloonManager
|
||||||
#include "bullet.h" // Para Bullet, BulletType, BulletMoveStatus
|
#include "bullet.h" // Para Bullet, BulletType, BulletMoveStatus
|
||||||
|
#include "enter_name.h" // Para NAME_LENGHT
|
||||||
#include "fade.h" // Para Fade, FadeType
|
#include "fade.h" // Para Fade, FadeType
|
||||||
#include "global_inputs.h" // Para check
|
#include "global_inputs.h" // Para check
|
||||||
#include "input.h" // Para InputType, Input, INPUT_DO_NOT_ALL...
|
#include "input.h" // Para InputType, Input, INPUT_DO_NOT_ALL...
|
||||||
@@ -30,9 +31,8 @@
|
|||||||
#include "screen.h" // Para Screen
|
#include "screen.h" // Para Screen
|
||||||
#include "section.h" // Para Name, name, Options, options
|
#include "section.h" // Para Name, name, Options, options
|
||||||
#include "smart_sprite.h" // Para SmartSprite
|
#include "smart_sprite.h" // Para SmartSprite
|
||||||
#include "stage.h" // Para get, number, Stage, power
|
#include "stage.h" // Para number, get, Stage, power, total_p...
|
||||||
#include "text.h" // Para Text
|
#include "text.h" // Para Text
|
||||||
#include "dbgtxt.h" // Para dbg_print
|
|
||||||
#include "texture.h" // Para Texture
|
#include "texture.h" // Para Texture
|
||||||
struct JA_Sound_t; // lines 37-37
|
struct JA_Sound_t; // lines 37-37
|
||||||
|
|
||||||
@@ -303,7 +303,16 @@ void Game::updateGameOverState()
|
|||||||
|
|
||||||
if (fade_->hasEnded())
|
if (fade_->hasEnded())
|
||||||
{
|
{
|
||||||
section::name = section::Name::HI_SCORE_TABLE;
|
if (game_completed_counter_ > 0)
|
||||||
|
{
|
||||||
|
// Los jugadores han completado el juego
|
||||||
|
section::name = section::Name::CREDITS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// La partida ha terminado con la derrota de los jugadores
|
||||||
|
section::name = section::Name::HI_SCORE_TABLE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -951,8 +960,7 @@ void Game::disableTimeStopItem()
|
|||||||
void Game::checkMusicStatus()
|
void Game::checkMusicStatus()
|
||||||
{
|
{
|
||||||
// Si la música no está sonando
|
// Si la música no está sonando
|
||||||
if (JA_GetMusicState() == JA_MUSIC_INVALID ||
|
if (JA_GetMusicState() == JA_MUSIC_INVALID || JA_GetMusicState() == JA_MUSIC_STOPPED)
|
||||||
JA_GetMusicState() == JA_MUSIC_STOPPED)
|
|
||||||
// Si se ha completado el juego o los jugadores han terminado, detiene la música
|
// Si se ha completado el juego o los jugadores han terminado, detiene la música
|
||||||
state_ == GameState::COMPLETED || allPlayersAreGameOver() ? JA_StopMusic() : JA_PlayMusic(Resource::get()->getMusic("playing.ogg"));
|
state_ == GameState::COMPLETED || allPlayersAreGameOver() ? JA_StopMusic() : JA_PlayMusic(Resource::get()->getMusic("playing.ogg"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,18 +27,16 @@ Instructions::Instructions()
|
|||||||
texture_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)),
|
texture_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)),
|
||||||
backbuffer_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)),
|
backbuffer_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)),
|
||||||
text_(Resource::get()->getText("smb2")),
|
text_(Resource::get()->getText("smb2")),
|
||||||
tiled_bg_(std::make_unique<TiledBG>((SDL_Rect){0, 0, param.game.width, param.game.height}, TiledBGMode::STATIC)),
|
tiled_bg_(std::make_unique<TiledBG>(param.game.game_area.rect, TiledBGMode::STATIC)),
|
||||||
fade_(std::make_unique<Fade>())
|
fade_(std::make_unique<Fade>())
|
||||||
{
|
{
|
||||||
// Crea un backbuffer para el renderizador
|
// Configura las texturas
|
||||||
SDL_SetTextureBlendMode(backbuffer_, SDL_BLENDMODE_BLEND);
|
SDL_SetTextureBlendMode(backbuffer_, SDL_BLENDMODE_BLEND);
|
||||||
|
|
||||||
// Crea una textura para el texto fijo
|
|
||||||
SDL_SetTextureBlendMode(texture_, SDL_BLENDMODE_BLEND);
|
SDL_SetTextureBlendMode(texture_, SDL_BLENDMODE_BLEND);
|
||||||
|
|
||||||
// Inicializa variables
|
// Inicializa variables
|
||||||
section::name = section::Name::INSTRUCTIONS;
|
section::name = section::Name::INSTRUCTIONS;
|
||||||
view_ = {0, 0, param.game.width, param.game.height};
|
view_ = param.game.game_area.rect;
|
||||||
|
|
||||||
// Inicializa objetos
|
// Inicializa objetos
|
||||||
fade_->setColor(fade_color.r, fade_color.g, fade_color.b);
|
fade_->setColor(fade_color.r, fade_color.g, fade_color.b);
|
||||||
@@ -211,7 +209,9 @@ void Instructions::update()
|
|||||||
|
|
||||||
// Mantiene la música sonando
|
// Mantiene la música sonando
|
||||||
if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED))
|
if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED))
|
||||||
|
{
|
||||||
JA_PlayMusic(Resource::get()->getMusic("title.ogg"));
|
JA_PlayMusic(Resource::get()->getMusic("title.ogg"));
|
||||||
|
}
|
||||||
|
|
||||||
// Actualiza el objeto screen
|
// Actualiza el objeto screen
|
||||||
Screen::get()->update();
|
Screen::get()->update();
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include <algorithm> // para std::clamp
|
#include <stdlib.h> // Para rand
|
||||||
#include <stdlib.h> // para rand
|
#include <algorithm> // Para clamp
|
||||||
#include "animated_sprite.h" // para SpriteAnimated
|
#include "animated_sprite.h" // Para AnimatedSprite
|
||||||
#include "param.h" // para param
|
#include "param.h" // Para Param, ParamGame, param
|
||||||
class Texture;
|
class Texture; // lines 6-6
|
||||||
|
|
||||||
Item::Item(ItemType type, float x, float y, SDL_Rect &play_area, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation)
|
Item::Item(ItemType type, float x, float y, SDL_Rect &play_area, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation)
|
||||||
: sprite_(std::make_unique<AnimatedSprite>(texture, animation)),
|
: sprite_(std::make_unique<AnimatedSprite>(texture, animation)),
|
||||||
@@ -73,8 +73,6 @@ void Item::render()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <algorithm> // Necesario para std::clamp
|
|
||||||
|
|
||||||
void Item::move()
|
void Item::move()
|
||||||
{
|
{
|
||||||
floor_collision_ = false;
|
floor_collision_ = false;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "path_sprite.h"
|
#include "path_sprite.h"
|
||||||
#include <cmath> // Para abs
|
#include <cstdlib> // Para abs
|
||||||
#include <stdlib.h> // Para abs
|
|
||||||
#include <functional> // Para function
|
#include <functional> // Para function
|
||||||
#include <utility> // Para move
|
#include <utility> // Para move
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
#include "player.h"
|
#include "player.h"
|
||||||
#include <SDL2/SDL_render.h> // Para SDL_FLIP_HORIZONTAL, SDL_FLIP_NONE
|
#include <SDL2/SDL_render.h> // Para SDL_FLIP_HORIZONTAL, SDL_FLIP_NONE, SDL...
|
||||||
#include <SDL2/SDL_timer.h> // Para SDL_GetTicks
|
#include <SDL2/SDL_timer.h> // Para SDL_GetTicks
|
||||||
#include <stdlib.h> // Para rand
|
#include <stdlib.h> // Para rand
|
||||||
#include <algorithm> // Para max, min
|
#include <algorithm> // Para clamp, max, min
|
||||||
#include "animated_sprite.h" // Para AnimatedSprite
|
#include "animated_sprite.h" // Para AnimatedSprite
|
||||||
#include "input.h" // Para InputType
|
#include "input.h" // Para InputType
|
||||||
#include "manage_hiscore_table.h" // Para HiScoreEntry
|
#include "param.h" // Para Param, ParamGame, param
|
||||||
#include "options.h" // Para Options, OptionsGame, options
|
#include "scoreboard.h" // Para Scoreboard, ScoreboardMode
|
||||||
#include "param.h" // Para Param, ParamGame, param
|
#include "texture.h" // Para Texture
|
||||||
#include "scoreboard.h" // Para Scoreboard, ScoreboardMode
|
|
||||||
#include "texture.h" // Para Texture
|
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
Player::Player(int id, float x, int y, bool demo, SDL_Rect &play_area, std::vector<std::shared_ptr<Texture>> texture, const std::vector<std::vector<std::string>> &animations)
|
Player::Player(int id, float x, int y, bool demo, SDL_Rect &play_area, std::vector<std::shared_ptr<Texture>> texture, const std::vector<std::vector<std::string>> &animations)
|
||||||
@@ -164,7 +162,7 @@ void Player::move()
|
|||||||
pos_x_ += vel_x_;
|
pos_x_ += vel_x_;
|
||||||
|
|
||||||
// Si el jugador abandona el area de juego por los laterales, restaura su posición
|
// Si el jugador abandona el area de juego por los laterales, restaura su posición
|
||||||
const float min_x = param.game.play_area.rect.x - 5;
|
const float min_x = play_area_.x - 5;
|
||||||
const float max_x = play_area_.w + 5 - WIDTH_;
|
const float max_x = play_area_.w + 5 - WIDTH_;
|
||||||
pos_x_ = std::clamp(pos_x_, min_x, max_x);
|
pos_x_ = std::clamp(pos_x_, min_x, max_x);
|
||||||
|
|
||||||
@@ -174,13 +172,13 @@ void Player::move()
|
|||||||
case PlayerState::DYING:
|
case PlayerState::DYING:
|
||||||
{
|
{
|
||||||
// Si el cadaver abandona el area de juego por los laterales lo hace rebotar
|
// Si el cadaver abandona el area de juego por los laterales lo hace rebotar
|
||||||
if ((player_sprite_->getPosX() < param.game.play_area.rect.x) || (player_sprite_->getPosX() + WIDTH_ > play_area_.w))
|
if ((player_sprite_->getPosX() < play_area_.x) || (player_sprite_->getPosX() + WIDTH_ > play_area_.w))
|
||||||
{
|
{
|
||||||
player_sprite_->setVelX(-player_sprite_->getVelX());
|
player_sprite_->setVelX(-player_sprite_->getVelX());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Si el cadaver toca el suelo cambia el estado
|
// Si el cadaver toca el suelo cambia el estado
|
||||||
if (player_sprite_->getPosY() > param.game.play_area.rect.h - HEIGHT_)
|
if (player_sprite_->getPosY() > play_area_.h - HEIGHT_)
|
||||||
{
|
{
|
||||||
if (player_sprite_->getVelY() < 2.0f)
|
if (player_sprite_->getVelY() < 2.0f)
|
||||||
{
|
{
|
||||||
@@ -194,7 +192,7 @@ void Player::move()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Decrementa las velocidades de rebote
|
// Decrementa las velocidades de rebote
|
||||||
player_sprite_->setPosY(param.game.play_area.rect.h - HEIGHT_);
|
player_sprite_->setPosY(play_area_.h - HEIGHT_);
|
||||||
player_sprite_->setVelY(player_sprite_->getVelY() * -0.5f);
|
player_sprite_->setVelY(player_sprite_->getVelY() * -0.5f);
|
||||||
player_sprite_->setVelX(player_sprite_->getVelX() * 0.75f);
|
player_sprite_->setVelX(player_sprite_->getVelX() * 0.75f);
|
||||||
}
|
}
|
||||||
@@ -224,6 +222,41 @@ void Player::move()
|
|||||||
setPlayingState(PlayerState::GAME_OVER);
|
setPlayingState(PlayerState::GAME_OVER);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PlayerState::CREDITS:
|
||||||
|
{
|
||||||
|
pos_x_ += vel_x_ / 2.0f;
|
||||||
|
if (vel_x_ > 0)
|
||||||
|
{
|
||||||
|
// setInputPlaying(InputType::RIGHT);
|
||||||
|
if (pos_x_ > param.game.game_area.rect.w - WIDTH_)
|
||||||
|
{
|
||||||
|
pos_x_ = param.game.game_area.rect.w - WIDTH_;
|
||||||
|
vel_x_ *= -1;
|
||||||
|
// setInputPlaying(InputType::LEFT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// setInputPlaying(InputType::LEFT);
|
||||||
|
if (pos_x_ < param.game.game_area.rect.x)
|
||||||
|
{
|
||||||
|
pos_x_ = param.game.game_area.rect.x;
|
||||||
|
vel_x_ *= -1;
|
||||||
|
// setInputPlaying(InputType::RIGHT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos_x_ > param.game.game_area.center_x - WIDTH_ / 2)
|
||||||
|
{
|
||||||
|
setWalkingState(PlayerState::WALKING_LEFT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setWalkingState(PlayerState::WALKING_RIGHT);
|
||||||
|
}
|
||||||
|
shiftSprite();
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -254,6 +287,7 @@ void Player::setAnimation()
|
|||||||
case PlayerState::PLAYING:
|
case PlayerState::PLAYING:
|
||||||
case PlayerState::ENTERING_NAME_GAME_COMPLETED:
|
case PlayerState::ENTERING_NAME_GAME_COMPLETED:
|
||||||
case PlayerState::LEAVING_SCREEN:
|
case PlayerState::LEAVING_SCREEN:
|
||||||
|
case PlayerState::CREDITS:
|
||||||
{
|
{
|
||||||
// Crea cadenas de texto para componer el nombre de la animación
|
// Crea cadenas de texto para componer el nombre de la animación
|
||||||
const std::string a_walking = walking_state_ == PlayerState::WALKING_STOP ? "stand" : "walk";
|
const std::string a_walking = walking_state_ == PlayerState::WALKING_STOP ? "stand" : "walk";
|
||||||
@@ -470,6 +504,11 @@ void Player::setPlayingState(PlayerState state)
|
|||||||
setScoreboardMode(ScoreboardMode::GAME_COMPLETED);
|
setScoreboardMode(ScoreboardMode::GAME_COMPLETED);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PlayerState::CREDITS:
|
||||||
|
{
|
||||||
|
vel_x_ = (walking_state_ == PlayerState::WALKING_RIGHT) ? BASE_SPEED_ : -BASE_SPEED_;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -615,9 +654,13 @@ void Player::decEnterNameCounter()
|
|||||||
{
|
{
|
||||||
enter_name_counter_ = param.game.enter_name_seconds;
|
enter_name_counter_ = param.game.enter_name_seconds;
|
||||||
if (playing_state_ == PlayerState::ENTERING_NAME)
|
if (playing_state_ == PlayerState::ENTERING_NAME)
|
||||||
|
{
|
||||||
setPlayingState(PlayerState::CONTINUE);
|
setPlayingState(PlayerState::CONTINUE);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
setPlayingState(PlayerState::LEAVING_SCREEN);
|
setPlayingState(PlayerState::LEAVING_SCREEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -625,7 +668,9 @@ void Player::decEnterNameCounter()
|
|||||||
int Player::getRecordNamePos() const
|
int Player::getRecordNamePos() const
|
||||||
{
|
{
|
||||||
if (enter_name_)
|
if (enter_name_)
|
||||||
|
{
|
||||||
return enter_name_->getPosition();
|
return enter_name_->getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "animated_sprite.h" // Para AnimatedSprite
|
#include <SDL2/SDL_rect.h> // Para SDL_Rect
|
||||||
#include "enter_name.h" // Para EnterName
|
#include <SDL2/SDL_stdinc.h> // Para Uint32
|
||||||
#include "utils.h" // Para Circle
|
#include <memory> // Para unique_ptr, shared_ptr
|
||||||
#include <SDL2/SDL_rect.h> // Para SDL_Rect
|
#include <string> // Para string
|
||||||
#include <SDL2/SDL_stdinc.h> // Para Uint32
|
#include <vector> // Para vector
|
||||||
#include <memory> // Para unique_ptr, shared_ptr
|
#include "animated_sprite.h" // Para AnimatedSprite
|
||||||
#include <string> // Para string
|
#include "enter_name.h" // Para EnterName
|
||||||
#include <vector> // Para vector
|
#include "manage_hiscore_table.h" // Para HiScoreEntry
|
||||||
#include "options.h"
|
#include "options.h" // Para Options, OptionsGame, options
|
||||||
|
#include "utils.h" // Para Circle
|
||||||
class Texture; // lines 12-12
|
class Texture; // lines 13-13
|
||||||
enum class InputType : int; // lines 13-13
|
enum class InputType : int; // lines 14-14
|
||||||
enum class ScoreboardMode; // lines 14-14
|
enum class ScoreboardMode; // lines 15-15
|
||||||
|
|
||||||
// Estados del jugador
|
// Estados del jugador
|
||||||
enum class PlayerState
|
enum class PlayerState
|
||||||
@@ -40,6 +40,7 @@ enum class PlayerState
|
|||||||
CELEBRATING, // Poniendo pose de victoria
|
CELEBRATING, // Poniendo pose de victoria
|
||||||
ENTERING_NAME_GAME_COMPLETED, // Poniendo nombre en el tramo final del juego
|
ENTERING_NAME_GAME_COMPLETED, // Poniendo nombre en el tramo final del juego
|
||||||
LEAVING_SCREEN, // Moviendose fuera de la pantalla
|
LEAVING_SCREEN, // Moviendose fuera de la pantalla
|
||||||
|
CREDITS, // Estado para los creditos del juego
|
||||||
};
|
};
|
||||||
|
|
||||||
// Clase Player
|
// Clase Player
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
#include "asset.h" // Para Asset
|
#include "asset.h" // Para Asset
|
||||||
#include "dbgtxt.h" // Para dbg_print
|
#include "dbgtxt.h" // Para dbg_print
|
||||||
#include "global_inputs.h" // Para service_pressed_counter
|
#include "global_inputs.h" // Para service_pressed_counter
|
||||||
#include "jail_shader.h" // Para init, render
|
|
||||||
#include "notifier.h" // Para Notifier
|
#include "notifier.h" // Para Notifier
|
||||||
#include "on_screen_help.h" // Para OnScreenHelp
|
#include "on_screen_help.h" // Para OnScreenHelp
|
||||||
#include "options.h" // Para Options, OptionsVideo, options, Options...
|
#include "options.h" // Para Options, OptionsVideo, options, Options...
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ namespace section
|
|||||||
HI_SCORE_TABLE = 5,
|
HI_SCORE_TABLE = 5,
|
||||||
GAME_DEMO = 6,
|
GAME_DEMO = 6,
|
||||||
INSTRUCTIONS = 7,
|
INSTRUCTIONS = 7,
|
||||||
QUIT = 8,
|
CREDITS = 8,
|
||||||
|
QUIT = 9,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Opciones para la sección
|
// Opciones para la sección
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "stage.h"
|
#include "stage.h"
|
||||||
#include <vector>
|
#include <algorithm> // Para min
|
||||||
|
#include <vector> // Para vector
|
||||||
|
|
||||||
namespace Stage
|
namespace Stage
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -264,4 +264,13 @@ void Text::reLoadTexture()
|
|||||||
void Text::setFixedWidth(bool value)
|
void Text::setFixedWidth(bool value)
|
||||||
{
|
{
|
||||||
fixed_width_ = value;
|
fixed_width_ = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Establece una paleta
|
||||||
|
void Text::setPalette(int number)
|
||||||
|
{
|
||||||
|
auto temp = SDL_GetRenderTarget(Screen::get()->getRenderer());
|
||||||
|
SDL_SetRenderTarget(Screen::get()->getRenderer(), nullptr);
|
||||||
|
sprite_->getTexture()->setPalette(number);
|
||||||
|
SDL_SetRenderTarget(Screen::get()->getRenderer(), temp);
|
||||||
}
|
}
|
||||||
@@ -78,4 +78,7 @@ public:
|
|||||||
|
|
||||||
// Establece si se usa un tamaño fijo de letra
|
// Establece si se usa un tamaño fijo de letra
|
||||||
void setFixedWidth(bool value);
|
void setFixedWidth(bool value);
|
||||||
|
|
||||||
|
// Establece una paleta
|
||||||
|
void setPalette(int number);
|
||||||
};
|
};
|
||||||
@@ -29,15 +29,15 @@
|
|||||||
Title::Title()
|
Title::Title()
|
||||||
: text_(Resource::get()->getText("smb2")),
|
: text_(Resource::get()->getText("smb2")),
|
||||||
fade_(std::make_unique<Fade>()),
|
fade_(std::make_unique<Fade>()),
|
||||||
tiled_bg_(std::make_unique<TiledBG>((SDL_Rect){0, 0, param.game.width, param.game.height}, TiledBGMode::RANDOM)),
|
tiled_bg_(std::make_unique<TiledBG>(param.game.game_area.rect, TiledBGMode::RANDOM)),
|
||||||
game_logo_(std::make_unique<GameLogo>(param.game.game_area.center_x, param.title.title_c_c_position)),
|
game_logo_(std::make_unique<GameLogo>(param.game.game_area.center_x, param.title.title_c_c_position)),
|
||||||
mini_logo_texture_(Resource::get()->getTexture("logo_jailgames_mini.png")),
|
mini_logo_sprite_(std::make_unique<Sprite>(Resource::get()->getTexture("logo_jailgames_mini.png"))),
|
||||||
mini_logo_sprite_(std::make_unique<Sprite>(mini_logo_texture_, param.game.game_area.center_x - mini_logo_texture_->getWidth() / 2, 0, mini_logo_texture_->getWidth(), mini_logo_texture_->getHeight())),
|
|
||||||
define_buttons_(std::make_unique<DefineButtons>()),
|
define_buttons_(std::make_unique<DefineButtons>()),
|
||||||
num_controllers_(Input::get()->getNumControllers())
|
num_controllers_(Input::get()->getNumControllers())
|
||||||
{
|
{
|
||||||
// Configura objetos
|
// Configura objetos
|
||||||
game_logo_->enable();
|
game_logo_->enable();
|
||||||
|
mini_logo_sprite_->setX(param.game.game_area.center_x - mini_logo_sprite_->getWidth() / 2);
|
||||||
fade_->setColor(fade_color.r, fade_color.g, fade_color.b);
|
fade_->setColor(fade_color.r, fade_color.g, fade_color.b);
|
||||||
fade_->setType(FadeType::RANDOM_SQUARE);
|
fade_->setType(FadeType::RANDOM_SQUARE);
|
||||||
fade_->setPost(param.fade.post_duration);
|
fade_->setPost(param.fade.post_duration);
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ private:
|
|||||||
std::unique_ptr<Fade> fade_; // Objeto para realizar fundidos en pantalla
|
std::unique_ptr<Fade> fade_; // Objeto para realizar fundidos en pantalla
|
||||||
std::unique_ptr<TiledBG> tiled_bg_; // Objeto para dibujar el mosaico animado de fondo
|
std::unique_ptr<TiledBG> tiled_bg_; // Objeto para dibujar el mosaico animado de fondo
|
||||||
std::unique_ptr<GameLogo> game_logo_; // Objeto para dibujar el logo con el título del juego
|
std::unique_ptr<GameLogo> game_logo_; // Objeto para dibujar el logo con el título del juego
|
||||||
std::shared_ptr<Texture> mini_logo_texture_; // Textura con el logo de JailGames mini
|
|
||||||
std::unique_ptr<Sprite> mini_logo_sprite_; // Sprite con el logo de JailGames mini
|
std::unique_ptr<Sprite> mini_logo_sprite_; // Sprite con el logo de JailGames mini
|
||||||
std::unique_ptr<DefineButtons> define_buttons_; // Objeto para definir los botones del joystic
|
std::unique_ptr<DefineButtons> define_buttons_; // Objeto para definir los botones del joystic
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user