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

Mapa Heksagonalna - pola w zasięgu

Ostatnio zmodyfikowano 2024-02-24 09:24
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
Mapa Heksagonalna - pola w zasięgu
» 2024-02-23 22:35:49
Witam.
Chciałbym uzyskać współrzędne pól w danym zasięgu pewnego pola.
Poniższe obrazy obrazują problem.

Pola dla promienia R=0

Pola dla promienia R=1

Pola dla promienia R=2
P-180869
DejaVu
» 2024-02-23 22:53:41
Na podstawie pozycji kursora?
1) Weź pozycję kursora
2) przekształć pozycję kursora w każdym kierunku o rozmiar tilesa.

Wersja prostsza (łatwiejsza do implementacji i bardziej praktyczna do realizacji):
1) znajdź pozycję na którą wskazuje kursor
2) skoro znasz lokalizację pola na które wskazuje kursor, to wiesz również jakie indeksy mają wszystkie pola dookoła
P-180870
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-23 23:01:08
czyli jak ? rekurencyjnie to zrobić?
P-180871
DejaVu
» 2024-02-24 00:12:43
Zaimplementuj cokolwiek co zadziała, ale masz 6 pól wokół pola X, więc tutaj rekurencja nie jest potrzebna tylko łopatologiczne zbudowanie listy pól wokół pola X, a potem przetworzenie tej listy.
P-180872
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-24 02:13:10
Dzięki za rady. Problem rozwiązany a tak to zrobiłem. (Jednak użylem rekurencji)
 
Przypisałem każdemu z pól sąsiadów, a następnie rekurencyjnie ich wywoływałem. Przydał się tu kontener <set> (unikalne itemy w liście).


C/C++
// SET THE NEIGHBOURS FOR ANY TILE
for( auto & tile: hexMap->tiles )
{
   
tile->neighbours[ 0 ] = hexMap->getHexTile( tile->x +( tile->z % 2 ), tile->z + 1 );
   
tile->neighbours[ 1 ] = hexMap->getHexTile( tile->x + 1, tile->z );
   
tile->neighbours[ 2 ] = hexMap->getHexTile( tile->x +( tile->z % 2 ), tile->z - 1 );
   
tile->neighbours[ 3 ] = hexMap->getHexTile( tile->x +( tile->z % 2 ) - 1, tile->z - 1 );
   
tile->neighbours[ 4 ] = hexMap->getHexTile( tile->x - 1, tile->z );
   
tile->neighbours[ 5 ] = hexMap->getHexTile( tile->x +( tile->z % 2 ) - 1, tile->z + 1 );
}

C/C++
void getNeighbours( std::set < HexTile * > & tiles, HexTile * tile, int radius )
{
   
if( tile != nullptr )
   
{
       
tiles.insert( tile );
       
       
if( radius > 0 )
       
{
           
getNeighbours( tiles, tile->neighbours[ 0 ], radius - 1 );
           
getNeighbours( tiles, tile->neighbours[ 1 ], radius - 1 );
           
getNeighbours( tiles, tile->neighbours[ 2 ], radius - 1 );
           
getNeighbours( tiles, tile->neighbours[ 3 ], radius - 1 );
           
getNeighbours( tiles, tile->neighbours[ 4 ], radius - 1 );
           
getNeighbours( tiles, tile->neighbours[ 5 ], radius - 1 );
       
}
    }
}

 przykładowe użycie
C/C++
std::set < HexTile * > ts;
getNeighbours( ts, hexMap->getHexTile( tilePos.X, tilePos.Y ), brushSize );

for( auto & t: ts )
   
 t->setTerrainType( brushTerrain );
P-180873
DejaVu
» 2024-02-24 09:24:33
No i good job :)
P-180874
« 1 »
  Strona 1 z 1