Mapa Heksagonalna - pola w zasięgu
Ostatnio zmodyfikowano 2024-02-24 09:24
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=0Pola dla promienia R=1Pola dla promienia R=2 |
|
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 |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-02-23 23:01:08 czyli jak ? rekurencyjnie to zrobić? |
|
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. |
|
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). 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 ); }
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 std::set < HexTile * > ts; getNeighbours( ts, hexMap->getHexTile( tilePos.X, tilePos.Y ), brushSize );
for( auto & t: ts ) t->setTerrainType( brushTerrain );
|
|
DejaVu |
» 2024-02-24 09:24:33 No i good job :) |
|
« 1 » |