aidez moi à trouvez où ça coince stp

aidez moi à trouvez où ça coince stp - Delphi/Pascal - Programmation

Marsh Posté le 31-12-2002 à 17:10:08    

j'essaie de faire un truc assez simple mais j'ai du mal : je veux juste créer une fenetre et initialiser directx.
je me suis inspiré de ce code http://www.andypike.com/tutorials/directx8/001.asp et j'ai essayé de le traduire en delphi mais ça marche pas. ça me donne pas d'erreur non plus donc j'y pige rien :-(
 
merci bcp si qqun peut prendre 5mn pour regarder.
 


mon code :
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  Windows,
  Messages,
  DXUtil,
  {$I UseD3D8.inc};
var
g_pD3D : IDIRECT3D8;
g_pD3DDevice : IDIRECT3DDEVICE8;
 
 
function InitialiseD3D(hWnd : HWND) : HRESULT;
var
    d3ddm : D3DDISPLAYMODE ;
    d3dpp : D3DPRESENT_PARAMETERS ;
begin
 
    //First of all, create the main D3D object. If it is created successfully we
    //should get a pointer to an IDirect3D8 interface.
    g_pD3D := Direct3DCreate8(D3D_SDK_VERSION);
    if(g_pD3D = nil) then Result := E_FAIL;
 
 
    //Get the current display mode
    if(FAILED(g_pD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3ddm))) then Result := E_FAIL;
 
 
    //Create a structure to hold the settings for our device
 
    ZeroMemory(@d3dpp, sizeof(d3dpp));
 
    //Fill the structure.  
    //We want our program to be windowed, and set the back buffer to a format
    //that matches our current display mode
    d3dpp.Windowed := TRUE;
    d3dpp.SwapEffect := D3DSWAPEFFECT_COPY_VSYNC;
    d3dpp.BackBufferFormat := d3ddm.Format;
 
    //Create a Direct3D device.
    if(FAILED(g_pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                   D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp, g_pD3DDevice)))  then Result := E_FAIL;
    Result := S_OK;
end;
 
procedure Render();
begin
    if(g_pD3DDevice = nil) then exit;
 
    //Clear the backbuffer to a green color
    g_pD3DDevice.Clear(0, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0, 0);
     
    //Begin the scene
    g_pD3DDevice.BeginScene();
     
    //Rendering of our game objects will go here
     
    //End the scene
    g_pD3DDevice.EndScene();
     
    //Filp the back and front buffers so that whatever has been rendered on the back buffer
    //will now be visible on screen (front buffer).
    g_pD3DDevice.Present(nil, nil, 0, nil);
end;
 
procedure CleanUp();
begin
    if(g_pD3DDevice <> nil) then
    begin
        g_pD3DDevice._Release();
        g_pD3DDevice := nil;
    end;
 
    if(g_pD3D <> nil) then
    begin
        g_pD3D._Release();
        g_pD3D := nil;
    end;
end;
 
procedure GameLoop();
var
  msg : TMSG;
  fMessage : bool;
begin
    //Enter the game loop
 
 
    PeekMessage(msg, 0, 0, 0, PM_NOREMOVE);
     
    while(msg.message <> WM_QUIT) do
    begin
        fMessage := PeekMessage(msg, 0, 0, 0, PM_REMOVE);
 
        if(fMessage) then
        begin
            //Process message
            TranslateMessage(msg);
            DispatchMessage(msg);
        end
        else
        begin
            //No message to process, so render the current scene
            Render();
        end;
    end;
end;
 
