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

przerwanie programu w SFML kiedy kursor wyjedzie za okno aplikacji

Ostatnio zmodyfikowano 2016-06-17 21:44
Autor Wiadomość
pajdas
Temat założony przez niniejszego użytkownika
przerwanie programu w SFML kiedy kursor wyjedzie za okno aplikacji
» 2016-06-17 20:03:01
Stworzyłem sobie mały program w sfml ale jest w nim mały kłopot. W programie steruję prawym i lewym przyciskiem myszy oraz oczywiście zależnością jej pozycji. Kiedy nacisnę lewy przycisk myszy obiekt zbliża się do kursora, kiedy nacisnę prawy to oddala się od kursora, jeżeli jednak wyjadę poza okno aplikacji to program się zawiesza i wyskakuje komunikat zamknięcia okna. Wyskakuje program ... .exe nie odpowiada

mój kod jest taki, wiem że nie jest on zbyt dobrze napisany ale działa.
C/C++
#include <SFML/Graphics.hpp>
#include <cmath>

int SPEED = 250;

sf::Texture tekstura;
sf::Sprite obrazek;

double angle;
double stopnie;
int main()
{
    sf::Texture tekstura;
    sf::Sprite obrazek;
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "ruch w SFML" );
    tekstura.loadFromFile( "box.jpg" );
   
    obrazek.setTexture( tekstura );
    sf::Clock frameClock;
    obrazek.setPosition( 20, 20 );
    while( true )
    {
       
        while( true )
        {
           
            oknoAplikacji.clear( sf::Color::Black );
            obrazek.setOrigin( 20, 20 );
           
            sf::Vector2i pozycjaMyszy = sf::Mouse::getPosition( oknoAplikacji );
            sf::Vector2f rectPos( obrazek.getPosition() );
           
            angle = atan2(( pozycjaMyszy.y - rectPos.y ),( pozycjaMyszy.x - rectPos.x ) );
           
            obrazek.setRotation( angle * 180 / 3.141592f + 90 );
            float dt = frameClock.restart().asSeconds();
           
            if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
            {
                obrazek.move( cos( angle ) * SPEED * dt, sin( angle ) * SPEED * dt );
            }
            else if( sf::Mouse::isButtonPressed( sf::Mouse::Right ) )
            {
                obrazek.move( - cos( angle ) * SPEED * dt, - sin( angle ) * SPEED * dt );
            }
           
            oknoAplikacji.draw( obrazek );
           
            oknoAplikacji.display();
        }
       
    }
    return 0;
}
prosze o rozwiązanie problemu z tym, że jak wyjadę kursorem za okno i znowu nacisnę klawisz ale już w oknie wywala mi błąc.
drugi problem to taki że jak obiekt dojedzie do kursora to zaczyna migotać. Chcę aby miał kierunek taki z jakim przybył do tego kursora.
trzeci problem jest taki że jak nacisnę X czyli zamknięcie aplikacji (ten X z prawego górnego rogu w Windowsie) to ona nie wyłącza się. Proszę o kod i opisanie rozwiązań moich problemów
P-149221
michal11
» 2016-06-17 20:07:51
Po co ci podwójny while ? Nie działa ci zamykanie okna bo, jak już ci pisałem w którymś z poprzednich tematów, nie obsługujesz eventów.
P-149222
pajdas
Temat założony przez niniejszego użytkownika
» 2016-06-17 21:09:34
kiedy używam eventów to muszę naciskać kilkukrotnie przycisk myszy a jak mam bezpośredni dostęp do myszy to trzymam przycisk i jedzie do przodu
C/C++
while( oknoAplikacji.pollEvent( zdarzenie ) )
{
    if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left )
    {
        obrazek.move( cos( angle ) * SPEED * dt, sin( angle ) * SPEED * dt );
    }
    if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Right )
    {
        obrazek.move( - cos( angle ) * SPEED * dt, - sin( angle ) * SPEED * dt );
    }
}
P-149223
Gibas11
» 2016-06-17 21:30:45
Wystarczy to:
C/C++
while( oknoAplikacji.pollEvent( zdarzenie ) )
     continue;

P-149224
pajdas
Temat założony przez niniejszego użytkownika
» 2016-06-17 21:34:42
Dzięki, a jak byś rozwiązał problem z migoczącym obrazkiem kiedy obiekt dojedzie do kursora
P-149225
Gibas11
» 2016-06-17 21:44:01
Sprawdzaj czy odległość między obrazkiem a kursorem jest mniejsza od prędkości (wyrażonej w pikselach na klatkę), jeżeli nie - poruszaj nim tak jak teraz, a jeżeli tak - sztywno ustawiaj obrazek w pozycji kursora używając setPosition().
P-149226
« 1 »
  Strona 1 z 1