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

[SFML 2.1] Kolizja per pixel

Ostatnio zmodyfikowano 2014-12-14 14:23
Autor Wiadomość
Winner
Temat założony przez niniejszego użytkownika
» 2014-12-12 19:43:58
Myślę, że jestem na dobrej drodze :D Napisałem taki testowy kod:
C/C++
for( int i = 0; i < TILE_SIZE; i++ )
{
    col = pixel[ 1 ].getPixel( 10, 10 );
    if( col == sf::Color( 255, 255, 255 ) )
    {
        GraMario.close();
    }
}

Ale jeszcze pytanie:
Dlaczego tutaj -> img[ i / 20 ] dzielisz i przez 20?
P-122757
colorgreen19
» 2014-12-12 19:49:30
ponieważ TILE_SIZE/TILE_COUNT = 20 ( 60/3=20 ). dlaczego tak? otóż:
1  pixel x należy do img[0];
19 pixel x należy do img[0];
20 pixel x należy do img[1];
21 pixel x należy do img[1];

stosując to rozwiązanie który_pixel/szerokość_kafelka da nam nr obrazka na którym ten pixel sie znajduje bo
1/20  = 0
19/20 = 0
20/20 = 1
21/20 = 1
itd..
/dzielenie bez reszty wiec wszystko elegancko gra

a robimy to po to, by nie dobierać się do nieistniejącego pixela na obrazku ( co by niewiadomo czym skutkowało )
P-122758
Winner
Temat założony przez niniejszego użytkownika
» 2014-12-12 20:09:24
Dobra to mam kod:
C/C++
for( int i = 0; i < TILE_SIZE; i++ )
{
    col = pixel[ i / 50 ].getPixel( i + map_x, 1 );
    if( col == sf::Color( 255, 255, 255 ) )
    {
        GraMario.close();
    }
}
I mój obraz pixel[0] jest cały biały (czyli spełnia if) jednak nawet jak mojej postaci nie ma na tym kafelku to program się zamyka. Domyślam się że to przez to, że współrzędne w getPixel(i + map_x, 1); to współrzędne na pixel[0] a nie na mapie "globalnej".
P-122759
colorgreen19
» 2014-12-12 20:11:13
za mało kodu troche, daj wiecej. i sprawdź współrzędne cout'em, a nie sie domyślaj :P
P-122760
Winner
Temat założony przez niniejszego użytkownika
» 2014-12-13 12:48:00
C/C++
map_x1 =(( przesuniecie / 50 ) *( - 1 ) );
std::cout << map_x1 << std::endl;
if( mapa[ 0 ][ map_x1 ] != 0 )
{
    col = pixel[ 0 ].getPixel( 1, 1 );
    if( col == sf::Color( 255, 255, 255 ) )
    {
        GraMario.close();
    }
}
 Takie coś mi wyszło. Wydaje mi się że zrobiłem zwykłą kolizje na kafelkach...(starałem się tego uniknąć). Narazie działa dosyć dobrze, chociaż kiedyś też kolizja na kafelkach działała mi dobrze a później wszystko zaczęło się sypać :/
Dzięki za pomoc :)
Jakbyś miał jeszcze jakieś propozycje jak lepiej zrobić tą kolizje per pixel to chętnie wysłucham.
P-122783
colorgreen19
» 2014-12-13 18:13:00
z tego kodu to jedyne co widze to to, ze aplikacja zamknie się jak pixel(1,1) z obrazka bedzie biały?
Może napisze ci jak ja bym to widział:
pseudo kod
C/C++
while( stan_gry != Wyjscie ) //petla główna
{
    //gdzies tu eventy
   
    //przyjecie sterowania klawiszami
   
    //jakies tam inne operacje
   
    //kolizje
    for( int i = 0; i < ilosc_kafelkow_mapy_x; i++ )
    {
        for( int j = 0; j < ilosc_kafelkow ) mapy_y; j++ )
        {
            if( kafelek[ i ][ j ] != pustego_kafelka )
            {
                if( kafelek[ i ][ j ] ma punkt wspolny z playerem ) //np uzyj sf::Rect::intersects( player.getGlobalBounds() )
                {
                    cout << "elementy sie pokrywaja, to moglibysmy skonczyc na zywklej kafelkowej kolizji, ale my jedziemy dalej z per pixel" << endl;
                   
                    //zamien sf::Sprite kafelka[i][j] na sf::Image
                    sf::Image img = kafelek[ i ][ j ].getTexture().copyToImage() //jakos tak to chyba szlo :D
                   
                    //zrob porownanie pixeli playera i kafelka, mechanizm masz podany, np cos takiego:
                    for( int kx = 0; kx < szereokosc_kafelka; kx++ )
                    {
                        for( int ky = 0; ky < wysokosc_kafelka; ky++ )
                        {
                            //pobierz kolory pixeli
                            sf::Color playercolor = img.getPixel( kx, ky );
                            //i teraz porownaj czy nie sa przeźroczyste itp, to tym rozważaliśmy wczesniej,
                            if( to_co_wyzej )
                            {
                                cout << "Jest kolizja" );
                                //i teraz ustawiasz flagi kolizji na obiekcie, rozpoznajesz czy kolizja jest z lewej czy z prawej itp
                            }
                        }
                    }
                }
            }
        }
    }
}
P-122805
Winner
Temat założony przez niniejszego użytkownika
» 2014-12-14 14:23:04
Wielkie dzięki za kod :) postaram się go zastosować. A u mnie zrobiłem to zamykanie aplikacji tylko dla testu czy wykrywa kolor pixela na odpowiednich współrzędnych.
P-122854
1 « 2 »
Poprzednia strona Strona 2 z 2