function WinProc(hWnd : HWND; msg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT;
begin
    case msg of
      WM_DESTROY:
            begin
            PostQuitMessage(0);
            Result:= 0;
            exit;
            end;
      WM_KEYUP:
            begin
            case (wParam) of
              VK_ESCAPE:
                    begin
                    //User has pressed the escape key, so quit
                    DestroyWindow(hWnd);
                    Result:= 0;
                    exit;
                    end;
            end;
            exit;
            end;
    end;
 
    Result := DefWindowProc(hWnd, msg, wParam, lParam);
end;
 
function WinMain(hInstance : HINST; hPrevInstance : HINST;
                 lpCmdLine : PChar; nCmdShow : Integer) : integer; stdcall;
var
  wc: TWndClass;
  h_Wnd : HWND;
 
begin
    //Register the window class
  with wc do                    // Set up the window class
    begin
      style := CS_CLASSDC;
      lpfnWndProc := @WinProc;
      hInstance     := wc.hInstance;
      hCursor       := LoadCursor(0, IDC_ARROW);
      lpszClassName := 'OpenGL';
   end;
    RegisterClass(wc);
 
    //Create the application's window
    h_Wnd := CreateWindow('DX Project 1', 'www.andypike.com: Tutorial 1',
                              WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
                              GetDesktopWindow(), 0, wc.hInstance, nil);
 
    //Initialize Direct3D
    if(SUCCEEDED(InitialiseD3D(h_Wnd))) then
    begin
        //Show our window
        ShowWindow(h_Wnd, SW_SHOWDEFAULT);
        UpdateWindow(h_Wnd);
 
        //Start game running: Enter the game loop
        GameLoop();
    end;
     
    CleanUp();
 
    UnregisterClass('DX Project 1', wc.hInstance);
     
    Result:= 0;
end;
 
begin
   WinMain( hInstance, hPrevInst, CmdLine, CmdShow );
end.

Reply

Marsh Posté le 31-12-2002 à 17:10:08   

Reply

Marsh Posté le 31-12-2002 à 18:08:53    

debug


---------------
Borland rulez: http://pages.infinit.net/borland
Reply

Marsh Posté le 31-12-2002 à 18:12:21    

ça donne pas d'erreur comme je l'ait dit !!

Reply

Marsh Posté le 31-12-2002 à 18:32:39    

Fais une exécution pas à pas pour voir si ça passe partout où il faut...
Et pour le {$APPTYPE CONSOLE} tu es sûr que tu en as besoin ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 31-12-2002 à 18:37:10    

le pas à pas ne bloque nul part et fait comme si tout se passait bien mais aucune fenetre ne s'affiche...
 
effectivement $APPTYPE CONSOLE est inutile mais ça résoud pas le pb :-/

Reply

Marsh Posté le 31-12-2002 à 20:41:41    

tout ne se passe pas bien et tu peux t'en apercevoir en controlant les valeur de retour de RegisterClass et CreateWindow lorsque cela se passe bien elles retournent une valeur <> 0 et là c 0 aux deux...
 
 
modifie :
 

function WinProc(hWnd : HWND; msg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT;


 
en
 

function WinProc(hWnd : HWND; msg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT;  stdcall;


 
ensuite initialise la totalité des propriétés de wc sans utiliser le with
 

wc.style         := CS_CLASSDC;
wc.lpfnWndProc   := @WinProc;
wc.cbClsExtra    := 0;
wc.cbWndExtra    := 0;
wc.hIcon         := LoadIcon(0,idi_application);
wc.hcursor       := loadcursor(0,idc_arrow);
wc.hInstance     := hInstance;
wc.hCursor       := LoadCursor(0, IDC_ARROW);
wc.hbrbackground := hbrush(color_window);
wc.lpszmenuname  := nil;
wc.lpszClassName := 'OpenGL';


 
et pour finir dans CreateWindow tu dois utiliser le nom de la classe que tu viens d'enregistrer soit
 

h_Wnd := CreateWindow(wc.lpszClassName, 'www.andypike.com: Tutorial 1', WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, 0, 0, wc.hInstance, nil);


Message édité par taureau le 31-12-2002 à 20:42:57
Reply

Marsh Posté le 31-12-2002 à 20:45:31    

au fait...Bonne année 2003 à tous  :bounce:  :hello:  :D

Reply

Marsh Posté le 01-01-2003 à 00:23:42    

Taureau a écrit :


ensuite initialise la totalité des propriétés de wc sans utiliser le with
 


 
pq sans le width :??:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-01-2003 à 02:01:31    

bon, ça marche (ça bug quand je ferme la fenetre mais c pas le plus important, je verrais ça plus tard). merci bcp bcp taureau !
 
pour la peine je vous donnerais les source de mon jeu quand je l'aurais fini ;)  (ça va tout déchirer je sens ! :p)
 
 
Allez bonne année à tous !

Reply

Marsh Posté le 01-01-2003 à 10:12:51    

antp a écrit :


 
pq sans le width :??:


 
je présume que cela doit entrer en interférence avec une autre propriété je dois dire que j'ai pas cherché laquelle mais si on utilise with pour initialiser wc ben RegisterClass échoue...
 
j'ai fais les test en virant tout le code DirectX donc je n'ai pas trop regardé celui-ci.

Reply

Marsh Posté le 01-01-2003 à 10:12:51   

Reply

Marsh Posté le 01-01-2003 à 15:28:08    

bon maintenant que j'en suis au tutorial 2, j'ai tjrs des petites pb de conversion c++ -> delphi.
 
quel serait le code le plus adapté pour mettre ça en delphi ?

Code :
  1. struct CUSTOMVERTEX
  2. {
  3.     FLOAT x, y, z, rhw; // The transformed position for the vertex.
  4.     DWORD colour; // The vertex colour.
  5. };
  6.     CUSTOMVERTEX cvVertices[] =
  7.     {
  8.         {250.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),}, //Vertex 1 - Red (250, 100)
  9.         {400.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0),}, //Vertex 2 - Green (400, 350)
  10.         {100.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255),}, //Vertex 3 - Blue (100, 350)
  11.     };


 
