Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3503 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  aidez moi à trouvez où ça coince stp

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

aidez moi à trouvez où ça coince stp

n°277883
dweis
Posté le 31-12-2002 à 17:10:08  profilanswer
 

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.

mood
Publicité
Posté le 31-12-2002 à 17:10:08  profilanswer
 

n°277909
os2
Posté le 31-12-2002 à 18:08:53  profilanswer
 

debug


---------------
Borland rulez: http://pages.infinit.net/borland
n°277914
dweis
Posté le 31-12-2002 à 18:12:21  profilanswer
 

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

n°277920
antp
Super Administrateur
Champion des excuses bidons
Posté le 31-12-2002 à 18:32:39  profilanswer
 

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
n°277922
dweis
Posté le 31-12-2002 à 18:37:10  profilanswer
 

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 :-/

n°277932
taureau
Posté le 31-12-2002 à 20:41:41  profilanswer
 

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
n°277933
taureau
Posté le 31-12-2002 à 20:45:31  profilanswer
 

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

n°277955
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-01-2003 à 00:23:42  profilanswer
 

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
n°277961
dweis
Posté le 01-01-2003 à 02:01:31  profilanswer
 

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 !

n°277970
taureau
Posté le 01-01-2003 à 10:12:51  profilanswer
 

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.

mood
Publicité
Posté le 01-01-2003 à 10:12:51  profilanswer
 

n°278009
dweis
Posté le 01-01-2003 à 15:28:08  profilanswer
 

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;

n°278010
dweis
Posté le 01-01-2003 à 15:30:54  profilanswer
 

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 ?

n°278014
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-01-2003 à 15:50:02  profilanswer
 

"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
n°278015
chrisbk
-
Posté le 01-01-2003 à 15:53:52  profilanswer
 

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

n°278016
dweis
Posté le 01-01-2003 à 15:54:02  profilanswer
 

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 ?

n°278017
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-01-2003 à 16:00:34  profilanswer
 

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
n°278018
Profil sup​primé
Posté le 01-01-2003 à 16:01:28  answer
 

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

n°278019
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-01-2003 à 16:01:45  profilanswer
 

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
n°278020
dweis
Posté le 01-01-2003 à 16:01:46  profilanswer
 

ok, merci bcp

n°278021
dweis
Posté le 01-01-2003 à 16:06:23  profilanswer
 

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

n°278023
chrisbk
-
Posté le 01-01-2003 à 16:07:19  profilanswer
 

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)

n°278024
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-01-2003 à 16:07:39  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°278025
chrisbk
-
Posté le 01-01-2003 à 16:08:40  profilanswer
 

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

n°278027
Profil sup​primé
Posté le 01-01-2003 à 16:09:27  answer
 

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

n°278028
dweis
Posté le 01-01-2003 à 16:10:07  profilanswer
 

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

n°278029
chrisbk
-
Posté le 01-01-2003 à 16:10:38  profilanswer
 

gagné [:yaisse2]

n°278030
dweis
Posté le 01-01-2003 à 16:12:30  profilanswer
 


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

n°278032
chrisbk
-
Posté le 01-01-2003 à 16:13:36  profilanswer
 

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
n°278046
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-01-2003 à 16:32:03  profilanswer
 

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
n°278049
dweis
Posté le 01-01-2003 à 16:35:29  profilanswer
 

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

n°278051
chrisbk
-
Posté le 01-01-2003 à 16:37:02  profilanswer
 

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

n°278052
dweis
Posté le 01-01-2003 à 16:37:49  profilanswer
 

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

n°278053
taureau
Posté le 01-01-2003 à 16:39:16  profilanswer
 

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

n°278055
dweis
Posté le 01-01-2003 à 16:41:02  profilanswer
 

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)

n°278056
dweis
Posté le 01-01-2003 à 16:43:09  profilanswer
 

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

n°278057
chrisbk
-
Posté le 01-01-2003 à 16:43:41  profilanswer
 

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)

n°278058
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-01-2003 à 16:44:30  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°278059
dweis
Posté le 01-01-2003 à 16:45:24  profilanswer
 
n°278060
chrisbk
-
Posté le 01-01-2003 à 16:47:43  profilanswer
 

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;
 
 

n°278061
dweis
Posté le 01-01-2003 à 16:48:12  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  aidez moi à trouvez où ça coince stp

 

Sujets relatifs
[HTML] please, Aidez moi a centrer mes calques... (débutant inside)Aidez moi a faire un prgm qui fait ça (enfin si c'est possible) :
Aidez un pauvre députant :jap: merci a vous[JS] pb avec onclick !! aidez moi :'(
[HTML / JS] getelementbyid aidez moi !!![PHP] aidez moi à améliorer une fonction :( regex ?
pitie aidez moi (débutant en C)[C++] Question sur les pointeurs, aidez moi à comprendre svp !
Les tours Hanoi en java en applet ... Aidez moiAidez moi a completer cette Expression régulière
Plus de sujets relatifs à : aidez moi à trouvez où ça coince stp


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)