Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 18.2
18.2 Terreno simples
1.1 Construindo um terreno simples
Bem, agora vamos conhecer melhor as funções que possibilitaram a construção
do terreno acima que fizemos esforço para parecer-se com um campo de futebol.
dbSetupTerrain();
void dbSetupTerrain ( void );
Essa função inicializa o processo de criação do terreno, realizando processos
internos. Você deve começar sempre o processo de criação com essa função e
aplicar as outras funções numa ordem lógica para obter o resultado correto.
---------------------------------------------------------------------------
dbMakeObjectTerrain( nTerreno )
void dbMakeObjectTerrain( int iID );
Essa função registra um handle de identificação para o terreno que deverá ser
utilizado em funções subsequentes para manipulá-lo.
---------------------------------------------------------------------------
dbSetTerrainHeightMap( nTerreno, sArquivoMapa)
void dbSetTerrainHeightMap ( int iID, char* dwHeightMap );
Essa função configura o mapa de altura no terreno especificado. Para melhor
resultado utilize uma imagem formato BMP a partir de 8 bits (256 cores),
tamanho 256x256 com tons entre o preto e o branco. Lembrando que o branco
e o preto representam respectivamente a elevação máxima e nenhuma elevação
com os diversos tons de cinza ocasionando alturas diversas.
Exemplo:
// Determinando o mapa de altura
dbSetTerrainHeightMap ( nTerreno, "mapa_altura.bmp" );
---------------------------------------------------------------------------
dbSetTerrainTexture(nTerreno, nImagemCor, nImagemDetalhe);
void dbSetTerrainTexture( int iID, int iBase, int iDetail );
Essa função define a imagem de difusão e a imagem de detalhe do terreno
especificado.
Veja na ilustração abaixo que a imagem de cor é projetada sobre o terreno
imprimindo ao mesmo tempo sua cor e seu desenho sobre ele.
A imagem de detalhe dá textura ao ao terreno replicando-se em cada segmento
do mesmo. Sem essa imagem de detalhe o terreno fica com um aspecto liso.
Nosso exemplo não replica exatamente as cores do mapa de cor porque
projetamos uma luz esverdeada sobre o terreno para reforçar o verde do
gramado e dessa forma as demais cores também sofrem esse efeito esverdeante
da luz.
Veja abaixo o cenário de uso da função dbSetTerrainTexture():
// (...) procedimentos anteriores necessários...
// Vamos nomear os números para ficar mais legível nosso programa
#define nTerreno 1 // identificação do terreno sendo trabalhado
#define img_textura 1 // textura ou mapa de cor do terreno
#define img_detalhe 2 // textura de detalhamento
// Carregando as imagens de trabalho
dbSetDir("c:\\gameprog\\gdkmedia\\bitmap");
dbLoadImage ( "mapa_cor.jpg", img_textura );
dbLoadImage ( "detalhes.jpg", img_detalhe );
// Determinando a textura difusa e a textura de detalhe
dbSetTerrainTexture ( nTerreno, img_textura, img_detalhe );
---------------------------------------------------------------------------
dbSetTerrainScale(nTerreno, sx, sy, sz);
void dbSetTerrainScale ( int iID, float fXScale, float fYScale, float fZScale );
Essa função aplica uma merecida escala no terreno. Use essa função para
expandir o tamanho do terreno pelos três eixos.
Exemplo:
// (...) procedimentos anteriores necessários...
// Vamos nomear os números para ficar mais legível nosso programa
#define nTerreno 1 // identificação do terreno sendo trabalhado
// Vamos ajustar a escala do terreno
// ...mais largo no eixo X e Z; menor no eixo Y
float escala_x, escala_y, escala_z;
escala_x = 3.0f; escala_y = 0.6f; escala_z = 3.0f;
dbSetTerrainScale ( nTerreno, escala_x, escala_y, escala_z );
---------------------------------------------------------------------------
dbSetTerrainLight ( nTerreno, xluzdir, yluzdir, zluzdir,
luzred, luzgreen, luzblue, luz_intensidade );
void dbSetTerrainLight ( int iID, float fX, float fY, float fZ,
float fRed, float fGreen, float fBlue, float fScale );
Essa função define cor, direção e a intesidade da luz sobre o terreno.
Exemplo:
// (...) procedimentos anteriores necessários...
// Vamos nomear os números para ficar mais legível nosso programa
#define nTerreno 1 // identificação do terreno sendo trabalhado
// Ajustando a iluminação do terreno com uma luz esverdeante
float xdir, ydir, zdir;
float red, green, blue, intensidade;
xdir = 1.0f; ydir = -0.25f; zdir = 0.0f;
red = 0.55f; green = 1.0f; blue = 0.0f;
intensidade = 0.2f;
dbSetTerrainLight ( nTerreno, xdir, ydir, zdir,
red, green, blue, intensidade );
---------------------------------------------------------------------------
dbBuildTerrain(nTerreno);
void dbBuildTerrain ( int iID );
Essa função constrói o terreno e mostra-o na tela. Essa função deve fechar
o bloco de funções de terreno.
---------------------------------------------------------------------------
dbUpdateTerrain();
void dbUpdateTerrain ( void );
Essa função atualiza os dados internos do terreno permitindo assim uma
renderização atualizada do mesmo. Você deve usar essa função antes de
dbSync().
---------------------------------------------------------------------------
1.2 Programa exemplo
Veja agora o programa exemplo integralmente:

// terrain01.cpp - Esse programa mostra como construir um simples terreno
#include "DarkGDK.h"
void initsys(void); // inicializa o sistema
void construir_terreno(void); // configura e mostra o terreno
// Faz a leitura do teclado e atualiza a visualização
void atualizar_visao(void);
#define nTerreno 1 // handle do terreno
void DarkGDK ( void ) {
initsys();
construir_terreno();
// Ajustando a camera
dbPositionCamera ( 385, 23, 100 );
// Looping principal
while ( LoopGDK ( ) )
{
atualizar_visao();
// Atualize a tela
dbSync ( );
}// endwhile
}// endfunction: darkgdk
//-----------------------------------------------------------------------------
void initsys(void) {
dbSyncOn ( );
dbSyncRate ( 60 );
dbSetWindowTitle("terrain01.cpp");
}// endfunction: initsys()
//-----------------------------------------------------------------------------
void construir_terreno(void) {
// Vamos nomear os números para ficar mais legível nosso programa
#define img_textura 1 // textura ou mapa de cor do terreno
#define img_detalhe 2 // textura de detalhamento
// Carregando as imagens de trabalho
dbSetDir("c:\\gameprog\\gdkmedia\\bitmap");
dbLoadImage ( "mapa_cor.jpg", img_textura );
dbLoadImage ( "detalhes.jpg", img_detalhe );
// inicializando o processo de construção de terreno
dbSetupTerrain ( );
// Obtendo o handle para o terreno
dbMakeObjectTerrain ( nTerreno );
// Determinando o mapa de altura
dbSetTerrainHeightMap ( nTerreno, "mapa_altura.bmp" );
// Ajustando a escala do terreno
// Mais largo no eixo X e Z; menor no eixo Y
float escala_x, escala_y, escala_z;
escala_x = 3.0f; escala_y = 0.6f; escala_z = 3.0f;
dbSetTerrainScale ( nTerreno, escala_x, escala_y, escala_z );
// Ajustando a iluminação do terreno
float xdir, ydir, zdir;
float red, green, blue, intensidade;
xdir = 1.0f; ydir = -0.25f; zdir = 0.0f;
red = 0.55f; green = 1.0f; blue = 0.0f;
intensidade = 0.2f;
dbSetTerrainLight ( nTerreno, xdir, ydir, zdir, red, green, blue, intensidade );
// Determinando a textura difusa e a textura de detalhe
dbSetTerrainTexture ( nTerreno, img_textura, img_detalhe );
// Tudo pronto, agora mostre o terreno
dbBuildTerrain ( nTerreno );
}// endfunction: construir_terreno()
//-----------------------------------------------------------------------------
void atualizar_visao() {
// Vamos controlar a camera com as setas
float nVelocidade = 2.0f;
float nVelocidadeGiroLateral = 2.0f;
int nCamera = 0; // Camera default
dbControlCameraUsingArrowKeys ( nCamera, nVelocidade, nVelocidadeGiroLateral );
// Encontre a altura do terreno na posição da camera
float xcam, zcam, nAltura;
xcam = dbCameraPositionX();
zcam = dbCameraPositionZ();
nAltura = dbGetTerrainGroundHeight ( nTerreno, xcam, zcam);
// Vamos recolocar a camera um pouco acima do chão
nAltura = nAltura + 10.0f;
dbPositionCamera ( xcam, nAltura, zcam);
// Atualize o terreno
dbUpdateTerrain ( );
} // endfunction: atualizar_visao()