У меня огромная проблема в моем проекте DirectX.
Мне нужно сделать структуру для вершинного буфера ..
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), },
};
Но как мне сделать это в цикле?
Мне нужно сделать огромное поле из треугольников (3d рельеф). Так,
Я попробовал что-то вроде этого:
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),}};}
}
}
Но это не работает для меня. 🙁 Я не могу понять, как это сделать. Помогите, пожалуйста. Спасибо.
Есть много проблем с кодом, который вы разместили.
Прежде всего, это не сработает:
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);
Таким образом, вы присваиваете каждое значение члену структуры, а не пытаетесь назначить всю структуру одним ударом, как я делал в первом примере.
Вы можете установить значение структуры, установив каждый ее компонент, например так.
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";