Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 15.3
15.3 Colisão de objetos 3D
1 Visão geral
A detecção da colisão de objetos é um processo fundamental na programação de jogos,
pois é através desse processo que você determina uma reação inteligente ao seu
personagem conforme ele se depara com um outro objeto. O cálculo para se detectar
uma colisão em um mundo 3D é complexo, porém é importante saber que ele é feito
baseado na coordenada do objeto e no raio que o objeto ocupa ao redor dessa
coordenada, logo se houver uma intersecção de coordenadas ou de raios com um outro
objeto houve então uma colisão.
1)Colisão de um objeto com outro objeto particular
dbSetObjectCollisionOn(nObjeto);
Esta função aciona a detecção de colisão do objeto (nObjeto)
especificado com qualquer outro objeto.
nBool = dbObjectCollision(nObjeto,nObjetoAlvo)
Esta função retorna o valor um caso o objeto nObjeto colidiu com o objeto alvo.
Caso você queira detectar a colisão do objeto com qualquer outro objeto, configure
nObjetoAlvo para zero.
Exemplo:
dbSetObjectCollisionOn (1);
if (dbObjectCollision(1,2) > 0)
{
dbPlaySound (som_arrastar);
for (int ncx=1; ncx < 20; ncx++)
{
zbox++; dbPositionObject (2,xbox,ybox,zbox)
} //endfor
} // endif
Veja agora o programa exemplo completo:
// colisao3d.cpp
// Esse programa ilustra o uso de detecção de colisão da DarkGdk
#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
// Variáveis de trabalho
int terminar = 0;
const int som_arrastar = 1;
//coordenada dos objetos
float xpos = 400, ypos = 10, zpos = 300;
float xbox = 400, ybox = 10, zbox = 350;
// ----------------------------------------------------------------------------
void DarkGDK ( void ) {
// Começo da aplicação DarkGdk
// Carrega textura do terreno
dbSetWindowTitle("Aguarde...");
dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\textura2x2.bmp",1);
dbLoadSound ("c:\\gameprog\\gdkmedia\\som\\arrastar.wav",som_arrastar);
// Inicializa o sistema
initsys();
// Prepara o terreno
dbMakeMatrix (1,2000,10000,10,50);
dbPrepareMatrixTexture (1,1,2,2);
texturizar();
//preparando os objetos
dbMakeObjectSphere (1,10);
dbPositionObject (1,xpos,ypos,zpos);
dbMakeObjectCube (2,30);
dbPositionObject (2,xbox,ybox,zbox);
dbTextureObject (2,1);
// Posiciona camera na cena
dbPositionCamera (400, 50, 250);
// Liga detecção de colisão para o objeto 1
dbSetObjectCollisionOn (1);
dbSyncOn();
// Looping principal
while ( LoopGDK ( ) ) {
if (terminar == 0) teclado();
dbSync ( );
if (terminar == 1)
{
dbDeleteImage (1); dbDeleteMatrix (1);
dbDeleteObject (1);
return;
} // endif
} // fim do while
return;
} // fim da função: DarkGDK
// ----------------------------------------------------------------------------
void initsys() {
// Esta função inicializa o sistema
dbSyncOn( );
dbSetWindowTitle("colisao3d.cpp");
dbSetTextTransparent();
dbDisableEscapeKey();
dbSyncRate(60);
} // 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];
if (dbEscapeKey()) terminar = 1;
// Movimentação do ponto de foco da luz
if (dbUpKey())zpos += 5;
if (dbDownKey()) zpos -= 5;
if (dbLeftKey()) xpos -= 5;
if (dbRightKey()) xpos += 5;
// Mostra informações na tela
dbText (10,10, "Controles: <esc> terminar \t <setas cima,baixo> mover a esfera");
sprintf (sinfo, "xbox:%f ybox:%f zbox:%f ", xbox, ybox, zbox);
dbText (10,30, sinfo);
if (dbObjectCollision(1,2) > 0)
{
dbPlaySound (som_arrastar);
for (int ncx=1; ncx < 20; ncx++)
{
zbox++; dbPositionObject (2,xbox,ybox,zbox);
}
} // endif
//movendo os objetos
dbPositionObject (1,xpos,ypos,zpos);
dbPositionObject (2,xbox,ybox,zbox);
} // teclado().fim