Hej, piszę w C++/SFML system cząsteczek. Po kliknięciu na jakąś ma ona zostać rozdzielona na dwie tymczasowe części:
Warunek sprawdzający czy kursor myszy jest na pozycji danej cząstki:
if (it->m_particle.getGlobalBounds().contains(mouseCursor) && it->isRegenerated())
Ponieważ klasa cząstki jest zaprzyjaźniona z klasą systemu cząstek to jak widać stosuje bezpośredni dostęp do składowej prywatnej:
class AlphaParticleSystem::AlphaParticle : public sf::Drawable {
friend class AlphaParticleSystem;
private:
bool m_regenerated;
private:
static constexpr float MinAngle = 0.f;
static constexpr float MaxAngle = 360.f;
static constexpr float MinMoveSpeed = 100.f;
static constexpr float MaxMoveSpeed = 200.f;
static constexpr float MinLifeTimeInSec = 2.f;
static constexpr float MaxLifeTimeInSec = 6.f;
static constexpr float MinParticleSize = 40.f;
static constexpr float MaxParticleSize = 70.f;
static constexpr float MinRotateSpeed = -200.f;
static constexpr float MaxRotateSpeed = 200.f;
private:
sf::Vector2f m_velocity;
float m_remaingLifeTime;
float m_moveSpeed;
float m_rotateSpeed;
sf::RectangleShape m_particle;
static std::pair<float, float> getVectorBasedAngle(float angle);
public:
AlphaParticle(float size, float angle, float moveSpeed, float rotateSpeed, float lifeTime,
sf::Vector2f emitter, sf::Color color, bool regenerated = true);
AlphaParticle(sf::Vector2f emitter, bool regenerated = true);
void regenerate(sf::Vector2f emitter);
float getRemaingLifeTime() const;
void update(float deltaTime);
bool isRegenerated() const;
const sf::Color& getCurrentColor() const;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
const sf::FloatRect& getParticleRect() const;
};
Działa tu wszystko ok. Gorzej kiedy wykorzystam w warunku publiczną funkcje cząstki getParticleRect() :
if (it->getParticleRect().contains(mouseCursor) && it->isRegenerated()) {
Niby ta funkcja zwraca to samo co getGlobalBounds(), a jednak tu "kolizja" z kursorem nie jest wykrywalna. Z góry dziękuje za pomoc :)