From 198aa45d59b3dfc414d965d1deeb2cd8da2d16ad Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 5 Jan 2025 07:32:30 +0100 Subject: [PATCH] Afegida una lluna i un sol al fondo --- data/gfx/game/game_moon.png | Bin 0 -> 3425 bytes data/gfx/game/game_sun.png | Bin 0 -> 4906 bytes source/background.cpp | 97 ++++++++++++++++++++++++++++++++---- source/background.h | 50 +++++++++++++------ source/director.cpp | 4 +- source/game.cpp | 21 ++++---- 6 files changed, 136 insertions(+), 36 deletions(-) create mode 100644 data/gfx/game/game_moon.png create mode 100644 data/gfx/game/game_sun.png diff --git a/data/gfx/game/game_moon.png b/data/gfx/game/game_moon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9ddc8d7c52e8f8df3a33552074e423eff2df77 GIT binary patch literal 3425 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�>ln+gg=@59M*L6fz(F`Eg$AlTob*83Q7%gZFxud$Tv@T#!ZtyuwQ5k7?axh z0;&a3^B_8sA!zi_jJ zXWRw(0hCslC`F2*EDHhK!IdSMz)$s zliBc*w+H~RLBccchWr5$f*8E2C1C9Is`-CUV66G|#W}m5|BzeF9v%Z=@_)tAo@esEW2~`V zBq;m>)$GrO#8VzhWGqE$?vC(`yCr|1A_VLlA1*=e=&FXzG{4&X;qdYdPv97}(eHef z^uI9f8FXbht;-)AN3@+l&k0SY0&$CkXWTvc12e`5*!;=teKk8c@{^4LXpH|*HF)Cx zrt8!ZenwsMyYQ%Pw}vK1J;<$-KJYN)4-|v|7=HrkObc}?GxH~eK)>ZxN0WP=0prlA z`xH`59`2o#^e(cMZP)hihVYDsBY%LxqxLks0I12q=SvP~wt9p1JbJw&y*^h5!ZPB2 z$o|cRCYQ#;lD`2hQ6lF+JEE3Ci!1;tbQ!TrWnGArr#!^Dha^1X;mF^(e8(2iGH&5C zJ`2Ia6Q1!9eoRCh4oz>$}3D3A&@}IbThYor% zp%2RjVmyGP=XvcNo?p+7tq!c|GKHM<*_q9rF22jPcL`0gVXU8*GOSxVEHIdmI;$k7D=cR>CHR~9a5{gO7; z6>)v{ovwbU-XfIlSun=sX{EhzvSt`TGNUzbD_;~#p)1|_l*%Ky@8`NT(o~JDjbezfmhOq#s>7(EK zs(+x4ah3ddP$AeX`5XTPJJaqhT3#JO#$4?mbL@X1x9N3Cv$OYOMFwZ~aAJYeUV(iB zMzm8Gf;~1#{tEHk>Srw)Uc-LbIUu+B9RYP=s<Vsugk*(cd4fR zqfMeG=t6)ElK+f#JMHZnwzF%3yi8zCF$c$eH>;YRmn>(KNLOY4E!&)w>`pk;?gz%< z)h+~kY>ND6{FTwQ*|(2NsUd7(zmu6B2}%=G4 z*bMm-jj#L8#2MWt$>%^rpZx8teof^_ul|CXM$Q>_K7^Vzzf5vVmb*23+;4n%A=nK0 z_h=z{yeQ6r@ynj`QfmGJlb>g7X5$0uD7()O`8pl6%2sdF^*XZwFh~5XJsw&JN?P<{ zNIo${att`X-WlQD@d$b9@+9%O;x~+!ER2s>+=>eNTUcmZ_*BUs&M>dj8EbWBj&AAq zXVEcLBu(kogy8DrZwzU2&X^+*t%N^Rjn46hCb~>XkUu_BcYjHgMXBOBS!gv|s8%CE z+30SKj1MgYTQPfTW)9~t<+#h%L&-4W%}0J^m2p&{Z{mLF)t4y1AF@Oe9yv-Ot^dx1H$_CQxW~w=|)y(a*~sW_47} zuWR$Wza`}XEv;+j`1hWGuocbkP}5c=t-b`|2eZF}pWDwVNU7n_Y;cY>zmD9xsE%`R z6ve#7JKv>GunEl%Ow1q6OFhHrHt=L$n($m_x1=F!dM1J9Oa?b# z_OW~YuFh?1y?Rg3SlLaWuo8oAbD0+VewF1q4EbF=KkA@u?KI(J{NS8=cOhu2l!?Zyznjr<;raeBmh8}^oL6#zhuNQUq9E!)G{w{ISpEx)}MX-dzZ=aqc}y{XXmktuDtXVvU`um* z?g^XJ=%?a}bB9LNpzGP;Eunb6YyRcXLU`7Uo6_5N#2=bRdn*NgOWX4yYA+Dg9U_u;erIEX%2i%5uNw@U76L_y{3YTa+Ay2%)5(82mNac9Lb8Qft4rYoAqa3Ae3)~k(O|uP zf=>SB5hhReLLSl|0A>q83z41XAC)aBkxu?)Q6s*VeMrm@0!3y5mGTsw{L7O2biXA$+OaS?`On8GBe>2n?xepkI{D8-7RsD+ZE0>w$BO7S z{~1XBM;Mr={YS*VrwMIaNB@lR3 // Para SDL_BLENDMODE_BLEND #include // Para SDL_PIXELFORMAT_RGBA8888 #include // Para clamp, max -#include "moving_sprite.h" // Para MovingSprite -#include "param.h" // Para Param, ParamBackground, param -#include "resource.h" // Para Resource -#include "screen.h" // Para Screen -#include "sprite.h" // Para Sprite -#include "texture.h" // Para Texture +#include +#include "moving_sprite.h" // Para MovingSprite +#include "param.h" // Para Param, ParamBackground, param +#include "resource.h" // Para Resource +#include "screen.h" // Para Screen +#include "sprite.h" // Para Sprite +#include "texture.h" // Para Texture // Constructor Background::Background() @@ -18,16 +19,22 @@ Background::Background() bottom_clouds_texture_(Resource::get()->getTexture("game_clouds2.png")), grass_texture_(Resource::get()->getTexture("game_grass.png")), gradients_texture_(Resource::get()->getTexture("game_sky_colors.png")), + sun_texture_(Resource::get()->getTexture("game_sun.png")), + moon_texture_(Resource::get()->getTexture("game_moon.png")), rect_({0, 0, gradients_texture_->getWidth() / 2, gradients_texture_->getHeight() / 2}), src_rect_({0, 0, 320, 240}), dst_rect_({0, 0, 320, 240}), base_(rect_.h), - color_(Color(param.background.attenuate_color.r, param.background.attenuate_color.g, param.background.attenuate_color.b)), + attenuate_color_(Color(param.background.attenuate_color.r, param.background.attenuate_color.g, param.background.attenuate_color.b)), alpha_color_text_(param.background.attenuate_alpha), alpha_color_text_temp_(param.background.attenuate_alpha) { + // Precalcula rutas + createSunPath(); + createMoonPath(); + // Inicializa variables { gradient_rect_[0] = {0, 0, rect_.w, rect_.h}; @@ -55,9 +62,11 @@ Background::Background() bottom_clouds_sprite_a_ = std::make_unique(bottom_clouds_texture_, (SDL_Rect){0, bottom_clouds_y, rect_.w, bottom_clouds_texture_->getHeight()}); bottom_clouds_sprite_b_ = std::make_unique(bottom_clouds_texture_, (SDL_Rect){rect_.w, bottom_clouds_y, rect_.w, bottom_clouds_texture_->getHeight()}); - buildings_sprite_ = std::make_unique(buildings_texture_, 0, 0, buildings_texture_->getWidth(), buildings_texture_->getHeight()); + buildings_sprite_ = std::make_unique(buildings_texture_); gradient_sprite_ = std::make_unique(gradients_texture_, 0, 0, rect_.w, rect_.h); grass_sprite_ = std::make_unique(grass_texture_, 0, 0, grass_texture_->getWidth(), grass_texture_->getHeight() / 2); + sun_sprite_ = std::make_unique(sun_texture_); + moon_sprite_ = std::make_unique(moon_texture_); } // Inicializa objetos @@ -79,6 +88,8 @@ Background::Background() buildings_sprite_->setY(base_ - buildings_sprite_->getHeight()); grass_sprite_->setY(base_ - grass_sprite_->getHeight()); + sun_sprite_->setPosition(sun_path_.front()); + moon_sprite_->setPosition(moon_path_.front()); } // Crea la textura para componer el fondo @@ -88,7 +99,7 @@ Background::Background() // Crea la textura para atenuar el fondo color_texture_ = SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, rect_.w, rect_.h); SDL_SetTextureBlendMode(color_texture_, SDL_BLENDMODE_BLEND); - setColor(color_); + setColor(attenuate_color_); SDL_SetTextureAlphaMod(color_texture_, alpha_color_text_); } @@ -114,6 +125,10 @@ void Background::update() // Calcula el valor de alpha_ alpha_ = std::max((255 - (int)(255 * transition_)), 0); + // Mueve el sol + sun_sprite_->setPosition(sun_path_.at(sun_index_)); + moon_sprite_->setPosition(moon_path_.at(moon_index_)); + // Incrementa el contador ++counter_; @@ -181,6 +196,10 @@ void Background::fillCanvas() // Dibuja el gradiente de fondo renderGradient(); + // Dibuja los astros + sun_sprite_->render(); + moon_sprite_->render(); + // Dibuja las nubes de arriba renderTopClouds(); @@ -250,13 +269,13 @@ void Background::setPos(SDL_Rect pos) // Establece el color_ de atenuación void Background::setColor(Color color) { - color_ = color; + attenuate_color_ = color; // Colorea la textura auto temp = SDL_GetRenderTarget(renderer_); SDL_SetRenderTarget(renderer_, color_texture_); - SDL_SetRenderDrawColor(renderer_, color_.r, color_.g, color_.b, 255); + SDL_SetRenderDrawColor(renderer_, attenuate_color_.r, attenuate_color_.g, attenuate_color_.b, 255); SDL_RenderClear(renderer_); SDL_SetRenderTarget(renderer_, temp); @@ -322,4 +341,60 @@ void Background::updateClouds() { bottom_clouds_sprite_b_->setPosX(bottom_clouds_sprite_b_->getWidth()); } +} + +// Precalcula el vector con el recorrido del sol +void Background::createSunPath() +{ + constexpr int OFFSET_X = 94; // Desplazamiento en la textura del sol hasta el sol + constexpr int OFFSET_Y = 48; // Desplazamiento en la textura del sol hasta el sol + constexpr int CENTER_X = 270; + const int center_y = base_ - 30; + constexpr int RADIUS = 130; + const int EXTRA_PIXELS = 30; // Píxeles adicionales para la línea recta + + // Generar puntos de la curva desde 90 a 180 grados + for (double theta = M_PI / 2; theta <= M_PI; theta += 0.01) + { + int x = CENTER_X + static_cast(RADIUS * cos(theta)); + int y = center_y - static_cast(RADIUS * sin(theta)); // Nota: y está invertido en la pantalla + sun_path_.push_back({x - OFFSET_X, y - OFFSET_Y}); + } + + // Agregar puntos en línea recta después de la curva + SDL_Point last_point = sun_path_.back(); + for (int i = 1; i <= EXTRA_PIXELS; ++i) + { + sun_path_.push_back({last_point.x, last_point.y + i}); + } +} + +// Precalcula el vector con el recorrido de la luna +void Background::createMoonPath() +{ + constexpr int CENTER_X = 100; + const int center_y = base_ - 50; + constexpr int RADIUS = 140; + + // Generar puntos de la curva desde 0 a 90 grados + for (double theta = 0; theta <= M_PI / 2; theta += 0.01) + { + int x = CENTER_X + static_cast(RADIUS * cos(theta)); + int y = center_y - static_cast(RADIUS * sin(theta)); // Nota: y está invertido en la pantalla + moon_path_.push_back({x, y}); + } +} + +// Establece la posición del sol +void Background::setSunProgression(float progress) +{ + progress = std::clamp(progress, 0.0f, 1.0f); + sun_index_ = static_cast(progress * (sun_path_.size() - 1)); +} + +// Establece la posición de la luna +void Background::setMoonProgression(float progress) +{ + progress = std::clamp(progress, 0.0f, 1.0f); + moon_index_ = static_cast(progress * (moon_path_.size() - 1)); } \ No newline at end of file diff --git a/source/background.h b/source/background.h index d323b91..7db1c9e 100644 --- a/source/background.h +++ b/source/background.h @@ -51,6 +51,8 @@ private: std::shared_ptr bottom_clouds_texture_; // Textura con las nubes de fondo std::shared_ptr grass_texture_; // Textura con la hierba del suelo std::shared_ptr gradients_texture_; // Textura con los diferentes colores de fondo del juego + std::shared_ptr sun_texture_; // Textura con el sol + std::shared_ptr moon_texture_; // Textura con la luna std::unique_ptr top_clouds_sprite_a_; // Sprite para las nubes superiores std::unique_ptr top_clouds_sprite_b_; // Sprite para las nubes superiores @@ -60,26 +62,32 @@ private: std::unique_ptr buildings_sprite_; // Sprite con los edificios de fondo std::unique_ptr gradient_sprite_; // Sprite con los graficos del degradado de color de fondo std::unique_ptr grass_sprite_; // Sprite para la hierba + std::unique_ptr sun_sprite_; // Sprite para el sol + std::unique_ptr moon_sprite_; // Sprite para la luna SDL_Texture *canvas_; // Textura para componer el fondo SDL_Texture *color_texture_; // Textura para atenuar el fondo // Variables - SDL_Rect gradient_rect_[4]; // Vector con las coordenadas de los 4 degradados para el cielo - SDL_Rect top_clouds_rect_[4]; // Vector con las coordenadas de los 4 nubes de arriba - SDL_Rect bottom_clouds_rect_[4]; // Vector con las coordenadas de los 4 nubes de abajo - int gradient_number_ = 0; // Indica el número de degradado de fondo que se va a dibujar - int alpha_ = 0; // Transparencia entre los dos degradados - float clouds_speed_ = 0; // Velocidad a la que se desplazan las nubes - float transition_ = 0; // Nivel de transición del fondo 0..1 - int counter_ = 0; // Contador interno - SDL_Rect rect_; // Tamaño del objeto fondo - SDL_Rect src_rect_; // Parte del objeto fondo que se va a dibujará en pantalla - SDL_Rect dst_rect_; // Posición donde dibujar la parte del objeto fondo que se dibujará en pantalla - int base_; // Linea de fondo coincidente con el area inferior de la zona de juego - Color color_; // Color para atenuar el fondo - int alpha_color_text_; // Alpha para atenuar el fondo - int alpha_color_text_temp_; // Valor temporal para hacer la transición de alpha + SDL_Rect gradient_rect_[4]; // Vector con las coordenadas de los 4 degradados para el cielo + SDL_Rect top_clouds_rect_[4]; // Vector con las coordenadas de los 4 nubes de arriba + SDL_Rect bottom_clouds_rect_[4]; // Vector con las coordenadas de los 4 nubes de abajo + int gradient_number_ = 0; // Indica el número de degradado de fondo que se va a dibujar + int alpha_ = 0; // Transparencia entre los dos degradados + float clouds_speed_ = 0; // Velocidad a la que se desplazan las nubes + float transition_ = 0; // Nivel de transición del fondo 0..1 + int counter_ = 0; // Contador interno + SDL_Rect rect_; // Tamaño del objeto fondo + SDL_Rect src_rect_; // Parte del objeto fondo que se va a dibujará en pantalla + SDL_Rect dst_rect_; // Posición donde dibujar la parte del objeto fondo que se dibujará en pantalla + int base_; // Linea de fondo coincidente con el area inferior de la zona de juego + Color attenuate_color_; // Color para atenuar el fondo + int alpha_color_text_; // Alpha para atenuar el fondo + int alpha_color_text_temp_; // Valor temporal para hacer la transición de alpha + std::vector sun_path_; // Vector con el recorrido del sol + std::vector moon_path_; // Vector con el recorrido de la luna + size_t sun_index_; // Posición del vector del recorrido del sol + size_t moon_index_; // Posición del vector del recorrido de la luna // Dibuja el gradiente de fondo void renderGradient(); @@ -99,6 +107,12 @@ private: // Actualiza las nubes void updateClouds(); + // Precalcula el vector con el recorrido del sol + void createSunPath(); + + // Precalcula el vector con el recorrido de la luna + void createMoonPath(); + public: // Constructor Background(); @@ -132,4 +146,10 @@ public: // Establece la transparencia de la atenuación void setAlpha(int alpha); + + // Establece la posición del sol + void setSunProgression(float progress); + + // Establece la posición de la luna + void setMoonProgression(float progress); }; \ No newline at end of file diff --git a/source/director.cpp b/source/director.cpp index ce597d4..5fa848c 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -54,7 +54,7 @@ Director::Director(int argc, const char *argv[]) section::name = section::Name::GAME; section::options = section::Options::GAME_PLAY_1P; #elif DEBUG - section::name = section::Name::GAME; + section::name = section::Name::LOGO; #else // NORMAL GAME section::name = section::Name::LOGO; section::attract_mode = section::AttractMode::TITLE_TO_DEMO; @@ -467,6 +467,8 @@ void Director::setFileList() Asset::get()->add(prefix + "/data/gfx/game/game_grass.png", AssetType::BITMAP); Asset::get()->add(prefix + "/data/gfx/game/game_power_meter.png", AssetType::BITMAP); Asset::get()->add(prefix + "/data/gfx/game/game_sky_colors.png", AssetType::BITMAP); + Asset::get()->add(prefix + "/data/gfx/game/game_sun.png", AssetType::BITMAP); + Asset::get()->add(prefix + "/data/gfx/game/game_moon.png", AssetType::BITMAP); } { // Intro diff --git a/source/game.cpp b/source/game.cpp index a116591..8cea7ff 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -36,6 +36,7 @@ #include "text.h" // Para Text #include "texture.h" // Para Texture #include "mouse.h" +#include "dbgtxt.h" struct JA_Sound_t; // lines 37-37 // Constructor @@ -855,8 +856,8 @@ void Game::renderPathSprites() void Game::killPlayer(std::shared_ptr &player) { if (!player->isPlaying() || player->isInvulnerable()) - { - // Si no está jugando o tiene inmunidad, no hace nada + { + // Si no está jugando o tiene inmunidad, no hace nada return; } @@ -969,9 +970,9 @@ void Game::updateBackground() } // Calcula la velocidad en función de los globos explotados y el total de globos a explotar para acabar el juego - constexpr float clouds_initial_speed = 0.05f; - constexpr float clouds_final_speed = 2.00f - clouds_initial_speed; - const float cloudsSpeed = (-clouds_initial_speed) + (-clouds_final_speed * (static_cast(Stage::total_power) / total_power_to_complete_game_)); + constexpr float CLOUDS_INITIAL_SPEED = 0.05f; + constexpr float CLOUDS_FINAL_SPEED = 2.00f - CLOUDS_INITIAL_SPEED; + const float cloudsSpeed = (-CLOUDS_INITIAL_SPEED) + (-CLOUDS_FINAL_SPEED * (static_cast(Stage::total_power) / total_power_to_complete_game_)); background_->setCloudsSpeed(cloudsSpeed); // Calcula la transición de los diferentes fondos @@ -981,6 +982,11 @@ void Game::updateBackground() background_->setGradientNumber(static_cast(gradient_number)); background_->setTransition(percent); + // Calcula la posición del sol + constexpr float sun_final_power = num * 2; + background_->setSunProgression(Stage::total_power / sun_final_power); + background_->setMoonProgression(Stage::total_power / static_cast(total_power_to_complete_game_)); + // Actualiza el objeto background_->update(); } @@ -1690,9 +1696,6 @@ void Game::initDemo(int player_id) // Configura los marcadores scoreboard_->setMode(SCOREBOARD_LEFT_PANEL, ScoreboardMode::DEMO); scoreboard_->setMode(SCOREBOARD_RIGHT_PANEL, ScoreboardMode::DEMO); - - // Añade unos cuantos globos - // balloon_manager_->createRandomBalloons(); } // Modo grabar demo @@ -1931,7 +1934,7 @@ void Game::updateGameStatePlaying() #ifdef DEBUG if (auto_pop_balloons_) { - Stage::addPower(20); + Stage::addPower(5); } #endif updatePlayers();