aidez moi à trouvez où ça coince stp - Delphi/Pascal - Programmation
Marsh Posté le 31-12-2002 à 18:08:53
ReplyMarsh 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 ?
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 :-/
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; |
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); |
Marsh Posté le 01-01-2003 à 00:23:42
Taureau a écrit : |
pq sans le width
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 ! )
Allez bonne année à tous !
Marsh Posté le 01-01-2003 à 10:12:51
antp a écrit : |
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.
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 :
|
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 :
|
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 ?
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 :
|
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.
Marsh Posté le 01-01-2003 à 15:53:52
antp a écrit : "VOID *pVertices" -> "pVertices: Pointer" |
250.0f = float
250.0 = double
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 ?
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 :
|
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.
Marsh Posté le 01-01-2003 à 16:06:23
bon encore une petite question (désolé) : ça veut dire quoi : (BYTE**)&pVertices ?
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)
Marsh Posté le 01-01-2003 à 16:07:39
ça veut dire qu'y a du bidouillage dans l'air
Marsh Posté le 01-01-2003 à 16:08:40
antp a écrit : ça veut dire qu'y a du bidouillage dans l'air |
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
Marsh Posté le 01-01-2003 à 16:09:27
antp a écrit : nil = NULL |
k, merci
Marsh Posté le 01-01-2003 à 16:10:07
c ça le code :
Code :
|
Marsh Posté le 01-01-2003 à 16:12:30
ReplyMarsh 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 )
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.
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 !
Marsh Posté le 01-01-2003 à 16:37:02
dweis a écrit : mouais, c un peu trop obscure pour moi je crois |
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
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
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
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)
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 |
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
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)
Marsh Posté le 01-01-2003 à 16:44:30
Donne la déclaration de la méthode "Lock"
Marsh Posté le 01-01-2003 à 16:47:43
antp a écrit : Donne la déclaration de la méthode "Lock" |
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;
Marsh Posté le 01-01-2003 à 16:48:12
chrisbk a écrit : |
merci y'avait la solution dedant :
pVertices: PByte;
g_pVB.Lock(0, SizeOf(g_Vertices), pVertices, 0)
=))))
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.