Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 10.2
10.2 Texturizando o terreno
10.1 Aspectos gerais
Para texturizar um terreno criado pela função dbMakeMatrix() é necessário os
seguintes passos:
a) Preparar com um programa de manipulação de imagens uma imagem para servir de
textura. Para melhor performance do programa é importante que o tamanho da
imagem seja múltiplo de 8 tipo 64x64, 128x128, 256x256 e assim sucessivamente.
b) Carregar a imagem dentro da sua aplicação com dbLoadImage():
dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\textura2x2.bmp",1);
c) Preparar a textura com a função dbPrepareMatrixTexture(). Veja em nossa
amostra de textura acima que a imagem está segmentada em 2x2 trazendo quatro
texturas diferentes numeradas de 1 a 4. Essa ordem (1-4) é a ordem na qual a
DarkGdk enxerga e acessa as texturas. Veja abaixo a sintaxe da função de
preparação da textura:
dbPrepareMatrixTexture (nMatrix,nImagem, recorte-x, recorte-y);
void dbPrepareMatrixTexture ( int MatrixNumber, int ImageNumber, int Across, int Down )
dbPrepareMatrixTexture (1,1,2,2);
Veja que você precisa indicar o terreno (nMatrix), indicar a imagem fonte da
textura (nImagem), indicar a segmentação horizontal (recorte-x), e segmentação
vertical (recorte-y).
d) Aplicar a textura com a função dbFillMatrix():
dbFillMatrix ( nMatrix, nAltura, nTile);
void dbFillMatrix ( int MatrixNumber, float Height, int TileNumber )
dbFillMatrix (1,10,nTile);
Nessa função você indica o terreno (nMatrix) e você pode definir a
altura de colocação do terreno no mundo 3D através de nAltura.
nTile refere-se ao 'azulejo', subtextura presente na sua imagem.
e) Atualizar a visualização do terreno a função dbUpdateMatrix(nMatrix):
dbUpdateMatrix (1);
Veja nosso programa exemplo:
// matrix02tex.cpp
// Esse programa mostra como texturizar um terreno (matrix)
#include "DarkGDK.h"
// Protótipo das funções
void initsys(); // inicializa o sistema
void trocar_textura(); // Troca e atualiza a textura da matrix
int nTile = 2; // Representa um tipo de textura numa imagem
// ----------------------------------------------------------------------------
void DarkGDK ( void ) {
// Começo da aplicação DarkGdk
initsys();
// Criação básica de um terreno com o posicionamento da câmera para visualizá-lo
dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\textura2x2.bmp",1);
dbMakeMatrix (1,1000,1000,4,3);
dbPrepareMatrixTexture (1,1,2,2);
dbFillMatrix (1,10,nTile);
dbUpdateMatrix (1);
dbPositionCamera (500, 200, -600);
while ( LoopGDK ( ) ) {
trocar_textura();
dbSync ( );
} // fim do while
return;
} // fim da função: DarkGDK
// ----------------------------------------------------------------------------
void initsys() {
// Esta função inicializa o sistema
dbSyncOn( );
dbSetWindowTitle("matrix02tex.cpp");
} // initsys().fim
// ----------------------------------------------------------------------------
void trocar_textura() {
char *stecla = "0";
float nAltura = 0;
// Leitura do teclado
stecla = dbInKey();
// Reconfigura a textura conforme a tecla pressionada
if (!strcmp("1", stecla)) nTile = 1;
if (!strcmp("2", stecla)) nTile = 2;
if (!strcmp("3", stecla)) nTile = 3;
if (!strcmp("4", stecla)) nTile = 4;
nAltura = nTile * 15;
// Troca a textura e atualiza a matrix
if (stecla[0] != 0) {
dbFillMatrix (1, nAltura, nTile);
dbUpdateMatrix (1);
strcpy (stecla, "0"); // Neutraliza memória e efeito da tecla digitada
} // endif
dbText (10,10, "Pressione 1-2-3-4 para mudar a textura");
} // trocar_textura().fim
A função strcpy(*sdestino, *sfonte) é uma função de string que copia o conteúdo
sfonte para sdestino. É equivalente a sdestino = sfonte mas com linguagem c
essa construção não é possível com strings.
No próximo capítulo vamos ver como texturizar individualmente cada polígono do
terreno.