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

[SFML]Czy kliknięto sprajta?

Ostatnio zmodyfikowano 2011-06-04 18:46
Autor Wiadomość
DejaVu
» 2011-06-04 18:05:47
W przykładzie nie ma dwóch sprajtów. Wniosek jest prosty - w kodzie swoim masz błąd :)

/edit:
Ba nawet widać gdzie:
C/C++
naszSprajt.TransformToLocal(...)
a potem:
C/C++
obrazek.Width(...)

/edit2:
Zagalopowałem się ;p
Faktem jest, że obiekt naszSprajt pewnie masz 2x u siebie zamiast zmienić go na inny.
P-33845
mar3
Temat założony przez niniejszego użytkownika
» 2011-06-04 18:09:28
Mam 2 inne sprajty z innym obrazkiem.
P-33846
DejaVu
» 2011-06-04 18:10:08
To nie jest tematem tego wątku.
P-33847
mar3
Temat założony przez niniejszego użytkownika
» 2011-06-04 18:12:39
Mam 2 inne sprajty z innym obrazkiem i mam ten kod skopiowany i zmieniony pod drugiego sprajta.
P-33848
DejaVu
» 2011-06-04 18:14:17
Więc wklej kod, bo tak to będziemy jeszcze długo pisali i nic z tego nie wyniknie. Chciałbym zauważyć jeszcze, że przykład z kursu działa, więc to jest ewidentnie Twój błąd we własnym kodzie.
P-33849
mar3
Temat założony przez niniejszego użytkownika
» 2011-06-04 18:20:05
Oto mój kod:
 - w mainie
C/C++
//...
gra game;
//...

sf::Event zdarzenie;
while( oknoAplikacji.GetEvent( zdarzenie ) )
{
    //...
    if( zdarzenie.Type == sf::Event::MouseButtonPressed && zdarzenie.MouseButton.Button == sf::Mouse::Left )
         game.czyKliknietoKarte( zdarzenie.MouseButton.X, zdarzenie.MouseButton.Y );
   
}
 - w klasie gra
C/C++
void gra::czyKliknietoKarte( int mouseX, int mouseY )
{
    for( int i = 0; i < karty.size(); i++ )
    {
        sf::Vector2f punkt = karty[ i ].czyKlikni ę to( mouseX, mouseY );
        if( punkt.x >= 0 && punkt.y >= 0 && punkt.x <= SZER_KARTY && punkt.y <= WYS_KARTY && !karty[ i ].czyOdkryta() )
        {
            if( ileOdkrytych < 2 )
            {
                karty[ i ].odkryj();
                ileOdkrytych++;
                odkryte[( ileOdkrytych - 1 ) ] = i;
            }
            return;
        }
    }
}
 - w klasie karta
C/C++
sf::Vector2f karta::czyKlikni ę to( int mouseX, int mouseY )
{
    return kartaSprajt.TransformToLocal( sf::Vector2f(( float ) mouseX,( float ) mouseY ) );
}
/Edit:
To gra w memory (ztąd odkryta/zakryta karta)
P-33851
DejaVu
» 2011-06-04 18:21:12
hmm... lol :P faktycznie jest błąd o którym mówiłeś :)

/edit:
Tak pi razy drzwi wychodzi na to, że trzeba przeskalować pozycję kursora czy coś w ten deseń.

/edit2:
C/C++
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Kurs SFML - http://cpp0x.pl" );
   
    //Utworzenie białego obrazka i wykonanie przekształceń na sprajcie
    sf::Image obrazek;
    obrazek.Create( 30, 60, sf::Color::White );
   
    sf::Image obrazek2;
    obrazek2.Create( 20, 20, sf::Color::White );
    sf::Sprite naszSprajt2;
    naszSprajt2.SetImage( obrazek2 );
    naszSprajt2.SetScale( 5, 5 );
    naszSprajt2.SetPosition( 100, 100 );
   
    sf::Sprite naszSprajt;
    naszSprajt.SetImage( obrazek );
    naszSprajt.SetPosition( 400, 300 );
    naszSprajt.SetScale( 5, 5 );
    naszSprajt.SetCenter( obrazek.GetWidth() / 2.0f, obrazek.GetHeight() / 2.0f );
    naszSprajt.SetColor( sf::Color( 0x00, 0xff, 0x00, 0x80 ) );
   
    while( oknoAplikacji.IsOpened() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == sf::Event::Closed )
                 oknoAplikacji.Close();
           
        } //while
       
        oknoAplikacji.Clear( sf::Color::Black );
        naszSprajt.Rotate( 0.01f );
        const sf::Input & sterowanie = oknoAplikacji.GetInput();
        sf::Vector2f mysz = oknoAplikacji.ConvertCoords( sterowanie.GetMouseX(), sterowanie.GetMouseY() );
       
        {
            //Tu sprawdzanie czy mysz jest nad sprajtem czy nie oraz modyfikowanie jego koloru
            sf::Vector2f punkt = naszSprajt.TransformToLocal( mysz );
            bool bCzyZaznaczony =( punkt.x >= 0 && punkt.y >= 0 && punkt.x <= obrazek.GetWidth() && punkt.y <= obrazek.GetHeight() );
            naszSprajt.SetColor( bCzyZaznaczony ? sf::Color::Green: sf::Color::Red );
        }
       
        {
            //Tu sprawdzanie czy mysz jest nad sprajtem czy nie oraz modyfikowanie jego koloru
            sf::Vector2f punkt = naszSprajt2.TransformToLocal( mysz );
            bool bCzyZaznaczony =( punkt.x >= 0 && punkt.y >= 0 && punkt.x <= obrazek2.GetWidth() && punkt.y <= obrazek2.GetHeight() );
            naszSprajt2.SetColor( bCzyZaznaczony ? sf::Color::Green: sf::Color::Red );
        }
       
        oknoAplikacji.Draw( naszSprajt );
        oknoAplikacji.Draw( naszSprajt2 );
        oknoAplikacji.Display();
    } //while
    return 0;
}
P-33852
malan
» 2011-06-04 18:37:47
Ja rozwiązałem to tak:
C/C++
bool Button::lClicked( const sf::Input & input )
{
    return( input.IsMouseButtonDown( sf::Mouse::Left ) &&
    input.GetMouseX() >= spritePositionXY.x && input.GetMouseX() <= spritePositionXY.x + spriteWidthHeight.x &&
    input.GetMouseY() >= spritePositionXY.y && input.GetMouseY() <= spritePositionXY.y + spriteWidthHeight.y );
}
... i żadnego błędu nie mam ;p
P-33853
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona