• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed SFML - sf::FloatRect, problem z metodą contains()

Object Storage Arubacloud
0 głosów
635 wizyt
pytanie zadane 14 stycznia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 14 stycznia 2019 przez Jakub 0

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 :)

komentarz zamknięcia: problem rozwiązany.

1 odpowiedź

0 głosów
odpowiedź 14 stycznia 2019 przez C☺ndzi Stary wyjadacz (12,100 p.)
wybrane 14 stycznia 2019 przez Jakub 0
 
Najlepsza
Czy używasz sf::Mouse::getPosition( window )? samo getPosition() zwraca pozycję na monitorze, a z parametrem względem podanego okna.
komentarz 14 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
Tak, używam. Ale tak jak powiedziałem problem nie dotyczy tego że kontakt z kursorem jest w ogóle błędnie wykrywany, mam na myśli tylko to czemu wszystko działa poprawnie przy bezpośrednim dostępie do obiektu typu sf::RectangleShape a już nic nie jest wykrywane kiedy wykorzystamy do tego metodę interfejsu klasy.
1
komentarz 14 stycznia 2019 przez C☺ndzi Stary wyjadacz (12,100 p.)
Widzę problem - sf::FloatRect sf::RectangleShape::getGlobalBounds() prawdopodobnie nie zwraca *referencji*, a ty zwracasz const referencję - czyli zwracasz referencję do obiektu, który jest niszczony po wyjsciu z funkcji getParticleRect. Sprawdź czy działa zwracając kopię (czyli po prostu usuń & w getParticleRect)
komentarz 14 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
dziękuje, teraz działa :)

Zastanawiam się tylko z jakiego powodu nie ma możliwości zwrócenia referencji na dany typ...
1
komentarz 14 stycznia 2019 przez C☺ndzi Stary wyjadacz (12,100 p.)

To wygląda jakoś tak:
 

// Nie zwraca referencji, więc to kopia
FloatRect RectangleShape::getGlobalBounds()
{
    return FloatRect{x, y, x + size.x, y + size.y};
}

// Tutaj chcesz zwrócić referencję
const FloatRect& Partcile::getParticleRect()
{
    // obiekt, który zwrócił rectangle.getGlobalBounds()
    // jest od razu niszczony po wyjściu z funkcji
    return rectangle.getGlobalBounds();
}

// Ponieważ powyższy kod jest równoznaczny z tym:
const FloatRect& Partcile::getParticleRect()
{
    FloatRect rect = rectangle.getGlobalBounds();

    return rect;
}

 

komentarz 14 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
wielkie dzięki za pomoc. Pozdrawiam.

Podobne pytania

0 głosów
2 odpowiedzi 395 wizyt
0 głosów
0 odpowiedzi 537 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez sofnir Gaduła (4,690 p.)
0 głosów
3 odpowiedzi 405 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez sprytny22 Obywatel (1,130 p.)

92,762 zapytań

141,686 odpowiedzi

320,497 komentarzy

62,106 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...