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

[SFML 2.1] Sprawdzanie czy użytkownik kliknął w dany obszar ekranu(okna) lub w jakiegoś sprit'a.

Ostatnio zmodyfikowano 2013-12-07 21:39
Autor Wiadomość
Zdziwiony
Temat założony przez niniejszego użytkownika
[SFML 2.1] Sprawdzanie czy użytkownik kliknął w dany obszar ekranu(okna) lub w jakiegoś sprit'a.
» 2013-12-06 15:04:42
Witam. Mam takie pytanie jak w temacie :), bo w polskich kursach nikt o tym nie wspomina ;/
Kod:
C/C++
#include <SFML/Graphics.hpp>
#include <cmath>
#include <windows.h>

int main()
{
    FreeConsole();
    sf::RenderWindow okno( sf::VideoMode( 500, 500 ), "Kurs SFML 2.1" );
    sf::RenderWindow okno2;
    sf::Texture tekstura;
    tekstura.loadFromFile( "grafika\\tlo.jpg" );
    sf::Sprite obrazek;
    obrazek.setTexture( tekstura );
   
   
    while( okno.isOpen() )
    {
        sf::Event zdarzenie;
        while( okno.pollEvent( zdarzenie ) ) //obsloga zdarzen
        {
            if( zdarzenie.type == sf::Mouse::Left )
            {
                okno2.create( sf::VideoMode( 800, 600, 32 ), "oknonr2" );
                okno.close();
            }
            //
            if( zdarzenie.type == sf::Event::Closed )
            {
                okno.close();
            }
            //
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 okno.close();
            //
        }
       
        okno.clear( sf::Color::Black );
        okno.draw( obrazek );
        okno.display();
       
       
    }
    sf::Event zdarzenie2;
    while( okno2.isOpen() )
    {
        sf::Event zdarzenie2;
        while( okno2.pollEvent( zdarzenie2 ) ) //obsloga zdarzen
        {
            //
            if( zdarzenie2.type == sf::Event::Closed )
            {
                okno2.close();
            }
            //
            if( zdarzenie2.type == sf::Event::KeyPressed && zdarzenie2.key.code == sf::Keyboard::Escape )
                 okno2.close();
            //
        }
        okno2.clear( sf::Color::Black );
        okno2.draw( obrazek );
        okno2.display();
       
    }
    return 0;
}

To jest taki przykład, w którym chcę, żeby po kliknięciu na dany sprite, napis itp. otworzyło się nowe okienko, bo z takim zapisem jak wyżej, to apka otwiera drugie okienko po kliknięciu X, dlatego, że robi się to LPM...

A jeśli zamiast
if( zdarzenie.type == sf::Mouse::Left )
na
if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left )
Nowe okno będzie się otwierać po kliknięciu w dowolną część ekranu. I tu leży mój problem, bo nie wiem jak zapisać to, żeby program uruchamiał okienko po kliknięciu w obiekt np. 10x10px lub po prostu w miejsce o kordach x,y.
 
Pozdrawiam.
P-98500
pekfos
» 2013-12-06 15:23:42
bo w polskich kursach nikt o tym nie wspomina ;/
Bo kursy zakładają, że znasz język i umiesz używać jego podstawowych struktur. No i, oczywiście, nie opisują całej biblioteki, bo ty by nie miało sensu. Gdybyś poszukał, znalazłbyś np coś takiego jak contains() z sf::Rect<>. A gdybyś nie poszukał, to pozycję myszki masz zapisaną w zdarzeniu, wystarczy prosty warunek.
P-98503
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-12-06 16:07:30
Poprawiłem na coś takiego:
C/C++
#include <SFML/Graphics.hpp>
#include <cmath>
#include <windows.h>

