From 15b73f1d2c96a36766605fe52c712be1d2cb2b6a Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 29 Sep 2022 11:22:29 +0200 Subject: [PATCH 1/2] TITULO bastante avanzado, se deja para el final ya que falta ver elmodo demo y demas --- source/director.cpp | 34 +- source/input.cpp | 111 ++++--- source/input.h | 12 +- source/instructions.h | 2 +- source/title.cpp | 724 ++++++++++++++++++++---------------------- source/title.h | 74 ++--- source/utils.h | 27 +- 7 files changed, 492 insertions(+), 492 deletions(-) diff --git a/source/director.cpp b/source/director.cpp index 05e212d..29376a1 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -196,19 +196,19 @@ bool Director::setFileList() asset->add("data/gfx/intro.png", t_bitmap); asset->add("data/gfx/items.png", t_bitmap); asset->add("data/gfx/logo.png", t_bitmap); - + asset->add("data/gfx/title_bg_tile.png", t_bitmap); asset->add("data/gfx/title_coffee.png", t_bitmap); asset->add("data/gfx/title_crisis.png", t_bitmap); asset->add("data/gfx/title_dust.png", t_bitmap); asset->add("data/gfx/title_dust.ani", t_data); asset->add("data/gfx/title_gradient.png", t_bitmap); - + asset->add("data/gfx/player1_head.png", t_bitmap); asset->add("data/gfx/player1_body.png", t_bitmap); asset->add("data/gfx/player1_legs.png", t_bitmap); asset->add("data/gfx/player1_death.png", t_bitmap); - + asset->add("data/gfx/player2_head.png", t_bitmap); asset->add("data/gfx/player2_body.png", t_bitmap); asset->add("data/gfx/player2_legs.png", t_bitmap); @@ -237,7 +237,6 @@ bool Director::setFileList() asset->add("data/menu/title.men", t_data); asset->add("data/menu/options.men", t_data); - return asset->check(); } @@ -245,12 +244,23 @@ bool Director::setFileList() bool Director::loadConfigFile() { // Pone unos valores por defecto + options->input.clear(); + + input_t inp; + inp.id = 0; + inp.name = "KEYBOARD"; + inp.deviceType = INPUT_USE_KEYBOARD; + options->input.push_back(inp); + + inp.id = 0; + inp.name = "GAME CONTROLLER"; + inp.deviceType = INPUT_USE_GAMECONTROLLER; + options->input.push_back(inp); + options->fullScreenMode = 0; options->windowSize = 3; options->language = ba_BA; options->difficulty = DIFFICULTY_NORMAL; - options->input[0].deviceType = INPUT_USE_KEYBOARD; - options->input[1].deviceType = INPUT_USE_GAMECONTROLLER; options->filter = FILTER_NEAREST; options->vSync = true; options->screenWidth = GAME_WIDTH; @@ -283,8 +293,8 @@ bool Director::loadConfigFile() SDL_RWwrite(file, &options->windowSize, sizeof(options->windowSize), 1); SDL_RWwrite(file, &options->language, sizeof(options->language), 1); SDL_RWwrite(file, &options->difficulty, sizeof(options->difficulty), 1); - SDL_RWwrite(file, &options->input[0].deviceType, sizeof(options->input[0].deviceType), 1); - SDL_RWwrite(file, &options->input[1].deviceType, sizeof(options->input[1].deviceType), 1); + SDL_RWwrite(file, &options->input.at(0).deviceType, sizeof(options->input.at(0).deviceType), 1); + SDL_RWwrite(file, &options->input.at(1).deviceType, sizeof(options->input.at(1).deviceType), 1); SDL_RWwrite(file, &options->filter, sizeof(options->filter), 1); SDL_RWwrite(file, &options->vSync, sizeof(options->vSync), 1); SDL_RWwrite(file, &options->screenWidth, sizeof(options->screenWidth), 1); @@ -310,8 +320,8 @@ bool Director::loadConfigFile() SDL_RWread(file, &options->windowSize, sizeof(options->windowSize), 1); SDL_RWread(file, &options->language, sizeof(options->language), 1); SDL_RWread(file, &options->difficulty, sizeof(options->difficulty), 1); - SDL_RWread(file, &options->input[0].deviceType, sizeof(options->input[0].deviceType), 1); - SDL_RWread(file, &options->input[1].deviceType, sizeof(options->input[1].deviceType), 1); + SDL_RWread(file, &options->input.at(0).deviceType, sizeof(options->input.at(0).deviceType), 1); + SDL_RWread(file, &options->input.at(1).deviceType, sizeof(options->input.at(1).deviceType), 1); SDL_RWread(file, &options->filter, sizeof(options->filter), 1); SDL_RWread(file, &options->vSync, sizeof(options->vSync), 1); SDL_RWread(file, &options->screenWidth, sizeof(options->screenWidth), 1); @@ -359,8 +369,8 @@ bool Director::saveConfigFile() SDL_RWwrite(file, &options->windowSize, sizeof(options->windowSize), 1); SDL_RWwrite(file, &options->language, sizeof(options->language), 1); SDL_RWwrite(file, &options->difficulty, sizeof(options->difficulty), 1); - SDL_RWwrite(file, &options->input[0].deviceType, sizeof(options->input[0].deviceType), 1); - SDL_RWwrite(file, &options->input[1].deviceType, sizeof(options->input[1].deviceType), 1); + SDL_RWwrite(file, &options->input.at(0).deviceType, sizeof(options->input.at(0).deviceType), 1); + SDL_RWwrite(file, &options->input.at(1).deviceType, sizeof(options->input.at(1).deviceType), 1); SDL_RWwrite(file, &options->filter, sizeof(options->filter), 1); SDL_RWwrite(file, &options->vSync, sizeof(options->vSync), 1); SDL_RWwrite(file, &options->screenWidth, sizeof(options->screenWidth), 1); diff --git a/source/input.cpp b/source/input.cpp index bcf10d6..cc0d469 100644 --- a/source/input.cpp +++ b/source/input.cpp @@ -5,38 +5,38 @@ Input::Input(std::string file) { // Fichero gamecontrollerdb.txt - mDBpath = file; + dbPath = file; // Inicializa las variables - for (int i = 0; i < 17; i++) - { - mKeyBindings[i].scancode = 0; - mKeyBindings[i].active = false; + keyBindings_t kb; + kb.scancode = 0; + kb.active = false; + keyBindings.resize(17, kb); - mGameControllerBindings[i].button = SDL_CONTROLLER_BUTTON_INVALID; - mGameControllerBindings[i].active = false; - } + GameControllerBindings_t gcb; + gcb.button = SDL_CONTROLLER_BUTTON_INVALID; + gcb.active = false; + gameControllerBindings.resize(17, gcb); + // Comprueba si hay un mando conectado discoverGameController(); } // Destructor Input::~Input() { - for (int i = 0; i < mNumGamepads; i++) - mConnectedControllers[i] = nullptr; } // Asigna uno de los posibles inputs a una tecla del teclado void Input::bindKey(Uint8 input, SDL_Scancode code) { - mKeyBindings[input].scancode = code; + keyBindings.at(input).scancode = code; } // Asigna uno de los posibles inputs a un botón del mando void Input::bindGameControllerButton(Uint8 input, SDL_GameControllerButton button) { - mGameControllerBindings[input].button = button; + gameControllerBindings.at(input).button = button; } // Comprueba si un input esta activo @@ -48,24 +48,28 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index) if (device == INPUT_USE_ANY) index = 0; - if ((device == INPUT_USE_KEYBOARD) || (device == INPUT_USE_ANY)) + if (device == INPUT_USE_KEYBOARD || device == INPUT_USE_ANY) { - const Uint8 *mKeystates = SDL_GetKeyboardState(nullptr); + const Uint8 *keyStates = SDL_GetKeyboardState(nullptr); if (repeat) { - if (mKeystates[mKeyBindings[input].scancode] != 0) + if (keyStates[keyBindings.at(input).scancode] != 0) + { successKeyboard = true; + } else + { successKeyboard = false; + } } else { - if (!mKeyBindings[input].active) + if (!keyBindings.at(input).active) { - if (mKeystates[mKeyBindings[input].scancode] != 0) + if (keyStates[keyBindings.at(input).scancode] != 0) { - mKeyBindings[input].active = true; + keyBindings.at(input).active = true; successKeyboard = true; } else @@ -75,9 +79,9 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index) } else { - if (mKeystates[mKeyBindings[input].scancode] == 0) + if (keyStates[keyBindings.at(input).scancode] == 0) { - mKeyBindings[input].active = false; + keyBindings.at(input).active = false; successKeyboard = false; } else @@ -93,18 +97,22 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index) { if (repeat) { - if (SDL_GameControllerGetButton(mConnectedControllers[index], mGameControllerBindings[input].button) != 0) + if (SDL_GameControllerGetButton(connectedControllers.at(index), gameControllerBindings[input].button) != 0) + { successGameController = true; + } else + { successGameController = false; + } } else { - if (!mGameControllerBindings[input].active) + if (!gameControllerBindings[input].active) { - if (SDL_GameControllerGetButton(mConnectedControllers[index], mGameControllerBindings[input].button) != 0) + if (SDL_GameControllerGetButton(connectedControllers.at(index), gameControllerBindings[input].button) != 0) { - mGameControllerBindings[input].active = true; + gameControllerBindings[input].active = true; successGameController = true; } else @@ -114,9 +122,9 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index) } else { - if (SDL_GameControllerGetButton(mConnectedControllers[index], mGameControllerBindings[input].button) == 0) + if (SDL_GameControllerGetButton(connectedControllers.at(index), gameControllerBindings[input].button) == 0) { - mGameControllerBindings[input].active = false; + gameControllerBindings[input].active = false; successGameController = false; } else @@ -136,45 +144,54 @@ bool Input::discoverGameController() bool found = false; if (SDL_WasInit(SDL_INIT_GAMECONTROLLER) != 1) + { SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER); + } - if (SDL_GameControllerAddMappingsFromFile(mDBpath.c_str()) < 0) - printf("Error, could not load %s file: %s\n", mDBpath.c_str(), SDL_GetError()); + if (SDL_GameControllerAddMappingsFromFile(dbPath.c_str()) < 0) + { + printf("Error, could not load %s file: %s\n", dbPath.c_str(), SDL_GetError()); + } - int nJoysticks = SDL_NumJoysticks(); - mNumGamepads = 0; + const int nJoysticks = SDL_NumJoysticks(); + numGamepads = 0; // Cuenta el numero de mandos - for (int i = 0; i < nJoysticks; i++) + for (int i = 0; i < nJoysticks; ++i) + { if (SDL_IsGameController(i)) - mNumGamepads++; + { + numGamepads++; + } + } printf("\nChecking for game controllers...\n"); - printf("%i joysticks found, %i are gamepads\n", nJoysticks, mNumGamepads); + printf("%i joysticks found, %i are gamepads\n", nJoysticks, numGamepads); - if (mNumGamepads > 0) + if (numGamepads > 0) { found = true; - for (int i = 0; i < mNumGamepads; i++) + for (int i = 0; i < numGamepads; i++) { // Abre el mando y lo añade a la lista SDL_GameController *pad = SDL_GameControllerOpen(i); if (SDL_GameControllerGetAttached(pad) == 1) { - mConnectedControllers.push_back(pad); - std::string separator(" #"); + connectedControllers.push_back(pad); + const std::string separator(" #"); std::string name = SDL_GameControllerNameForIndex(i); name.resize(25); name = name + separator + std::to_string(i); std::cout << name << std::endl; - mControllerNames.push_back(name); + controllerNames.push_back(name); } else + { std::cout << "SDL_GetError() = " << SDL_GetError() << std::endl; + } } - //mGameController = mConnectedControllers[0]; SDL_GameControllerEventState(SDL_ENABLE); } @@ -184,23 +201,31 @@ bool Input::discoverGameController() // Comprueba si hay algun mando conectado bool Input::gameControllerFound() { - if (mNumGamepads > 0) + if (numGamepads > 0) + { return true; + } else + { return false; + } } // Obten el nombre de un mando de juego std::string Input::getControllerName(int index) { - if (mNumGamepads > 0) - return mControllerNames[index]; + if (numGamepads > 0) + { + return controllerNames.at(index); + } else + { return ""; + } } // Obten el numero de mandos conectados int Input::getNumControllers() { - return mNumGamepads; + return numGamepads; } \ No newline at end of file diff --git a/source/input.h b/source/input.h index 5910feb..62c7865 100644 --- a/source/input.h +++ b/source/input.h @@ -41,19 +41,19 @@ private: Uint8 scancode; // Scancode asociado bool active; // Indica si está activo }; - keyBindings_t mKeyBindings[17]; // Vector con las teclas asociadas a los inputs predefinidos struct GameControllerBindings_t { SDL_GameControllerButton button; // GameControllerButton asociado bool active; // Indica si está activo }; - GameControllerBindings_t mGameControllerBindings[17]; // Vector con las teclas asociadas a los inputs predefinidos - std::vector mConnectedControllers; // Vector con todos los mandos conectados - std::vector mControllerNames; // Vector con los nombres de los mandos - int mNumGamepads; // Numero de mandos conectados - std::string mDBpath; // Ruta al archivo gamecontrollerdb.txt + std::vector keyBindings; // Vector con las teclas asociadas a los inputs predefinidos + std::vector gameControllerBindings; // Vector con las teclas asociadas a los inputs predefinidos + std::vector connectedControllers; // Vector con todos los mandos conectados + std::vector controllerNames; // Vector con los nombres de los mandos + int numGamepads; // Numero de mandos conectados + std::string dbPath; // Ruta al archivo gamecontrollerdb.txt // Comprueba si hay un mando conectado bool discoverGameController(); diff --git a/source/instructions.h b/source/instructions.h index d76942f..3118aea 100644 --- a/source/instructions.h +++ b/source/instructions.h @@ -35,7 +35,7 @@ private: Uint16 mCounter; // Contador section_t mSection; // Estado del bucle principal para saber si continua o se sale Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa - Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa + Uint32 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa bool mManualQuit; // Indica si se quiere salir del modo manual // Actualiza las variables diff --git a/source/title.cpp b/source/title.cpp index 1153d32..27aebc4 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -4,180 +4,145 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset, options_t *options, Lang *lang, section_t section) { // Copia las direcciones de los punteros - mRenderer = renderer; - mScreen = screen; - mInput = input; - mAsset = asset; - mOptions = options; - mLang = lang; + this->renderer = renderer; + this->screen = screen; + this->input = input; + this->asset = asset; + this->options = options; + this->lang = lang; // Reserva memoria para los punteros propios - mEventHandler = new SDL_Event(); - mFade = new Fade(renderer); + eventHandler = new SDL_Event(); + fade = new Fade(renderer); - dustTexture = new LTexture(mRenderer, mAsset->get("title_dust.png")); - coffeeTexture = new LTexture(mRenderer, mAsset->get("title_coffee.png")); - crisisTexture = new LTexture(mRenderer, mAsset->get("title_crisis.png")); - gradientTexture = new LTexture(mRenderer, mAsset->get("title_gradient.png")); + dustTexture = new LTexture(renderer, asset->get("title_dust.png")); + coffeeTexture = new LTexture(renderer, asset->get("title_coffee.png")); + crisisTexture = new LTexture(renderer, asset->get("title_crisis.png")); + gradientTexture = new LTexture(renderer, asset->get("title_gradient.png")); - mCoffeeBitmap = new SmartSprite(coffeeTexture, mRenderer); - mCrisisBitmap = new SmartSprite(crisisTexture, mRenderer); - mDustBitmapL = new AnimatedSprite(dustTexture, mRenderer, mAsset->get("title_dust.ani")); - mDustBitmapR = new AnimatedSprite(dustTexture, mRenderer, mAsset->get("title_dust.ani")); - mGradient = new Sprite({0, 0, 256, 192}, gradientTexture, mRenderer); + coffeeBitmap = new SmartSprite(coffeeTexture, renderer); + crisisBitmap = new SmartSprite(crisisTexture, renderer); + dustBitmapL = new AnimatedSprite(dustTexture, renderer, asset->get("title_dust.ani")); + dustBitmapR = new AnimatedSprite(dustTexture, renderer, asset->get("title_dust.ani")); + gradient = new Sprite({0, 0, 256, 192}, gradientTexture, renderer); - mText = new Text(mAsset->get("smb2.png"), mAsset->get("smb2.txt"), mRenderer); - mText2 = new Text(mAsset->get("8bithud.png"), mAsset->get("8bithud.txt"), mRenderer); + text1 = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer); + text2 = new Text(asset->get("8bithud.png"), asset->get("8bithud.txt"), renderer); - mMenu.title = new Menu(mRenderer, mAsset, mInput, mAsset->get("title.men")); - mMenu.options = new Menu(mRenderer, mAsset, mInput, mAsset->get("options.men")); + menu.title = new Menu(renderer, asset, input, asset->get("title.men")); + menu.options = new Menu(renderer, asset, input, asset->get("options.men")); // Sonidos - mSound = JA_LoadSound(mAsset->get("title.wav").c_str()); + crashSound = JA_LoadSound(asset->get("title.wav").c_str()); // Musicas - mMusic = JA_LoadMusic(mAsset->get("title.ogg").c_str()); + titleMusic = JA_LoadMusic(asset->get("title.ogg").c_str()); // Inicializa variables - mSection = section; - mCounter = TITLE_COUNTER; - mBackgroundCounter = 0; - mBackgroundMode = rand() % 2; - mMenuVisible = false; - mMenu.active = mMenu.title; - mNextSection.name = PROG_SECTION_GAME; - mPostFade = 0; - mTicks = 0; - mTicksSpeed = 15; - mFade->init(0x17, 0x17, 0x26); - mDemo = false; + this->section = section; + counter = TITLE_COUNTER; + backgroundCounter = 0; + backgroundMode = rand() % 2; + menuVisible = false; + menu.active = menu.title; + nextSection.name = PROG_SECTION_GAME; + postFade = 0; + ticks = 0; + ticksSpeed = 15; + fade->init(0x17, 0x17, 0x26); + demo = false; // Pone valores por defecto a las opciones de control - mOptions->input[0].id = 0; - mOptions->input[0].name = "KEYBOARD"; - mOptions->input[0].deviceType = INPUT_USE_KEYBOARD; + options->input.clear(); - mOptions->input[1].id = 0; - mOptions->input[1].name = "GAME CONTROLLER"; - mOptions->input[1].deviceType = INPUT_USE_GAMECONTROLLER; + input_t i; + i.id = 0; + i.name = "KEYBOARD"; + i.deviceType = INPUT_USE_KEYBOARD; + options->input.push_back(i); + + i.id = 0; + i.name = "GAME CONTROLLER"; + i.deviceType = INPUT_USE_GAMECONTROLLER; + options->input.push_back(i); // Comprueba si hay mandos conectados checkInputDevices(); - // Pone valores por defecto - mDeviceIndex[0] = mAvailableInputDevices.size() - 1; // El último dispositivo encontrado es el teclado - mDeviceIndex[1] = 0; // El primer mando encontrado. Si no ha encontrado ninguno es el teclado + // Pone valores por defecto. El primer jugador el teclado. El segundo jugador el primer mando + deviceIndex.clear(); + deviceIndex.push_back(availableInputDevices.size() - 1); // El último dispositivo encontrado es el teclado + deviceIndex.push_back(0); // El primer mando encontrado. Si no ha encontrado ninguno es el teclado // Si ha encontrado un mando se lo asigna al segundo jugador - if (mInput->gameControllerFound()) + if (input->gameControllerFound()) { - mOptions->input[1].id = mAvailableInputDevices[mDeviceIndex[1]].id; - mOptions->input[1].name = mAvailableInputDevices[mDeviceIndex[1]].name; - mOptions->input[1].deviceType = mAvailableInputDevices[mDeviceIndex[1]].deviceType; + options->input.at(1).id = availableInputDevices.at(deviceIndex.at(1)).id; + options->input.at(1).name = availableInputDevices.at(deviceIndex.at(1)).name; + options->input.at(1).deviceType = availableInputDevices.at(deviceIndex.at(1)).deviceType; } // Inicializa el bitmap de Coffee - mCoffeeBitmap->setPosX(45); - mCoffeeBitmap->setPosY(11 - 200); - mCoffeeBitmap->setWidth(167); - mCoffeeBitmap->setHeight(46); - mCoffeeBitmap->setVelX(0.0f); - mCoffeeBitmap->setVelY(2.5f); - mCoffeeBitmap->setAccelX(0.0f); - mCoffeeBitmap->setAccelY(0.1f); - mCoffeeBitmap->setSpriteClip(0, 0, 167, 46); - mCoffeeBitmap->setEnabled(true); - mCoffeeBitmap->setEnabledCounter(0); - mCoffeeBitmap->setDestX(45); - mCoffeeBitmap->setDestY(11); + coffeeBitmap->setPosX(45); + coffeeBitmap->setPosY(11 - 200); + coffeeBitmap->setWidth(167); + coffeeBitmap->setHeight(46); + coffeeBitmap->setVelX(0.0f); + coffeeBitmap->setVelY(2.5f); + coffeeBitmap->setAccelX(0.0f); + coffeeBitmap->setAccelY(0.1f); + coffeeBitmap->setSpriteClip(0, 0, 167, 46); + coffeeBitmap->setEnabled(true); + coffeeBitmap->setEnabledCounter(0); + coffeeBitmap->setDestX(45); + coffeeBitmap->setDestY(11); // Inicializa el bitmap de Crisis - mCrisisBitmap->setPosX(60); - mCrisisBitmap->setPosY(57 + 200); - mCrisisBitmap->setWidth(137); - mCrisisBitmap->setHeight(46); - mCrisisBitmap->setVelX(0.0f); - mCrisisBitmap->setVelY(-2.5f); - mCrisisBitmap->setAccelX(0.0f); - mCrisisBitmap->setAccelY(-0.1f); - mCrisisBitmap->setSpriteClip(0, 0, 137, 46); - mCrisisBitmap->setEnabled(true); - mCrisisBitmap->setEnabledCounter(0); - mCrisisBitmap->setDestX(60); - mCrisisBitmap->setDestY(57); + crisisBitmap->setPosX(60); + crisisBitmap->setPosY(57 + 200); + crisisBitmap->setWidth(137); + crisisBitmap->setHeight(46); + crisisBitmap->setVelX(0.0f); + crisisBitmap->setVelY(-2.5f); + crisisBitmap->setAccelX(0.0f); + crisisBitmap->setAccelY(-0.1f); + crisisBitmap->setSpriteClip(0, 0, 137, 46); + crisisBitmap->setEnabled(true); + crisisBitmap->setEnabledCounter(0); + crisisBitmap->setDestX(60); + crisisBitmap->setDestY(57); // Inicializa el bitmap de DustRight - mDustBitmapR->setPosX(218); - mDustBitmapR->setPosY(47); - mDustBitmapR->setWidth(16); - mDustBitmapR->setHeight(16); - mDustBitmapR->setFlip(SDL_FLIP_HORIZONTAL); + dustBitmapR->setPosX(218); + dustBitmapR->setPosY(47); + dustBitmapR->setWidth(16); + dustBitmapR->setHeight(16); + dustBitmapR->setFlip(SDL_FLIP_HORIZONTAL); // Inicializa el bitmap de DustLeft - mDustBitmapL->setPosX(33); - mDustBitmapL->setPosY(47); - mDustBitmapL->setWidth(16); - mDustBitmapL->setHeight(16); + dustBitmapL->setPosX(33); + dustBitmapL->setPosY(47); + dustBitmapL->setWidth(16); + dustBitmapL->setHeight(16); // Inicializa el sprite con el degradado - mGradient->setSpriteClip(0, 96, 256, 192); + gradient->setSpriteClip(0, 96, 256, 192); // Crea el mosaico de fondo del titulo createTiledBackground(); // Coloca la ventana que recorre el mosaico de fondo de manera que coincida con el mosaico que hay pintado en el titulo al iniciar - mBackgroundWindow.x = 128; - mBackgroundWindow.y = 96; - mBackgroundWindow.w = GAME_WIDTH; - mBackgroundWindow.h = GAME_HEIGHT; + backgroundWindow.x = 128; + backgroundWindow.y = 96; + backgroundWindow.w = GAME_WIDTH; + backgroundWindow.h = GAME_HEIGHT; // Inicializa los valores del vector con los valores del seno for (int i = 0; i < 360; ++i) { - mSin[i] = SDL_sinf((float)i * 3.14f / 180.0f); + sin[i] = SDL_sinf((float)i * 3.14f / 180.0f); } - // Inicializa los objetos de menu - // mMenu.title->setText(mAsset->get("smb2.png"), mAsset->get("smb2.txt")); - // mMenu.title->setName("TITLE"); - // mMenu.title->setPos(0, (14 * BLOCK) + 4); - // mMenu.title->setBackgroundType(MENU_BACKGROUND_TRANSPARENT); - // mMenu.title->addItem(mLang->getText(51), 2); // 1 PLAYER - // mMenu.title->addItem(mLang->getText(52), 7); // 2 PLAYERS - // mMenu.title->addItem(mLang->getText(1), 7); // OPTIONS - // mMenu.title->addItem(mLang->getText(3)); // QUIT - // mMenu.title->setDefaultActionWhenCancel(3); - // mMenu.title->setBackgroundColor({0x30, 0x30, 0x40}, 192); - // mMenu.title->setSelectorColor({0xe5, 0x1c, 0x23}, 0); - // mMenu.title->setSelectorTextColor({0xFF, 0xB4, 0x00}); - // mMenu.title->centerMenuOnX(SCREEN_CENTER_X); - // mMenu.title->centerMenuElementsOnX(); - - // mMenu.options->setText(mAsset->get("smb2.png"), mAsset->get("smb2.txt")); - // mMenu.options->setName("OPTIONS"); - // mMenu.options->setPos(0, BLOCK); - // mMenu.options->setBackgroundType(MENU_BACKGROUND_TRANSPARENT); - // mMenu.options->addItem(mLang->getText(59), 7); // (0) DIFFICULTY - // mMenu.options->addItem(mLang->getText(62), 2, true, false, true); // (1) PLAYER 1 CONTROLS - // mMenu.options->addItem(mLang->getText(69), 7, false, false); // (2) KEYBOARD - // mMenu.options->addItem(mLang->getText(63), 2, true, false, true); // (3) PLAYER 2 CONTROLS - // mMenu.options->addItem(mLang->getText(70), 7, false, false); // (4) GAME CONTROLLER - // mMenu.options->addItem(mLang->getText(8), 7); // (5) LANGUAGE - // mMenu.options->addItem(mLang->getText(58), 2, true, false, true); // (6) DISPLAY MODE - // mMenu.options->addItem(mLang->getText(4), 7, false, false); // (7) WINDOW - // mMenu.options->addItem(mLang->getText(7), 2); // (8) WINDOW SIZE - // mMenu.options->addItem(mLang->getText(60), 2); // (9) FILTER - // mMenu.options->addItem(mLang->getText(61), 7); // (10) VSYNC - // mMenu.options->addItem(mLang->getText(2), 7); // (11) HOW TO PLAY - // mMenu.options->addItem(mLang->getText(9), 2); // (12) ACCEPT - // mMenu.options->addItem(mLang->getText(10)); // (13) CANCEL - // mMenu.options->setDefaultActionWhenCancel(13); - // mMenu.options->setBackgroundColor({0x30, 0x30, 0x40}, 192); - // mMenu.options->setSelectorColor({0xe5, 0x1c, 0x23}, 255); - // mMenu.options->setSelectorTextColor({0xFF, 0xF1, 0x76}); - // mMenu.options->centerMenuOnX(SCREEN_CENTER_X); - // mMenu.options->centerMenuOnY(SCREEN_CENTER_Y); - // Actualiza los textos de los menus // updateMenuLabels(); } @@ -185,8 +150,8 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset, // Destructor Title::~Title() { - delete mEventHandler; - delete mFade; + delete eventHandler; + delete fade; dustTexture->unload(); delete dustTexture; @@ -200,22 +165,22 @@ Title::~Title() gradientTexture->unload(); delete gradientTexture; - delete mCoffeeBitmap; - delete mCrisisBitmap; - delete mDustBitmapL; - delete mDustBitmapR; - delete mGradient; + delete coffeeBitmap; + delete crisisBitmap; + delete dustBitmapL; + delete dustBitmapR; + delete gradient; - delete mText; - delete mText2; + delete text1; + delete text2; - delete mMenu.title; - delete mMenu.options; + delete menu.title; + delete menu.options; - JA_DeleteSound(mSound); - JA_DeleteMusic(mMusic); + JA_DeleteSound(crashSound); + JA_DeleteMusic(titleMusic); - SDL_DestroyTexture(mBackground); + SDL_DestroyTexture(background); } // Actualiza las variables del objeto @@ -225,28 +190,28 @@ void Title::update() checkEventHandler(); // Calcula la lógica de los objetos - if (SDL_GetTicks() - mTicks > mTicksSpeed) + if (SDL_GetTicks() - ticks > ticksSpeed) { // Actualiza el contador de ticks - mTicks = SDL_GetTicks(); + ticks = SDL_GetTicks(); - switch (mSection.subsection) + switch (section.subsection) { // Sección 1 - Titulo desplazandose case TITLE_SECTION_1: { // Actualiza los objetos - mCoffeeBitmap->update(); - mCrisisBitmap->update(); + coffeeBitmap->update(); + crisisBitmap->update(); // Si los objetos han llegado a su destino, cambiamos de Sección - if (mCoffeeBitmap->hasFinished() && mCrisisBitmap->hasFinished()) + if (coffeeBitmap->hasFinished() && crisisBitmap->hasFinished()) { - mSection.subsection = TITLE_SECTION_2; + section.subsection = TITLE_SECTION_2; // Pantallazo blanco - SDL_SetRenderDrawColor(mRenderer, 0xFF, 0xFF, 0xFF, 0xFF); - SDL_RenderClear(mRenderer); - SDL_RenderPresent(mRenderer); + SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); + SDL_RenderClear(renderer); + SDL_RenderPresent(renderer); } } break; @@ -263,50 +228,50 @@ void Title::update() // Reproduce la música if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED)) { - JA_PlayMusic(mMusic); + JA_PlayMusic(titleMusic); } // Actualiza el contador de ticks - mTicks = SDL_GetTicks(); + ticks = SDL_GetTicks(); - mDustBitmapR->update(); - mDustBitmapL->update(); + dustBitmapR->update(); + dustBitmapL->update(); // Actualiza la lógica del titulo - mMenu.active->update(); - mFade->update(); + menu.active->update(); + fade->update(); - if (mFade->hasEnded()) + if (fade->hasEnded()) { - switch (mPostFade) + switch (postFade) { case 0: // 1 PLAYER - mSection.name = PROG_SECTION_GAME; - mSection.subsection = GAME_SECTION_PLAY_1P; + section.name = PROG_SECTION_GAME; + section.subsection = GAME_SECTION_PLAY_1P; JA_StopMusic(); break; case 1: // 2 PLAYERS - mSection.name = PROG_SECTION_GAME; - mSection.subsection = GAME_SECTION_PLAY_2P; + section.name = PROG_SECTION_GAME; + section.subsection = GAME_SECTION_PLAY_2P; JA_StopMusic(); break; case 2: // QUIT - mSection.name = PROG_SECTION_QUIT; + section.name = PROG_SECTION_QUIT; JA_StopMusic(); break; case 3: // TIME OUT - mCounter = TITLE_COUNTER; - mMenu.active->reset(); - if (mDemo) + counter = TITLE_COUNTER; + menu.active->reset(); + if (demo) { runDemoGame(); runInstructions(INSTRUCTIONS_MODE_AUTO); } else - mSection.name = PROG_SECTION_LOGO; + section.name = PROG_SECTION_LOGO; break; default: @@ -318,31 +283,31 @@ void Title::update() updateBG(); // Comprueba las entradas para el menu - if (mMenuVisible == true) + if (menuVisible == true) { - mMenu.active->checkInput(); + menu.active->checkInput(); } // Comprueba si se ha seleccionado algún item del menú - if (mMenu.active->getName() == "TITLE") + if (menu.active->getName() == "TITLE") { - switch (mMenu.active->getItemSelected()) + switch (menu.active->getItemSelected()) { case 0: // 1 PLAYER - mPostFade = 0; - mFade->activateFade(); + postFade = 0; + fade->activateFade(); break; case 1: // 2 PLAYERS - mPostFade = 1; - mFade->activateFade(); + postFade = 1; + fade->activateFade(); break; case 2: // OPTIONS - mMenu.active = mMenu.options; - mOptionsPrevious = *mOptions; + menu.active = menu.options; + optionsPrevious = *options; break; case 3: // QUIT - mPostFade = 2; - mFade->activateFade(); + postFade = 2; + fade->activateFade(); break; default: @@ -351,17 +316,17 @@ void Title::update() } // Comprueba si se ha seleccionado algún item de opciones - if (mMenu.active->getName() == "OPTIONS") + if (menu.active->getName() == "OPTIONS") { - switch (mMenu.active->getItemSelected()) + switch (menu.active->getItemSelected()) { case 0: // Difficulty - if (mOptions->difficulty == DIFFICULTY_EASY) - mOptions->difficulty = DIFFICULTY_NORMAL; - else if (mOptions->difficulty == DIFFICULTY_NORMAL) - mOptions->difficulty = DIFFICULTY_HARD; + if (options->difficulty == DIFFICULTY_EASY) + options->difficulty = DIFFICULTY_NORMAL; + else if (options->difficulty == DIFFICULTY_NORMAL) + options->difficulty = DIFFICULTY_HARD; else - mOptions->difficulty = DIFFICULTY_EASY; + options->difficulty = DIFFICULTY_EASY; updateMenuLabels(); break; case 1: // PLAYER 1 CONTROLS @@ -373,43 +338,43 @@ void Title::update() updateMenuLabels(); break; case 5: // Language - mOptions->language++; - if (mOptions->language == 3) - mOptions->language = 0; + options->language++; + if (options->language == 3) + options->language = 0; updateMenuLabels(); break; case 6: // Display mode switchFullScreenModeVar(); - if (mOptions->fullScreenMode != 0) + if (options->fullScreenMode != 0) { - mMenu.options->setSelectable(8, false); - mMenu.options->setGreyed(8, true); + menu.options->setSelectable(8, false); + menu.options->setGreyed(8, true); } else { - mMenu.options->setSelectable(8, true); - mMenu.options->setGreyed(8, false); + menu.options->setSelectable(8, true); + menu.options->setGreyed(8, false); } updateMenuLabels(); break; case 8: // Windows size - mOptions->windowSize++; - if (mOptions->windowSize == 5) - mOptions->windowSize = 1; + options->windowSize++; + if (options->windowSize == 5) + options->windowSize = 1; updateMenuLabels(); break; case 9: // FILTER - if (mOptions->filter == FILTER_LINEAL) - mOptions->filter = FILTER_NEAREST; + if (options->filter == FILTER_LINEAL) + options->filter = FILTER_NEAREST; else - mOptions->filter = FILTER_LINEAL; + options->filter = FILTER_LINEAL; updateMenuLabels(); break; case 10: // VSYNC - if (mOptions->vSync) - mOptions->vSync = false; + if (options->vSync) + options->vSync = false; else - mOptions->vSync = true; + options->vSync = true; updateMenuLabels(); break; case 11: // HOW TO PLAY @@ -417,14 +382,14 @@ void Title::update() break; case 12: // ACCEPT applyOptions(); - mMenu.active->reset(); - mMenu.active = mMenu.title; + menu.active->reset(); + menu.active = menu.title; break; case 13: // CANCEL - mOptions = &mOptionsPrevious; + options = &optionsPrevious; updateMenuLabels(); - mMenu.active->reset(); - mMenu.active = mMenu.title; + menu.active->reset(); + menu.active = menu.title; break; default: @@ -432,9 +397,9 @@ void Title::update() } } - if (mMenu.active->getName() == "TITLE") + if (menu.active->getName() == "TITLE") { - mCounter--; + counter--; } } @@ -449,60 +414,60 @@ void Title::update() // Dibuja el objeto en pantalla void Title::render() { - switch (mSection.subsection) + switch (section.subsection) { // Sección 1 - Titulo desplazandose case TITLE_SECTION_1: { - mScreen->start(); // Prepara para empezar a dibujar en la textura de juego - mScreen->clean(bgColor); // Limpia la pantalla - SDL_RenderCopy(mRenderer, mBackground, &mBackgroundWindow, nullptr); // Dibuja el tileado de fondo - mGradient->render(); // Dibuja el degradado - mCoffeeBitmap->render(); // Dibuja los objetos - mCrisisBitmap->render(); // Dibuja los objetos - mScreen->blit(); // Vuelca el contenido del renderizador en pantalla + screen->start(); // Prepara para empezar a dibujar en la textura de juego + screen->clean(bgColor); // Limpia la pantalla + SDL_RenderCopy(renderer, background, &backgroundWindow, nullptr); // Dibuja el tileado de fondo + gradient->render(); // Dibuja el degradado + coffeeBitmap->render(); // Dibuja los objetos + crisisBitmap->render(); // Dibuja los objetos + screen->blit(); // Vuelca el contenido del renderizador en pantalla } break; // Sección 2 - Titulo vibrando case TITLE_SECTION_2: { // Reproduce el efecto sonoro - JA_PlaySound(mSound); + JA_PlaySound(crashSound); // Agita la pantalla const int v[] = {-1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 0}; - const int a = mCoffeeBitmap->getPosX(); - const int b = mCrisisBitmap->getPosX(); + const int a = coffeeBitmap->getPosX(); + const int b = crisisBitmap->getPosX(); for (int n = 0; n < 11 * 3; ++n) { // Prepara para empezar a dibujar en la textura de juego - mScreen->start(); + screen->start(); // Limpia la pantalla - mScreen->clean(bgColor); + screen->clean(bgColor); // Dibuja el tileado de fondo - SDL_RenderCopy(mRenderer, mBackground, &mBackgroundWindow, nullptr); + SDL_RenderCopy(renderer, background, &backgroundWindow, nullptr); // Dibuja el degradado - mGradient->render(); + gradient->render(); // Dibuja los objetos - mCoffeeBitmap->setPosX(a + v[n / 3]); - mCrisisBitmap->setPosX(b + v[n / 3]); - mCoffeeBitmap->render(); - mCrisisBitmap->render(); + coffeeBitmap->setPosX(a + v[n / 3]); + crisisBitmap->setPosX(b + v[n / 3]); + coffeeBitmap->render(); + crisisBitmap->render(); - mDustBitmapR->update(); - mDustBitmapL->update(); - mDustBitmapR->render(); - mDustBitmapL->render(); + dustBitmapR->update(); + dustBitmapL->update(); + dustBitmapR->render(); + dustBitmapL->render(); // Vuelca el contenido del renderizador en pantalla - mScreen->blit(); + screen->blit(); } - mSection.subsection = TITLE_SECTION_3; + section.subsection = TITLE_SECTION_3; } break; @@ -510,47 +475,47 @@ void Title::render() // Sección 3 - La pantalla de titulo con el menú y la música case TITLE_SECTION_3: { // Prepara para empezar a dibujar en la textura de juego - mScreen->start(); + screen->start(); // Limpia la pantalla - mScreen->clean(bgColor); + screen->clean(bgColor); // Dibuja el tileado de fondo - SDL_RenderCopy(mRenderer, mBackground, &mBackgroundWindow, nullptr); + SDL_RenderCopy(renderer, background, &backgroundWindow, nullptr); // Dibuja el degradado - mGradient->render(); + gradient->render(); // Dibuja los objetos - if (mMenu.active->getName() != "OPTIONS") + if (menu.active->getName() != "OPTIONS") { // Bitmaps con el logo/titulo del juego - mCoffeeBitmap->render(); - mCrisisBitmap->render(); + coffeeBitmap->render(); + crisisBitmap->render(); // Texto con el copyright y versión - mText2->writeDX(TXT_CENTER | TXT_SHADOW, SCREEN_CENTER_X, GAME_HEIGHT - (BLOCK * 2), TEXT_COPYRIGHT, 1, noColor, 1, shdwTxtColor); + text2->writeDX(TXT_CENTER | TXT_SHADOW, SCREEN_CENTER_X, GAME_HEIGHT - (BLOCK * 2), TEXT_COPYRIGHT, 1, noColor, 1, shdwTxtColor); } - if (mMenuVisible == true) + if (menuVisible == true) { - mMenu.active->render(); + menu.active->render(); } - mDustBitmapR->render(); - mDustBitmapL->render(); + dustBitmapR->render(); + dustBitmapL->render(); // PRESS ANY KEY! - if ((mCounter % 50 > 14) && (mMenuVisible == false)) + if ((counter % 50 > 14) && (menuVisible == false)) { - mText->writeDX(TXT_CENTER | TXT_SHADOW, SCREEN_CENTER_X, PLAY_AREA_THIRD_QUARTER_Y + BLOCK, mLang->getText(23), 1, noColor, 1, shdwTxtColor); + text1->writeDX(TXT_CENTER | TXT_SHADOW, SCREEN_CENTER_X, PLAY_AREA_THIRD_QUARTER_Y + BLOCK, lang->getText(23), 1, noColor, 1, shdwTxtColor); } // Fade - mFade->render(); + fade->render(); // Vuelca el contenido del renderizador en pantalla - mScreen->blit(); + screen->blit(); } break; @@ -563,24 +528,24 @@ void Title::render() void Title::checkEventHandler() { // Comprueba los eventos que hay en la cola - while (SDL_PollEvent(mEventHandler) != 0) + while (SDL_PollEvent(eventHandler) != 0) { // Evento de salida de la aplicación - if (mEventHandler->type == SDL_QUIT) + if (eventHandler->type == SDL_QUIT) { - mSection.name = PROG_SECTION_QUIT; + section.name = PROG_SECTION_QUIT; break; } - if (mSection.subsection == TITLE_SECTION_3) + if (section.subsection == TITLE_SECTION_3) { // Si se pulsa alguna tecla durante la tercera sección del titulo - if ((mEventHandler->type == SDL_KEYUP) || (mEventHandler->type == SDL_JOYBUTTONUP)) + if ((eventHandler->type == SDL_KEYUP) || (eventHandler->type == SDL_JOYBUTTONUP)) { // Muestra el menu - mMenuVisible = true; + menuVisible = true; // Reinicia el contador - mCounter = TITLE_COUNTER; + counter = TITLE_COUNTER; } } } @@ -589,36 +554,36 @@ void Title::checkEventHandler() // Actualiza el tileado de fondo void Title::updateBG() { - if (mBackgroundMode == 0) + if (backgroundMode == 0) { // El tileado de fondo se desplaza en diagonal - ++mBackgroundWindow.x %= 64; - ++mBackgroundWindow.y %= 64; + ++backgroundWindow.x %= 64; + ++backgroundWindow.y %= 64; } else { // El tileado de fondo se desplaza en circulo - ++mBackgroundCounter %= 360; - mBackgroundWindow.x = 128 + (int(mSin[(mBackgroundCounter + 270) % 360] * 128)); - mBackgroundWindow.y = 96 + (int(mSin[(360 - mBackgroundCounter) % 360] * 96)); + ++backgroundCounter %= 360; + backgroundWindow.x = 128 + (int(sin[(backgroundCounter + 270) % 360] * 128)); + backgroundWindow.y = 96 + (int(sin[(360 - backgroundCounter) % 360] * 96)); } } // Cambia el valor de la variable de modo de pantalla completa void Title::switchFullScreenModeVar() { - switch (mOptions->fullScreenMode) + switch (options->fullScreenMode) { case 0: - mOptions->fullScreenMode = SDL_WINDOW_FULLSCREEN; + options->fullScreenMode = SDL_WINDOW_FULLSCREEN; break; case SDL_WINDOW_FULLSCREEN: - mOptions->fullScreenMode = SDL_WINDOW_FULLSCREEN_DESKTOP; + options->fullScreenMode = SDL_WINDOW_FULLSCREEN_DESKTOP; break; case SDL_WINDOW_FULLSCREEN_DESKTOP: - mOptions->fullScreenMode = 0; + options->fullScreenMode = 0; break; default: - mOptions->fullScreenMode = 0; + options->fullScreenMode = 0; break; } } @@ -628,181 +593,181 @@ void Title::updateMenuLabels() { int i = 0; // DIFFICULTY - switch (mOptions->difficulty) + switch (options->difficulty) { case DIFFICULTY_EASY: - mMenu.options->setItemCaption(i, mLang->getText(59) + ": " + mLang->getText(66)); // EASY + menu.options->setItemCaption(i, lang->getText(59) + ": " + lang->getText(66)); // EASY break; case DIFFICULTY_NORMAL: - mMenu.options->setItemCaption(i, mLang->getText(59) + ": " + mLang->getText(67)); // NORMAL + menu.options->setItemCaption(i, lang->getText(59) + ": " + lang->getText(67)); // NORMAL break; case DIFFICULTY_HARD: - mMenu.options->setItemCaption(i, mLang->getText(59) + ": " + mLang->getText(68)); // HARD + menu.options->setItemCaption(i, lang->getText(59) + ": " + lang->getText(68)); // HARD break; default: - mMenu.options->setItemCaption(i, mLang->getText(59) + ": " + mLang->getText(67)); // NORMAL + menu.options->setItemCaption(i, lang->getText(59) + ": " + lang->getText(67)); // NORMAL break; } i++; // PLAYER 1 CONTROLS - mMenu.options->setItemCaption(i, mLang->getText(62)); + menu.options->setItemCaption(i, lang->getText(62)); i++; // PLAYER 1 CONTROLS - OPTIONS - switch (mOptions->input[0].deviceType) + switch (options->input[0].deviceType) { case INPUT_USE_KEYBOARD: - mMenu.options->setItemCaption(i, mLang->getText(69)); // KEYBOARD - mMenu.options->setGreyed(i, false); + menu.options->setItemCaption(i, lang->getText(69)); // KEYBOARD + menu.options->setGreyed(i, false); break; case INPUT_USE_GAMECONTROLLER: - mMenu.options->setItemCaption(i, mLang->getText(70)); // GAME CONTROLLER - if (!mInput->gameControllerFound()) - mMenu.options->setGreyed(i, true); + menu.options->setItemCaption(i, lang->getText(70)); // GAME CONTROLLER + if (!input->gameControllerFound()) + menu.options->setGreyed(i, true); else { - mMenu.options->setGreyed(i, false); - mMenu.options->setItemCaption(i, mOptions->input[0].name); + menu.options->setGreyed(i, false); + menu.options->setItemCaption(i, options->input[0].name); } break; default: - mMenu.options->setItemCaption(i, mLang->getText(69)); // KEYBOARD + menu.options->setItemCaption(i, lang->getText(69)); // KEYBOARD break; } i++; // PLAYER 2 CONTROLS - mMenu.options->setItemCaption(i, mLang->getText(63)); + menu.options->setItemCaption(i, lang->getText(63)); i++; // PLAYER 2 CONTROLS - OPTIONS - switch (mOptions->input[1].deviceType) + switch (options->input[1].deviceType) { case INPUT_USE_KEYBOARD: - mMenu.options->setItemCaption(i, mLang->getText(69)); // KEYBOARD - mMenu.options->setGreyed(i, false); + menu.options->setItemCaption(i, lang->getText(69)); // KEYBOARD + menu.options->setGreyed(i, false); break; case INPUT_USE_GAMECONTROLLER: - mMenu.options->setItemCaption(i, mLang->getText(70)); // GAME CONTROLLER - if (!mInput->gameControllerFound()) - mMenu.options->setGreyed(i, true); + menu.options->setItemCaption(i, lang->getText(70)); // GAME CONTROLLER + if (!input->gameControllerFound()) + menu.options->setGreyed(i, true); else { - mMenu.options->setGreyed(i, false); - mMenu.options->setItemCaption(i, mOptions->input[1].name); + menu.options->setGreyed(i, false); + menu.options->setItemCaption(i, options->input[1].name); } break; default: - mMenu.options->setItemCaption(i, mLang->getText(69)); // KEYBOARD + menu.options->setItemCaption(i, lang->getText(69)); // KEYBOARD break; } i++; // LANGUAGE - switch (mOptions->language) + switch (options->language) { case es_ES: - mMenu.options->setItemCaption(i, mLang->getText(8) + ": " + mLang->getText(24)); // SPANISH + menu.options->setItemCaption(i, lang->getText(8) + ": " + lang->getText(24)); // SPANISH break; case ba_BA: - mMenu.options->setItemCaption(i, mLang->getText(8) + ": " + mLang->getText(25)); // VALENCIAN + menu.options->setItemCaption(i, lang->getText(8) + ": " + lang->getText(25)); // VALENCIAN break; case en_UK: - mMenu.options->setItemCaption(i, mLang->getText(8) + ": " + mLang->getText(26)); // ENGLISH + menu.options->setItemCaption(i, lang->getText(8) + ": " + lang->getText(26)); // ENGLISH break; default: - mMenu.options->setItemCaption(i, mLang->getText(8) + ": " + mLang->getText(26)); // ENGLISH + menu.options->setItemCaption(i, lang->getText(8) + ": " + lang->getText(26)); // ENGLISH break; } i++; // DISPLAY MODE - mMenu.options->setItemCaption(i, mLang->getText(58)); + menu.options->setItemCaption(i, lang->getText(58)); i++; // DISPLAY MODE - OPTIONS - switch (mOptions->fullScreenMode) + switch (options->fullScreenMode) { case 0: - mMenu.options->setItemCaption(i, mLang->getText(4)); // WINDOW + menu.options->setItemCaption(i, lang->getText(4)); // WINDOW break; case SDL_WINDOW_FULLSCREEN: - mMenu.options->setItemCaption(i, mLang->getText(5)); // FULLSCREEN + menu.options->setItemCaption(i, lang->getText(5)); // FULLSCREEN break; case SDL_WINDOW_FULLSCREEN_DESKTOP: - mMenu.options->setItemCaption(i, mLang->getText(6)); // FAKE FULLSCREEN + menu.options->setItemCaption(i, lang->getText(6)); // FAKE FULLSCREEN break; default: - mMenu.options->setItemCaption(i, mLang->getText(4)); // WINDOW + menu.options->setItemCaption(i, lang->getText(4)); // WINDOW break; } i++; // WINDOW SIZE - mMenu.options->setItemCaption(i, mLang->getText(7) + " x" + std::to_string(mOptions->windowSize)); // WINDOW SIZE + menu.options->setItemCaption(i, lang->getText(7) + " x" + std::to_string(options->windowSize)); // WINDOW SIZE i++; // FILTER - if (mOptions->filter == FILTER_LINEAL) - mMenu.options->setItemCaption(i, mLang->getText(60) + ": " + mLang->getText(71)); // BILINEAL + if (options->filter == FILTER_LINEAL) + menu.options->setItemCaption(i, lang->getText(60) + ": " + lang->getText(71)); // BILINEAL else - mMenu.options->setItemCaption(i, mLang->getText(60) + ": " + mLang->getText(72)); // LINEAL + menu.options->setItemCaption(i, lang->getText(60) + ": " + lang->getText(72)); // LINEAL i++; // VSYNC - if (mOptions->vSync) - mMenu.options->setItemCaption(i, mLang->getText(61) + ": " + mLang->getText(73)); // ON + if (options->vSync) + menu.options->setItemCaption(i, lang->getText(61) + ": " + lang->getText(73)); // ON else - mMenu.options->setItemCaption(i, mLang->getText(61) + ": " + mLang->getText(74)); // OFF + menu.options->setItemCaption(i, lang->getText(61) + ": " + lang->getText(74)); // OFF i++; // HOW TO PLAY - mMenu.options->setItemCaption(i, mLang->getText(2)); + menu.options->setItemCaption(i, lang->getText(2)); i++; // ACCEPT - mMenu.options->setItemCaption(i, mLang->getText(9)); // ACCEPT + menu.options->setItemCaption(i, lang->getText(9)); // ACCEPT i++; // CANCEL - mMenu.options->setItemCaption(i, mLang->getText(10)); // CANCEL + menu.options->setItemCaption(i, lang->getText(10)); // CANCEL // Recoloca el menu de opciones - mMenu.options->centerMenuOnX(SCREEN_CENTER_X); - mMenu.options->centerMenuOnY(SCREEN_CENTER_Y); - mMenu.options->centerMenuElementsOnX(); + menu.options->centerMenuOnX(SCREEN_CENTER_X); + menu.options->centerMenuOnY(SCREEN_CENTER_Y); + menu.options->centerMenuElementsOnX(); // Establece las etiquetas del menu de titulo - mMenu.title->setItemCaption(0, mLang->getText(51)); // 1 PLAYER - mMenu.title->setItemCaption(1, mLang->getText(52)); // 2 PLAYERS - mMenu.title->setItemCaption(2, mLang->getText(1)); // OPTIONS - mMenu.title->setItemCaption(3, mLang->getText(3)); // QUIT + menu.title->setItemCaption(0, lang->getText(51)); // 1 PLAYER + menu.title->setItemCaption(1, lang->getText(52)); // 2 PLAYERS + menu.title->setItemCaption(2, lang->getText(1)); // OPTIONS + menu.title->setItemCaption(3, lang->getText(3)); // QUIT // Recoloca el menu de titulo - mMenu.title->centerMenuOnX(SCREEN_CENTER_X); - mMenu.title->centerMenuElementsOnX(); + menu.title->centerMenuOnX(SCREEN_CENTER_X); + menu.title->centerMenuElementsOnX(); } // Aplica las opciones de menu seleccionadas void Title::applyOptions() { - mScreen->setVideoMode(mOptions->fullScreenMode); + screen->setVideoMode(options->fullScreenMode); - mLang->setLang(mOptions->language); + lang->setLang(options->language); updateMenuLabels(); createTiledBackground(); @@ -811,89 +776,88 @@ void Title::applyOptions() // Bucle para el titulo del juego section_t Title::run() { - while (mSection.name == PROG_SECTION_TITLE) + while (section.name == PROG_SECTION_TITLE) { update(); render(); // Sección 3 - La pantalla de titulo con el menú y la música // Sección Instrucciones - // if (mSection.subsection == TITLE_SECTION_INSTRUCTIONS) + // if (section.subsection == TITLE_SECTION_INSTRUCTIONS) //{ // runInstructions(INSTRUCTIONS_MODE_AUTO); //} } - return mSection; + return section; } // Ejecuta la parte donde se muestran las instrucciones void Title::runInstructions(Uint8 mode) { - mInstructions = new Instructions(mRenderer, mScreen, mAsset, mLang); - mInstructions->run(mode); - delete mInstructions; + instructions = new Instructions(renderer, screen, asset, lang); + instructions->run(mode); + delete instructions; } // Ejecuta el juego en modo demo void Title::runDemoGame() { - mDemoGame = new Game(1, 0, mRenderer, mScreen, mAsset, mLang, mInput, true, mOptions); - mDemoGame->run(); - delete mDemoGame; + demoGame = new Game(1, 0, renderer, screen, asset, lang, input, true, options); + demoGame->run(); + delete demoGame; } // Modifica las opciones para los controles de los jugadores bool Title::updatePlayerInputs(int numPlayer) { - const int numDevices = mAvailableInputDevices.size(); + const int numDevices = availableInputDevices.size(); - // Si no hay mandos se deja todo de manera prefijada - if (!mInput->gameControllerFound()) - { - mDeviceIndex[0] = 0; - mDeviceIndex[1] = 0; + if (!input->gameControllerFound()) + { // Si no hay mandos se deja todo de manera prefijada + deviceIndex.at(0) = 0; + deviceIndex.at(1) = 0; - mOptions->input[0].id = -1; - mOptions->input[0].name = "KEYBOARD"; - mOptions->input[0].deviceType = INPUT_USE_KEYBOARD; + options->input.at(0).id = -1; + options->input.at(0).name = "KEYBOARD"; + options->input.at(0).deviceType = INPUT_USE_KEYBOARD; - mOptions->input[1].id = 0; - mOptions->input[1].name = "GAME CONTROLLER"; - mOptions->input[1].deviceType = INPUT_USE_GAMECONTROLLER; + options->input.at(1).id = 0; + options->input.at(1).name = "GAME CONTROLLER"; + options->input.at(1).deviceType = INPUT_USE_GAMECONTROLLER; return true; } - else // Si hay mas de un dispositivo, se recorre el vector - { + else + { // Si hay mas de un dispositivo, se recorre el vector printf("numplayer:%i\n", numPlayer); - printf("deviceindex:%i\n", mDeviceIndex[numPlayer]); + printf("deviceindex:%i\n", deviceIndex.at(numPlayer)); // Incrementa el indice - if (mDeviceIndex[numPlayer] < numDevices - 1) + if (deviceIndex.at(numPlayer) < numDevices - 1) { - mDeviceIndex[numPlayer]++; + deviceIndex.at(numPlayer)++; } else { - mDeviceIndex[numPlayer] = 0; + deviceIndex.at(numPlayer) = 0; } - printf("deviceindex:%i\n", mDeviceIndex[numPlayer]); + printf("deviceindex:%i\n", deviceIndex.at(numPlayer)); // Si coincide con el del otro jugador, se lo intercambian - if (mDeviceIndex[0] == mDeviceIndex[1]) + if (deviceIndex.at(0) == deviceIndex.at(1)) { const int theOtherPlayer = (numPlayer + 1) % 2; - mDeviceIndex[theOtherPlayer]--; - if (mDeviceIndex[theOtherPlayer] < 0) + deviceIndex.at(theOtherPlayer)--; + if (deviceIndex.at(theOtherPlayer) < 0) { - mDeviceIndex[theOtherPlayer] = numDevices - 1; + deviceIndex.at(theOtherPlayer) = numDevices - 1; } } // Copia el dispositivo marcado por el indice a la variable de opciones de cada jugador - mOptions->input[0] = mAvailableInputDevices[mDeviceIndex[0]]; - mOptions->input[1] = mAvailableInputDevices[mDeviceIndex[1]]; + options->input[0] = availableInputDevices.at(deviceIndex.at(0)); + options->input[1] = availableInputDevices.at(deviceIndex.at(1)); return true; } @@ -903,20 +867,20 @@ bool Title::updatePlayerInputs(int numPlayer) void Title::createTiledBackground() { // Crea la textura para el mosaico de fondo - mBackground = SDL_CreateTexture(mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAME_WIDTH * 2, GAME_HEIGHT * 2); - if (mBackground == nullptr) + background = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAME_WIDTH * 2, GAME_HEIGHT * 2); + if (background == nullptr) { printf("TitleSurface could not be created!\nSDL Error: %s\n", SDL_GetError()); } // Crea los objetos para pintar en la textura de fondo - LTexture *bgTileTexture = new LTexture(mRenderer, mAsset->get("title_bg_tile.png")); - Sprite *tile = new Sprite({0, 0, 64, 64}, bgTileTexture, mRenderer); + LTexture *bgTileTexture = new LTexture(renderer, asset->get("title_bg_tile.png")); + Sprite *tile = new Sprite({0, 0, 64, 64}, bgTileTexture, renderer); // Prepara para dibujar sobre la textura - SDL_SetRenderTarget(mRenderer, mBackground); - SDL_SetRenderDrawColor(mRenderer, 0x43, 0x43, 0x4F, 0xFF); - SDL_RenderClear(mRenderer); + SDL_SetRenderTarget(renderer, background); + SDL_SetRenderDrawColor(renderer, 0x43, 0x43, 0x4F, 0xFF); + SDL_RenderClear(renderer); // Rellena la textura con el tile tile->setSpriteClip(0, 0, 64, 64); @@ -931,7 +895,7 @@ void Title::createTiledBackground() } // Vuelve a colocar el renderizador apuntando a la pantalla - SDL_SetRenderTarget(mRenderer, nullptr); + SDL_SetRenderTarget(renderer, nullptr); // Libera la memoria utilizada por los objetos bgTileTexture->unload(); @@ -943,25 +907,25 @@ void Title::createTiledBackground() void Title::checkInputDevices() { printf("Filling devices for options menu...\n"); - int numControllers = mInput->getNumControllers(); - mAvailableInputDevices.clear(); + const int numControllers = input->getNumControllers(); + availableInputDevices.clear(); input_t temp; // Añade todos los mandos if (numControllers > 0) - for (int i = 0; i < numControllers; i++) + for (int i = 0; i < numControllers; ++i) { temp.id = i; - temp.name = mInput->getControllerName(i); + temp.name = input->getControllerName(i); temp.deviceType = INPUT_USE_GAMECONTROLLER; - mAvailableInputDevices.push_back(temp); - printf("Device %i:\t%s\n", (int)mAvailableInputDevices.size(), temp.name.c_str()); + availableInputDevices.push_back(temp); + printf("Device %i:\t%s\n", (int)availableInputDevices.size(), temp.name.c_str()); } // Añade el teclado al final temp.id = -1; temp.name = "KEYBOARD"; temp.deviceType = INPUT_USE_KEYBOARD; - mAvailableInputDevices.push_back(temp); - printf("Device %i:\t%s\n\n", (int)mAvailableInputDevices.size(), temp.name.c_str()); + availableInputDevices.push_back(temp); + printf("Device %i:\t%s\n\n", (int)availableInputDevices.size(), temp.name.c_str()); } \ No newline at end of file diff --git a/source/title.h b/source/title.h index 17c660f..1db9a83 100644 --- a/source/title.h +++ b/source/title.h @@ -42,54 +42,54 @@ private: }; // Objetos - SDL_Renderer *mRenderer; // El renderizador de la ventana - Screen *mScreen; // Objeto encargado de dibujar en pantalla - Asset *mAsset; // Objeto que gestiona todos los ficheros de recursos - Input *mInput; // Objeto para leer las entradas de teclado o mando - Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas - Instructions *mInstructions; // Objeto para la sección de las instrucciones - Game *mDemoGame; // Objeto para lanzar la demo del juego - SDL_Event *mEventHandler; // Manejador de eventos + SDL_Renderer *renderer; // El renderizador de la ventana + Screen *screen; // Objeto encargado de dibujar en pantalla + Asset *asset; // Objeto que gestiona todos los ficheros de recursos + Input *input; // Objeto para leer las entradas de teclado o mando + Lang *lang; // Objeto para gestionar los textos en diferentes idiomas + Instructions *instructions; // Objeto para la sección de las instrucciones + Game *demoGame; // Objeto para lanzar la demo del juego + SDL_Event *eventHandler; // Manejador de eventos LTexture *dustTexture; // Textura con los graficos del polvo LTexture *coffeeTexture; // Textura con los graficos de la palabra coffee LTexture *crisisTexture; // Textura con los graficos de la plabra crisis LTexture *gradientTexture; // Textura con los graficos para el degradado del fondo del titulo - SDL_Rect mBackgroundWindow; // Ventana visible para la textura de fondo del titulo - SDL_Texture *mBackground; // Textura dibujar el fondo del titulo + SDL_Rect backgroundWindow; // Ventana visible para la textura de fondo del titulo + SDL_Texture *background; // Textura dibujar el fondo del titulo - AnimatedSprite *mDustBitmapL; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo - AnimatedSprite *mDustBitmapR; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo + AnimatedSprite *dustBitmapL; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo + AnimatedSprite *dustBitmapR; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo - SmartSprite *mCoffeeBitmap; // Sprite con la palabra COFFEE para la pantalla de titulo - SmartSprite *mCrisisBitmap; // Sprite con la palabra CRISIS para la pantalla de titulo + SmartSprite *coffeeBitmap; // Sprite con la palabra COFFEE para la pantalla de titulo + SmartSprite *crisisBitmap; // Sprite con la palabra CRISIS para la pantalla de titulo - Sprite *mGradient; // Sprite para dibujar el degradado del titulo + Sprite *gradient; // Sprite para dibujar el degradado del titulo - Text *mText; // Objeto de texto para poder escribir textos en pantalla - Text *mText2; // Objeto de texto para poder escribir textos en pantalla - Fade *mFade; // Objeto para realizar fundidos en pantalla + Text *text1; // Objeto de texto para poder escribir textos en pantalla + Text *text2; // Objeto de texto para poder escribir textos en pantalla + Fade *fade; // Objeto para realizar fundidos en pantalla // Variable - JA_Music mMusic; // Musica para el titulo - JA_Sound mSound; // Sonido con el impacto del título - int mBackgroundCounter; // Temporizador para el fondo de tiles de la pantalla de titulo - int mCounter; // Temporizador para la pantalla de titulo - Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa - Uint8 mBackgroundMode; // Variable para almacenar el tipo de efecto que hará el fondo de la pantalla de titulo - float mSin[360]; // Vector con los valores del seno precalculados - bool mMenuVisible; // Indicador para saber si se muestra el menu del titulo o la frase intermitente - bool mDemo; // Indica si el modo demo estará activo - section_t mSection; // Indicador para el bucle del titulo - section_t mNextSection; // Indica cual es la siguiente sección a cargar cuando termine el contador del titulo - Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa - Uint8 mPostFade; // Opción a realizar cuando termina el fundido - menu_t mMenu; // Variable con todos los objetos menus y sus variables - struct options_t *mOptions; // Variable con todas las variables de las opciones del programa - options_t mOptionsPrevious; // Variable de respaldo para las opciones - std::vector mAvailableInputDevices; // Vector con todos los metodos de control disponibles - int mDeviceIndex[2]; // Indice para el jugador [i] del vector de dispositivos de entrada disponibles + JA_Music titleMusic; // Musica para el titulo + JA_Sound crashSound; // Sonido con el impacto del título + int backgroundCounter; // Temporizador para el fondo de tiles de la pantalla de titulo + int counter; // Temporizador para la pantalla de titulo + Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa + Uint8 backgroundMode; // Variable para almacenar el tipo de efecto que hará el fondo de la pantalla de titulo + float sin[360]; // Vector con los valores del seno precalculados + bool menuVisible; // Indicador para saber si se muestra el menu del titulo o la frase intermitente + bool demo; // Indica si el modo demo estará activo + section_t section; // Indicador para el bucle del titulo + section_t nextSection; // Indica cual es la siguiente sección a cargar cuando termine el contador del titulo + Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa + Uint8 postFade; // Opción a realizar cuando termina el fundido + menu_t menu; // Variable con todos los objetos menus y sus variables + struct options_t *options; // Variable con todas las variables de las opciones del programa + options_t optionsPrevious; // Variable de respaldo para las opciones + std::vector availableInputDevices; // Vector con todos los metodos de control disponibles + std::vector deviceIndex; // Indice para el jugador [i] del vector de dispositivos de entrada disponibles // Actualiza las variables del objeto void update(); @@ -100,7 +100,7 @@ private: // Comprueba los eventos void checkEventHandler(); - //Actualiza el tileado de fondo + // Actualiza el tileado de fondo void updateBG(); // Cambia el valor de la variable de modo de pantalla completa diff --git a/source/utils.h b/source/utils.h index 4d65080..7a93f73 100644 --- a/source/utils.h +++ b/source/utils.h @@ -3,6 +3,7 @@ #include #include "ltexture.h" #include +#include #ifndef UTILS_H #define UTILS_H @@ -85,19 +86,19 @@ struct input_t // Estructura con todas las opciones de configuración del programa struct options_t { - Uint8 difficulty; // Dificultad del juego - input_t input[2]; // Modo de control (teclado o mando) - Uint8 language; // Idioma usado en el juego - Uint32 fullScreenMode; // Contiene el valor del modo de pantalla completa - Uint8 windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana - Uint32 filter; // Filtro usado para el escalado de la imagen - bool vSync; // Indica si se quiere usar vsync o no - int screenWidth; // Ancho de la pantalla/ventana - int screenHeight; // Alto de la pantalla/ventana - bool integerScale; // Indica si el escalado de la imagen ha de ser entero en el modo a pantalla completa - bool keepAspect; // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa - bool borderEnabled; // Indica si ha de mostrar el borde en el modo de ventana - float borderSize; // Porcentaje de borde que se añade a lo ventana + Uint8 difficulty; // Dificultad del juego + std::vector input; // Modo de control (teclado o mando) + Uint8 language; // Idioma usado en el juego + Uint32 fullScreenMode; // Contiene el valor del modo de pantalla completa + Uint8 windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana + Uint32 filter; // Filtro usado para el escalado de la imagen + bool vSync; // Indica si se quiere usar vsync o no + int screenWidth; // Ancho de la pantalla/ventana + int screenHeight; // Alto de la pantalla/ventana + bool integerScale; // Indica si el escalado de la imagen ha de ser entero en el modo a pantalla completa + bool keepAspect; // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa + bool borderEnabled; // Indica si ha de mostrar el borde en el modo de ventana + float borderSize; // Porcentaje de borde que se añade a lo ventana }; // Calcula el cuadrado de la distancia entre dos puntos From e46a346d20d387f2246d1a3ed952fecc601a0a0c Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 29 Sep 2022 14:02:13 +0200 Subject: [PATCH 2/2] Trabajando con las animaciones del jugador --- data/gfx/new_player1_body.ani | 9 +++++++++ data/gfx/new_player1_body.png | Bin 0 -> 4739 bytes data/gfx/new_player1_death.ani | 9 +++++++++ .../{player1_death.png => new_player1_death.png} | Bin data/gfx/new_player1_head.ani | 9 +++++++++ data/gfx/new_player1_head.png | Bin 0 -> 2809 bytes data/gfx/new_player1_legs.ani | 9 +++++++++ data/gfx/new_player1_legs.png | Bin 0 -> 529 bytes data/gfx/player1_body.png | Bin 6991 -> 0 bytes data/gfx/player1_head.png | Bin 7032 -> 0 bytes data/gfx/player1_legs.png | Bin 785 -> 0 bytes source/director.cpp | 4 ++-- source/player.cpp | 5 ----- 13 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 data/gfx/new_player1_body.ani create mode 100644 data/gfx/new_player1_body.png create mode 100644 data/gfx/new_player1_death.ani rename data/gfx/{player1_death.png => new_player1_death.png} (100%) create mode 100644 data/gfx/new_player1_head.ani create mode 100644 data/gfx/new_player1_head.png create mode 100644 data/gfx/new_player1_legs.ani create mode 100644 data/gfx/new_player1_legs.png delete mode 100644 data/gfx/player1_body.png delete mode 100644 data/gfx/player1_head.png delete mode 100644 data/gfx/player1_legs.png diff --git a/data/gfx/new_player1_body.ani b/data/gfx/new_player1_body.ani new file mode 100644 index 0000000..9e655a4 --- /dev/null +++ b/data/gfx/new_player1_body.ani @@ -0,0 +1,9 @@ +frameWidth=16 +frameHeight=16 + +[animation] +name=default +speed=8 +loop=-1 +frames=0,1,2,3,4,5,6 +[/animation] \ No newline at end of file diff --git a/data/gfx/new_player1_body.png b/data/gfx/new_player1_body.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4246c02fde79101ccfb97ba6594c78d4ac3b3f GIT binary patch literal 4739 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 Idd@Nb0n6wt{Qv*} literal 0 HcmV?d00001 diff --git a/data/gfx/new_player1_death.ani b/data/gfx/new_player1_death.ani new file mode 100644 index 0000000..9e655a4 --- /dev/null +++ b/data/gfx/new_player1_death.ani @@ -0,0 +1,9 @@ +frameWidth=16 +frameHeight=16 + +[animation] +name=default +speed=8 +loop=-1 +frames=0,1,2,3,4,5,6 +[/animation] \ No newline at end of file diff --git a/data/gfx/player1_death.png b/data/gfx/new_player1_death.png similarity index 100% rename from data/gfx/player1_death.png rename to data/gfx/new_player1_death.png diff --git a/data/gfx/new_player1_head.ani b/data/gfx/new_player1_head.ani new file mode 100644 index 0000000..9e655a4 --- /dev/null +++ b/data/gfx/new_player1_head.ani @@ -0,0 +1,9 @@ +frameWidth=16 +frameHeight=16 + +[animation] +name=default +speed=8 +loop=-1 +frames=0,1,2,3,4,5,6 +[/animation] \ No newline at end of file diff --git a/data/gfx/new_player1_head.png b/data/gfx/new_player1_head.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc7023209bf655ed8df7f50a29a6bc929cd0341 GIT binary patch literal 2809 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 Qz&K{`boFyt=akR{0B+*y0{{R3 literal 0 HcmV?d00001 diff --git a/data/gfx/player1_body.png b/data/gfx/player1_body.png deleted file mode 100644 index 5774b817f31bbee8db6cd91033a8390d6a8c83d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6991 zcmc(k2T&BPBuUOg7$iI7 zoWubJkRUk^=`?%)`#Nh>V%a-U-GnT9eb*OqP*sScNJ&J0D5y`^${Y8jP8Z8HkR|p9V+fY@V!HSQs2> zAe&DhEkYD+|2jmaSu&CIA0A{JO{by!Q%-RrE)-HEFp@YeGcsk&rOL-3tX@j%)i0FX zsF+rvR7OaYWR|V>7ez8tR868!|DQgg&nG=Tw-0`BdQXAr7n`={S`8Yf>Ozg6P&F3j zfJ=@>+zCxP7UKrbjp2^Iw`-5pT=0p~>OxnQ2Xe(XyB^x7s%Q>*w@ny>85QbA=(WT^_vr?-66GN~F?w&%Ej;{&b|BEJCmyX@` z_rAX=YC&gf@H4CuMn+z*Mw!-sPE{a*lrS9-Mc|-Pba$SGaTNUI^xF!e6eP#v5cNq?vLSu7~P5gRX`}66|;#d{e8| z%Ioqn@U&>|KDF*H-hPRY)p%4W>rw4X=Disg7ZX<20CK6~-?`lJH3=)akNwHH7gDboL@=IkeClKfgKfo2F#z<y z2%*NV0oOpuQ6QbA&{8DZL}gVWPLw0n+)}%ESsM$y>CU^xuVSWphp~DcMRbMv7JhPL zV44{u0#+YUNGAa<%nID-9&^%K5Fdrz30w0S(Tpf%@X$FnAUa1Q5p^G1Jj|%$zZus} zG-4aKi_~zr1o0Q9vrj!NAd8~%2E&5qmmpm4T`Ul8?|es0!nRsV`Bsg7g|y@I(Pp@I zD>dGjQJyy%+o!4$$Y*_H!QPe+&yRZJPak-YSh()+_oDry!ARZQ6tdfYo1F2}q@uHJ zI9{$r{0dRdE_ubl&XVFR@Ztp_wg?UnJmKS4+8pnkDDov2Axh7oUY~L9jq$l7k1E#N8`*(Of~B~ zA_M#?X_6CJOzU2Vk(O}BkC&+u8~9l*>6D5QtSxr?R(dEu6OP}eV8^602|bV-ph_e~`I}Wh5K9TlcKhN*q6W@9nS*BA6P`1WdnjsfQ~xcKdIp7m zFa-NXC~p!<=HU!7gY02k!0SV8W?7kFTrp;fVUTLzR%WG_HZGl_Wv4*>%kdL=)`+-| zX45}Gp<`Q%MVVP%-Ir$*0^S+T-kU^=Jx-2;IIr4rw3Oz;^Wf8IEI4nWr?;PP#i#__ z^-^Ar)E1&-d)Ho~M&y;bR1#vq&{9mQC=2CprVZXvq$Pwoa4)+TTQVCATOb8i!a7=O z1_%wFpgtiHhC2)20y*>5a9+^xTc&kUS1NpiTE|9KR#NXZpb1?J6xP+jE{#@WnT$bO zwJ0*%5Z?TEBCOD$%;5mu?GTD(l#Nye9M?KDpQda0*!P?+)mli#L3~uDBHqz_I_gsQk zud?>9!?MKR(iJ}d5=-_sP6R5`v9IG7xgz4(=N~&XfMhRq)_%_mOlUmje&&_R!aDTf zD-iA)gFtu5;YzleNfSY274AbF@Jf%oQPAnI7QyE{R=JXigbI;OY_^+~ayi5ZCr#JB zk-JNgXdhTVD=HS}fI%i0U3sI3-;L`mR^Jx_@iL62`%+6HZEynbK@@d5$$m;Ty{5d$^Kic^MAGIT~ zrR;U94(%tGT+f@hr3H%1&a@jaLUTn>ZyX1#YnkHNNx5(A5Xzc7csF2p&EZzYlyedr z$4!U8qMO>EfE$vciq}zs=h*_vsZ2bTAH}=9_ez9V+l_*XXvVE7ICPn&F7RastLGo1 zDkbN$z!j@u1Cw9t#xsp+My5(9CFIIu33eU;>TJDy9@iR!f`6DHb|Fz*tpA$28Kr<* ztv(-TjSqrhf$ZP%GGv!Hs^){P743{6s^lgs4r>u*x@<>lI~-d&`3e_Zg?$F^T>5bs z)8FoauDY37?lSFBVBwdBXP+76EK$T;@f-UoM#}eKkE3YvD-Lh(NCtw-J&nK{x)t3_ zn-q&@Tg%8#(Dd9;9$sRX7DtHJL^-p)VqG5q1pGumJ7_2Tw>I)u&=rSUQY86#!u>l~8V{9J5aP$A`w zr)7#pwX4z_y_ob~BP2AYJ%od+isX}W4i9gHy!~M_pBXfFo9!0r^1yR`>`v6Z;a|7Z zqt-j~Z0x4%?(f9xzf^Bl)9ebmpNhTcrIXM$m^;%-IV^pF7kS&X)tl>*t{WOOGk9-yOnhWYiea>(V@o(bp_B}4RDD} z?0CWvH3IUDg8t|`70T-Os?$%iTWvo&WPolEhnh7NrA}^fPd92keIEFkZQuf>CnLYN z82f7uT@-6dJ~}(5aOC11Oj{oip^FG~<=>p&Z2QyxzL_NFXk1av)bDUcPJqXHH^AM~ zgDMa1A3pGD3o-t4fW=Kiu}f0+Lh?ml!0H3`Bxald-knsOw$mndalw4q0=LGNV+4BI z-2I;Y(><r22D~8lCAJ#Tz61W^!i!$guaF!1MGr>n zRI5Y!_|JjhE7Pd&DO*purTy|zdyN2(nLyTB*pmFMf_5Rwz%x zZhD@G&?lT)2$BGSvhc>4kCKo&#UmmjH&k&ZKk6cQjOau|J9%H7BuI7-9WQS07rmX1 z08r-xR}_){{ax3u#%RO;FWAvV`w=ar+pJ^tMwRSuXbYg>xFze<8c$W$+AG{yTY&HO zSx=@$U9XF-kq?BT!4QI&1-lS24tb>ypBDI(b_mQXW6f)ejFFkFm zYP$yG^(i7UFTSfduG#+#>;zD;1Nb*R9dJkQr|t97l+Zb=;lTC9gZR10eO zFJ_m@?;pmD?}Zij7ISQM!1byYtb`%W&!b2YRq;Cm4&%NFb}F zzs5V+Wn!wj`04U(H#X7t*<7>dN}1k{oxKCY{@sbN*LU@GxNW`pR~bZ^P12-GZ>kOU zhWfvje4sh3m)8_w!2)H`Me_tv0bzrh zHh}Os0xAb!1$wy8D+*@TOXmMc4C3F&5EpS3iM-Nrv03>73mmiF>o=!}Xu*5ES#~v9 z=|W4r2M#SS;X6Qb{`6?IzgYapgZNZCnOn_GzIs^}h&Lb{ladMdkDhr!56yY-Ur{`X zjcXSdMIK8Wj|#qrpvK>QdjZSkO~a$6gDvAkbHC7}(JhH1LikN#J2Nvjxx|wxflPDK z=W@*e0Np?OHvsB4g^!C$y-0hSeFBiu+1y)<`!cRFOv>;hq`1~2oAJ4}fs!pTLM3E@ zJ;%#NuBQf_uGue4Sq@vK`MvI`k9=s&_c? z5&ky!m@}`6$W#nn(MXK@-p>NvIAV!`bf#32H-hJyP3-#MtgRoL(g9|C7yTm>XhEqu zm3XpD92U=g2+u6Ue}PXvw666UX!D`=OJd>R&og5=J62^w1Dq%0TXrCQ@JAL_UIwE> zTp;fBco4c)K~O;q6xrX4Ic9&0yhV4QJXeIa*>EQp;~0_ujzUX=R=v``5K*dMebUmE zQ#|rY5Bq^i6(Lc|^3as8rsT4DKMu)a^#alRVw`QJuc6hS+5)dc$@uM$Se56tr{u?S z6X8_n{lCJZxw^m7$=ZBccm}ry@zkvo&R+UGpmw9;h8$_bva7Y4RXh7dH_M*Hmr%(b zkZ`ii`o4Zmae4m}>OI|7O0J_EryIi2iI;(^+~r_>dglxDBDdSloJ*c-<2Wik52Yei za^PT^;fz_)kPgt8*qMz)A#*>U9@pi2^IY*gt%Z2T_ySlS9}&S{AjnIk=|fp;P0gO zSL2-BG^F<7CwH(_T?Q*Aj~GNcL4$LB{H8|euIZx))d2j~%r(P>wmV_>4N17x1}PsM z>&X~Bc9nXiF)HtpT7|X7e{K}Iz`5Zals@`hRRK;HO9F{@BcFQ(*oM z_sJXoI3UCdq!d3tg(uXUge(VOXBgKLMaRn9i$SXf)8-wdrB z^=Td|cCEG8=WT;>=)%BOSH$z=FXH(Xvhte138Iu87V%w8&I7Bv?OHJ*@Q&Se%UI@A zaJD`RR$XdFy+*~g)&x%!+Qa}4F*R}Hw81wvd7&WeGuU9`?41Rt+npT7Q`sse&uPzf zKoOObqs#q1`wOxZ*|;L8O8$hD5^oPntUrS0A4V&cRsW05qo=C&} zCrc>7n|k*04Q67TxwBcJ5KIqO`?G-5`didB7=apuV9(l19FTmuwfRC>^52>Iu#@*qtBzWr-t6bIwan`rW(Uw z+LIK%@xM(10xWYY8=Nzg-1+$^k=*h2gS zjJZiVF7zNCGf)aYW=D$L5f#3*cn}_77Tl7}Sngl{H%? zzYZ?8zFiXWwkY~91M)^Vqtai#%n5dd<^Sr-95gV{bNY!)c9tHuD&FT^$hJ?BkZiF$ zXgFERn`7B+yG(BdGEIL|kpC-6%4euUvhK=fsu5d;AeN5W``)v&qT3>sm1MX*AMjeq zp~{Bw@Ll`sH6m~5Z0`fc4765&H0bAQTd*%57*7n0|IWc7c|WC;94QpFSLx!llR*p6 zx8_<%d&i1&6*!ACmv#~6^0IrM%ECXmxZp$mV>sF-zU^9uNmcmw#4>Fi|3LUx1FGx(FYIFjU=3h7~MPhCSkCP ztn>r*0Zk?0*9+`<;bWlFaViCZ+U#k5O`hS0(4x}!gAjX$_J1ITZigOG`Tr(ioJ_6M z_YP6@bU*C@V9I@eZB7cNaTWFwzTPqNN zL*UHv7>{qz2cX%x5;}TQh4?xdmZIzxC8v2mKJN^Vw{{`0fb9Y(8(vzcj})mr`DEK* z;L|8#+TY84w$snl-l#g8oPYH8Ux|bB!qQSy;&r5&t$(iy4#qm2KTYADk$gy?#ftUz z@2qj`$_+fRBTfzAs}R!XtNM*~C7Beq7_CvIwj7VWd%o-~9!|N~$vr$nL2HMls=u&~ zh2LQs)L9%+E0|;$bX$Vh4!5uYr84jVVfm=_ CLAyHu diff --git a/data/gfx/player1_head.png b/data/gfx/player1_head.png deleted file mode 100644 index 93b6502422644ad63ec94cc2c58b04a0091c1487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7032 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 dV`O&{|{(p8w>yd diff --git a/data/gfx/player1_legs.png b/data/gfx/player1_legs.png deleted file mode 100644 index 24218209f55f55d4d89b47f3623a3f1a5b526f99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 785 zcmV+s1Md8ZP)Px%%Sl8*RCt{2+&^d&Q5*;GZ#0+#p}2O^p%glI31sM$W;mpSm{Ki5&@MW0I&=PcMCmn=95X*D8yvw_ncbE4rSO0!LQ!aP+?)QH8F3Wuh zKtx1DL_|bHL_|bHL_`)UrMk#+JpbWArsMsoa_YwVk}m+@-AOb2UTsA4&Hc#n>M=h) zeMGCfZQP%vQmTvmo#n{*>NV4j`?tu;59>?5Sef@mTYlJpSNJpq_w?v}u3f8&US}9y%k&Fy)%8#O1gXsjfDaeL*n(uia#A+u#GRic?Gt614-l=- zby4jwLG^so#7zxzd7@ON`Ka~9-5?vkqJAPGA|fIpA|fIp zA|j%HRMr`vY5tcCkcsgW{pX zmkoTp*vHH7%f?2_r{nD?FSK=RN=Br639a9dv}9D~TltYN<$rpeAy)VHb7^8IN%iWP zARESDR3nq*DBR?OehzXD!O-Y-nk>}eS=NfY{)ozm!a+O8>#%!od)<-YG zrTK9UNpn+eLs