Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

podążanie obiektu za myszką

Ostatnio zmodyfikowano 2016-06-17 09:51
Autor Wiadomość
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.


P-149184
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
C/C++
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 );
}
P-149185
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.
C/C++
////////////////////////////////////////////////////////////
/// \brief Give access to the real-time state of the mouse
///
////////////////////////////////////////////////////////////
class SFML_WINDOW_API Mouse
P-149188
pajdas
Temat założony przez niniejszego użytkownika
» 2016-06-16 18:29:17
dziękuje za pomoc...ale
C/C++
#include <SFML/Graphics.hpp>
#include <windows.h> //wczesniej używałęm Sleep()
#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 );
        /*przy tym wywala mi błąd*/ Vector2f rectPos( rect.getPosition() );
       
        angle = atan2 /*co to atan 2*/(( pozycjaMyszy.y - rectPos.y ),( pozycjaMyszy.x - rectPos.x ) );
       
        if( Keyboard::isKeyPressed( Keyboard::Space ) )
        {
            rect.move( cos( angle ) * SPEED * dt /*co to dt*/, sin( angle ) * SPEED * dt /*co to 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ś
C/C++
#include <SFML/Graphics.hpp>
#include <windows.h> //wczesniej używałęm Sleep()
#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 /*co to dt*/, sin( angle ) * SPEED * dt /*co to dt*/ );
        }
       
       
        oknoAplikacji.display();
    }
    return 0;
}
P-149189
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
P-149190
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.
P-149191
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
P-149192
Gibas11
» 2016-06-16 19:17:08
@michal11 Skrót myślowy. ;)
C/C++
sf::Vector2f diff = pos1 - pos2;
float distance = sqrt( diff.x * diff.x + diff.y * diff.y );
diff /= distance;
diff *= dt;

//Możesz coś ruszyć o diff i dostaniesz ładny ruch

@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:
C/C++
int main()
{
    // Jakiś kod
    sf::Clock frameClock;
    // ...
    // W pętli:
    float dt = frameClock.restart().asSeconds();
    // ...
}
P-149193
« 1 » 2
  Strona 1 z 2 Następna strona