j'arrive à déclarer un type équivalent mais j'arrive pas à le "remplir" (car il faut passer par cvVertices.x, cvVertices.y et comme c'est un tableau ça merde...)
 
et que signifie

Code :
  1. VOID* pVertices;

Reply

Marsh Posté le 01-01-2003 à 15:30:54    

et un dernier petit truc, j'ai pas bien pigé ce que signifie le f après les nombres (comme 250.0f), si ce n'est que ça semble marcher si j'en met pas ?

Reply

Marsh Posté le 01-01-2003 à 15:50:02    

"VOID *pVertices" -> "pVertices: Pointer"
 
pour le 250.0f suffit que tu mettes 250.0, en C ça veut dire qu'il est du type float si je me souviens bien... enfin ça faudrait que quelqu'un confirme. En Delphi par défaut c'est Double, l'équivalent du double du C. L'équivalent du float c'est Single. Je sais pas si ça pourrait avoir une influence que tu mélanges double et float. À mon avis tant que les structures que tu passes à des fonctions externes ont des types de même taille ça devrait être bon.
 
pour la déclaration de l'autre truc,
 

Code :
  1. type
  2.   CUSTOMVERTEX: record
  3.     x, y, z: Single;
  4.     colour: DWORD;
  5.   end;
  6. var
  7.   cvVertices: array of CUSTOMVERTEX[0..2];


 
Pour mettre une valeur dans cvVerices lors de sa déclaration, ça ne marche que s'il est déclaré en global. Et encore, je ne suis pas sûr que c'est possible à faire avec un type de ce genre. Suffit de le remplir par après sinon.


Message édité par antp le 01-01-2003 à 15:51:15

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-01-2003 à 15:53:52    

antp a écrit :

"VOID *pVertices" -> "pVertices: Pointer"
 
pour le 250.0f suffit que tu mettes 250.0, en C ça veut dire qu'il est du type float si je me souviens bien...  


 
250.0f = float
250.0  = double

Reply

Marsh Posté le 01-01-2003 à 15:54:02    

merci.
 
mais ce qui me gène, c'est pour le remplir. car là, la seule écriture que j'ai trouvée et qui marche serait :
cvVertices[1].x := ...
cvVertices[1].y := ...
cvVertices[1].z := ...
cvVertices[1].rhw := ...
cvVertices[1].colour := ...
 
et pareil pour chaque élément du tableau. et donc je me demandais si y'avait pas un moyen d'écrire tout ça en une ligne ?

Reply

Marsh Posté le 01-01-2003 à 16:00:34    

Bah non, c'est comme en C quoi, tu peux pas directement remplir une structure :/
Enfin tu peux tj faire un truc du genre:
 

Code :
  1. procedure initialisation;
  2.    procedure repli_tab(aX, aY, aZ, aRhw: Single; aColour: DWORD; var aStruct: CUSTOMVERTEX);
  3.    begin
  4.      with aStruct do
  5.      begin
  6.        x := aX;
  7.        y := aY;
  8.        z := aZ;
  9.        rhw := aRhw;
  10.        colour := aColour;
  11.      end;   
  12.    end;
  13. begin
  14.    rempli_tab(250.0, 100.0, 0.5, 1.0, D3DCOLOR_XRGB(255, 0, 0), cvVertices[0]);
  15.    rempli_tab(400.0f, 350.0, 0.5, 1.0, D3DCOLOR_XRGB(0, 255, 0), cvVertices[1]);
  16.    ...
  17. end;


Message édité par antp le 01-01-2003 à 16:01:34

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-01-2003 à 16:01:28    

tite question au passage, c'est quoi 'nil' ?  :??:

Reply

Marsh Posté le 01-01-2003 à 16:01:45    

nil = NULL
ça vaut en général 0, mais en terme de pointeur et non en terme de nombre entier.


Message édité par antp le 01-01-2003 à 16:02:27

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-01-2003 à 16:01:46    

ok, merci bcp

Reply

Marsh Posté le 01-01-2003 à 16:06:23    

bon encore une petite question (désolé) : ça veut dire quoi : (BYTE**)&pVertices ?

Reply

Marsh Posté le 01-01-2003 à 16:07:19    

dweis a écrit :

bon encore une petite question (désolé) : ça veut dire quoi : (BYTE**)&pVertices ?


 
cast de l'adresse de pVertices en BYTE (ca doit etre unsigned char)

Reply

Marsh Posté le 01-01-2003 à 16:07:39    

ça veut dire qu'y a du bidouillage dans l'air :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-01-2003 à 16:08:40    

antp a écrit :

ça veut dire qu'y a du bidouillage dans l'air :D
 


 
A mon avis c'est un lock de vertex buffer, et vu que le type n'est pas fixe a l'avance, ben fallait bien trouver un moyen plus ou moins standart :D

Reply

Marsh Posté le 01-01-2003 à 16:09:27    

antp a écrit :

nil = NULL
ça vaut en général 0, mais en terme de pointeur et non en terme de nombre entier.

k, merci :)

