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

question-closed Sfml obracanie wokol punktu

Object Storage Arubacloud
0 głosów
807 wizyt
pytanie zadane 2 lipca 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)
zamknięte 3 lipca 2017 przez 10kw10
Jak moge obrocic sprite wokol punktu innego niz origin?

Czyli ogolnie obracam wokol origin, a jesli chce to wokol np srodka sprita po czym origin wraca na swoje miejsce. :D

Moze da sie przeciazyc? metode rotate i jako drugi argument podac ten punkt?

Gdzie moge zobaczyc cialo funkcji rotate?
komentarz zamknięcia: .

2 odpowiedzi

+1 głos
odpowiedź 2 lipca 2017 przez Knayder Nałogowiec (37,640 p.)
wybrane 3 lipca 2017 przez 10kw10
 
Najlepsza

Ciało funkcji setRotation (Bo rotate, to setRotation(getRotation() + angle) możesz zobaczyć tutaj:
https://github.com/SFML/SFML/blob/master/src/SFML/Graphics/Transformable.cpp#L72

Z tego co zrozumiałem, to chciałbyś obracać sprita wokół jego środka, a pozycjonować względem rogu.
Spróbuj zrobić to tak, jak zrobiłem to w tym kodzie.
 

#include <iostream>
#include <SFML/Graphics.hpp>


class Pawn : public sf::Drawable, public sf::Transformable {
	sf::RectangleShape shape;

	virtual void draw(sf::RenderTarget &target, sf::RenderStates states) const override {
		states.transform *= getTransform();
		target.draw(shape, states);
	}
public:
	Pawn() : shape({ 200,200 })
	{
		shape.setPosition(100, 100);
		shape.setOrigin(100, 100);
	}
	void rotate(const float &angle) {
		setRotation(shape.getRotation() + angle);
	}

	void setRotation(const float &angle) {
		shape.setRotation(angle);
	}
	float getRotation() {
		return shape.getRotation();
	}


};

int main()
{
	sf::RenderWindow window(sf::VideoMode(1280, 720), "Title");
	Pawn pawn;
	while (window.isOpen()) {
		sf::Event event;
		while (window.pollEvent(event)) {
			if (event.type == sf::Event::Closed)
				window.close();
		}
		
		pawn.setPosition((sf::Vector2f)sf::Mouse::getPosition(window));
		pawn.rotate(0.1);
		window.clear(sf::Color(37,37,48));
		window.draw(pawn);
		window.display();
	}

	return 0;
}

Tutaj masz parę screenów z działania aplikacji:
http://imgur.com/a/ae5Yw

Za każdym przejściem pętli, nadaję mu pozycję myszki oraz obracam o 0.1f
 

komentarz 2 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
co w twoim kodzie sprawia ze pozycjonuje sie wedlug lewego gornego rogu (lub innego punktu innego niz wedlug ktorego wykonuje sie obrot) ?

Jak widze origin ustawiasz na (100,100) a potem ustawiasz jego pozycje na pozycje myszki wiec bd w srodku a nie w rogu.
komentarz 2 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
i nie do konca o cos takiego.

Raz chcialbym obrocic wokol innego srodka, a raz wokol innego srodka.
komentarz 2 lipca 2017 przez Knayder Nałogowiec (37,640 p.)
W takim przypadku zmieniaj po prostu origin za pomocą setOrigin za każym razem.
komentarz 2 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
gdy zmienie origin, zmieni sie takze pozycja
komentarz 2 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
znaczy nie do konca. Ulozenie sprita na scenie
komentarz 2 lipca 2017 przez Knayder Nałogowiec (37,640 p.)
W takim razie, możesz wykorzystać kod który wykorzystałem na początku i utworzyć w nim jeszcze taką metodę.

(Na telefonie piszę i nie działa mi przycisk do wstawiania kodu, przepraszam)

void setOrigin(const float &x, const float &y){

    shape.setOrigin(x, y);

    shape.setPosition(x, y);

}

 

Nie daję gwarancji, że zadziała, aczkolwiek powinno na 90%
komentarz 2 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
jak to dziala ze bierze lewy gorny rog a nie origin ? :D
komentarz 2 lipca 2017 przez Knayder Nałogowiec (37,640 p.)
Zauważ że klasa Pawn dziedziczy po sf::Transformable. Metodą setPosition dla obiektu klasy Pawn, zmieniamy pozycje Transforma dla Pawna, a zasłonięte metody rotacji i origin, działają dla shape w klasie Pawn.
komentarz 3 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
poradzilem sobie w troche inny sposob ale dzieki za pomoc
0 głosów
odpowiedź 2 lipca 2017 przez Patrycjerz Mędrzec (192,320 p.)

Ustawiasz po prostu origin jako współrzędną punktu względem lewego górnego rogu sprite'a. On nie zmienia się aż do kolejnego jego zmienienia.

Mam nadzieję, że znasz metodę setOrigin

komentarz 2 lipca 2017 przez 10kw10 Pasjonat (22,880 p.)
zle mnie zrozumiales

Podobne pytania

0 głosów
0 odpowiedzi 327 wizyt
pytanie zadane 5 lutego 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)
–1 głos
1 odpowiedź 182 wizyt
pytanie zadane 6 lipca 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)
–1 głos
1 odpowiedź 363 wizyt
pytanie zadane 2 marca 2016 w C i C++ przez Maciek123233 Gaduła (3,400 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...