Nachdem mir bei meinem Problem bisher noch niemand helfen konnte hab ich mich mal alleine auf den steinigen Pfad begeben und angefangen ein paar Klassen zu schreiben. Und siehe da: ich stehe vor weiteren Problemen!
Ich habe jetzt eine Klasse
Tlts2DObject mit folgender Deklaration:
Delphi-Quellcode:
type
Tlts2DObject = class(TObject)
private
D3DVertex: array [0..5] of TMyVertex;
D3DTexture: IDIRECT3DTEXTURE9;
DebugSchritt: Integer;
public
Left: Integer;
Top: Integer;
Width: Integer;
Height: Integer;
Layer: Integer;
Color: dword;
Angle: Real;
Alpha: Integer;
Graphic: String;
procedure render(pD3DVertexBuffer: pIDirect3DVertexBuffer9;
pD3DDevice: pIDirect3DDevice9);
procedure updateGeom();
procedure DebugMsg(Text: String);
end;
Dabei sind pIDirect3DVertexBuffer9 und pIDirect3DDevice9 folgendermassen definiert:
Delphi-Quellcode:
type pIDirect3DDevice9 = ^IDirect3DDevice9;
type pIDirect3DVertexBuffer9 = ^IDirect3DVertexBuffer9;
Die Render Methode (der Übeltäter und Nagel zu meinem Sarg) sieht folgendermassen aus:
Delphi-Quellcode:
procedure Tlts2DObject.render(pD3DVertexBuffer: IDirect3DVertexBuffer9;
pD3DDevice: IDirect3DDevice9);
var
vbVertices : pByte;
begin
UpdateGeom(); //Anmerkung: hier wird die Geometrie des Objekts errechnet
pD3DDevice^.SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); //hier crash => Zugriff auf das Device per Pointer nicht möglich
pD3DDevice^.SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
pD3DDevice^.SetTextureStageState(0,D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pD3DDevice^.SetTextureStageState(0,D3DTSS_CONSTANT, D3DTEXF_LINEAR);
pD3DDevice^.SetTextureStageState(0,D3DTSS_CONSTANT, D3DTEXF_LINEAR);
D3DXCreateTextureFromFile(pD3DDevice^,pchar(Graphic),D3DTexture);
if Alpha <> 255 then
pD3DDevice^.SetRenderState( D3DRS_ALPHABLENDENABLE, 1 )
else
pD3DDevice^.SetRenderState( D3DRS_ALPHABLENDENABLE, 0 );
pD3DDevice^.CreateVertexBuffer (sizeof(TMyVertex), D3DUSAGE_WRITEONLY,
D3D9T_CUSTOMVERTEX, D3DPOOL_MANAGED,
pD3DVertexBuffer^, nil);
pD3DVertexBuffer^.Lock(0,0,pointer(vbVertices),D3DLOCK_NOOVERWRITE);
Move(D3DVertex,vbVertices^,SizeOf(TltsSprite));
pD3DVertexBuffer^.Unlock;
pD3DDevice^.SetTexture( 0, D3DTexture );
pD3DDevice^.SetFVF(D3D9T_CUSTOMVERTEX);
pD3DDevice^.SetStreamSource(0,pD3DVertexBuffer^,0,sizeof(TMyVertex));
pD3DDevice^.DrawPrimitive( D3DPT_TRIANGLELIST,0,2 );
end;
Ich lege nun von meinem Hauptprogramm aus ein neues Objekt vom Typ Tlts2DObject an:
Delphi-Quellcode:
newWindowObject := Tlts2DObject.Create();
newWindowObject.Width := frmMain.getResolution.Width;
newWindowObject.Height := frmMain.getResolution.Height;
newWindowObject.Left := 0;
newWindowObject.Top := 0;
newWindowObject.Layer := 1;
newWindowObject.Color := $8000FF;
newWindowObject.Angle := 0;
newWindowObject.Alpha := 130;
newWindowObject.Graphic := 'media\menumain.bmp';
Desweiteren initialisiere ich in meinem
Hauptprogramm das Direct3DDevice mit allem drum und dran.
In meinem Hauptprogramm wird ausserdem die Szene begonnen und beendet (Damit meine ich BeginScene und EndScene). Dazwischen jedoch soll die render Methode meines neuen Objekts newWindowObject aufgerufen werden und genau da liegt das Problem!
Delphi-Quellcode:
if assigned(D3DDevice) then
begin
D3DDevice.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(100,100,100),1,0);
if SUCCEEDED(D3DDevice.BeginScene) then
begin
//VertexListe erweitern
SetLength(vblist, length(vblist)+1);
newWindowObject.render(Pointer(vblist[0]),Pointer(D3DDevice));
D3DDevice.EndScene;
end;
// Zeige Resultate auf dem Bildschirm
D3DDevice.Present(nil,nil,0,nil);
end;
end;
Beim Sprung in die render Methode des Objekts kommt eine
Exception sobald ich das D3DDevice auch nur anfasse - die Zeile habe ich oben markiert.
Ich habe bisher noch nie wirklich mit Zeigern unter Delphi gearbeitet, ich kann mir vorstellen dass einem versierten Pointer-Nutzer der Fehler sofort auffällt - ich für meinen Teil bin wirklich ratlos.
jaaaaa! Gebt es mir
Lieber Gruß
Vitus