pajdas Temat założony przez niniejszego użytkownika |
podążanie obiektu za myszką » 2016-06-16 17:32:41 Chcę zrobić grę w SFML. Pewnie zastanawiacie sie dlaczego nie umieściłem tego w dziale z tworzeniem gier 2d. Dlatego, że mam problem z aspektem programowania i matematyki, a mianowicie za podążaniem obrazka za myszą. Wiem, że w internecie jest BARDZO dużo tego typu tematów. Mój plan jest taki, chce zrobić na początku mały program który będzie robić w sumie dwie rzeczy.
Pierwszą jest to aby obiekt obracał się z stronę kursora. Więc mamy takie dane: pozycja kursora i pozycja obrazka. Nieznany jest kąt, wiem, że można to obliczyć jakoś przez sin i cos, ale jest pewien problem, mianowicie chodzę dopiero do drugiej gimnazjum. Trochę przeczytałem w internecie i wiem w sumie jak się oblicza to ale nie wiem jak to zastosować, jak przeliczyć wynik sinusa alfa na stopnie w okręgu. Nie wiem czym jest sin i cos a jak to przełożyć do C++ to już w ogóle nie mam pojęcia.
Drugą funkcją mojego programu który chce zrobić jest przemieszczanie się tego obiektu w stronę kursora po naciśnięciu np. spacji. Nie wiem gdzie ma być punkt do którego będzie miał zmierzać obiekt po wykonaniu każdej pętli programu. Nie wiem jak ustawiać prędkość ruchu. Nie mam pomysłu jak to wykonać, a dodatkowo brak mojej wiedzy matematycznej zaczyna mnie przygniatać.
Proszę o pomoc. Najlepszą pomocą byłoby po prostu napisanie mi programu, który będzie robił to co opisałem wyżej czyli obracanie się za myszką, a po wciśnięciu spacji będzie podążać za myszką nawet w tedy kiedy ona zmieni swoje położenie (czyli zmieni się też kierunek ruchu obrazka). Program niech będzie proceduralnie bez podziału na inne pliki jeśli to możliwe.
Przepraszam, że w sumie proszę was o wykonanie całej roboty za mnie. Oczywiście jakiekolwiek wytłumaczenie będzie także dla mnie zadowalające, bo przecież lepsze jest zrozumienie czegoś niż posiadanie tego.
|
|
michal11 |
» 2016-06-16 17:57:26 Pewnie masz jakiegoś sprajta którego chcesz poruszać. Wtedy masz matefoę getPosition(). W namespace Mouse masz funckję getPosition(const Window &relativeTo). Jak już masz te 2 pkt. to pozostaje zwykła matematyka. Nawet znalazłem jakiś swój stary kod, może to ci pomoże Vector2i mousePos( Mouse::getPosition( window ) ); Vector2f rectPos( rect.getPosition() );
angle = atan2(( mousePos.y - rectPos.y ),( mousePos.x - rectPos.x ) );
if( Keyboard::isKeyPressed( Keyboard::Space ) ) { rect.move( cos( angle ) * SPEED * dt, sin( angle ) * SPEED * dt ); }
|
|
Gibas11 |
» 2016-06-16 18:26:52 @up Łatwiej policzyć to z Pitagorasa, zwłaszcza początkującym. ;) Btw sf::Mouse to klasa a nie przestrzeń nazw.
class SFML_WINDOW_API Mouse
|
|
pajdas Temat założony przez niniejszego użytkownika |
» 2016-06-16 18:29:17 dziękuje za pomoc...ale #include <SFML/Graphics.hpp> #include <windows.h> #include <cmath>
int SPEED;
sf::Texture tekstura; sf::Sprite obrazek;
double angle;
int main() { sf::Texture tekstura; sf::Sprite obrazek; sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "rotacja w SFML" ); tekstura.loadFromFile( "droga.jpg" ); obrazek.setTexture( tekstura ); while( oknoAplikacji.isOpen() ) { oknoAplikacji.clear( sf::Color::Black ); sf::Vector2i pozycjaMyszy = sf::Mouse::getPosition( oknoAplikacji ); Vector2f rectPos( rect.getPosition() ); angle = atan2 (( pozycjaMyszy.y - rectPos.y ),( pozycjaMyszy.x - rectPos.x ) ); if( Keyboard::isKeyPressed( Keyboard::Space ) ) { rect.move( cos( angle ) * SPEED * dt , sin( angle ) * SPEED * dt ); } oknoAplikacji.display(); } return 0; }
Dobra wszysko ogarniam z wyjątkiem tego dt Nie mam pojęcia co to Prosze o pomoc najlepiej jeszcze dziś #include <SFML/Graphics.hpp> #include <windows.h> #include <cmath>
int SPEED;
sf::Texture tekstura; sf::Sprite obrazek;
double angle;
int main() { sf::Texture tekstura; sf::Sprite obrazek; sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "rotacja w SFML" ); tekstura.loadFromFile( "droga.jpg" ); obrazek.setTexture( tekstura ); while( oknoAplikacji.isOpen() ) { oknoAplikacji.clear( sf::Color::Black ); sf::Vector2i pozycjaMyszy = sf::Mouse::getPosition( oknoAplikacji ); Vector2f rectPos( obrazek.getPosition() ); angle = atan2(( pozycjaMyszy.y - rectPos.y ),( pozycjaMyszy.x - rectPos.x ) ); if( Keyboard::isKeyPressed( Keyboard::Space ) ) { rect.move( cos( angle ) * SPEED * dt , sin( angle ) * SPEED * dt ); } oknoAplikacji.display(); } return 0; }
|
|
pajdas Temat założony przez niniejszego użytkownika |
» 2016-06-16 18:36:32 troche poczytałem o tych sin i cos i z ogółu wiem o co chodzi. prosze tylko jeszcze o poprawienie mojego kodu |
|
michal11 |
» 2016-06-16 19:13:02 @Gibas11
Z pitagorasa nie policzysz o ile przesunąć obiekt względem osi x i y tylko odległość pomiędzy dwoma pkt. i ruch nie będzie "ładny". Co do Mouse to właśnie nie byłem pewny dlatego strzeliłem z tym namespace.
@pajdas
dt to skrót od delta time czyli różnica czasu pomiędzy dwoma klatkami. Jak widzę twój kod to możesz to wywalić, najwyżej później dodasz. To jest po to aby ruch był płynny i niezależny od szybkości komputera. |
|
pajdas Temat założony przez niniejszego użytkownika |
» 2016-06-16 19:16:10 dobra rozumiem ale program po kompilacji nie robi nic poza wyświetlaniem sprajta, jak nacisnę spację to obiekt nie rusza się, nawet obiekt nie obraca się w kierunku kursora, czyli program nie robi z żadnej planowanej funkcji |
|
Gibas11 |
» 2016-06-16 19:17:08 @michal11 Skrót myślowy. ;) sf::Vector2f diff = pos1 - pos2; float distance = sqrt( diff.x * diff.x + diff.y * diff.y ); diff /= distance; diff *= dt;
@pajdas Możesz ją zignorować i usunąć, kod będzie sprawny ale otrzymasz nieregularny ruch zależny od fps. Poczytaj o sf::Clock i sf::Time, sam wtedy dodasz dt. EDIT: Chyba że chcesz gotowca: int main() { sf::Clock frameClock; float dt = frameClock.restart().asSeconds(); }
|
|
« 1 » 2 |