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

index << >>



12.2 Outras funções de movimentação de objeto

12.2.1 Rotação de objeto em apenas um eixo

Através da função dbRotateObject() que usamos no capítulo anterior nós conseguimos
rodar o objeto nos três eixos simultâneamente. Há três funções que rodam a objeto
em cada eixo isoladamente:

dbXRotateObject (rx) - Roda o objeto no eixo x
dbYRotateObject (ry) - Roda o objeto no eixo y
dbZRotateObject (rz) - Roda o objeto no eixo z

Os argumentos representam ângulos e são do tipo float. Os valores podem ser também
negativos.

12.2.2 Outras funções de rotação de objeto
Há outro grupo de funções que especificam ainda mais o trabalho de rodar o
objeto:	

dbTurnObjectLeft( nAngulo )
dbTurnObjectRight( nAngulo )
Estas funções giram o objeto para a esquerda e direita. São semelhantes a uma rotação
no eixo y.

dbPitchObjectUp( nAngulo )
dbPitchCameraDown( nAngulo ) 
Estas funções giram o objeto para cima e para baixo. São semelhantes a uma rotação
no eixo x.	

dbRollObjectLeft( nAngulo )
dbRollObjectRight( nAngulo ) 
Estas funções giram o objeto para esquerda e direita aplicando um efeito-parafuso na
visualização. São semelhantes a uma rotação no eixo z.

O grupo de funções acima vai sempre somando nAngulo à rotação anterior do
objeto de forma que estas funções em um looping com o valor de nAngulo fixo
ficam rodando o objeto continuamente.

Veja nosso programa exemplo:	
	
