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

Pole ruchu bohatera na mapie kafelkowej sfml

Ostatnio zmodyfikowano 2020-10-15 18:19
Autor Wiadomość
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.
C/C++
bool Range::create( sf::Vector2u tileSize, int * tiles, unsigned int width, unsigned int height, int vessel, int speed, int obstacle )
{
    //obstacle to minimalna wartosc na tablicy którą są oznaczane ściany i przeszkody i na które nie można będzie wejść
    //vessel to wartość jaką na tablicy oznaczony jest bohater
    //speed to ilość kafelków w lini prostej które może przemierzyć (nie może iść na skos)
    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.
P-177603
pekfos
» 2020-10-13 21:49:29
Taki romb?
         .     
        ...    
       .....   
      ...p...  
       .....   
        ...    
         .     
P-177604
BraveRat
Temat założony przez niniejszego użytkownika
» 2020-10-14 14:27:55
Tak
P-177605
pekfos
» 2020-10-14 18:05:38
C/C++
if( dystans_L1( postac, pole ) <= N )
     pole jest w zasiegu N ruchow postaci;
Licz dystans jako metrykę taksówkarską (normę L1). https://en.wikipedia.org/wiki​/Taxicab_geometry
P-177606
BraveRat
Temat założony przez niniejszego użytkownika
» 2020-10-15 18:19:07
Dzięki
P-177607
« 1 »
  Strona 1 z 1