int main()
{
    FreeConsole();
    sf::RenderWindow okno( sf::VideoMode( 500, 500 ), "Kurs SFML 2.1" );
    sf::RenderWindow okno2;
    sf::Texture tekstura;
    tekstura.loadFromFile( "grafika\\tlo.jpg" );
    sf::Sprite obrazek;
    obrazek.setTexture( tekstura );
    int x;
    int y;
    x = 1;
    y = 1;
   
   
    while( okno.isOpen() )
    {
        sf::Event zdarzenie;
       
        while( okno.pollEvent( zdarzenie ) ) //obsloga zdarzen
        {
           
            if( zdarzenie.mouseMove.x == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left )
            if( zdarzenie.mouseMove.y == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left )
            {
                okno2.create( sf::VideoMode( 800, 600, 32 ), "oknonr2" );
                okno.close();
            }
            //
            if( zdarzenie.type == sf::Event::Closed )
            {
                okno.close();
            }
            //
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 okno.close();
            //
        }
       
        okno.clear( sf::Color::Black );
        okno.draw( obrazek );
        okno.display();
       
       
    }
    sf::Event zdarzenie2;
    while( okno2.isOpen() )
    {
        sf::Event zdarzenie2;
        while( okno2.pollEvent( zdarzenie2 ) ) //obsloga zdarzen
        {
            //
            if( zdarzenie2.type == sf::Event::Closed )
            {
                okno2.close();
            }
            //
            if( zdarzenie2.type == sf::Event::KeyPressed && zdarzenie2.key.code == sf::Keyboard::Escape )
                 okno2.close();
            //
        }
        okno2.clear( sf::Color::Black );
        okno2.draw( obrazek );
        okno2.display();
       
    }
    return 0;
}
Bardzo się zdziwiłem, że się skomplinowało... ale oczywiście nie działa jak należy :P (no cóż nic dziwnego..., bardziej dziwne, że się skomplinowało...

Tak wiem, popełniłem jak zwykle podstawowe błędy itp, itd... Ale czy mógłbym poprosić o jeszcze jakąś podpowiedź ? (Jako argument za mogę powiedzieć, że chyba do końca życia zapamiętam, że trzeba użyć stringa i jak go użyć, żeby móc połączyć jakiś ciąg znaków, po tej batalii w moim pierwszym temacie na forum :P) (Tam w sumie nie miałem usprawiedliwienia, że sam sobie nie poradziłem, bo dopiero teraz niedawno przypadkiem zobaczyłem jak tego używać w jakimś polskim kursie C++ :P (ehh... po czasie :P) Jednak kursów SFML po polsku jest garstka i obszerne nie są... A dokumentacja na stronie SFML jest dla mnie bez dobrej znajomości angielskiego słabo zrozumiana... ;/

Pozdrawiam.

EDIT:
C/C++
if( zdarzenie.mouseMove.x == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left )
     if( zdarzenie.mouseMove.y == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left )

Dobra, dobra... tak wiem to są 2 różne ify :P (bardzo głupi błąd) dlatego się skomplinowało :P Sam nie wiem czemu to tak zapisałem :P
P-98506
pekfos
» 2013-12-06 16:13:04
Znalazłeś pozycję myszki (co prawda złą, ale to wyjdzie później). Jaki masz problem w zapisaniu warunku, że pozycje zawierają się w jakimś przedziale? (no i oczywiście musisz dalej sprawdzać typ zdarzenia)
P-98507
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-12-06 16:20:28
Coś takiego ?
C/C++
int x;
int y;
y =( rand() % 50 ) + 7;
x =( rand() % 50 ) + 7;
Nie wiem, czy dobrze, ale tak się robiło przy losowaniu liczb z przedziału...

Oczywiście się komplinuje, ale nie działa ;/

A druga sprawa to, jak zapisać tu dwie osie X i Y ?
C/C++
if( zdarzenie.mouseMove.y == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left )
{
    okno2.create( sf::VideoMode( 800, 600, 32 ), "oknonr2" );
    okno.close();
}
P-98509
pekfos
» 2013-12-06 16:26:00
Coś takiego ?
Nie.. Masz sprawdzić, czy liczba należy do przedziału, a nie wylosować liczbę z przedziału..

A druga sprawa to, jak zapisać tu dwie osie X i Y ?
Rozumiesz coś z tego, co piszesz? Bo ja nie. Zamiast dodać dodatkowy warunek, zmieniłeś zmienną i porównujesz z, bezsensowną w tym kontekście, wartością.
P-98510
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-12-06 16:46:36
Rozumiesz coś z tego, co piszesz? Bo ja nie.
Szczerze ? Średnio :E Chyba najmądrzejszą decyzją z mojej strony będzie darowanie sobie na razie bibliotek... Myślałem, że wiem już wystarczająco dużo o c++, żeby zacząć bawić się SFML'em(tym bardziej, że czytałem, że to prosta biblioteka), ale wychodzi na to, że chyba nie ... ;/

Zadziwia mnie jednak to, że pomimo tego, że ponoć WinAPI jest trudniejsze to i tak lepiej je ogarniam niż SFML'a :O (ale to chyba dlatego, że o WinAPI jest dużo więcej obszernych kursów po polsku :D)(dowód program zamieszczony na tym forum w odpowiednim dziale, którego wszyscy boją się pobrać :E)

PS: Przeczytałem cały kurs C++ na tej stronie... (nie po kolei ale co tam :P) Jedyne tematy, których nie czytałem to te o programowaniu obiektowym... I tu pytanie: Czy ta obiektowość jest tak przydatna w SFML'u, czy jednak jestem aż tak tępy na tego C++ ?:E. No i inne pytanie... Mniej więcej ile czasu muszę siedzieć w konsoli, żeby móc stworzyć w końcu 'coś fajnego' :) ? (nie ukrywam ale się niecierpliwie :P i jak myślę, że już wystarczająco wszystko ogarniam to biorę się za takiego SFML'a czy WinAPI i wychodzi na to, że tak na prawdę nic nie umiem :P (no może nie zupełnie nic, bo prosty program w WinAPI jakoś tam zrobię, zresztą sam możesz zobaczyć jego screena...(albo już widziałeś)).
P-98513
czosnek17
» 2013-12-06 18:42:35
Przeczytałem cały kurs C++ na tej stronie
Jak przeczytałeś, to napisz kilka nawet prostych programów dla treningu (np zadania z kursu).

Czy ta obiektowość jest tak przydatna w SFML'u
Jest potrzebna i to nie tylko w SFML, ale ogólnie w programowaniu.

Ja mam taką obsługę kliknięcia na przycisk
C/C++
if( mouse.getPosition( okno ).x > spr.getPosition().x && mouse.getPosition( okno ).x < spr.getPosition().x + tsize.x
&& mouse.getPosition( okno ).y > spr.getPosition().y && mouse.getPosition( okno ).y < spr.getPosition().y + tsize.y ) //tu sprawdzam, czy mysz znajduje się nad spritem
{
    if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
    {
        cout << "kliknięto\n";
    }
}
//sf::Vector2u tsize;//rozmiar tekstury przycisku
P-98522
« 1 » 2 3
  Strona 1 z 3 Następna strona