Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 20.1
20.1 Carregando mundos do jogo Quake da Id Software
1 Visão geral
A DarkGdk possui funções que permitem carregar mapas do jogo Quake da empresa
Id Software. Você pode instalar o jogo Quake III Arena no seu computador e
utilizar os belos mapas que este jogo possui.
Os mapas do jogo citado vêm compactados com compressão zip padrão em um
arquivo com formato pak ou pk3. Você pode utilizar o descompactador Winrar
para verificar o conteúdo desse pacote. Os mapas em si mesmos vem formatados
em arquivos com a extensão BSP.
Ainda, você pode utilizar editor de mapas do Quake para produzir mapas
originais para seus jogos. Os editores mais conhecidos são o Quark e
o GtkRadiant que foi liberado ao público pela própria Id Software.
O GtkRadiant produz mapas com arquivos em formatos .map que depois
devem ser compilados para arquivos .BSP. Depois do mapa pronto você
deve produzir um arquivo zip e renomear sua extensão como .pk3 para
poder utilizá-lo dentro da DarkGdk.
Funções de mundo (World) da DarkGdk
-------------------------------------------------------------------------------
void dbLoadBSP ( char*PK3Filename, char* BSPFilename )
dbLoadBSP ( sArquivo_pk3, sMapa_nome_bsp )
Essa função carrega um arquivo pk3 do jogo Quake e seleciona o mapa
apontado pela string sMapa_nome_bps.
Exemplos:
dbLoadBSP ("ikzdm1.pk3", "ikzdm1.bsp");
dbLoadBSP ("pak0.pk3", "q3dm11.bsp");
Posteriormente você deve assinalar uma camera para este mundo bsp
utilizando a função dbSetBSPCamera () e depois habilitar a colisão
da camera com esse mundo utilizando a função dbSetBSPCameraCollision();
-------------------------------------------------------------------------------
void dbSetBspCamera ( int CameraNumber )
dbSetBspCamera (nCamera)
Essa função assinala uma câmera para o mapa BSP carregado.
Exemplo:
// Identificação da camera
int cam_default = 0;
// Destaca a camera zero(0) como a camera do mundo BSP
dbSetBSPCamera (cam_default)
-------------------------------------------------------------------------------
void dbSetBspCameraCollision ( int CollisionIndex, int CameraNumber,
float Radius, int Response )
dbSetBspCameraCollision ( objControle, nCamera , nRaio, nresp_colisao)
Essa função habilita a colisão da camera com os objetos do mundo 3d carregado.
Sem essa função a camera atravessa os objetos.
objControle representa o 'colididor' interno que vai tratar as colisões
nCamera representa a camera que vai ser utilizada no sistema de colisão
nRaio representa o raio da esfera de colisão que circula a câmera
nresp_colisao Liga (1) ou desliga (0) retrocesso da câmera após colisão para
o ponto antes do impacto. (Não funcionou em nossos testes.)
Exemplo:
// Identificação da camera
int cam_default = 0;
// Configuração de colisão do mundo BSP com a câmera
int nresposta_colisao = 0;
float raio_colisao = 0.75f;
// Habilita colisão do mundo com a camera
dbSetBSPCameraCollision ( 1 , cam_default, raio_colisao,
nresposta_colisao );
Veja agora o programa completo:
// mundo01.cpp
// Esse programa ilustra como carregar um mapa do Quake
#include "DarkGDK.h"
#include "windows.h"
// Protótipo das funções
void initsys(); // inicializa o sistema
void teclado(); // Interpreta o teclado
void setup_skyBox(); // Configura skyBox
void setup_camera(); // Configura câmera
void setup_quakemap(); // Carrega mapa do jogo quake
int terminar = 0;
// Dados para posição da câmera
float xcam = 0.0f;
float ycam = 0.5f;
float zcam = 0.0f;
// Dados para movimentação da câmera via teclado
float velocidade = 0.1f;
float curva = 0.03f;
// Dados para girar a câmera usando o mouse
float old_ycam_angle = 0;
float old_xcam_angle = 0;
float ycam_angle = 0;
float xcam_angle = 0;
// ----------------------------------------------------------------------------
void DarkGDK ( void ) {
// Começo da aplicação DarkGdk
// Inicializa o sistema
initsys();
// Coloca um céu ao redor do mapa
setup_skyBox();
// Configura a câmera
setup_camera();
// Carrega mapa do Quake e configura colisão de câmera
setup_quakemap();
// Configura mouse e posição da camera
dbPositionMouse (400,300);
dbPositionCamera ( xcam, ycam, zcam);
dbSetWindowTitle("mundo01.cpp");
// Looping principal
while ( LoopGDK ( ) ) {
if (terminar == 0) teclado();
dbSync ( );
if (terminar == 1)
{
return;
} // endif
} // fim do while
return;
} // fim da função: DarkGDK
// ----------------------------------------------------------------------------
void initsys() {
// Esta função inicializa o sistema
dbSyncOff( );
dbSyncRate ( 60 );
dbSetWindowTitle("Carregando mundo do Quake. Aguarde... ");
dbDisableEscapeKey();
dbSetDisplayMode (800, 600, 32);
} // initsys().fim
// ----------------------------------------------------------------------------
// teclado() - Lê o teclado e executa comandos do usuário
void teclado() {
// Utilize as setas para movimentar a camera
dbControlCameraUsingArrowKeys ( 0, velocidade, curva );
// Angulo atual vira angulo antigo
old_ycam_angle = ycam_angle;
old_xcam_angle = xcam_angle;
// O mouse modifica o ângulo da camera
ycam_angle = dbWrapValue ( ycam_angle + dbMouseMoveX ( ) * 0.4f );
xcam_angle = dbWrapValue ( xcam_angle + dbMouseMoveY ( ) * 0.4f );
// Rotaciona a camera
dbYRotateCamera ( dbCurveAngle ( ycam_angle, old_ycam_angle, 24 ) );
dbXRotateCamera ( dbCurveAngle ( xcam_angle, old_xcam_angle, 24 ) );
if (dbEscapeKey()) terminar = 1;
if (dbMouseClick() == 2) terminar = 1;
dbSync();
} // teclado().fim
void setup_skyBox()
{
dbBackdropOff();
dbLoadObject ( "c:\\gameprog\\gdkmedia\\sky\\skybox2.x", 200 );
dbSetObjectLight ( 200, 0 );
dbSetObjectTexture ( 200, 3, 1 );
dbPositionObject ( 200, 1000, 2000, 4000 );
dbScaleObject ( 200, 30000, 30000, 30000 );
} // setup_skyBox()
void setup_camera()
{
dbAutoCamOff( );
dbSetCameraRange ( 0.05f, 30000 );
} // setup_Camera().end
void setup_quakemap()
{
// Identificação da camera
int cam_default = 0;
// Configuração de colisão do mundo BSP com a câmera
int nresposta_colisao = 0;
float raio_colisao = 0.75f;
// Vamos carregar um mapa do jogo Quake
dbSetDir ("c:\\gameprog\\gdkmedia\\mundo");
dbLoadBSP ("ikzdm1.pk3", "ikzdm1.bsp");
// Destaca a camera zero(0) como a camera do mundo BSP
dbSetBSPCamera (cam_default);
// Habilita colisão do mundo com a camera
dbSetBSPCameraCollision ( 1 , cam_default, raio_colisao,
nresposta_colisao );
} // setup_Quakemap()