我的OpenGL代码中出现了一个问题,看起来很简单,但它似乎没有像我预期的那样工作。
代码如下:
int x = 0, y = 0, z = 0, TP = 1;
bool initiate_placement = true;
float trans[3][3][2] = {{{-16.0,16.0},{0.0,16.0},{16.0,16.0}},
{{-16.0,0.0},{0.0,0.0},{16.0,0.0}},
{{-16.0,-16.0},{0,-16.0},{16.0,-16.0}}};
vector<tiles> Place;
tiles VER, HOR, NOREA, NORWE, SOUEA, SOUWE, TNOR, TSOU, TEA, TWE, CRO;
void Tile_Placement()
{
int A = rand() % 10 + 1;
if (TP <= 9)
{
switch (A)
{
case 1:
VER.vertical(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(VER);
break;
case 2:
HOR.horizontal(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(HOR);
break;
case 3:
NOREA.north2east(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(NOREA);
break;
case 4:
NORWE.north2west(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(NORWE);
break;
case 5:
SOUEA.south2east(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(SOUEA);
break;
case 6:
SOUWE.south2west(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(SOUWE);
break;
case 7:
TNOR.T_north(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(TNOR);
break;
case 8:
TSOU.T_south(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(TSOU);
break;
case 9:
TEA.T_east(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(TEA);
break;
case 10:
TWE.T_west(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(TWE);
break;
case 11:
CRO.cross(trans[x][y][z],trans[x][y][z + 1]);
Place.push_back(CRO);
break;
}
cout << trans[x][y][z] << " , " << trans[x][y][z + 1] << endl;
}
}
void Tile_LoopZ()
{
if (z < 1)
{
Tile_Placement();
TP++;
z++;
Tile_LoopZ();
}
z = 0;
}
void Tile_LoopY()
{
if (y < 3)
{
Tile_LoopZ();
y++;
Tile_LoopY();
}
y = 0;
}
void Tile_LoopX()
{
if (initiate_placement == true)
{
if (x < 3)
{
Tile_LoopY();
x++;
Tile_LoopX();
x = 0;
}
}
initiate_placement = false; //<<< problem is focused here
x = 0, y = 0, z = 0, TP = 1;
}
void gameScene()
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLineWidth(2.0);
glColor3f(1.0, 1.0, 1.0);
Tile_LoopX();
glutSwapBuffers();
}
这里的代码告诉我,在递归函数Tile_LoopX();
中,一旦initiate_placement == true
,就会发生一个推回九个图块的代码。将九个磁贴推回后,会导致initiate_placement
错误,如果再次调用gameScene()
,Tile_LoopX();
将无法运行其代码。
到目前为止我所知道的事情是gameScene()
是一个无限循环。删除initiate_placement = false;
会使图块随机突然显示,因为它会一遍又一遍地调用。放置initiate_placement = false;
听起来像是一个很好的解决方案,但瓷砖从未被推回过。为了测试代码是否通过,我添加了一个cout
,它实际上已通过。
如果有的话,我可能错过了一些非常简单的东西,我真的需要帮助。
2015年4月16日更新:
向量做被推回,因为我cout
对向量的大小(即9)。现在的问题在于,矢量中的对象从未在程序中直观显示,甚至无法在程序中使用其代码。