splitted skilltree
This commit is contained in:
		
							parent
							
								
									611dca5dcc
								
							
						
					
					
						commit
						06377bd12a
					
				
					 4 changed files with 409 additions and 337 deletions
				
			
		|  | @ -5,7 +5,7 @@ project(skilltree) | ||||||
| find_package(SFML 2.5 REQUIRED graphics window system) | find_package(SFML 2.5 REQUIRED graphics window system) | ||||||
| 
 | 
 | ||||||
| # Создадим исполняемый файл по имени player_movement из исходных файлов | # Создадим исполняемый файл по имени player_movement из исходных файлов | ||||||
| add_executable(skilltree src/skilltree.cpp) | add_executable(skilltree src/skilltree.cpp src/node.cpp) | ||||||
| 
 | 
 | ||||||
| # Укажем, что нужно использовать стандарт C++20 | # Укажем, что нужно использовать стандарт C++20 | ||||||
| target_compile_features(skilltree PRIVATE cxx_std_20) | target_compile_features(skilltree PRIVATE cxx_std_20) | ||||||
|  |  | ||||||
							
								
								
									
										241
									
								
								term2/seminar04_factory/src/node.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								term2/seminar04_factory/src/node.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,241 @@ | ||||||
|  | #include "node.hpp" | ||||||
|  | 
 | ||||||
|  | Node::Node(sf::Vector2f& position) : mPosition{position} {} | ||||||
|  | 
 | ||||||
