Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-11-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Thumbs up DirectX 9

Este hilo tiene como objetivo enseñar a ejecutar directx en tu aplicacion y decidi postearlo porque este tema, integrado, no lo encontre por internet, fui armando mis conocimientos por pedazos de informacion que fui recolectando a lo largo de 3 meses

Para empezar vamos a a realizar los siguientes pasos:
1) Instalar JDK DirectX, el mio es "Microsoft DirectX SDK (March 2008)" ya esta la de noviembre LINK.
Por ejemplo yo lo instale en "C:\Program Files\CodeGear\Microsoft DirectX SDK (March 2008)" al lado del "RAD Studio"

2) Una vez instalado vamos a tener que tomar los .lib que tienen en la carpeta "C:\Program Files\CodeGear\Microsoft DirectX SDK (March 2008)\Lib\x86" (claro, si la arquitectura de la pc que utilizan es x86) y llevar a todos los .lib a una carpeta en la unidad c, en mi caso los deje en una carpeta "c:\translib", y ahora nos vamos a "C:\Program Files\CodeGear\RAD Studio\5.0\bin" y buscamos el ejecutable "coff2omf.exe" y lo llevamos en la carpeta donde dejamos los .lib (translib), coff to omf hace lo que el mismo nombre lo dice, y el comando para transformar a omf un .lib de Visual Studio es "coff2omf d3d9.lib d3d9.~lib" (alt+126) para el caso de d3d9.lib, luego llevamos el d3d9.~lib a la carpeta de nuestro proyecto, la renombramos a d3d9.lib. Solo nos queda Agregar el lib a nuestro proyecto, para eso vamos a usar (EN LA IDE CODEGEAR) el Proyect Manager (View->Structure, en la barra) y sobre el proyecto botonDerecho->Add, y elegimos el archivo .lib que vamos a ocupar, tal como muestra en la figura1, los .lib dependen de que archivos de cabecera se incluyen

3) Ya tenemos nuestro .lib, ahora nos falta agregar los archivos de cabecera, para eso vamos a tener que copiar todos los .h de la carpeta "C:\Program Files\CodeGear\Microsoft DirectX SDK (March 2008)\Include" y dejarlos en "C:\Program Files\CodeGear\RAD Studio\5.0\include". O simplemente agregar al path del proyecto la primer direccion y asi nos ahorramos copiar

4) Con todo lo anterior ya podemos meter en nuestro proyecto por ejemplo el "#include "d3dx9.h"", pero tenemos un problema mas, las funciones que utiliza el visual studio como el coseno y la raiz cuadrada que retornan flotante tienen otro nombre, asique unas lineas antes de meter el "#include "d3dx9.h"" vamos a tener que poner "#define cosf cos" y "#define sqrtf sqrt", este paso es casi solo demostrativo, ya que van a tener que definir funciones segun vayan apareciendo los problemas (obviamente funciones con la misma abstraccion pero con distinto identificador), pero con lo anterior ya es suficiente para el ejemplo que voy a poner

--- empezamos a utilizar la SDK de DirectX ----

5) Luego los pasos para seleccionar un dispositivo (ver antes tipos de dispositivos), inicializar directx, elegir resolucion, color, etc. están bien explicadas en la SDK de Directx, les recomiendo que lean bien y practiquen todo desde el principio. (DirectX Documentation for C++)

6) hecho lo anterior, si seguimos con el orden de la SDK vamos a llegar a la parte de mallas (un objeto grafico 3D), tambien la SDK explica que es una malla, como leerla en memoria, que puntero hace referencia a su buffer, como se toma la textura, etc.

7) Lo interesante de todo esto, cuando usamos el "DirectX Sample Browser", los ejemplos estan en visual c++, por lo tanto nos jode un poco. Vamos a tener que adaptar el codigo de ejemplo a nuestro compilador. Aca entra en juego el conocimiento del lenguaje y de la ide de cada compilador, por ejemplo:

Código:
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D           = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice     = NULL; // Our rendering device
LPD3DXMESH              g_pMesh          = NULL; // Our mesh object in sysmem
D3DMATERIAL9*           g_pMeshMaterials = NULL; // Materials for our mesh
LPDIRECT3DTEXTURE9*     g_pMeshTextures  = NULL; // Textures for our mesh
DWORD                   g_dwNumMaterials = 0L;   // Number of mesh materials
¿donde van mis variables globales que se pueden inicializar cuando las defino en c++ RAD Studio?, pues en el archivo unit1.cpp debajo de "TForm1 *Form1;" , despues lo que queda es copiar y pegar. (siempre y cuando se entienda lo que uno esta copiando)

las definiciones en las funciones en visual studio c++
Código:
HRESULT InitD3D( HWND hWnd )
{
    // Create the D3D object.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;
       ...
       ...
en nuestro proyecto una funcion no debe estar definida en cualquier lado como lo hace VS c++, para adaptar esta parte agregamos a la clase TForm1, en la parte publica, un metodo "HRESULT InitD3D( HWND hWnd );" y luego al codigo anterior modificamos solo la parte del nombre quedando

Código:
HRESULT TForm1::InitD3D( HWND hWnd )    // :: implementamos la funcion
{
    // Create the D3D object.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;
       ...
       ...
el resto se puede dejar como esta si no nos da error.

Errores comunes
*visual studio mete una L antes de un string, solucion, sacar esa L
ejemplo:
Código:
...
            MessageBox(NULL, L"Could not find tiger.x", L"Meshes.exe", MB_OK);
...
pasa a ser
Código:
...
            MessageBox(NULL, "Could not find tiger.x", "Meshes.exe", MB_OK);
...
*llamada a funciones, si hicimos los pasos anteriores vamos a tener que llamar a nuestras funciones de la forma "Form1->Funcion()"
ejemplo:
Código:
...
                }
                else
                    Render();
            }
...
y queda
Código:
...
                }
                else
                    Form1->Render();
            }
...
*Utilizacion de funciones desconocidas. Mas que un error, es falta de conocimiento, por ejemplo nos va a dar un error porque no estan definidas las funciones
StringCchCopyA(,,)
StringCchCatA(,,)
solo nos queda ir a la ayuda de codegear y ver si tenemos un archivo de cabecera que las contenga, para este caso se debe incluir "#include "strsafe.h"", lo mismo nos va a pasar con "timegettime()" que pide "#include "Mmsystem.h""

Bueno, este post me llevo mas de una hora hacerlo espero que les sirva y tambien espero no haberme olvidado nada, hay mas cosas que se deben tener en cuenta a la hora de pasar de VSc++ a CODEGEAR C++.

Si aprenden algo nuevo en directx o estuve equivocado en algo, no duden en avisarme (ka4-9@hotmail.com)



----------------SECCION DESCARGA------------------

CAPTURA EJECUTABLE

DESCARGAR EJECUTABLE
(la descarga del ejecutable contiene D3DX9_37.dll, la verdad yo ya la tengo instalada pero en las pc que probe lo necesitaban)

DESCARGA DE CODIGO DE FUENTE

Última edición por grandmasterdari fecha: 01-12-2008 a las 19:04:48.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
DirectX fide Gráficos 1 12-12-2007 02:39:28
DirectX v10 for WinXP Deiv Windows 5 02-11-2007 16:14:11
DirectX 10 jhonny Noticias 0 24-04-2007 00:12:35
DirectX Aztaroth Varios 0 10-06-2005 23:39:27
DirectX y Delphi 6 zuriel_zrf Gráficos 1 14-02-2004 19:27:55


La franja horaria es GMT +2. Ahora son las 09:10:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi