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

index << >>



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()

index << >>

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