Как сделать Gradient box?

Участник
Участник
Статус
Оффлайн
Регистрация
3 Июн 2017
Сообщения
365
Реакции
291
Собственно вопрос, как сделать такие элементы (за именем)?
MzCzlvqB-N8.jpg

Если можно ЛС или под хайд от новорегов)

AddRectFilledMultiColor - не катит
 
думаю не составит труда допилить до нужного эффекта....


первым делом описываем прототип для функции:
Что нам будет нужно? Нам необходимо указывать положение в пространстве:
Код:
Expand Collapse Copy
int x, int y,
нужна возможность указывать свои размеры(высота\ширина):
Код:
Expand Collapse Copy
int w, int h,
необходимо выбирать цвета начального и конечного цветов:
Код:
Expand Collapse Copy
D3DCOLOR Col_start, D3DCOLOR Col_end,
в задумке нужна возможность выбора ориентации заливки цветом, поэтому указываем "ссылку" на структуру, которую заведем немного позже:
Код:
Expand Collapse Copy
 Gradient_orientation orientation_Box ,
ну и конечно же указатель на наше устройство:
Код:
Expand Collapse Copy
IDirect3DDevice9* pDevice

С аргументами для функции мы закончали))

перейдем непосредственно к самому описанию тела:


первым делом заводим структуру для буффера вершин:
Код:
Expand Collapse Copy
static struct D3DVERTEX
   {
   int x,
     y,
   z;
   D3DCOLOR color;
   }

теперь описыываем сам буффер:
Код:
Expand Collapse Copy
Buff_Vertex[4] = {
   {0,0,0,1.0f,0},
   {0,0,0,1.0f,0},
   {0,0,0,1.0f,0},
   {0,0,0,1.0f,0}};


заполняем буффер согласно нашей структуре:
Код:
Expand Collapse Copy
Buff_Vertex[0].x = x;
   Buff_Vertex[0].y = y;
   Buff_Vertex[0].color = Col_start;

   Buff_Vertex[1].x = x+w;
   Buff_Vertex[1].y = y;
   Buff_Vertex[1].color = orientation_Box == horizontal ? Col_end : Col_start;

   Buff_Vertex[2].x = x;
   Buff_Vertex[2].y = y+h;
   Buff_Vertex[2].color = orientation_Box == horizontal ? Col_start : Col_end;

   Buff_Vertex[3].x = x+w;
   Buff_Vertex[3].y = y+h;
   Buff_Vertex[3].color = Col_end;

немного поясню этот код, думаю многим из вас эта структура не известна:
Код:
Expand Collapse Copy
orientation_Box == horizontal ? Col_end : Col_start;
эта запись равносильна этой:
Код:
Expand Collapse Copy
if(a==b)
{
выполняем если условия соблюдены
}
else
{
выполняем если условия НЕ соблюдены
}


Теперь нарисуем созданный нами буффер вершин:
Код:
Expand Collapse Copy
pDevice->SetTexture(0, NULL);
   pDevice->SetPixelShader( 0 );
   pDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE);
   pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
   pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
   pDevice->SetRenderState(D3DRS_ZENABLE , FALSE);
   pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
   pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,Buff_Vertex,sizeof(D3DVERTEX));


С самой функцией все)

теперь опишем структуру для направления заливки:
Код:
Expand Collapse Copy
enum Gradient_orientation
   {
   horizontal,
   vertical
  };
использовать ее так:
Для горизонтальной заливки
Код:
Expand Collapse Copy
Gradient_Box(.....,horizontal ,..... );

Для вертикальной заливки
Код:
Expand Collapse Copy
Gradient_Box(.....,vertical ,..... );


Получается примерно следующее:

0-Primerboksazalitogogradientnyim.png


ЗЫ: Писал этот пост для другого сайта и с другой целью, но думаю будет в тему)
 
Назад
Сверху Снизу