我的DirectX项目存在很大问题。 我需要为vertexbuffer创建struct ..
CUSTOMVERTEX vertices[] =
{
{ 2.5f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 0.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ -2.5f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
};
但是我该怎么做呢? 我需要制作巨大的三角形场(三维地形)。所以, 我试过这样的事情:
void Field_Generation::Field_Generate(int X, int Y, int Z)
{
int zeme[X][Y];
int n=0;
for (int i=0;i < X;i++)
{
for (int j=0;i < Y;j++)
{
zeme[i][j] = rand() % Z;
}
}
for (int i=0;i < X;i++)
{
for (int j=0;i < Y;j++)
{
int color1= rand() % 255;
int color2= rand() % 255;
int color3= rand() % 255;
n++;
CUSTOMVERTEX verticles[n] = {{i,j,zeme[i][j],D3DCOLOR_XRGB(color1,color2,color3),}};
}
}
}
但这不适合我。 :(我无法弄明白该怎么做。请帮助。谢谢。
答案 0 :(得分:2)
您发布的代码存在许多问题。
首先,这不起作用:
int zeme[X][Y];
您不能以这种方式创建动态数组。虽然有多种方法可以执行此操作,但我建议您使用std::vector
,因此在源代码顶部确保包含正确的标题:
#include <vector>
using namespace std;
然后您可以像这样定义zeme
:
vector<vector<int> > zeme(X, vector<int>(Y, 0));
现在,您可以使用zeme[x][y]
访问您的元素。
接下来,您需要创建一个数组来保存自定义顶点数据,然后再次使用std::vector
。这应该被定义为类成员或全局变量,而不是在函数内定义。类似的东西:
std::vector<CUSTOMVERTEX> m_pVertices;
然后,在你的循环中,初始化每个条目,如下所示:
CUSTOMVERTEX pVertex = {i, j, zeme[i][j], D3DCOLOR_XRGB(color1,color2,color3) };
m_pVertices.push_back(pVertex);
稍后,当您需要将指向顶点数组的指针传递给DirectX进行绘制时,请使用此语法获取指向数据开头的指针:
CUSTOMVERTEX *pData = &m_pVertices[0];
(请注意,在C ++ 11中,有其他方法可以处理上述所有内容)
另一种选择,如果你已经有一个CUSTOMVERTEX
数组,那就是初始化循环中的每个组件。所以,假设你的CUSTOMVERTEX
有这样的结构(我猜是因为你没有显示它):
struct CUSTOMVERTEX
{
float x, y, z;
D3DCOLOR nCol;
};
然后,在你的循环中,你可以像这样初始化每个条目(你需要使用你的结构中定义的任何名称):
verticles[n].x = i;
verticles[n].y = j;
verticles[n].z = zeme[i][j];
verticles[n].nCol = D3DCOLOR_XRGB(color1,color2,color3);
因此,您将每个值分配给结构的成员,而不是像在第一个示例中那样尝试在一次命中中分配整个结构。
答案 1 :(得分:1)
您可以通过设置每个组件的组件来设置结构的值,如下所示。
struct Person
{
int age;
string name;
};
Person person[2];
person[0].age = 20;
person[0].name = "zdd";
person[1].age = 30;
person[1].name = "ddz";