Dale Caña Manolo!
>Estoy hasta las pelotas de tanto texto, yo lo que quiero es empezar a programar ya!
ok, te comprendo :-) pero antes de empezar tu verison del quake
debes saber como preparar tu primer programa 3D.
Uno de los mayores problemas con los que me tropeze al principio era tener que
pelear con la programacion para Windows cuando yo lo que queria era empezar
a dibujar cubos. No te olvides que los juegos o demos que vas a hacer tienen
que empezar desde 0, un proyecto vacio de Visual C++. Ahora vamos a ver como
quitarnos el muerto de encima y preparar la base de cualquier programa que hagamos
con DirectX.
Primeros Pasos
Ya explique en la introduccion como preparar tu Visual C++ para programar con DirectX, asi que si todavia no lo has hecho vuelve para atras. :-P
Para nuestros proyectos vamos a utilizar el "DirectX Graphics Common Architecture". Es el mismo formato que se usan en los ejemplo que acompañan al DirectX SDK. El "Common Files" te permite comenzar a trabajar inmediatamente con Direct3D sin tener que preocuparte de la parte fea de programar tu ventana para windows.
Usar este sistema es bueno porque:
- Nos olvidamos de tener que escribir el tipico codigo estandard de windows que lo unico que hace es liarnos, sobretodo al principio. Podras hacer tu propio codigo cuando ya hayas entendido como funciona Direct3D.
- Es un sistema comun que utiliza mucha gente y esta de sobra probado y optimizado, lo que nos ayuda a no perder tiempo depurando.
- Todos los ejemplo del SDK lo utilizan, asi que si quieres puedes pasar de estos tutoriales dentro de poco y comenzar con los ejemplos del SDK. :-)
- Es mas facil depurar en el modo ventana de "Common Files"
- Puedes generar tu propio codigo basandote en el "Common Files", asi que nunca esta de mas conocerlo.
Para crear tu primer proyecto, sigue estos pasos:
1. Copia los ficheros winmain.rc, resource.h, directx.ico de cualquiera de los ejemplos de C:\MSSDK\Samples\Multimedia\Direct3D a tu proyecto, y añadelos al mismo con la opcion Project -> Add to project -> Files...
2. Añade los siguientes enlaces en el menu Project -> Settings -> Link : ddraw.lib d3dx8.lib d3dxof.lib d3d8.lib winmm.lib dxguid.lib
3. Comprueba que tienes los siguientes directorios en tu lista de includes, desde el menu Tools -> Options -> Directories -> Include
C:\MSSDK\INCLUDE\
C:\MSSDK\SAMPLES\MULTIMEDIA\COMMON\INCLUDE\
4. Comprueba que tienes los siguientes directorios en tu lista de lib, desde el menu Tools -> Options -> Directories -> Libraries
C:\MSSDK\LIB
5. Añade los siguientes ficheros a tu proyecto (no hace falta que los copies, solo vete a Project -> Add to project -> Files ... ) y sobretodo no los modifiques.
6. Añade un nuevo archivo a tu proyecto y llamalo por ejemplo main.cpp (desde Project -> Add to project -> New y escribe el siguiente codigo:
#include <D3DX8.h>
#include "D3DApp.h"
#include "D3DFont.h"
#include "D3DUtil.h"
#include "DXUtil.h"
#include "resource.h"
//-------------------------------------------------------------
// Definicion de nuestra clase
//-------------------------------------------------------------
class CMyD3DApplication : public CD3DApplication
{
protected:
HRESULT OneTimeSceneInit();
HRESULT InitDeviceObjects();
HRESULT RestoreDeviceObjects();
HRESULT InvalidateDeviceObjects();
HRESULT DeleteDeviceObjects();
HRESULT Render();
HRESULT FrameMove();
HRESULT FinalCleanup();
public:
CMyD3DApplication();
};
//-------------------------------------------------------------
// Funcion MAIN de nuestro programa
//-------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { CMyD3DApplication d3dApp; if( FAILED( d3dApp.Create( hInst ) ) ) return 0;
return d3dApp.Run();
}
//------------------------------------------------------------- // Sobreescribimos los metodos de nuestra clase //------------------------------------------------------------- CMyD3DApplication::CMyD3DApplication() { m_strWindowTitle = _T("Basic"); m_bUseDepthBuffer = FALSE; }
HRESULT CMyD3DApplication::OneTimeSceneInit()
{
return S_OK;
}
HRESULT CMyD3DApplication::FrameMove()
{
return S_OK;
}
HRESULT CMyD3DApplication::Render()
{
return S_OK;
}
HRESULT CMyD3DApplication::InitDeviceObjects()
{
return S_OK;
}
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
return S_OK;
}
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
return S_OK;
}
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
return S_OK;
}
HRESULT CMyD3DApplication::FinalCleanup()
{
return S_OK;
}
Eventos
Bueno, no son exactamente eventos. Pero podriamos definirlos asi, ya que nos indican en que momento se encuentra nuestro programa.
el "Common Files" es una interfaz que presenta los siguientes eventos:
virtual HRESULT OneTimeSceneInit() { return s_OK; }
virtual HRESULT InitDeviceObjects() { return S_OK; }
virtual HRESULT RestoreDeviceObjects() { return S_OK; }
virtual HRESULT DeleteDeviceObjects() { return S_OK; }
virtual HRESULT Render() { return S_OK; }
virtual HRESULT FrameMove( float ) { return S_OK; }
virtual HRESULT FinalCleanup() { return S_OK; }
Cada uno de estos metodos deben ser sobreescritos con el codigo que queramos para cada uno de los siguientes momentos:
- Inicio de la aplicación: Ocurre una vez cada vez que se ejecuta el programa. Aqui debes cargar los objetos, precalcular algunos valores, y cosas por el estilo. Se llama a OneTimeSceneInit(), y a continuacion a RestoreDeviceObjects().
- Redimensionar la ventana o cambiar de dispositivo: Se llama primero a RestoreDeviceObjects y a InvalidateDeviceObjects() despues.
- Render, o cada vez que hay redibujar la ventana porque ha cambiado el contenido. Suele ocurrir varias veces por segundo mientras la aplicacion no se encuentre detenida. Se llama obviamente a la funcion Render() . Esta es una de las funciones mas importantes.
- Junto con Render, se llama antes a FrameMove() para calcular las matrices, texturizar, etc... Aqui se suele poner el codigo que tiene que ver con la animacion.
- Fin de la aplicacion. Se llama FinalCleanup() para limpiar todos los objetos de memoria, cerrar ficheros, etc.