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

[SFML 2.1] Problem z kolizją z wielokątem

Ostatnio zmodyfikowano 2014-01-12 21:21
Autor Wiadomość
Piotr020798
Temat założony przez niniejszego użytkownika
[SFML 2.1] Problem z kolizją z wielokątem
» 2014-01-06 16:05:17
Witam. Mam taką siatkę:
http://scr.hu/1xxi/5fibd
I mam problem z kolizją.
Mój kod kolizji:
C/C++
for( int i = 0; i < 50; i++ )
{
    for( int j = 0; j < 25; j++ )
    {
       
        if( siatka[ j ][ i ].getGlobalBounds().contains( okno.mapPixelToCoords( Mouse::getPosition( okno ), widok ) ) )
        {
            // Tutaj jakiś kod
        }
       
       
    }
}

Kafle są tworzone za pomocą sf::ConvexShape.
Problemem jest zasięg kolizji, który jest zbyt duży, tak jakby kafle były zwykłymi prostokątami.
Zasięg jednego kafla jest mniej-więcej taki: http://scr.hu/1xxi/jgvvk
Jak mam zmodyfikować mój kod, aby dział poprawnie?
P-101438
pekfos
» 2014-01-06 16:10:55
Bo są prostokątami. A przynajmniej z punktu widzenia getGlobalBounds().
P-101440
Piotr020798
Temat założony przez niniejszego użytkownika
» 2014-01-06 16:23:32
To jak to można zrobić inaczej?
P-101441
pekfos
» 2014-01-06 16:29:24
Dopisz dodatkowy warunek. getGlobalBounds() dostarcza Ci wystarczająco dużo informacji.
P-101443
Piotr020798
Temat założony przez niniejszego użytkownika
» 2014-01-06 16:45:24
Jakiś przykład?
P-101446
pekfos
» 2014-01-06 16:57:58
Nie za wygodnie? Masz prostokąt z wpisanym rombem, gdzie przekątne rombu są długościami boków prostokąta. Możesz wyznaczyć równania prostych współliniowych z bokami rombu. Wtedy wystarczy sprawdzić, czy dla danego X, Y mieści się między tymi prostymi (X i Y to współrzędne myszki).
P-101448
fortas
» 2014-01-07 15:05:56
1. Zle napisane petle:
C/C++
for( int i = 0; i < 50; i++ )
{
    for( int j = 0; j < 25; j++ )
    {
       
        if( siatka[ j ][ i ].getGlobalBounds().contains( okno.mapPixelToCoords( Mouse::getPosition( okno ), widok ) ) )
        {
            // Tutaj jakiś kod
        }
        // powinno byc siatka[ i ][ j ]
        //
    }
}
2. Sprobuj wykorzystac metode intersects zamiast contains. Przy evencie poruszania myszka tworz nowy IntRect z cordami myszki i porownuj do kolejnych elementow siatki.
P-101506
pekfos
» 2014-01-07 17:32:20
C/C++
// powinno byc siatka[ i ][ j ]
Ponieważ..?
P-101515
« 1 » 2 3
  Strona 1 z 3 Następna strona