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

SFML 2.1 "Przesuwające" sie koordynaty myszki

Ostatnio zmodyfikowano 2014-01-19 21:27
Autor Wiadomość
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
C/C++
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.
C/C++
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.html

Moze mi ktos powiedziec dlaczego zamiast koordynatow myszki bierze mi najpier i dopisuje ktory przycisk myszki naciskam? z gory dzieki
P-102506
pekfos
» 2014-01-19 13:18:36
C/C++
cout << menuEvent.mouseMove.x << " " << menuEvent.mouseMove.y << endl;
To nie jest poprawne. mouseMove zawiera poprawne informacje tylko dla zdarzenia MouseMoved.
P-102527
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?
P-102532
pekfos
» 2014-01-19 13:59:05
Brakuje return w GetMenuResponse().
P-102533
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
P-102534
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.
P-102535
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-01-19 14:29:40
jedyne co moge podac do problemu to funkcje MenuShow
C/C++
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
C/C++
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
C/C++
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;
};
P-102536
pekfos
» 2014-01-19 14:41:27
A jak dodajesz przyciski?
P-102538
« 1 » 2
  Strona 1 z 2 Następna strona