|  | void Node::addChild(const std::shared_ptr<Node>& child) | ||||||
|  | { | ||||||
|  |     mChildren.push_back(child); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::Vector2f Node::getPosition() | ||||||
|  | { | ||||||
|  |     return mPosition; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Node::unblock() | ||||||
|  | { | ||||||
|  |     mState = State::Unblocked; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Node::block() | ||||||
|  | { | ||||||
|  |     mState = State::Blocked; | ||||||
|  |     for (const auto& child : mChildren) | ||||||
|  |         child->block(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Node::onMousePressed(sf::Vector2f mouseCoords) | ||||||
|  | { | ||||||
|  |     if (mState == State::Blocked) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     if (collisionTest(mouseCoords))  | ||||||
|  |     { | ||||||
|  |         if (mState == State::Unblocked)  | ||||||
|  |         { | ||||||
|  |             mState = State::Activated; | ||||||
|  |             for (const auto& child : mChildren) | ||||||
|  |                 child->unblock(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         else if (mState == State::Activated) | ||||||
|  |         { | ||||||
|  |             mState = State::Unblocked; | ||||||
|  |             for (const auto& child : mChildren) | ||||||
|  |                 child->block(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (const auto& child : mChildren) | ||||||
|  |     { | ||||||
|  |         child->onMousePressed(mouseCoords); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* HitNode */ | ||||||
|  | 
 | ||||||
|  | HitNode::HitNode(sf::Vector2f position) : Node{position} {} | ||||||
|  | 
 | ||||||
|  | void HitNode::loadTexture() | ||||||
|  | { | ||||||
|  |     sf::String texturePath = getIconPath(); | ||||||
|  |     if (!mTexture.loadFromFile(texturePath)) | ||||||
|  |     { | ||||||
|  |         cout << "Error! Can't load file " << texturePath.toAnsiString() << endl; | ||||||
|  |         std::exit(1); | ||||||
|  |     } | ||||||
|  |     mSprite.setTexture(mTexture); | ||||||
|  |     mSprite.setOrigin({mRadius, mRadius}); | ||||||
|  |     mSprite.setPosition(mPosition); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | sf::Color HitNode::getCurrentColor() const | ||||||
|  | { | ||||||
|  |     if (mState == State::Unblocked) | ||||||
|  |         return sUnlockedColor; | ||||||
|  |     else if (mState == State::Activated) | ||||||
|  |         return sActivatedColor; | ||||||
|  |     return sBlockedColor; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void HitNode::draw(sf::RenderWindow& window) const | ||||||
|  | { | ||||||
|  |     for (const auto& el : mChildren) | ||||||
|  |     { | ||||||
|  |         sfLine connectionLine {mPosition, el->getPosition(), getCurrentColor(), 2}; | ||||||
|  |         connectionLine.draw(window); | ||||||
|  |         el->draw(window); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     static sf::CircleShape shape(mRadius); | ||||||
|  |     shape.setOrigin({mRadius, mRadius}); | ||||||
|  |     shape.setFillColor(getCurrentColor()); | ||||||
|  |     shape.setPosition(mPosition); | ||||||
|  |     window.draw(shape); | ||||||
|  | 
 | ||||||
|  |     window.draw(mSprite); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool HitNode::collisionTest(sf::Vector2f mouseCoords)  | ||||||
|  | { | ||||||
|  |     sf::Vector2f d = mPosition - mouseCoords; | ||||||
|  |     return d.x * d.x + d.y * d.y < mRadius * mRadius; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* BombSkillNode */ | ||||||
|  | 
 | ||||||
|  | BombSkillNode::BombSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String BombSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_bomb.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* SpikesSkillNode */ | ||||||
|  | SpikesSkillNode::SpikesSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String SpikesSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_spikes.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* LightningSkillNode */ | ||||||
|  | LightningSkillNode::LightningSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String LightningSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_lightning.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* EyeSkillNode */ | ||||||
|  | 
 | ||||||
|  | EyeSkillNode::EyeSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String EyeSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_eye.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* ClawsSkillNode */ | ||||||
|  | ClawsSkillNode::ClawsSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String ClawsSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_claws.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* ShieldSkillNode */ | ||||||
|  | ShieldSkillNode::ShieldSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String ShieldSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_shield.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* SwordSkillNode */ | ||||||
|  | SwordSkillNode::SwordSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String SwordSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_sword.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* ShurikenSkillNode */ | ||||||
|  | ShurikenSkillNode::ShurikenSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String ShurikenSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_shuriken.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* WindSkillNode */ | ||||||
|  | WindSkillNode::WindSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String WindSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_shuriken.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* MeteoriteSkillNode */ | ||||||
|  | MeteoriteSkillNode::MeteoriteSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String MeteoriteSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_meteorite.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* HandSkillNode */ | ||||||
|  | HandSkillNode::HandSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String HandSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_hand.png"}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* EarthquakeSkillNode */ | ||||||
|  | EarthquakeSkillNode::EarthquakeSkillNode(sf::Vector2f position) : HitNode{position}  | ||||||
|  | { | ||||||
|  |     loadTexture(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sf::String EarthquakeSkillNode::getIconPath()  | ||||||
|  | { | ||||||
|  |     return sf::String{"icons/icon_earthquake.png"}; | ||||||
|  | } | ||||||
							
								
								
									
										165
									
								
								term2/seminar04_factory/src/node.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								term2/seminar04_factory/src/node.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,165 @@ | ||||||
|  | #include <SFML/Graphics.hpp> | ||||||
|  | #include <cmath> | ||||||
|  | #include <vector> | ||||||
|  | #include <string> | ||||||
|  | #include <memory> | ||||||
|  | #include <iostream> | ||||||
|  | #include "sfline.hpp" | ||||||
|  | 
 | ||||||
|  | using std::cout, std::endl; | ||||||
|  | 
 | ||||||
|  | class Node | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     Node(sf::Vector2f& position); | ||||||
|  |     enum class State | ||||||
|  |     { | ||||||
|  |         Blocked, | ||||||
|  |         Unblocked, | ||||||
|  |         Activated | ||||||
|  |     }; | ||||||
|  |     void addChild(const std::shared_ptr<Node>& child); | ||||||
|  |     sf::Vector2f getPosition(); | ||||||
|  |     void unblock(); | ||||||
|  |     void block(); | ||||||
|  |     virtual bool collisionTest(sf::Vector2f mouseCoords) = 0; | ||||||
|  |     void onMousePressed(sf::Vector2f mouseCoords); | ||||||
|  |     virtual void draw(sf::RenderWindow& window) const = 0; | ||||||
|  | protected: | ||||||
|  |     sf::Vector2f mPosition {0, 0}; | ||||||
|  |     State mState = State::Blocked; | ||||||
|  | 
 | ||||||
|  |     std::vector<std::shared_ptr<Node>> mChildren {}; | ||||||
|  | 
 | ||||||
|  |     inline static sf::Color sBlockedColor   {40, 40, 40}; | ||||||
|  |     inline static sf::Color sUnlockedColor  {80, 80, 40}; | ||||||
|  |     inline static sf::Color sActivatedColor {160, 160, 40}; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class HitNode : public Node | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |     HitNode(sf::Vector2f position);  | ||||||
|  | 
 | ||||||
|  |     virtual sf::String getIconPath() = 0; | ||||||
|  |     void loadTexture(); | ||||||
|  |     sf::Color getCurrentColor() const; | ||||||
|  | 
 | ||||||
|  |     void draw(sf::RenderWindow& window) const; | ||||||
|  | 
 | ||||||
|  |     bool collisionTest(sf::Vector2f mouseCoords) override; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|  |     sf::Texture mTexture; | ||||||
|  |     sf::Sprite mSprite; | ||||||
|  | 
 | ||||||
|  |     float mRadius = 24; | ||||||
|  |     bool mIsActivated = false; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class BombSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     BombSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class SpikesSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     SpikesSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class LightningSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     LightningSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EyeSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     EyeSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ClawsSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     ClawsSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class ShieldSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     ShieldSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class SwordSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     SwordSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ShurikenSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     ShurikenSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class WindSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     WindSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class MeteoriteSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     MeteoriteSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class HandSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     HandSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class EarthquakeSkillNode : public HitNode | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     EarthquakeSkillNode(sf::Vector2f position); | ||||||
|  | 
 | ||||||
|  |     sf::String getIconPath() override; | ||||||
|  | }; | ||||||
|  | @ -4,345 +4,11 @@ | ||||||
| #include <string> | #include <string> | ||||||
| #include <memory> | #include <memory> | ||||||
| #include "sfline.hpp" | #include "sfline.hpp" | ||||||
|  | #include "node.hpp" | ||||||
| #include <iostream> | #include <iostream> | ||||||
| 
 | 
 | ||||||
| using std::cout, std::endl; | using std::cout, std::endl; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|     Icons from Ken111 |  | ||||||
|     https://www.flaticon.com/ru/packs/game-skill?k=1650700359068
 |  | ||||||
| 
 |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class Node |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     Node(sf::Vector2f& position)  |  | ||||||
|         : mPosition{position} |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     enum class State |  | ||||||
|     { |  | ||||||
|         Blocked, |  | ||||||
|         Unblocked, |  | ||||||
|         Activated |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     void addChild(const std::shared_ptr<Node>& child) |  | ||||||
|     { |  | ||||||
|         mChildren.push_back(child); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::Vector2f getPosition() |  | ||||||
|     { |  | ||||||
|         return mPosition; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void unblock() |  | ||||||
|     { |  | ||||||
|         mState = State::Unblocked; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void block() |  | ||||||
|     { |  | ||||||
|         mState = State::Blocked; |  | ||||||
|         for (const auto& child : mChildren) |  | ||||||
|             child->block(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     virtual bool collisionTest(sf::Vector2f mouseCoords) = 0; |  | ||||||
| 
 |  | ||||||
|     void onMousePressed(sf::Vector2f mouseCoords) |  | ||||||
|     { |  | ||||||
|         if (mState == State::Blocked) |  | ||||||
|             return; |  | ||||||
| 
 |  | ||||||
|         if (collisionTest(mouseCoords))  |  | ||||||
|         { |  | ||||||
|             if (mState == State::Unblocked)  |  | ||||||
|             { |  | ||||||
|                 mState = State::Activated; |  | ||||||
|                 for (const auto& child : mChildren) |  | ||||||
|                     child->unblock(); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             else if (mState == State::Activated) |  | ||||||
|             { |  | ||||||
|                 mState = State::Unblocked; |  | ||||||
|                 for (const auto& child : mChildren) |  | ||||||
|                     child->block(); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         for (const auto& child : mChildren) |  | ||||||
|         { |  | ||||||
|             child->onMousePressed(mouseCoords); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     virtual void draw(sf::RenderWindow& window) const = 0; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 
 |  | ||||||
|     sf::Vector2f mPosition {0, 0}; |  | ||||||
|     State mState = State::Blocked; |  | ||||||
| 
 |  | ||||||
|     std::vector<std::shared_ptr<Node>> mChildren {}; |  | ||||||
| 
 |  | ||||||
|     inline static sf::Color sBlockedColor   {40, 40, 40}; |  | ||||||
|     inline static sf::Color sUnlockedColor  {80, 80, 40}; |  | ||||||
|     inline static sf::Color sActivatedColor {160, 160, 40}; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class HitNode : public Node |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 
 |  | ||||||
|     HitNode(sf::Vector2f position)  |  | ||||||
|         : Node{position} |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     virtual sf::String getIconPath() = 0; |  | ||||||
| 
 |  | ||||||
|     void loadTexture() |  | ||||||
|     { |  | ||||||
|         sf::String texturePath = getIconPath(); |  | ||||||
|         if (!mTexture.loadFromFile(texturePath)) |  | ||||||
|         { |  | ||||||
|             cout << "Error! Can't load file " << texturePath.toAnsiString() << endl; |  | ||||||
|             std::exit(1); |  | ||||||
|         } |  | ||||||
|         mSprite.setTexture(mTexture); |  | ||||||
|         mSprite.setOrigin({mRadius, mRadius}); |  | ||||||
|         mSprite.setPosition(mPosition); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     sf::Color getCurrentColor() const |  | ||||||
|     { |  | ||||||
|         if (mState == State::Unblocked) |  | ||||||
|             return sUnlockedColor; |  | ||||||
|         else if (mState == State::Activated) |  | ||||||
|             return sActivatedColor; |  | ||||||
|         return sBlockedColor; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void draw(sf::RenderWindow& window) const |  | ||||||
|     { |  | ||||||
|         for (const auto& el : mChildren) |  | ||||||
|         { |  | ||||||
|             sfLine connectionLine {mPosition, el->getPosition(), getCurrentColor(), 2}; |  | ||||||
|             connectionLine.draw(window); |  | ||||||
|             el->draw(window); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         static sf::CircleShape shape(mRadius); |  | ||||||
|         shape.setOrigin({mRadius, mRadius}); |  | ||||||
|         shape.setFillColor(getCurrentColor()); |  | ||||||
|         shape.setPosition(mPosition); |  | ||||||
|         window.draw(shape); |  | ||||||
| 
 |  | ||||||
|         window.draw(mSprite); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     bool collisionTest(sf::Vector2f mouseCoords) override |  | ||||||
|     { |  | ||||||
|         sf::Vector2f d = mPosition - mouseCoords; |  | ||||||
|         return d.x * d.x + d.y * d.y < mRadius * mRadius; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 
 |  | ||||||
|     sf::Texture mTexture; |  | ||||||
|     sf::Sprite mSprite; |  | ||||||
| 
 |  | ||||||
|     float mRadius = 24; |  | ||||||
|     bool mIsActivated = false; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class BombSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     BombSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_bomb.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class SpikesSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     SpikesSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_spikes.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class LightningSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     LightningSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_lightning.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class EyeSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     EyeSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_eye.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class ClawsSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     ClawsSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_claws.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class ShieldSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     ShieldSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_shield.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class SwordSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     SwordSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_sword.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class ShurikenSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     ShurikenSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_shuriken.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class WindSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     WindSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_shuriken.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class MeteoriteSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     MeteoriteSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_meteorite.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class HandSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     HandSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_hand.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class EarthquakeSkillNode : public HitNode |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     EarthquakeSkillNode(sf::Vector2f position) : HitNode{position}  |  | ||||||
|     { |  | ||||||
|         loadTexture(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     sf::String getIconPath() override |  | ||||||
|     { |  | ||||||
|         return sf::String{"icons/icon_earthquake.png"}; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| std::shared_ptr<Node> createSkillTree() | std::shared_ptr<Node> createSkillTree() | ||||||
| { | { | ||||||
|     std::shared_ptr<Node> root  {new LightningSkillNode({400, 500})}; |     std::shared_ptr<Node> root  {new LightningSkillNode({400, 500})}; | ||||||
|  |  | ||||||
		Reference in a new issue