Al redefinir botons, ja no pots repetir botó. Util per als qui tenim la ma tremolosa i apretem dos voltes sense voler
This commit is contained in:
@@ -16,11 +16,11 @@ DefineButtons::DefineButtons(std::unique_ptr<Text> text_)
|
||||
x_ = param.game.width / 2;
|
||||
y_ = param.title.press_start_position;
|
||||
|
||||
buttons_.emplace_back(lang::getText(95), InputType::FIRE_LEFT, SDL_CONTROLLER_BUTTON_X);
|
||||
buttons_.emplace_back(lang::getText(96), InputType::FIRE_CENTER, SDL_CONTROLLER_BUTTON_Y);
|
||||
buttons_.emplace_back(lang::getText(97), InputType::FIRE_RIGHT, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER);
|
||||
buttons_.emplace_back(lang::getText(98), InputType::START, SDL_CONTROLLER_BUTTON_START);
|
||||
buttons_.emplace_back(lang::getText(99), InputType::EXIT, SDL_CONTROLLER_BUTTON_BACK);
|
||||
buttons_.emplace_back(lang::getText(95), InputType::FIRE_LEFT, SDL_CONTROLLER_BUTTON_INVALID);
|
||||
buttons_.emplace_back(lang::getText(96), InputType::FIRE_CENTER, SDL_CONTROLLER_BUTTON_INVALID);
|
||||
buttons_.emplace_back(lang::getText(97), InputType::FIRE_RIGHT, SDL_CONTROLLER_BUTTON_INVALID);
|
||||
buttons_.emplace_back(lang::getText(98), InputType::START, SDL_CONTROLLER_BUTTON_INVALID);
|
||||
buttons_.emplace_back(lang::getText(99), InputType::EXIT, SDL_CONTROLLER_BUTTON_INVALID);
|
||||
|
||||
for (int i = 0; i < input_->getNumControllers(); ++i)
|
||||
{
|
||||
@@ -40,9 +40,9 @@ void DefineButtons::render()
|
||||
}
|
||||
|
||||
// Comprueba el botón que se ha pulsado
|
||||
void DefineButtons::doControllerButtonDown(SDL_ControllerButtonEvent *event)
|
||||
void DefineButtons::doControllerButtonDown(SDL_ControllerButtonEvent &event)
|
||||
{
|
||||
int i = input_->getJoyIndex(event->which);
|
||||
size_t i = input_->getJoyIndex(event.which);
|
||||
|
||||
// Solo pillamos botones del mando que toca
|
||||
if (i != index_controller_)
|
||||
@@ -50,14 +50,18 @@ void DefineButtons::doControllerButtonDown(SDL_ControllerButtonEvent *event)
|
||||
return;
|
||||
}
|
||||
|
||||
buttons_[index_button_].button = (SDL_GameControllerButton)event->button;
|
||||
incIndexButton();
|
||||
const auto button = static_cast<SDL_GameControllerButton>(event.button);
|
||||
if (checkButtonNotInUse(button))
|
||||
{
|
||||
buttons_[index_button_].button = button;
|
||||
incIndexButton();
|
||||
}
|
||||
}
|
||||
|
||||
// Asigna los botones definidos al input_
|
||||
void DefineButtons::bindButtons()
|
||||
{
|
||||
for (int i = 0; i < (int)buttons_.size(); ++i)
|
||||
for (size_t i = 0; i < buttons_.size(); ++i)
|
||||
{
|
||||
input_->bindGameControllerButton(index_controller_, buttons_[i].input, buttons_[i].button);
|
||||
}
|
||||
@@ -84,7 +88,7 @@ void DefineButtons::checkInput()
|
||||
|
||||
case SDL_CONTROLLERBUTTONDOWN:
|
||||
{
|
||||
doControllerButtonDown(&event.cbutton);
|
||||
doControllerButtonDown(event.cbutton);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -121,7 +125,7 @@ void DefineButtons::incIndexButton()
|
||||
index_button_++;
|
||||
|
||||
// Comprueba si ha finalizado
|
||||
if (index_button_ == (int)buttons_.size())
|
||||
if (index_button_ == buttons_.size())
|
||||
{
|
||||
// Asigna los botones definidos al input_
|
||||
bindButtons();
|
||||
@@ -152,7 +156,18 @@ void DefineButtons::saveBindingsToOptions()
|
||||
// Intercambia los jugadores asignados a los dos primeros mandos
|
||||
void DefineButtons::swapControllers()
|
||||
{
|
||||
const int temp = options.controller[0].player_id;
|
||||
options.controller[0].player_id = options.controller[1].player_id;
|
||||
options.controller[1].player_id = temp;
|
||||
}
|
||||
std::swap(options.controller[0].player_id, options.controller[1].player_id);
|
||||
}
|
||||
|
||||
// Comprueba que un botón no esté ya asignado
|
||||
bool DefineButtons::checkButtonNotInUse(SDL_GameControllerButton button)
|
||||
{
|
||||
for (const auto &b : buttons_)
|
||||
{
|
||||
if (b.button == button)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -33,15 +33,15 @@ private:
|
||||
int x_; // Posición donde dibujar el texto
|
||||
int y_; // Posición donde dibujar el texto
|
||||
std::vector<DefineButtonsButton> buttons_; // Vector con las nuevas definiciones de botones/acciones
|
||||
int index_controller_ = 0; // Indice del controlador a reasignar
|
||||
int index_button_ = 0; // Indice para saber qué bot´çon se está definiendo
|
||||
size_t index_controller_ = 0; // Indice del controlador a reasignar
|
||||
size_t index_button_ = 0; // Indice para saber qué botón se está definiendo
|
||||
std::vector<std::string> controller_names_; // Nombres de los mandos
|
||||
|
||||
// Incrementa el indice de los botones
|
||||
void incIndexButton();
|
||||
|
||||
// Comprueba el botón que se ha pulsado
|
||||
void doControllerButtonDown(SDL_ControllerButtonEvent *event);
|
||||
void doControllerButtonDown(SDL_ControllerButtonEvent &event);
|
||||
|
||||
// Asigna los botones definidos al input
|
||||
void bindButtons();
|
||||
@@ -49,6 +49,9 @@ private:
|
||||
// Guarda los cambios en las opciones
|
||||
void saveBindingsToOptions();
|
||||
|
||||
// Comprueba que un botón no esté ya asignado
|
||||
bool checkButtonNotInUse(SDL_GameControllerButton button);
|
||||
|
||||
public:
|
||||
// Constructor
|
||||
explicit DefineButtons(std::unique_ptr<Text> text);
|
||||
|
||||
@@ -216,6 +216,12 @@ void Title::checkEvents()
|
||||
break;
|
||||
}
|
||||
|
||||
case SDLK_4:
|
||||
{
|
||||
showControllers();
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -302,23 +308,21 @@ void Title::reLoadTextures()
|
||||
}
|
||||
|
||||
// Reinicia el contador interno
|
||||
void Title::resetCounter()
|
||||
{
|
||||
counter_ = 0;
|
||||
}
|
||||
void Title::resetCounter() { counter_ = 0; }
|
||||
|
||||
// Intercambia la asignación de mandos a los jugadores
|
||||
void Title::swapControllers()
|
||||
{
|
||||
const auto num_controllers = Input::get()->getNumControllers();
|
||||
|
||||
if (num_controllers == 0)
|
||||
{
|
||||
if (Input::get()->getNumControllers() == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
define_buttons_->swapControllers();
|
||||
showControllers();
|
||||
}
|
||||
|
||||
// Muestra información sobre los controles y los jugadores
|
||||
void Title::showControllers()
|
||||
{
|
||||
// Crea cadenas de texto vacias para un numero máximo de mandos
|
||||
constexpr int MAX_CONTROLLERS = 2;
|
||||
std::string text[MAX_CONTROLLERS];
|
||||
@@ -341,11 +345,10 @@ void Title::swapControllers()
|
||||
const int index = playerControllerIndex[i];
|
||||
if (options.controller[index].plugged)
|
||||
{
|
||||
text[i] = lang::getText(101) + std::to_string(i + 1) + ": " + options.controller[index].name;
|
||||
text[i] = lang::getText(100) + std::to_string(i + 1) + ": " + options.controller[index].name;
|
||||
}
|
||||
}
|
||||
|
||||
Notifier::get()->showText(text[0], text[1]);
|
||||
|
||||
resetCounter();
|
||||
}
|
||||
@@ -74,6 +74,9 @@ private:
|
||||
// Intercambia la asignación de mandos a los jugadores
|
||||
void swapControllers();
|
||||
|
||||
// Muestra información sobre los controles y los jugadores
|
||||
void showControllers();
|
||||
|
||||
public:
|
||||
// Constructor
|
||||
Title();
|
||||
|
||||
Reference in New Issue
Block a user