colorgreen19 Temat założony przez niniejszego użytkownika |
SFML 2.1 "Przesuwające" sie koordynaty myszki » 2014-01-18 23:56:45 Witam, tworze menu gry i utknąłem na momencie gdy "klikam" na przycisk menu. Menu mam zbudowane w postaci listy z klasą przycisków MenuItem playButton; playButton.rect.left = posX; playButton.rect.top = posY; playButton.rect.width = 200; playButton.rect.height = 60; playButton.akcja = Play; akcja to enum, int posX =~80 i int posY = ~470. dalej mam 2 metody, jedna sprawdza czy zostal nacisnięty przycisk, druga sprawdza czy zostal nacisniety w Rect area. Menu::MenuStan Menu::HandleClick( int mouseX, int mouseY ) { list < MenuItem >::iterator it; for( it = menuItems.begin(); it != menuItems.end(); it++ ) { cout << "X: " << mouseX << " Y: " << mouseY << endl; Rect < int > menuItemRect =( * it ).rect; if( mouseX > menuItemRect.left && mouseX < menuItemRect.left + menuItemRect.width && mouseY > menuItemRect.top && mouseY < menuItemRect.top + menuItemRect.height ) { cout << "MouseButtonClicl checked in --rect-- area" << endl; return( * it ).akcja; } else cout << "--NOT---MouseButtonClicl checked in --rect-- area" << endl; } return Nothing; }
Menu::MenuStan Menu::GetMenuResponse( RenderWindow & okno ) { Event menuEvent; while( true ) { while( okno.pollEvent( menuEvent ) ) { int mouseX, mouseY; cout << menuEvent.mouseMove.x << " " << menuEvent.mouseMove.y << endl; if( menuEvent.type == Event::MouseButtonPressed && menuEvent.mouseButton.button == Mouse::Left ) { Vector2i position = sf::Mouse::getPosition(); mouseX = position.x; mouseY = position.y; return HandleClick( mouseX, mouseY ); } if( menuEvent.type == Event::Closed ) { return Exit; } } } } Kod jest poprawnie skonstruowany, problem zachodzi dopiero po uruchomieniu. Na ponizszym obrazku widzimy pozycje x i y myszki wzgledem okna. następne "0 135" wyswietla sie w momencie keidy klikne. Jak widzimy 135 kopiuje sie z x myszki do (teoretycznego) y kliknięcia. "0" tutaj oznacza lewy przycisk(z enuma myszki dla ogarniających) (kiedy klikne naraz lewy i prawy to zamiast "0" wyswietla sie 1 lub 2, bo to wartosc prawego przycisku myszki) nastepne info to sprawdzacze, czy klikniecie bylo w Rect area'i. ("X:, Y: zignorujcie) (sory, ale tu nie mozna chyba wstawiac obrazkow) http://www.fotosik.pl/pokaz_obrazek/10ce681417412e37.htmlMoze mi ktos powiedziec dlaczego zamiast koordynatow myszki bierze mi najpier i dopisuje ktory przycisk myszki naciskam? z gory dzieki |
|
pekfos |
» 2014-01-19 13:18:36 cout << menuEvent.mouseMove.x << " " << menuEvent.mouseMove.y << endl;
|
To nie jest poprawne. mouseMove zawiera poprawne informacje tylko dla zdarzenia MouseMoved. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-01-19 13:50:49 Dobra, z tym sobie juz poradzilem, ale dzieje sie inna sytuacja. Dziala ostatni przycisk - Exit. kiedy dla exitButton.akcja zrobie zamiast (z enuma) Exit Play, tj. exitButton.akcja = Play gra sie odpala. Wiec nie wiedziec czemu dziala tylko ostatni przycisk. Czym to moze byc spowodowane? Może musze to rozpisac bez petli, tylko jak? |
|
pekfos |
» 2014-01-19 13:59:05 Brakuje return w GetMenuResponse(). |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-01-19 14:14:38 Przecież jest w warunkach. I w HandleClick tez jest return |
|
pekfos |
» 2014-01-19 14:26:27 Faktycznie, pętla nieskończona. Podaj w takim razie więcej kodu. Piszesz o czymś, czego w tym kodzie nie ma. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-01-19 14:29:40 jedyne co moge podac do problemu to funkcje MenuShow void Game::MenuShow() { cout << "Menu odpalone" << endl; Menu menu; Menu::MenuStan stan = menu.Show( okno ); switch( stan ) { case Menu::Play: gameStan = Game::Playing; break; case Menu::Settings: gameStan = Game::InSettings; break; case Menu::Stats: gameStan = Game::InStats; break; case Menu::Exit: gameStan = Game::Exiting; break; } } i wywolanie tej funkcji w petli glownej Event zdarzenie; ...while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == Event::Closed ) { gameStan = Exiting; }; switch( gameStan ) { case Game::SplashScreenShowing: SplashScreenShow(); break; case Game::Exiting: okno.close(); break; case Game::MenuShowing: cout << "GameStan=InMenu" << endl; MenuShow(); break; case Game::Playing:... no i klasa Menu class Menu { public: enum MenuStan { Nothing, Exit, Play, Settings, Stats }; MenuStan Show( RenderWindow & okno ); struct MenuItem { public: Rect < int > rect; MenuStan akcja; }; private: MenuStan GetMenuResponse( RenderWindow & okno ); MenuStan HandleClick( int mouseX, int mouseY ); list < MenuItem > menuItems; }; |
|
pekfos |
» 2014-01-19 14:41:27 A jak dodajesz przyciski? |
|
« 1 » 2 |