From e0e35125a9e8b6cfe423d85859eecc867e8750c0 Mon Sep 17 00:00:00 2001 From: Andrey Suvorov Date: Sun, 16 Jun 2024 23:25:19 +0300 Subject: [PATCH 1/2] dino push --- sem2/SuvorovAM/HW2/HW2/.vs/HW2/v17/.suo | Bin 30720 -> 31744 bytes sem2/SuvorovAM/dino/dino/Brachiosaur.txt | 25 ++ sem2/SuvorovAM/dino/dino/Button.h | 49 +++ sem2/SuvorovAM/dino/dino/DINO_INFO.txt | 3 + .../SuvorovAM/dino/dino/DINO_INFO_DEFAULT.txt | 4 + sem2/SuvorovAM/dino/dino/Dino.h | 249 +++++++++++++ sem2/SuvorovAM/dino/dino/DinoGame.cpp | 101 +++++ sem2/SuvorovAM/dino/dino/DinoGame.sln | 31 ++ sem2/SuvorovAM/dino/dino/DinoGame.vcxproj | 151 ++++++++ .../dino/dino/DinoGame.vcxproj.filters | 57 +++ .../SuvorovAM/dino/dino/DinoGame.vcxproj.user | 4 + sem2/SuvorovAM/dino/dino/DinoType.h | 5 + sem2/SuvorovAM/dino/dino/Fight.h | 350 ++++++++++++++++++ .../dino/dino/GameData/DinoSprites/Dino1.png | Bin 0 -> 165641 bytes .../GameData/DinoSprites/Dino1_attack.png | Bin 0 -> 171995 bytes .../dino/dino/GameData/DinoSprites/Dino2.png | Bin 0 -> 286824 bytes .../GameData/DinoSprites/Dino2_attack.png | Bin 0 -> 272779 bytes .../dino/dino/GameData/DinoSprites/Dino3.png | Bin 0 -> 229992 bytes .../GameData/DinoSprites/Dino3_attack.png | Bin 0 -> 220334 bytes .../dino/dino/GameData/Dino_background.png | Bin 0 -> 6187 bytes sem2/SuvorovAM/dino/dino/GameData/Logo.png | Bin 0 -> 430517 bytes sem2/SuvorovAM/dino/dino/GameData/Shop.png | Bin 0 -> 1693085 bytes .../dino/dino/GameData/Terrain/Mountain.png | Bin 0 -> 1454775 bytes .../dino/dino/GameData/Terrain/Plain.png | Bin 0 -> 296595 bytes .../dino/dino/GameData/Terrain/River.png | Bin 0 -> 1642459 bytes sem2/SuvorovAM/dino/dino/GameData/arial.ttf | Bin 0 -> 1045960 bytes sem2/SuvorovAM/dino/dino/GameData/temp.png | Bin 0 -> 24617 bytes sem2/SuvorovAM/dino/dino/Player.h | 138 +++++++ sem2/SuvorovAM/dino/dino/Shop.h | 184 +++++++++ sem2/SuvorovAM/dino/dino/TextureLoader.h | 35 ++ sem2/SuvorovAM/dino/dino/Triceratops.txt | 13 + sem2/SuvorovAM/dino/dino/Tyrannosaur.txt | 9 + sem2/SuvorovAM/dino/dino/includes.h | 18 + 33 files changed, 1426 insertions(+) create mode 100644 sem2/SuvorovAM/dino/dino/Brachiosaur.txt create mode 100644 sem2/SuvorovAM/dino/dino/Button.h create mode 100644 sem2/SuvorovAM/dino/dino/DINO_INFO.txt create mode 100644 sem2/SuvorovAM/dino/dino/DINO_INFO_DEFAULT.txt create mode 100644 sem2/SuvorovAM/dino/dino/Dino.h create mode 100644 sem2/SuvorovAM/dino/dino/DinoGame.cpp create mode 100644 sem2/SuvorovAM/dino/dino/DinoGame.sln create mode 100644 sem2/SuvorovAM/dino/dino/DinoGame.vcxproj create mode 100644 sem2/SuvorovAM/dino/dino/DinoGame.vcxproj.filters create mode 100644 sem2/SuvorovAM/dino/dino/DinoGame.vcxproj.user create mode 100644 sem2/SuvorovAM/dino/dino/DinoType.h create mode 100644 sem2/SuvorovAM/dino/dino/Fight.h create mode 100644 sem2/SuvorovAM/dino/dino/GameData/DinoSprites/Dino1.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/DinoSprites/Dino1_attack.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/DinoSprites/Dino2.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/DinoSprites/Dino2_attack.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/DinoSprites/Dino3.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/DinoSprites/Dino3_attack.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/Dino_background.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/Logo.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/Shop.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/Terrain/Mountain.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/Terrain/Plain.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/Terrain/River.png create mode 100644 sem2/SuvorovAM/dino/dino/GameData/arial.ttf create mode 100644 sem2/SuvorovAM/dino/dino/GameData/temp.png create mode 100644 sem2/SuvorovAM/dino/dino/Player.h create mode 100644 sem2/SuvorovAM/dino/dino/Shop.h create mode 100644 sem2/SuvorovAM/dino/dino/TextureLoader.h create mode 100644 sem2/SuvorovAM/dino/dino/Triceratops.txt create mode 100644 sem2/SuvorovAM/dino/dino/Tyrannosaur.txt create mode 100644 sem2/SuvorovAM/dino/dino/includes.h diff --git a/sem2/SuvorovAM/HW2/HW2/.vs/HW2/v17/.suo b/sem2/SuvorovAM/HW2/HW2/.vs/HW2/v17/.suo index eb25533854179ab4039fc69088282312c72e7f60..aa6d8784429b54c51d2a22d3517a836b4a5e73a8 100644 GIT binary patch delta 2267 zcmcIkT}+#06n@|KEA)?_vGOwt(n8q=v``3fJQw6 zkK!hnQ_S&Ou&o#p4CsLVs%j0+orqH$=9F`)7@B{;uCl5o7cD(Pi+Bc+g(ycD5oL%| z2sL7FY2ciRq97rbLk?s^!;E$%q8_m{V1-Y$mXbEKGfy-B?YPcEtPJRRLeV3WwtriB zKw30Qq;LNZ(%Hs&BE28~v}_mPEFAJv=EVpiPkV_kB}V)yIZAjxhy7SZ=p(yOp2}O$@UjU$aLQTY5!I=p#G?QT;p*!nVF&O?0XdR3w@8`LlrhM}Tnf?F533%0F&8mYjR1HWxVAQ5R3iPeD+V7IUv))b8( zjtcO4kw?Ysw8c|Z16xHSLbkjgW{MwaI5jA>M&_CV%)yE)5?JzVk%tDKTXG^tfHch)|lgc6ibokzo|);9T})ZlmtgI(JV{u)H<`_)wF za|eg(ji7IENX}~6NzFD5(S~Wd=_>6y$_)e2fcM9$;jXzn&vAd@&&`*Ie{J|e+opS{1|FD){6I*; zPlkcSWw+2s`{jb&ARBg1*YPI&7#Kk`G^=i*FA3ipJg{zfm?(2;q?i1Ois>Z9a6b-6 zU%Vuk$iPaIDx-)Lydip|)af0|C@v1cy3r01=evp8PW54-lQXr0{Gaktw@{w2Q|LL= zR6W8`J#`1}j#*HOvKMcCu1Or z9q%TMS3S6i7tvtgVDw<3@uI|ocMVM-frHeUc2P7)y!etYGjHbYyl;NqCbn2&oh=3q zbGysJae1gS#7-uYAv06cLLs}?|1in7vtsb@u7boDTXSUoBdb97vJ2vToLz@azEjYn z0b-s?3FUdjItOuGTtABH5NzuzE|j2#akDEQb$QR;ih8NGFFQm+^x3}5FG`#aKRB4aq3k#Mlp|3QH4-+I zc1_1JW_?7A(jZA`m=TnQ6*;;rCe1@$T7RW)6hM?^u*d?q<@KzzIu?_1dHEEE7)MMX z6vQNgND*MoQOb5i!0RF0Bf_iMpqbiSh@jVb1r zOI!9O+Q!7c@T`ALJn;qrwt{bRR8Qgs*~*2Y1_Mnf?K7UJR;#G+XQ^PrcL`ScfU5X0 zU5;KjJ&oKj6?I6Al5}bob*vVNIu+P(%CO)Jiu4np7edDcl!LJ8jEToktK4I~29vJ& zWD_>kR2ory8wU(x=+RRG7yeyTR?Ppd8eMH_E8R>PDkU zfSvBJ8g5y(rMiqy#`^?44Ng!Un0mnS{-rsISpimOn+|LajJY3sZuc$SH*^_WzkOa? k>Fo*))|wWF3lwkQ#mx`T=RQ5X!{HyH7&_}8rN;Aq0C_jIvj6}9 diff --git a/sem2/SuvorovAM/dino/dino/Brachiosaur.txt b/sem2/SuvorovAM/dino/dino/Brachiosaur.txt new file mode 100644 index 00000000..a6c432af --- /dev/null +++ b/sem2/SuvorovAM/dino/dino/Brachiosaur.txt @@ -0,0 +1,25 @@ + + :+**=. + --+##= + :##= + +##. + -##= + :##+ + :##* + -### + =### + =###. + -###= + :####-..:---:: + *####***#+*#*#*=-: + +##**+**++*****#**+-. + +%###*+*****+++****##++=::. + :%%%#***##**++***+*#######**+==-:. + %%%%%#%%######%###=: + #%+=##*+*#*%%%*%#+ + *%-:##+ -%%+%#- + #%. ##= +%=+%+ + #* .#*. :+=. ##. + .+#- -#= -== + :**: + . diff --git a/sem2/SuvorovAM/dino/dino/Button.h b/sem2/SuvorovAM/dino/dino/Button.h new file mode 100644 index 00000000..2d61fc79 --- /dev/null +++ b/sem2/SuvorovAM/dino/dino/Button.h @@ -0,0 +1,49 @@ +#pragma once + +#include + + +#include "SFML/Graphics.hpp" + +class Button { +private: + sf::Sprite sp_button; + +public: + sf::Text text; + + Button(int x, int y, int width, int height, sf::Font& font, std::string buttonText, const sf::Texture& texture) { + sp_button.setTexture(texture); + sp_button.setPosition(sf::Vector2f(x, y)); + sp_button.setScale( + static_cast(width) / texture.getSize().x, + static_cast(height) / texture.getSize().y + ); + + text.setFont(font); + text.setString(buttonText); + text.setCharacterSize(36); + text.setStyle(sf::Text::Bold); + text.setFillColor(sf::Color::White); + text.setOutlineColor(sf::Color::Black); + text.setOutlineThickness(1.0f); + + sf::FloatRect textRect = text.getLocalBounds(); + text.setOrigin(textRect.left + textRect.width / 2.0f, textRect.top + textRect.height / 2.0f); + text.setPosition(x + width / 2.0f, y + height / 2.0f); + } + + void draw(sf::RenderWindow& window) { + window.draw(sp_button); + window.draw(text); + } + + bool isOverlapped(sf::RenderWindow& window) { + sf::Vector2i mousePos = sf::Mouse::getPosition(window); + sf::Vector2f buttonPos = sp_button.getPosition(); + sf::Vector2f buttonSize = sf::Vector2f(sp_button.getGlobalBounds().width, sp_button.getGlobalBounds().height); + + return (mousePos.x >= buttonPos.x && mousePos.x <= buttonPos.x + buttonSize.x && + mousePos.y >= buttonPos.y && mousePos.y <= buttonPos.y + buttonSize.y); + } +}; \ No newline at end of file diff --git a/sem2/SuvorovAM/dino/dino/DINO_INFO.txt b/sem2/SuvorovAM/dino/dino/DINO_INFO.txt new file mode 100644 index 00000000..76a6e603 --- /dev/null +++ b/sem2/SuvorovAM/dino/dino/DINO_INFO.txt @@ -0,0 +1,3 @@ +205 +1 100 100 +1 100 100 diff --git a/sem2/SuvorovAM/dino/dino/DINO_INFO_DEFAULT.txt b/sem2/SuvorovAM/dino/dino/DINO_INFO_DEFAULT.txt new file mode 100644 index 00000000..5ea6bbd7 --- /dev/null +++ b/sem2/SuvorovAM/dino/dino/DINO_INFO_DEFAULT.txt @@ -0,0 +1,4 @@ +555 +1 100 100 +1 100 100 +1 100 100 diff --git a/sem2/SuvorovAM/dino/dino/Dino.h b/sem2/SuvorovAM/dino/dino/Dino.h new file mode 100644 index 00000000..af80666d --- /dev/null +++ b/sem2/SuvorovAM/dino/dino/Dino.h @@ -0,0 +1,249 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SFML/Graphics.hpp" +#include "DinoType.h" +#include "TextureLoader.h" + +class Dino { +private: + std::string fileName; + sf::Sprite cardSprite; + sf::Font font; + sf::Text nameText; + sf::Text HPText; + sf::Texture t_dino_stand; + sf::Texture t_dino_attack; + sf::Texture cardTexture; + sf::Color originalColor; + sf::Clock damageClock; + sf::Clock attackClock; + bool isDamaged; + bool isAttacking; + + void organizeText(sf::Text& text, std::string textString, sf::Vector2f position) { + text.setFont(font); + text.setString(textString); + text.setCharacterSize(24); + text.setPosition(position); + text.setOutlineColor(sf::Color::Black); + text.setOutlineThickness(2.f); + } + + std::string getDinoName(DINO_Type type) { + switch (type) { + case Tyrannosaur: + return "Tyrannosaur"; + case Brachiosaur: + return "Brachiosaur"; + case Triceratops: + return "Triceratops"; + default: + return "Dino"; + } + } + + void ClockUpdate() { + if (isDamaged && damageClock.getElapsedTime().asSeconds() > 1) { + sp_dino.setColor(originalColor); + isDamaged = false; + } + if (isAttacking && attackClock.getElapsedTime().asSeconds() <= 1) { + sp_dino.setTexture(t_dino_attack); + } + else { + sp_dino.setTexture(t_dino_stand); + isAttacking = false; + } + if (isDead) { + Rotate(); + } + } + +protected: + int STR = 30; + int DEX = 15; + int INT = 10; + +public: + int HP = 100, cost = 0; + DINO_Type type; + sf::Sprite sp_dino; + sf::Sprite sp_AttackPhase; + bool isSelected = false, isDead = false; + + bool GetDamageFromEnemy(int damage) { + HP -= damage; + isDamaged = true; + damageClock.restart(); + sp_dino.setColor(sf::Color::Red); + + if (HP <= 0) { + HP = 0; + return true; + } + return false; + } + + int attackDamage = 10; + + Dino(DINO_Type type) : type(type) { // OLD DINO + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution distr(10, 30); + + STR = distr(gen); + DEX = distr(gen); + INT = distr(gen); + + font.loadFromFile("GameData/Arial.ttf"); + + switch (type) { + case DINO_Type::Triceratops: + t_dino_stand = TextureLoader::getInstance().getTexture("GameData/DinoSprites/Dino2.png"); + t_dino_attack.loadFromFile("GameData/DinoSprites/Dino2_attack.png"); + fileName = "Triceratops.txt"; + cost = 200; + HP = 135; + break; + case DINO_Type::Tyrannosaur: + t_dino_stand = TextureLoader::getInstance().getTexture("GameData/DinoSprites/Dino3.png"); + t_dino_attack.loadFromFile("GameData/DinoSprites/Dino3_attack.png"); + fileName = "Tyrannosaur.txt"; + cost = 150; + HP = 110; + break; + case DINO_Type::Brachiosaur: + t_dino_stand = TextureLoader::getInstance().getTexture("GameData/DinoSprites/Dino1.png"); + t_dino_attack.loadFromFile("GameData/DinoSprites/Dino1_attack.png"); + fileName = "Brachiosaur.txt"; + cost = 100; + HP = 100; + break; + default: + std::cerr << "Unknown dino type" << std::endl; + return; + } + + cardTexture = TextureLoader::getInstance().getTexture("GameData/Dino_background.png"); + cardSprite.setTexture(cardTexture); + cardSprite.setScale(1.0f, 1.1f); + cardSprite.setPosition(0, 30); + + sp_dino.setTexture(t_dino_stand); + sp_dino.setScale(0.5f, 0.5f); + sp_dino.setPosition(0, 40); + + sp_AttackPhase.setTexture(t_dino_attack); + sp_AttackPhase.setScale(0.5f, 0.5f); + sp_AttackPhase.setPosition(0, 40); + + isDamaged = false; + isAttacking = false; + originalColor = sp_dino.getColor(); + } + + void draw(sf::RenderWindow& window, sf::Vector2f position) { + organizeText(nameText, getDinoName(type), sf::Vector2f(0, 40)); + organizeText(HPText, std::to_string(HP) + " HP", sf::Vector2f(0, 25)); + + cardSprite.setPosition(position); + sp_dino.setPosition(position.x, position.y + 65); + sp_dino.setScale(0.5f, 0.5f); + nameText.setPosition(sf::Vector2f(position.x + 20, position.y + 25)); + HPText.setPosition(sf::Vector2f(position.x + 20, position.y + 45)); + + ClockUpdate(); + + window.draw(cardSprite); + window.draw(sp_dino); + window.draw(nameText); + window.draw(HPText); + } + + void draw(sf::RenderWindow& window, sf::Vector2f position, bool drawCard, bool invert, float scaleMultiplier) { + organizeText(nameText, getDinoName(type), sf::Vector2f(0, 0)); + organizeText(HPText, std::to_string(HP) + " HP", sf::Vector2f(0, 25)); + + cardSprite.setPosition(position); + sp_dino.setPosition(invert ? position.x + 90 : position.x, position.y + 45); + sp_dino.setScale(invert ? -0.5f : 0.5f, 0.5f); + sp_dino.setScale(sp_dino.getScale() * scaleMultiplier); + + nameText.setPosition(position); + HPText.setPosition(sf::Vector2f(position.x, position.y + 25)); + + ClockUpdate(); + + if (drawCard) { + window.draw(cardSprite); + } + window.draw(sp_dino); + if (scaleMultiplier > 1.0f) { + window.draw(nameText); + window.draw(HPText); + } + } + + void triggerAttack() { + isAttacking = true; + attackClock.restart(); + } + + void Rotate() { + sp_dino.setColor(sf::Color::Color(0, 0, 0, 220)); + } + + virtual ~Dino() {} + + virtual int damage(Terrain terrain) = 0; +}; + + +class DinoStr : public Dino { +public: + DinoStr(DINO_Type type) : Dino(type) {} + + int damage(Terrain terrain) override { + attackDamage = STR; + if (terrain == Plain) + attackDamage *= 2; + return attackDamage; + } + +}; + +class DinoDex : public Dino { +public: + DinoDex(DINO_Type type) : Dino(type) {} + + int damage(Terrain terrain) override { + attackDamage = DEX; + if (terrain == River) + attackDamage *= 2; + return attackDamage; + } + +}; + +class DinoInt : public Dino { +public: + DinoInt(DINO_Type type) : Dino(type) {} + + int damage(Terrain terrain) override { + attackDamage = INT; + if (terrain == Mountain) + attackDamage *= 2; + return attackDamage; + } + +}; \ No newline at end of file diff --git a/sem2/SuvorovAM/dino/dino/DinoGame.cpp b/sem2/SuvorovAM/dino/dino/DinoGame.cpp new file mode 100644 index 00000000..49df7bbf --- /dev/null +++ b/sem2/SuvorovAM/dino/dino/DinoGame.cpp @@ -0,0 +1,101 @@ +#include "includes.h" + +using namespace std; + + +void drawMainMenu(sf::RenderWindow& window, sf::Font& font, std::vector