Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 19.1
19.1 Utilizando o sistema de partículas
1 Visão geral
A DarkGdk apresenta um sistema de partículas ideal para compor pequenos
efeitos especiais.
void dbMakeParticles ( int iID, int iImageIndex, int maxParticles, float fRadius );
dbMakeParticles ( nObjParticulas , nImagem, nQtdMax, nRaioEmissor);
Essa função cria um sistema de partículas.
nObjParticulas Handle numérico do sistema de partículas
nImagem Imagem que texturiza as partículas
nQtdMax Quantidade máxima de partículas emitidas por ciclo
nRaioEmissor Tamanho do emissor expresso por raio
Exemplo:
const int img_fire = 3;
dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\fire.bmp",img_fire);
// Handle para o objeto partículas.
int partic_sys = 1;
// Quantidade máxima de partículas
int partic_max = 50;
// Raio de emissão das partículas
float raio = 20.0f;
// Cria o sistema de partículas
dbMakeParticles ( partic_sys , img_fire, partic_max, raio);
-------------------------------------------------------------------------------
void dbColorParticles ( int iID, int iRed, int iGreen, int iBlue );
dbColorParticles ( nObjParticulas, nVermelho, nVerde, nAzul );
Essa função adiciona uma cor às partículas que se combina com a textura
aplicada. A cor é dada na forma de valores rbg's individuais (nVermelho,
nVerde, nAzul);
Exemplo:
// Handle para o objeto partículas.
int partic_sys = 1;
// Cor das partículas
int r,g,b;
r = g = b = 255; // Branco
// Configura cor das partículas
dbColorParticles ( partic_sys, r, g, b );
-------------------------------------------------------------------------------
void dbPositionParticles ( int iID, float fX, float fY, float fZ );
dbPositionParticles ( nObjParticulas, xpos, ypos, zpos);
Essa função posiciona o emissor de partículas no espaço 3D.
Exemplo:
// Handle para o objeto partículas.
int partic_sys = 1;
float xcursor = 975, ycursor = 535, zcursor = -320;
dbPositionParticles ( partic_sys, xcursor, ycursor, zcursor);
-------------------------------------------------------------------------------
void dbSetParticleEmmissions( int iID, int iNumber );
dbSetParticleEmissions ( nObjParticulas, nQtd );
Essa função configura a quantidade (nQtd) de partículas emitidas. nQtd
representa uma taxa de volume.
Exemplo:
int partic_sys = 1;
// Quantidade de partículas na emissão
int partic_qtd = 10;
dbSetParticleEmissions ( partic_sys, partic_qtd );
-------------------------------------------------------------------------------
void dbSetParticleSpeed ( int iID, float fTime );
dbSetParticleSpeed ( nObjParticulas, partic_tempo );
Essa função configura a velocidade de movimentação das partículas.
Exemplo:
// Handle para o objeto partículas.
int partic_sys = 1;
// Frequência de emissão das partículas
float partic_tempo = 0.01f;
dbSetParticleSpeed ( partic_sys, partic_tempo);
-------------------------------------------------------------------------------
void dbSetParticleGravity ( int iID, float fGravity );
dbSetParticleGravity ( nObjParticulas, partic_gravidade );
Essa função configura a força de gravidade sobre as partículas. Valores
negativos invertem a direção de movimento das partículas.
Exemplo:
// Handle para o objeto partículas.
int partic_sys = 1;
// Gravidade da queda
float partic_gravidade = 2.0f;
dbSetParticleGravity ( partic_sys, partic_gravidade);
-------------------------------------------------------------------------------
void dbSetParticleFloor ( int iID, int iFlag );
dbSetParticleFloor(nObjParticulas, lPiso);
Essa função liga (lPiso = 1) ou desliga (lPiso = 0) o piso limite das
partículas. Se estiver desligado as partículas se movimentam por todo
o espaço 3D até desaparecerem.
Exemplo:
// Handle para o objeto partículas.
int partic_sys = 1;
int lPiso = 0;
dbSetParticleFloor ( partic_sys, lPiso);
-------------------------------------------------------------------------------
void dbGhostParticlesOn ( int iID, int iMode );
dbGhostParticlesOn(nObjParticulas, modo_ghost);
Essa função aplica um efeito fantasma nas partículas adicionando-lhes,
conforme a configuração do modo_ghost, alguma transparência às mesmas.
modo_ghost Vai de zero (0) a cinco (5) determinando 6 configurações
distintas de modo ghost.
Exemplo:
// Handle para o objeto partículas.
int partic_sys = 1;
int modo_ghost = 2;
dbGhostParticlesOn ( partic_sys, modo_ghost);
Veja agora o programa exemplo completo:
// particulas.cpp
// Esse programa mostra o uso do sistema de partículas
#include "DarkGDK.h"
#include "windows.h"
// Protótipo das funções
void initsys(); // inicializa o sistema
void teclado(); // Interpreta o teclado
void texturizar(); // Texturiza a matrix
void gpParticles(); // Testa Partículas
// Configuração da camera
float xcam = 1005, ycam = 475, zcam = -555;
float xcursor = 975, ycursor = 535, zcursor = -320;
float xcam_rot = 0, ycam_rot = 0, zcam_rot = 0;
// Configuração dos modos
int modo = 6;
int modo_cam = 1;
int modo_cam_rot = 4;
int modo_cursor = 6;
int terminar = 0;
const int img_fire = 3;
const int obj_cursor = 2;
// ----------------------------------------------------------------------------
void DarkGDK ( void ) {
// Começo da aplicação DarkGdk
// Carrega a textura do terreno e a textura das partículas
dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\textura2x2.bmp",1);
dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\fire.bmp",img_fire);
// Carrega soldado e sua textura
dbSetDir ("c:\\gameprog\\gdkmedia\\Modelos\\German");
dbLoadImage ("german.dds",2);
dbLoadObject ("H-German-Idle.x",1);
// Texturiza o soldado
dbTextureObject (1,2);
// Nosso cursor 3D
dbMakeObjectSphere(obj_cursor,10);
initsys();
// Faz o terreno do cenário
dbMakeMatrix (1,2000,10000,10,50);
dbPrepareMatrixTexture (1,1,2,2);
texturizar();
// Ajusta escala do objeto e ponto de apoio
dbScaleObject (1,12000,12000,12000);
dbFixObjectPivot(1);
// Ajusta câmera e posiciona objeto na cena
dbPositionCamera (1005, 475, -600);
dbPositionObject (1, 970, 300, -185);
dbSyncOn();
// Looping principal
while ( LoopGDK ( ) ) {
if (terminar == 0) teclado();
dbSync ( );
if (terminar == 1)
{
dbDeleteImage (1); dbDeleteImage(img_fire);
dbDeleteImage(2);
dbDeleteMatrix (1);
dbDeleteObject (1);dbDeleteObject (obj_cursor);
return;
} // endif
} // fim do while
return;
} // fim da função: DarkGDK
// ----------------------------------------------------------------------------
void initsys() {
// Esta função inicializa o sistema
dbSyncOn( );
dbSetWindowTitle("particulas.cpp");
dbSetTextTransparent();
dbDisableEscapeKey();
dbSyncRate(60);
dbSetAmbientLight(100);
dbPositionMouse(1,1);
} // initsys().fim
// ----------------------------------------------------------------------------
// texturizar() - Aplica aleatóriamente a textura na matrix
void texturizar() {
int linha, coluna;
for (coluna = 0; coluna < 10; coluna++)
{
for (linha = 0; linha < 50; linha++)
{
int tile = dbRnd(4) + 1;
dbSetMatrixTile (1, coluna, linha, tile);
} // linha
} //coluna
dbUpdateMatrix (1);
} // texturizar().fim
// ----------------------------------------------------------------------------
// teclado() - Lê o teclado e executa comandos do usuário
void teclado() {
char sinfo[255];
// Lê o teclado
char *stecla="??";
stecla = dbInKey();
if (dbEscapeKey()) terminar = 1;
if (dbMouseClick() == 1) gpParticles();
// Troca de modo
if (!strcmp(stecla, "c")) modo = modo_cam;
if (!strcmp(stecla, "r")) modo = modo_cam_rot;
if (!strcmp(stecla, "f")) modo = modo_cursor;
// Movimentação dos objetos
if (dbUpKey())
{
if (modo == modo_cam) zcam++;
if (modo == modo_cam_rot) zcam_rot++;
if (modo == modo_cursor) zcursor += 5;
} // endif
if (dbDownKey())
{
if (modo == modo_cam) zcam--;
if (modo == modo_cam_rot) zcam_rot--;
if (modo == modo_cursor) zcursor -= 5;
} // endif
if (dbLeftKey())
{
if (modo == modo_cam) xcam--;
if (modo == modo_cam_rot) xcam_rot--;
if (modo == modo_cursor) xcursor -= 5;
} // endif
if (dbRightKey())
{
if (modo == modo_cam) xcam++;
if (modo == modo_cam_rot) xcam_rot++;
if (modo == modo_cursor) xcursor += 5;
} // endif
if (dbKeyState(201)) {
if (modo == modo_cam) ycam++; // page_up;
if (modo == modo_cam_rot) ycam_rot++;
if (modo == modo_cursor) ycursor += 5;
} // endif
if (dbKeyState(209)) {
if (modo == modo_cam) ycam--; // page_down;
if (modo == modo_cam_rot) ycam_rot--;
if (modo == modo_cursor) ycursor -= 5;
} // endif
// Mostra informações na tela
if (modo == modo_cam)
{
dbText (10,10, "modo = modo_cam - (r) para modo rotacionar (f) cursor");
sprintf (sinfo, "xcam:%f ycam:%f zcam:%f", xcam, ycam, zcam);
dbText (10,30, sinfo);
dbText (10,50, "(clique) - aciona sistema de particulas");
} // endif
if (modo == modo_cam_rot)
{
dbText (10,10, "modo = modo_cam_rot - (c) posicionar camera (f) cursor");
sprintf (sinfo, "xcam_rot:%f ycam_rot:%f zcam_rot:%f", xcam_rot, ycam_rot, zcam_rot);
dbText (10,30, sinfo);
dbText (10,50, "(clique) - aciona sistema de particulas");
} // endif
if (modo == modo_cursor)
{
dbText (10,10, "modo = modo_cursor - (c,r) para posicionar ou rotacionar a camera");
sprintf (sinfo, "xcursor:%f ycursor:%f zcursor:%f ", xcursor, ycursor, zcursor);
dbText (10,30, sinfo);
dbText (10,50, "(clique) - aciona sistema de particulas");
// dbPointCamera (xcursor, ycursor, zcursor);
dbPositionObject(obj_cursor,xcursor, ycursor, zcursor);
} // endif
// Resseta o teclado
strcpy(stecla,"??");
dbPositionCamera (xcam, ycam, zcam);
dbRotateCamera (xcam_rot, ycam_rot, zcam_rot);
} // teclado().fim
void gpParticles()
{
// Criação de partículas
int partic_sys = 1;
// Quantidade máxima de partículas
int partic_max = 50;
// Raio de emissão das partículas
float raio = 20.0f;
// Cor das partículas
int r,g,b;
r= g = b = 255;
// Frequência de emissão das partículas
float partic_tempo = 0.01f;
// Gravidade da queda
float partic_gravidade = 2.0f;
// Quantidade de partículas na emissão
int partic_qtd = 10;
// 1- Liga piso 0 - Desliga piso
int lPiso = 0;
// 0-5 Modo ghost
int modo_ghost = 2;
// Cria o sistema de partículas
dbMakeParticles ( partic_sys , img_fire, partic_max, raio);
// Configura cor, posição e taxa de emissão
dbColorParticles ( partic_sys, r, g, b );
dbPositionParticles ( partic_sys, xcursor, ycursor, zcursor);
dbSetParticleEmissions ( partic_sys, partic_qtd );
// Configura velocidade de emissão e gravidade
dbSetParticleSpeed ( partic_sys, partic_tempo );
dbSetParticleGravity ( partic_sys, partic_gravidade );
// Configura efeito piso e efeito fantasma (ghost)
dbSetParticleFloor(partic_sys, lPiso);
dbGhostParticlesOn(partic_sys, modo_ghost);
} // gpParticles().fim
Esconde e re-exibir o sistema de partículas
Como esperado, há as duas funções clássicas da DarkGdk para esconder
e re-exibir o sistemas de partículas.
dbHideParticles (nObjPartic); // Esconde as partículas
dbShowParticles (nObjPartic); // Mostra as partículas