Reply

Marsh Posté le 01-01-2003 à 16:10:07    

c ça le code :  

Code :
  1. //Get a pointer to the vertex buffer vertices and lock the vertex buffer
  2.     if(FAILED(g_pVertexBuffer->Lock(0, sizeof(cvVertices), (BYTE**)&pVertices, 0)))

Reply

Marsh Posté le 01-01-2003 à 16:10:38    

gagné [:yaisse2]

Reply

Marsh Posté le 01-01-2003 à 16:12:30    


 
nan pour gagner faut me donner la syntaxe delphi :-p

Reply

Marsh Posté le 01-01-2003 à 16:13:36    

ben c'est pas bien compliqué. Un vb peut contenir un peu n'importe quoi (j'entends comme type de vertex, donc type de struct). Il n'etait donc pas possible pour les createurs de DX de fournir un prototype qui cadrait avec tous les types de vertex possible. Resultat, il te rende un pointeur vers des 'unsigned char *'. Bon.
 
Toi, de ton coté tu as ta struct de type CUSTOMVERTEX, et tu voudrais recuperer le pointeur sur le debut du VB dans ton CUSTOMVERTEX *.  
 
ton, tu fais un &mastructure (pour recuperer l'adresse de ton pointeur, pour que l'appel a lock puisse remplir ce qu'il pointe), et tu caste en BYTE ** pour ca corresponde avec le proto de Lock
 
Donc pour le delphi tu regarde le proto de Lock, et tu fais un cast, si cast il y a en delphi (ce dont je n'ai aucune idée :D)


Message édité par chrisbk le 01-01-2003 à 16:14:09
Reply

Marsh Posté le 01-01-2003 à 16:32:03    

Pour un cast en delphi c'est :
 
nom_du_type(variable)
 
l'équivalent de "&" du C est "@"
Mais on ne peut caster qu'une variable, pas l'adresse d'une variable. Donc il vaudra peut-être que tu passes par une variable temporaire de type "pointeur sur CUSTOMVERTEX".
Faudrait en effet voir le type de la fonction, la façon dont il est déclaré sous Delphi.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-01-2003 à 16:35:29    

mouais, c un peu trop obscure pour moi je crois ;)
 
on va d'abord faire sans vertexbuffer et on y reviendra plus tard !

Reply

Marsh Posté le 01-01-2003 à 16:37:02    

dweis a écrit :

mouais, c un peu trop obscure pour moi je crois ;)
 
on va d'abord faire sans vertexbuffer et on y reviendra plus tard !


 
nan, pitié, reste avec les VB. C vraiment pas dur, c'est juste une sorte de tableau géré par d3d. T'as juste a comprendre le mecanisme lock/unlock et c bon

Reply

Marsh Posté le 01-01-2003 à 16:37:49    

ah merde, le tutorial du sdk utilise aussi la même méthode. bon je suis condamné à trouver une solution ;)

