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

[SFML, C++] Obsługa zdarzeń w funkcji

Ostatnio zmodyfikowano 2011-08-18 11:06
Autor Wiadomość
jaupl
Temat założony przez niniejszego użytkownika
[SFML, C++] Obsługa zdarzeń w funkcji
» 2011-08-15 10:44:14
Chodzi mi tu o bezpośredni dostęp do klawiatury i myszy. Jak stworzyć funkcje która będzie umiała przyjąć od użytkownika liczbę ?? Jak na razie wyszło mi coś takiego :

C/C++
int odczyt( int liczba, sf::Sprite podswietlenie, const sf::Input & menu )
{
   
    cout << endl << "czytam" << endl;
    int y = 768;
    int warunek = 0;
    while( warunek != 1 )
    {
        if( menu.IsKeyDown( sf::Key::Up ) )
             cout << "ueaggg";
       
        for( int o = 0; o < 7; o += 3 )
        {
            int x = 832;
            for( int z = 1; z <= 3; z++ )
            {
                cout << "sprawdzam." << endl;
                if((( menu.GetMouseX() > x && menu.GetMouseX() <( x + 99 ) ) &&( menu.GetMouseY() > y && menu.GetMouseY() <( y + 24 ) ) && menu.IsMouseButtonDown( sf::Mouse::Left ) ) &&( warunek != 1 ) )
                {
                    warunek = 1;
                    liczba = z + o;
                    podswietlenie.SetPosition( x, y );
                }
                if( warunek != 1 )
                     podswietlenie.SetPosition( - 200, - 200 );
               
                x += 105;
            }
            y += 30;
        }
        if( menu.IsKeyDown( sf::Key::Num0 ) )
             liczba = 0, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num1 ) )
             liczba = 1, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num2 ) )
             liczba = 2, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num3 ) )
             liczba = 3, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num4 ) )
             liczba = 4, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num5 ) )
             liczba = 5, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num6 ) )
             liczba = 6, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num7 ) )
             liczba = 7, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num8 ) )
             liczba = 8, warunek = 1;
       
        if( menu.IsKeyDown( sf::Key::Num9 ) )
             liczba = 9, warunek = 1;
       
    }
    return liczba;
}

Cout'y dodane tylko po to oczywiście żeby sprawdzić jak funkcja działa (poprawnie czy nie) i na razie wnioskuje że jest w niej nieskończona pętla, tylko teraz pytanie : czy dlatego że program nie przyjmuje żadnej liczby przekazanej przez użytkownika ? czy dlatego że gdzieś się machnąłem ?? (w sumie wychodzi na to samo) :P funkcję wywołuje tak :
liczba[ i ] = odczyt( liczba[ i ], podswietlenie, okno.GetInput() );
 Kod się kompiluje. problemem jest to ze gdy kliknę na ekran w miejsce gdzie jest button to aplikacja przestaje odpowiadać :( (kiedy używałem tej instrukcji która sprawdza położenie myszki bezpośrednio w kodzie - działała, nie używałem tylko wtedy tej pętli
while( warunek != 1 )
)
P-39180
RoinarN
» 2011-08-15 14:54:53
jeżeli dobrze Cię zrozumiałem, to wnioskuję że tak.
1. Jest to nieskończona pętla, tak jak by, dopóty, dopóki nie uzyska wydarzenia, które rozkaże programowi zakończyć swoje działanie, np. ESC.
2. Nie możesz używać cout, jeżeli chcesz coś wyświetlić w oknie, cout-skrót od Console OUT, czyli wyświetla w konsoli, w tym przypadku musisz używać printf i scanf, ale pamiętaj że musisz dodać odpowiednią bibliotekę- cstdlib(chyba)
P-39191
malan
» 2011-08-15 15:44:07
@RoinarN: Za pomocą » standard Cprintf da się wyświetlić tekst w oknie SFML?
P-39195
jaupl
Temat założony przez niniejszego użytkownika
» 2011-08-15 16:19:26
oczywiście że nic (chodzi mi o cout'y) nie wyświetla się w oknie sfml ^^ ale okno konsoli jest w tle i widzę te komunikaty. tylko problem polega na tym że nawet gdy wciskam miejsce w którym znajduje się button nic się nie dzieje - w dodatku program przestaje odpowiadać. a kiedy używam przycisków num0 itd też nic się nie dzieje. najgorsze jest to że nie wiem co robię źle. :/
P-39196
malan
» 2011-08-16 03:43:38
Zdarzenia same się nie odbiorą - są na tyle bezczelne, że trzeba po nie samemu iść ;/
P-39218
jaupl
Temat założony przez niniejszego użytkownika
» 2011-08-17 08:28:15
Bezpośredni dostęp można uzyskać poprzez metodę GetInput klasy window
 (którą podaję jako argument do funkcji odczyt).
metoda zwraca referencję na stały obiekt typu sf::Input.
 
const sf::Input & menu
 który tworze przy deklaracji funkcji, tak ?? Tak mi się  wydawało i myślałem że to wystarczy... ale widać się myliłem. Nie ogarniam tego zabardzo ... i nie wiem jak mam to dokładnie zrobić ... zapis :
const sf::Input & menu = okno.GetInput()
 a potem podanie menu jako argument też mi nic nie dało ... ;/ Więc problem ni mniej ni więcej polega na tym że nie mam bladego pojęcia JAK po nie pójść.
P-39308
imralav
» 2011-08-17 15:04:32
Może niech parametrem funkcji będzie wskaźnik na obiekt klasy RenderWindow, argumentem adres tego obiektu i wewnątrz funkcji wykorzystasz metodę .GetInput() tego obiektu?
C/C++
RenderWindow okno(...);
...
void xxx( RenderWindow * okno,...)
{
    if( okno->GetInput()...)
    ...
}
    ...
P-39341
jaupl
Temat założony przez niniejszego użytkownika
» 2011-08-18 08:48:31
Chodzi mniej więcej o to ? :
Funkcja:
C/C++
int odczyt( int liczba, sf::Sprite podswietlenie, sf::RenderWindow * okno, int & warunek )
{
   
    const sf::Input & menu = okno->GetInput();
    int y = 768;
    if( menu.IsKeyDown( sf::Key::Up ) )
         cout << "ueaggg";
   
    for( int o = 0; o < 7; o += 3 )
    {
        int x = 832;
        for( int z = 1; z <= 3; z++ )
        {
            cout << "sprawdzam." << "    " << warunek << endl;
            if((( menu.GetMouseX() > x && menu.GetMouseX() <( x + 99 ) ) &&( menu.GetMouseY() > y && menu.GetMouseY() <( y + 24 ) ) && menu.IsMouseButtonDown( sf::Mouse::Left ) ) &&( warunek != 1 ) )
            {
                warunek = 1;
                liczba = z + o;
                podswietlenie.SetPosition( x, y );
            }
            if( warunek != 1 )
                 podswietlenie.SetPosition( - 200, - 200 );
           
            x += 105;
        }
        y += 30;
    }
   
    if( okno->GetInput().IsKeyDown( sf::Key::Num0 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num0)*/ )
         liczba = 0, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num1 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num1)*/ )
         liczba = 1, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num2 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num)*/ )
         liczba = 2, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num3 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num3)*/ )
         liczba = 3, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num4 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num4)*/ )
         liczba = 4, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num5 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num5)*/ )
         liczba = 5, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num6 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num6)*/ )
         liczba = 6, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num7 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num7)*/ )
         liczba = 7, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num8 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code == sf::Key::Num8)*/ )
         liczba = 8, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Num9 ) /*|| (hapens.Type == sf::Event::KeyPressed && hapens.Key.Code  == sf::Key::Num9)*/ )
         liczba = 9, warunek = 1;
   
    if( menu.IsKeyDown( sf::Key::Escape ) )
         okno->Close();
   
    return liczba;
}
wywołanie :
C/C++
liczba[ i ] = odczyt( liczba[ i ], podswietlenie, & okno, warunek );
P.s. jak widać próbowałem też podać zdarzenie jako argument funkcji i potem umieszczać je w warunkach z marnym skutkiem - program się kompilował, ale jak coś zrobiłem w oknie to przestawał odpowiadać (zawieszał się) z resztą dalej jest tak samo ;/
P-39399
« 1 » 2
  Strona 1 z 2 Następna strona