Pole ruchu bohatera na mapie kafelkowej sfml
Ostatnio zmodyfikowano 2020-10-15 18:19
BraveRat Temat założony przez niniejszego użytkownika |
Pole ruchu bohatera na mapie kafelkowej sfml » 2020-10-13 21:22:39 Witam ostatnio mam problem z napisaniem pewnej klasy. Klasa miałaby wyświetlać na mapie kafelkowej zasięg ruchu bohatera gry w postaci podobnej do rombu. bool Range::create( sf::Vector2u tileSize, int * tiles, unsigned int width, unsigned int height, int vessel, int speed, int obstacle ) { m_vertices.setPrimitiveType( sf::Quads ); m_vertices.resize( width * height * 4 ); int counter = 0; int cell = 0; int cellHeight = 0; std::vector < int > positions; for( unsigned int k = 0; k < width; k++ ) { for( unsigned int l = 0; l < height; l++ ) { if( tiles[ k + l * width ] == vessel ) { cell = k + l * width; cellHeight = l; } } } for( unsigned int m = 0; m < width; m++ ) { for( unsigned int n = 0; n < height; n++ ) { if( tiles[ m + n * width ] >= obstacle && tiles[ m + n * width ] != vessel ) { positions.push_back( 2 ); } else if( tiles[ m + n * width ] == vessel ) { positions.push_back( 2 ); } else { positions.push_back( 1 ); } } } for( int o = 0; o < speed + 1; o++ ) { for( int p = 0; p < speed * 2 + 1; p++ ) { if( p < speed && cell - speed -( speed * speed ) +(( 2 * speed ) + 1 ) + p == cell - speed -( speed * speed ) +(( 2 * speed ) + 1 ) + speed - o ) { positions[ cell - speed -( speed * speed ) +(( 2 * speed ) + 1 ) + p ] -= 1; } else if( p == speed ) { p++; positions[ cell - speed -( speed * speed ) +(( 2 * speed ) + 1 ) + p ] -= 1; } else if( p > speed + 1 && cell - speed -( speed * speed ) +(( 2 * speed ) + 1 ) + p == cell - speed -( speed * speed ) +( 2 *(( 2 * speed ) + 1 ) ) - speed + o ) { positions[ cell - speed -( speed * speed ) +(( 2 * speed ) + 1 ) + p ] -= 1; } } } for( unsigned int i = 0; i < width; i++ ) { for( unsigned int j = 0; j < height; j++ ) { int tileNumber = positions[ i + j * width ]; int actualcell = i + j * width; int tu = tileNumber %( tileset.getSize().x / tileSize.x ); int tv = tileNumber /( tileset.getSize().x / tileSize.x ); sf::Vertex * quad = & m_vertices[ counter * 4 ]; quad[ 0 ].position = sf::Vector2f(( i * tileSize.x ),( j * tileSize.y ) ); quad[ 1 ].position = sf::Vector2f((( i + 1 ) * tileSize.x ),( j * tileSize.y ) ); quad[ 2 ].position = sf::Vector2f((( i + 1 ) * tileSize.x ),(( j + 1 ) * tileSize.y ) ); quad[ 3 ].position = sf::Vector2f(( i * tileSize.x ),(( j + 1 ) * tileSize.y ) ); if( tileNumber == 0 ) { counter++; quad[ 0 ].texCoords = sf::Vector2f( tu * tileSize.x, tv * tileSize.y ); quad[ 1 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x, tv * tileSize.y ); quad[ 2 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x,( tv + 1 ) * tileSize.y ); quad[ 3 ].texCoords = sf::Vector2f( tu * tileSize.x,( tv + 1 ) * tileSize.y ); } } } m_vertices.resize( counter * 4 ); return true; }
Nie jestem w stanie ułożyć równania które opisywałoby ten kształt. |
|
pekfos |
» 2020-10-13 21:49:29 Taki romb? . ... ..... ...p... ..... ... .
|
|
BraveRat Temat założony przez niniejszego użytkownika |
» 2020-10-14 14:27:55 Tak |
|
pekfos |
» 2020-10-14 18:05:38 |
|
BraveRat Temat założony przez niniejszego użytkownika |
» 2020-10-15 18:19:07 Dzięki |
|
« 1 » |