#include "define_buttons.h" // Constructor DefineButtons::DefineButtons(Input *input, Text *text, param_t *param, options_t *options, section_t *section) { // Copia punteros a los objetos this->input = input; this->text = text; this->param = param; this->options = options; this->section = section; // Inicializa variables enabled = false; x = param->game.width / 2; y = param->title.pressStartPosition; indexController = 0; indexButton = 0; buttons.clear(); db_button_t button; button.label = "DISPARO IZQUIERDA"; button.input = input_fire_left; button.button = SDL_CONTROLLER_BUTTON_X; buttons.push_back(button); button.label = "DISPARO CENTRO"; button.input = input_fire_center; button.button = SDL_CONTROLLER_BUTTON_Y; buttons.push_back(button); button.label = "DISPARO DERECHA"; button.input = input_fire_right; button.button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER; buttons.push_back(button); button.label = "START"; button.input = input_start; button.button = SDL_CONTROLLER_BUTTON_START; buttons.push_back(button); button.label = "SALIR DEL JUEGO"; button.input = input_exit; button.button = SDL_CONTROLLER_BUTTON_BACK; buttons.push_back(button); for (int i = 0; i < input->getNumControllers(); ++i) { controllerNames.push_back(input->getControllerName(i)); } } // Destructor DefineButtons::~DefineButtons() { } // Actualiza las variables del objeto void DefineButtons::update() { if (enabled) { } } // Dibuja el objeto en pantalla void DefineButtons::render() { if (enabled) { text->writeCentered(x, y - 10, "PLAYER " + std::to_string(indexController + 1)); text->writeCentered(x, y, controllerNames[indexController]); text->writeCentered(x, y + 10, buttons[indexButton].label); } } // Comprueba el botón que se ha pulsado void DefineButtons::doControllerButtonDown(SDL_ControllerButtonEvent *event) { int i = input->getJoyIndex(event->which); // Solo pillamos botones del mando que toca if (i != indexController) { return; } buttons[indexButton].button = (SDL_GameControllerButton)event->button; incIndexButton(); } // Asigna los botones definidos al input void DefineButtons::bindButtons() { for (int i = 0; i < (int)buttons.size(); ++i) { input->bindGameControllerButton(indexController, buttons[i].input, buttons[i].button); } } // Comprueba las entradas void DefineButtons::checkInput() { if (enabled) { 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_PROG_QUIT; break; } if (event.type == SDL_CONTROLLERBUTTONDOWN) doControllerButtonDown(&event.cbutton); } } } // Habilita el objeto void DefineButtons::enable(int index) { if (input->getNumControllers() > 0) { enabled = true; indexController = index; indexButton = 0; } } // Comprueba si está habilitado bool DefineButtons::isEnabled() { return enabled; } // Incrementa el indice de los botones void DefineButtons::incIndexButton() { indexButton++; // Comprueba si ha finalizado if (indexButton == (int)buttons.size()) { // Asigna los botones definidos al input bindButtons(); // Guarda los cambios en las opciones saveBindingsToOptions(); input->allActive(indexController); // Reinicia variables indexButton = 0; indexController = 0; enabled = false; } } // Guarda los cambios en las opciones void DefineButtons::saveBindingsToOptions() { // Modifica las opciones para colocar los valores asignados options->controller[indexController].name = input->getControllerName(indexController); for (int j = 0; j < (int)options->controller[indexController].inputs.size(); ++j) { options->controller[indexController].buttons[j] = input->getControllerBinding(indexController, options->controller[indexController].inputs[j]); } }