// movimentos.cpp // Esse programa mostra como aplicar certos movimentos ao objeto // Testamos aqui as funções dbTurnObjectLeft, dbTurnObjectRight, // dbRollObjectLeft, dbRollObjectRight, dbPitchObjectDown, dbPitchObjectUp #include "DarkGDK.h" // Protótipo das funções void initsys(); // inicializa o sistema void teclado(); // Interpreta o teclado void texturizar(); // Texturiza a matrix void primitiva3d(); // Desenha uma primitiva 3d para teste // Configuração da camera float xcam = 1005, ycam = 475, zcam = -555; float xcam_rot = 0, ycam_rot = 0, zcam_rot = 0; // Espaço para mensagens de informação char sCmd[255]; char sinfo[255]; int nInicializado = 0; // Configuração dos modos int modo = 1; int modo_especifico = 1; int modo_geral = 4; int terminar = 0; // ---------------------------------------------------------------------------- void DarkGDK ( void ) { // Começo da aplicação DarkGdk initsys(); // Criação básica de um terreno dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\textura2x2.bmp",1); dbMakeMatrix (1,2000,10000,10,50); dbPrepareMatrixTexture (1,1,2,2); primitiva3d(); texturizar(); // Looping principal while ( LoopGDK ( ) ) { if (terminar == 0) teclado(); dbSync ( ); if (terminar == 1) { dbDeleteImage (1); dbDeleteMatrix (1); dbDeleteObject(3); return; } // endif } // fim do while return; } // fim da função: DarkGDK // ---------------------------------------------------------------------------- void initsys() { // Esta função inicializa o sistema dbSyncOn( ); dbSetWindowTitle("movimentos.cpp"); dbSetTextOpaque(); } // 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); dbPositionCamera (1005, 475, -600); } // texturizar().fim // ---------------------------------------------------------------------------- // teclado() - Lê o teclado e executa comandos do usuário void teclado() { // Zera mensagem na inicilização do programa if (nInicializado == 0) { strcpy(sCmd, "movimentos.cpp"); nInicializado = 1; } // Lê o teclado char *stecla="??"; stecla = dbInKey(); // Troca de modo if (!strcmp(stecla, "e")) modo = modo_especifico; if (!strcmp(stecla, "g")) modo = modo_geral; if (!strcmp(stecla, "q")) terminar = 1; // Movimentação dos objetos if (dbUpKey()) { if (modo == modo_especifico) dbRollObjectLeft(3,5); if (modo == modo_especifico) sprintf(sCmd,"%s","dbRollObjectLeft(3,5)"); if (modo == modo_geral) { zcam_rot--; sprintf(sCmd, "dbZRotateObject(3, zcam_rot= %f )", zcam_rot); dbZRotateObject (3,zcam_rot); } // fim do if(modo_geral) } // endif(upkey) if (dbDownKey()) { if (modo == modo_especifico) dbRollObjectRight(3,5); if (modo == modo_especifico) sprintf(sCmd, "%s","dbRollObjectRight(3,5)"); if (modo == modo_geral) { zcam_rot++; sprintf(sCmd, "dbZRotateObject(3, zcam_rot= %f )", zcam_rot); dbZRotateObject (3,zcam_rot); } // fim do if(modo_geral) } // endif(downkey) if (dbLeftKey()) { if (modo == modo_especifico) dbPitchObjectUp(3,5); if (modo == modo_especifico) sprintf(sCmd, "%s", "dbPitchObjectUp(3,5)"); if (modo == modo_geral) { xcam_rot--; sprintf(sCmd, "dbXRotateObject(3, xcam_rot= %f )", xcam_rot); dbXRotateObject(3,xcam_rot); } // fim do if (modo_geral) } // endif (lefkey) if (dbRightKey()) { if (modo == modo_especifico) dbPitchObjectDown(3,5); if (modo == modo_especifico) sprintf(sCmd, "%s","dbPitchObjectDown(3,5)"); if (modo == modo_geral) { sprintf(sCmd, "dbXRotateObject (3, xcam_rot= %f )",xcam_rot ); xcam_rot++; dbXRotateObject(3,xcam_rot); } // fim do if(modo_geral) } // endif (rightkey) if (dbKeyState(201)) { if (modo == modo_especifico) dbTurnObjectLeft(3, 5); if (modo == modo_especifico) sprintf(sCmd, "%s","dbTurnObjectLeft(3, 5)"); if (modo == modo_geral) { ycam_rot++; sprintf(sCmd, "dbYRotateObject(3, ycam_rot= %f )", ycam_rot); dbYRotateObject(3, ycam_rot); } // fim do if(modo_geral) } // endif (page_up) if (dbKeyState(209)) { if (modo == modo_especifico) dbTurnObjectRight(3,5); // page_down; if (modo == modo_especifico) sprintf(sCmd, "%s","dbTurnObjectRight(3,5)"); if (modo == modo_geral) { ycam_rot--; sprintf(sCmd, "dbYRotateObject(3, ycam_rot= %f )", ycam_rot); dbYRotateObject(3,ycam_rot); } // fim do if(modo_geral) } // endif (page_down) // Mostra informações na tela if (modo == modo_especifico) { dbText (10,10, "modo = modo_especifico - (g) para rotacao geral - (q) Terminar"); dbText (10,30, "cima/baixo - esquerda/direita - page_up/page_down"); dbText (10,50, sCmd); } // endif if (modo == modo_geral) { dbText (10,10, "modo = modo_geral - (e) para rotacao especifica"); sprintf (sinfo, "xcam_rot:%f ycam_rot:%f zcam_rot:%f", xcam_rot, ycam_rot, zcam_rot); dbText (10,30, sinfo); dbText (10,50, sCmd); if (!strcmp(stecla, "m")) dbWriteToClipboard(sinfo); } // endif // Resseta o teclado strcpy(stecla,"??"); } // teclado().fim void primitiva3d() { dbMakeObjectBox(3,50,200,200); dbPositionObject(3,816,200,175); // Aplicando cor ao objeto dbColorObject (3, dbRGB(0,0,255)); // Rodando o box dbRotateObject (3,0,-25,0); } // primitiva3d().fim

index << >>


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