Я использую С++ для рекурсивного создания шестиугольной сетки (используя стиль многосвязного списка). Я настроил его так, чтобы было легко создавать соседние плитки, но поскольку я делаю это рекурсивно, я действительно могу создать только все 6 соседей для данной плитки. Очевидно, это приводит к созданию повторяющихся плиток, и я пытаюсь каким-то образом избавиться от них. Поскольку я использую класс, проверка нулевых указателей не работает. Это либо не удается преобразовать мой класс Tile в int, либо каким-то образом преобразовать его, но не сделать это должным образом. Я явно устанавливаю все указатели в NULL при создании, и когда я проверяю, есть ли они, он говорит, что это не так, хотя я никогда не касался их с момента инициализации. Есть ли какой-то особый способ, которым я должен это сделать? Я даже не могу пройти по сетке без каких-либо NULL
Вот некоторые из моих соответствующих кодов. Да, я знаю, что это смущает.
Заголовок класса плитки:
class Tile
{
public:
Tile(void);
Tile(char *Filename);
~Tile(void);
void show(void);
bool LoadGLTextures();
void makeDisplayList();
void BindTexture();
void setFilename(char *newName);
char Filename[100];
GLuint texture[2];
GLuint displayList;
Tile *neighbor[6];
float xPos, yPos,zPos;
};`
Инициализация плитки:
Tile::Tile(void)
{
xPos=0.0f;
yPos=0.0f;
zPos=0.0f;
glEnable(GL_DEPTH_TEST);
strcpy(Filename, strcpy(Filename, "Data/BlueTile.bmp"));
if(!BuildTexture(Filename, texture[0]))
MessageBox(NULL,"Texture failed to load!","Crap!",MB_OK|MB_ICONASTERISK);
for(int x=0;x<6;x++)
{
neighbor[x]=NULL;
}
}
Создание соседних плиток:
void MakeNeighbors(Tile *InputTile, int stacks)
{
for(int x=0;x<6;x++)
{
InputTile->neighbor[x]=new Tile();
InputTile->neighbor[x]->xPos=0.0f;
InputTile->neighbor[x]->yPos=0.0f;
InputTile->zPos=float(stacks);
}
if(stacks)
{
for(int x=0;x<6;x++)
MakeNeighbors(InputTile->neighbor[x],stacks-1);
}
}
И, наконец, обход сетки:
void TraverseGrid(Tile *inputTile)
{
Tile *temp;
for(int x=0;x<6;x++)
if(inputTile->neighbor[x])
{
temp=inputTile->neighbor[x];
temp->xPos=0.0f;
TraverseGrid(temp);
//MessageBox(NULL,"Not Null!","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
}
Ключевой строкой является «if(inputTile->neighbor[x])», и независимо от того, делаю ли я это «if(inputTile->neighbor[x]==NULL)» или что-то еще, оно просто не обрабатывает его должным образом. О, и я также знаю, что я не настроил список полностью. Сейчас только одно направление.