[SFML] kolizje postaci z mapą kafelkową
Ostatnio zmodyfikowano 2015-12-19 15:30
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: 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: Engine::Engine( sf::RenderWindow & win ) { 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 ) ); } 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: 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. |
|
« 1 » |