He estado usando DelphiX para aprender, pero me gustaría pasarme a los encabezados de DX8. Con DelphiX me he saltado parte del aprendizaje de DX, y ahora tengo algunas dudas. Me gustaría que algún fiebre de Delphi (como Lord Trancos) me diera algunas pistas. Primero, cómo inicializo el modo 3D en ventana y en pantalla completa, y como lo finalizo para restaurar la ventana. Además en DelphiX tengo un timer, cual es el timer en los encabezados? Lo otro es, si ya no voy a usar componentes, pues tengo que hacerlo todo a pie con los encabezados, aún necesito un form? Supongo que si pudiera deshacerme del form tendría aplicaciones más pequeñas, entonces cómo puedo hacer una aplicación 3D mínima? Y sólo me falta preguntar por los controles: ??
Les agradecería infinitamente si pudieran ilustrarme con trozos de código o si me pasaran enlaces a programas sencillos.
Saludos!!
Citar
El 2002-08-20 06:00, Cronodragón escribió:
He estado usando DelphiX para aprender, pero me gustaría pasarme a los encabezados de DX8. Con DelphiX me he saltado parte del
jejeje, bienvenidooooo al maravilloso mundo de DirectX a pelo con Delphi! :riendo:
Citar
pistas. Primero, cómo inicializo el modo 3D en ventana y en pantalla completa, y como lo finalizo para restaurar la ventana. Además
Esto es muy facil, echale un vistazo a mi pagina donde podras encontrar los tutoriales del SDK de microsoft portados a delphi (tambien puedes encontrar otras conversiones mucho mas estrictas en la pagina de clootie)
Citar
en DelphiX tengo un timer, cual es el timer en los encabezados? Lo otro es, si ya no voy
Yo no uso timers, normalmente uso el evento onIdle, lo malo es que eso dispara el uso de la CPU... :triste:
Creo que cualquier timer de alta resolucion sirve (es posible que el timer del DelphiX te sirva)
Pregunta a los de VC++; ¿vosotros que usais?
Citar
a usar componentes, pues tengo que hacerlo todo a pie con los encabezados, aún necesito un form? Supongo que si pudiera deshacerme
no, no hace falta.
Citar
del form tendría aplicaciones más pequeñas, entonces cómo puedo hacer una aplicación 3D mínima? Y sólo me falta preguntar por los controles: ??
te envio por e-mail un ejemplo de una aplicacion minima (sin form)
En cuanto a los controles,... si no usas form y no son controles sino componentes no visuales; aun puedes usarlos. Si quieres usar controles visuales en una aplicacion sin form.... puffff... no vale la pena.
Citar
Les agradecería infinitamente si pudieran ilustrarme con trozos de código o si me pasaran enlaces a programas sencillos.
puedes empezar por mi web :ojo:
y aqui tienes una especie de SDK para directX y delphi hecho a base de demos que la gente ha enviado a borland y que saldran en el companion CD del delphi 7:
http://codecentral.borland.com/codecentral...isting?id=18611es un buen paquete para empezar. :ojo:
SaludoteZ!
Gracias Lord! Ya tengo tus ejemplos, pero también tengo un problema. Yo instalé DX8, y cuando ejecuto el ejemplo del mirror, me aparece un dialogo diciendo que no se puede iniciar el hardware 3D. Eso está bien porque yo no tengo tarjeta aceleradora. Pero a continuación aparece un dialogo que dice que cambie el modo a 16, 24 o 32 bits... pero ya está en 32 bits, y probé con otros modos, pero igual aparece el error. Qué podrá ser?
Maldito M$-DirectX siempre dando problemas.
- Marco
Te funcionan otros programas de DX8 por software? (Como los ejemplos del SDK de Microsoft o la beta de Merlin de Dracula)
Los del SDK si me funcionan, la mayoría. No he probado los de Drácula. No se si tendré que pasarme a Visual C++... pero no me gusta, la verdad es que en Delphi todo es muy sencillo, incluso he visto programadores experimentados que tratan de pasarse de C++ a Visual Basic para hacer las cosas más fácil. Delphi es un punto intermedio.
Estaba viendo que hay cierta diferencia entre la rutina de inicialización de Microsoft y la tuya. Voy a probar con la de MS, pues me funcionó cuando compilé con Visual C++
Pude traducir esto, pero aún no logro utilizarlo:
var
D3D : IDirect3D8 = nil;
D3DDevice : IDirect3DDevice8 = nil;
function InitD3D (Handle : hWnd) : HRESULT;
var
DisplayMode : TD3DDisplayMode;
PresentParameters : TD3DPresent_Parameters;
begin
D3D := Direct3DCreate8 (D3D_SDK_VERSION);
if D3D = nil then
begin
Result := E_FAIL;
Exit;
end;
if Failed (D3D.GetAdapterDisplayMode (D3DADAPTER_DEFAULT, DisplayMode))
then
begin
Result := E_FAIL;
Exit;
end;
ZeroMemory (@PresentParameters, SizeOf (PresentParameters));
PresentParameters.Windowed := True;
PresentParameters.SwapEffect := D3DSWAPEFFECT_DISCARD;
PresentParameters.BackBufferFormat := DisplayMode.Format;
if Failed (D3D.CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Handle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, PresentParameters, D3DDevice)) then
begin
Result := E_FAIL;
Exit;
end;
Result := S_OK;
end;
procedure Cleanup;
begin
D3DDevice := nil;
D3D := nil;
end;
procedure Render;
begin
if not Assigned (D3DDevice) then
Exit;
D3DDevice.Clear (0, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 255), 1.0, 0);
D3DDevice.BeginScene;
D3DDevice.EndScene;
D3DDevice.Present (nil, nil, 0, nil);
end;
A que te refieres cuando dices que no logras utilizarlo ?
[Lord Trancos]
Gracias por el link del "SDK", hay ejemplos muy buenos como un tal smile invaders... :ojo:
[Cronodragon]
Me pasa lo mismo que a ti, algunos ejemplos (sobre todo los de 3d) me dan errores y me indican que cambie la profundidad de color. Otros me dicen que mi tarjeta no esta preparada, pero es que yo creo que con una VOODOO 3 3000 que tengo deberia bastar, asi que debe ser algun fallo de los programas.
Lord: Me refiero a que estoy tratando de llamar las rutinas InitD3D, Render, y Cleanup... pero no se desde donde debería llamarlas. Probé poniendolas en estos eventos pero no pasa nada:
procedure TForm1.FormCreate(Sender: TObject);
begin
if Failed (InitD3D (Application.Handle)) then
Application.Terminate;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Cleanup;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Render;
end;
Luego, corriendo el código paso por paso me di cuenta de que ni siquiera crea el D3D, o sea que la línea
D3D := Direct3DCreate8 (D3D_SDK_VERSION);
siempre asigna nil a D3D haciendo que todo se caiga desde un principio. Talvez estoy llamando a la función en un momento inoportuno. ??
JPeP: Sí, ese mismo es mi problema, pero a mi no me corre nada hecho en Delphi que no tenga DelphiX.
Yo mismo: Tendré que comprar tarjeta aceleradora???... Maldito DX, parece que le tiene fobia a los compiladores de Borland. Habrá que poner FINIT de línea por medio.
Yo no sé nada de DirectX + Delphi pero bueno ahí va una sugerencia..prueba a iniciar D3D en el evento OnActivate, a lo mejor es que necesita algo que en OnCreate aún no se ha creado...
Saludos
Ten en cuenta que el evento OnActivate se llama cada vez que la ventana recibe el foco de la aplicacion. Así que tendras ke tener cuidado para inicializar D3D solo la primera vez.
P.D.: Es ke aki nop se habla nunca de OpenGL? v.v
Citar
Luego, corriendo el código paso por paso me di cuenta de que ni siquiera crea el D3D, o sea que la línea
D3D := Direct3DCreate8 (D3D_SDK_VERSION);
siempre asigna nil a D3D haciendo que todo se caiga desde un principio. Talvez estoy llamando a la función en un momento inoportuno. ??
Que raro.. :-?
Que valor tiene D3D_SDK_VERSION ?
Jejeje Lord Trancos mola mucho ver tu nick plantado en la pagina de Borland, se nota que te estas mojando con el mundo Delphi. Sigue asi.
Saludos
Bueno, solo voy a probar una vez mas con el metodo OnActivate... mejor me paso a C++, seguire trabajando en Delphi para otros proyectos. Puesto que esta corriendo bien con DirectX 7, y que DX tiene problemas con los compiladores de Borland, puedo sacar como conclusion que la version 8 de DX no se ejecuta en una aplicacion Delphi a menos que uno tenga tarjeta aceleradora... culpa de Microsoft. Pero bueno, cuando empence con esto de DX revise los ejemplos en C++ y entendia muy poco, ahora que ya tengo mas experiencia, se ven faciles, y hasta me he entusiasmado un poco. En todo caso no es bueno para un programador cerrarse en un solo lenguaje, ya sea Basic, C o Pascal. Voy a aprender algo nuevo. Gracias por las ayudas, seguramente les voy a estar preguntando sobre C en los proximos dias. :riendo:
- Marco
Ok, pero que conste q a mi el ejemplo por software si que me funcionaba :lengua:
:loco:
:riendo: Estoy seguro, solo que DX8 da muchos problemas.
Saludos!
- Marco