• 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()

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
728 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 516 wizyt
0 głosów
0 odpowiedzi 595 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez sofnir Gaduła (4,690 p.)
0 głosów
3 odpowiedzi 451 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez sprytny22 Obywatel (1,130 p.)

93,188 zapytań

142,204 odpowiedzi

322,027 komentarzy

62,516 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2704p. - Tomasz Bielak
  5. 2678p. - Łukasz Siedlecki
  6. 2666p. - rucin93
  7. 2627p. - CC PL
  8. 2485p. - Marcin Putra
  9. 2418p. - Michal Drewniak
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2127p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...