Reply

Marsh Posté le 01-01-2003 à 16:39:16    

un bon site pour la traduction des exemples du sdk directx en delphi
 
http://clootie.narod.ru/delphi/download_dx90.html

Reply

Marsh Posté le 01-01-2003 à 16:41:02    

bon la doc dit
 
HRESULT Lock(
  UINT OffsetToLock,
  UINT SizeToLock,
  BYTE** ppbData,
  DWORD Flags
);
 
ppbData  
[out] Address of a pointer to an array of BYTE values, filled with the returned vertex data
 
 
alors j'essaie
test : Array of byte;
g_pVertexBuffer.Lock(0, sizeof(cvVertices), test, 0)
 
mais ça veut pas (types of actual and format var parameters must be identifical)

Reply

Marsh Posté le 01-01-2003 à 16:43:09    

Taureau a écrit :

un bon site pour la traduction des exemples du sdk directx en delphi
 
http://clootie.narod.ru/delphi/download_dx90.html


 
ouais mais les exemples du sdk j'en veux pas car ils utilisent une classe spéciale pour simplifier les choses et bon je vais pas commencer à programmer en me basant sur une classe à laquelle je pige que dalle

Reply

Marsh Posté le 01-01-2003 à 16:43:41    

vu d'ensemble sur les VB :
 
http://prografix.free.fr/index.php?page=tut&id=48
 
 
pis sinon j'ai trouvé ca :
 
http://delphilab.yellis.net/sources.php
 
(voir le Direct3DPack1)

Reply

Marsh Posté le 01-01-2003 à 16:44:30    

Donne la déclaration de la méthode "Lock" :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-01-2003 à 16:45:24    

Reply

Marsh Posté le 01-01-2003 à 16:47:43    

antp a écrit :

Donne la déclaration de la méthode "Lock" :o


 
ca a l'air d'etre ca (tain chui trop bon today)
 
function Lock(const OffsetToLock, SizeToLock : Cardinal; var ppbData : PByte; const Flags : LongWord) : HResult; stdcall;
 
 

Reply

Marsh Posté le 01-01-2003 à 16:48:12    

chrisbk a écrit :


pis sinon j'ai trouvé ca :
 
http://delphilab.yellis.net/sources.php
 
(voir le Direct3DPack1)


 
merci y'avait la solution dedant :
  pVertices: PByte;
g_pVB.Lock(0, SizeOf(g_Vertices), pVertices, 0)
 
=))))

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed