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

[SFML] kolizje postaci z mapą kafelkową

Ostatnio zmodyfikowano 2015-12-19 15:30
Autor Wiadomość
urbi727
Temat założony przez niniejszego użytkownika
[SFML] kolizje postaci z mapą kafelkową
» 2015-12-19 15:30:37
Witam, od dłuższego czasu zmagam się z kolizjami w mojej prostej gierce typu "Fall Down". Początkowo napisałem kolizje na podstawie jakiegoś tutoriala w necie, lecz tam problem polegał na tym, że postać się zatrzymywała, bo kolizje nie były sprawdzane przed zajściem lecz "w trakcie". Później dopisałem, a raczej zerżnąłem z innego poradnika metody:

 
C/C++
sf::FloatRect Player::getBoundingBox()
{
    return sprite.getGlobalBounds();
}

sf::Vector2f Player::ruch( sf::Time czas )
{
    sf::Vector2f v( 0, 0 );
    if( wLewo )
         v.x -= predkosc;
   
    if( wPrawo )
         v.x += predkosc;
   
    return v * czas.asSeconds();
}

void checkcollision( Player & sprite, std::vector < Player > V, sf::Vector2f ruch )
{
    sf::FloatRect X = sprite.getBoundingBox();
    sf::FloatRect Y = sprite.getBoundingBox();
    X.left += ruch.x;
    Y.top += ruch.y;
    bool kolX = false; bool kolY = false;
   
    for( int i = 0; i < V.size(); i++ )
    if( X.intersects( V[ i ].getBoundingBox() ) )
         kolX = true;
    else if( Y.intersects( V[ i ].getBoundingBox() ) )
         kolY = true;
   
    if( !kolX )
         sprite.ruch( sf::Vector2f( ruch.x, 0 ) );
   
    if( !kolY )
         sprite.ruch( sf::Vector2f( 0, ruch.y ) );
   
}
 
A oto moja mapa:
C/C++
Engine::Engine( sf::RenderWindow & win )
{
    // wczytanie tekstur
    for( int i = 1; i < Level::COUNT; i++ )
    {
        tekstura[ i ].loadFromFile( "data/images/tiles.png", IntRect(( i - 1 ) * level.tile_width, 0, level.tile_width, level.tile_height ) );
    }
   
    //ustawienie kafli
    level.loadFromFile( "map.level" );
    for( int i = 0; i < level.height; i++ )
    {
        for( int j = 0; j < level.width; j++ )
        {
            if( level.poziom[ i ][ j ].type != Level::NONE )
            {
                sprite[ i ][ j ].setTexture( tekstura[ level.poziom[ i ][ j ].type ] );
                sprite[ i ][ j ].setPosition( j * level.tile_width, i * level.tile_height );
            }
        }
    }
    runEngine( win );
}

Jednakże, we wspomnianym poradniku bohater i przeszkody były tworzone w mainie, przez podanie wielkości i pozycji obiektu:
C/C++
cGracz gracz( sf::Vector2f( 50, 50 ) );
cGracz on( sf::Vector2f( 50, 50 ) ); on.zmienPozycje( sf::Vector2f( 200, 200 ) );
cGracz inny( sf::Vector2f( 50, 50 ) ); inny.zmienPozycje( sf::Vector2f( 300, 300 ) );
cGracz inny2( sf::Vector2f( 50, 50 ) ); inny2.zmienPozycje( sf::Vector2f( 380, 180 ) );
std::vector < cGracz > V;
V.push_back( on );
V.push_back( inny );
V.push_back( inny2 );

ja chciałbym tego użyć do mapy kafelkowej i nie wiem jak to zrobić. Wydaję mi się, że trzeba kafelki mapy dodać do vektoru V, tylko że nie  mam pomysłu jak to zrobić. Z góry dzięki za pomoc.
P-142148
« 1 »
  Strona 1 z 1