Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 19.1

index << >>



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
index << >>

Produzido por Gameprog: Jair Pereira - Setembro/2013 © gameprog.br@gmail.com http://www.gameprog.com.br http://www.nucleoararat.com.br