我想使用 C++ 运行一段代码来绘制两个坦克(表示为正方形)。这项工作要求我们使用 for 循环来做到这一点。我设法让它工作,但现在坦克是相同的颜色。我想使用 if 语句来检查它是哪个坦克并给它正确的颜色。我目前将两个坦克放在一个名为 tankpointer 的动态数组中。所以我的非工作代码如下所示:
void draw(game *mygame)
{
for (int i = 0; i < 2; i++)
{
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glMatrixMode(GL_MODELVIEW);
// draw player 1...
glVertexPointer(3, GL_FLOAT, 0, tankVertices);
glColorPointer(4, GL_FLOAT, 0, tank1VertexColors);
glLoadIdentity();
// replace the 0 and 1 of the dynamic array with i to get it to repeat:
glTranslatef(mygame->tankpointer[i].tankx, mygame->tankpointer[i].tanky, -5.0);
glRotatef(mygame->tankpointer[i].rotation, 0.0, 0.0, 1.0);
// 6 instead of the previous 3 to make a square:
glDrawArrays(GL_TRIANGLES, 0, 6);
if (tankpointer[0])
{
float tank1VertexColors[24] =
{
0.4f, 0.4f, 0.4f, 1.0f,
0.4f, 0.4f, 0.4f, 1.0f,
0.4f, 0.4f, 0.4f, 1.0f,
0.4f, 0.4f, 0.4f, 1.0f,
0.4f, 0.4f, 0.4f, 1.0f,
0.4f, 0.4f, 0.4f, 1.0f
};
}
else
{
float tank2VertexColors[24] =
{
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f,
0.8f, 0.8f, 0.8f, 1.0f
};
}
};
它说 if (tankpointer[0])
未定义。任何帮助/建议都会有用。
最佳答案
编译器正在提示,因为您在 tankpointer[0]
之前错过了 mygame->
。 但是,把它放进去不会做你想要的......
两个指针都应该有效,即它们都指向坦克。任何非 NULL 指针都将在 if
语句内计算为 true
,因此 if (mygame->tankpointer[0])
将始终为 true (除非 tankpointer[0]
实际上是 NULL
;那么您的循环将因其他原因而无法工作)。
你想要的是比较循环索引:
if (i == 0) {
// code to set colour for tank 0
} else {
// code to set colour for tank 1
}
更好的是,对于扩展到两个储 jar 之外的解决方案,定义储 jar 索引和颜色之间的映射。我将把它留作练习,以了解您如何做到这一点。
注意:在您提供的代码中,您正在初始化 if
语句分支范围内的数组。该数组不会存在于每个分支之外,因此您也需要在那里设置颜色属性,或者将声明移到外面,并在条件分支内分配元素。
关于c++ - 让 if 语句在 for 循环中工作(使用动态数组和指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34092600/