#1 02.07.2012 10:50:58

CreativeMD
Member
Registriert: 22.02.2012
Beiträge: 15

Fehler beim Beispielprojekt

Hi

Ich habe das Buch "DirectX 9 in Delphi" gelesen,
und hab mir dazu die Projekte angeschaut,
doch das Projekt in Kapitel 4 "Der Indexbuffer" hat einen Fehler

Code: delphi

procedure setupviewandprojection;
var
  pos, dir, up : td3dxvector3;
  matview, matproj : td3dxmatrix;
begin
  // Position, Richtung und Ausrichtung festlegen
  pos := d3dxvector3( sin(gettickcount*0.001)*8, 10.0, cos(gettickcount*0.001)*8 );
  dir := d3dxvector3( 0.0, 0.0, 0.0 );
  up  := d3dxvector3( 0.0, 1.0, 0.0 );

  // View-Matrix festlegen
  d3dxmatrixlookatlh( matview, pos, dir, up );
  d3ddev9.settransform( d3dts_view, matview );

  // Projektionsmatrix festlegen
  d3dxmatrixperspectivefovlh( matproj,
                              d3dx_pi / 4,
                              form1.width / form1.height,
                              1.0,
                              100 );
  d3ddev9.settransform( d3dts_projection, matproj );
end;



[DCC Fehler] Menu.pas(128): E2010 Inkompatible Typen: 'TD3DMatrix' und '_D3DMATRIX' (d3ddev9.SetTransform)
[DCC Fehler] Menu.pas(136): E2010 Inkompatible Typen: 'TD3DMatrix' und '_D3DMATRIX' (d3ddev9.SetTransform)

Ich hab auch schon versucht matView als d3d9.TD3DMatrix zudeklarien, aber
dann stimmt die Funktion  D3DXMatrixLookAtLH nicht mehr

weiß irgendjemand die Lösung für diese Problem?

Vielen Dank im voraus

Offline

 

#2 02.07.2012 17:19:32

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehler beim Beispielprojekt

Ich sollte es eigentlich wissen, bin mir aber nicht sicher. Ist bestimmt wieder ein Header-Problem. Ich nutze die von Clootie (www.clootie.ru), damit sollte es klappen. Sind die von Ampaze noch aktuell?

DerPeer

Offline

 

#3 02.07.2012 17:50:46

CreativeMD
Member
Registriert: 22.02.2012
Beiträge: 15

Re: Fehler beim Beispielprojekt

hm
soweit ich mich erinnern kann hab ich die DirectX 9 von clootie benutzt (http://www.clootie.ru/delphi/download_dx92.html),
von Ampaze hab ich noch nie was gehört.

Hab mal ein bisschen gegoogelt, dass sind also auch DirectX Header dateien?

Beitrag geändert von CreativeMD (02.07.2012 17:51:41)

Offline

 

#4 02.07.2012 18:14:47

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehler beim Beispielprojekt

Ja. Die Header sind die Dateien, die Delphi braucht, um die Methoden usw. in den DLLs nutzen zu können. Ampaze und Clootie hatten sich in der Vergangenheit damit beschäftigt, D3D damit Delphi-Entwicklern zugänglich zu machen.

Der Link sollte stimmen. ICH hab meine allerdings schon ewig nicht mehr aktualisiert.

Generell gibts hier im Forum Leute, die da mehr den Durchblick haben als ich.

Wenns nun immer noch nicht geht, ist natürlich blöd.

Die betreffenden Stellen in meinen Headern sehen so aus:

    function SetTransform(State: TD3DTransformStateType; const pMatrix: TD3DMatrix): HResult; stdcall;

  TD3DXMatrix = TD3DMatrix;
  TD3DMatrix = _D3DMATRIX;
  _D3DMATRIX = packed record
    case integer of
      0 : (_11, _12, _13, _14: Single;
           _21, _22, _23, _24: Single;
           _31, _32, _33, _34: Single;
           _41, _42, _43, _44: Single);
      1 : (m : array [0..3, 0..3] of Single);
  end {_D3DMATRIX};

Ist das bei dir genauso?

Derpeer

Offline

 

#5 02.07.2012 19:08:49

CreativeMD
Member
Registriert: 22.02.2012
Beiträge: 15

Re: Fehler beim Beispielprojekt

also bei mir geht
die Funktion in die Datei d3d9.pas

aber dort
finde ich nur diese Zeile:

Code: delphi

function settransform(state : td3dtransformstatetype; const matrix : td3dmatrix) : hresult; stdcall;


Leider kann ich aus irgendeinem Grund der Funktion nicht weiterfolgen (STRG + Mausklick).

Offline

 

#6 02.07.2012 19:31:09

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehler beim Beispielprojekt

Ich habe mir die Sachen von Clootie heruntergeladen, aber darin weder eine d3d9.pas noch deine zitierte Zeile gefunden. Sorry erstmal.

DerPeer

Offline

 

#7 02.07.2012 19:39:41

CreativeMD
Member
Registriert: 22.02.2012
Beiträge: 15

Re: Fehler beim Beispielprojekt

ja
sorry
ich hätte dir sagen sollen das es eine Datei vom Buch ist
http://www.minfos.de/buch/
die Header Dateien muss man sich herunterladen.

Offline

 

#8 02.07.2012 19:43:02

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehler beim Beispielprojekt

Hab die ne PM geschickt.

DerPeer

Offline

 

#9 02.07.2012 21:14:14

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Fehler beim Beispielprojekt

Hast du sowohl die d3d9.pas als auch die d3dx9.pas eingebunden? Vll ist die Deklaration in der einen und die Funktion in der anderen oder so.

Funktionen die in den Headern hinten stdcall stehen haben kannst du nicht weiterverfolgen, da sie in einer DLL sind und nicht per Code zugänglich smile

MfGnietschow

Beitrag geändert von Gnietschow (02.07.2012 21:37:28)


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#10 03.07.2012 09:27:31

CreativeMD
Member
Registriert: 22.02.2012
Beiträge: 15

Re: Fehler beim Beispielprojekt

also das ist ein Beispielprojekt vom Buch "DirectX 9 in Delphi"

Dieser Fehler tritt auch bei allen kommenden Projekten auf, da er dieselbe Funktion nutzt.

Beispielprojekt Kapitel 4 "Der Indexbuffer":

Code: delphi

{** <pre>=====================================================================
 main                                                              19.01.2003
 -----------------------------------------------------------------------------
 Author:    Martin Pyka
 Purpose:   Hauptunit der Anwendung
 History:   19.01.2003 Erstellung der Unit
 =======================================================================</pre>}


unit main;

interface

uses
  windows, messages, sysutils, classes, graphics, controls, forms,
  dialogs, d3d9, d3dx9, dxhelp;

type
  tform1 = class(tform)
    procedure formcreate(sender: tobject);
    procedure formclose(sender: tobject; var action: tcloseaction);
  private
    procedure onidle(sender: tobject; var done: boolean);
  public
    { Public declarations }
  end;

type
  td3dlvertex = record
    position : td3dxvector3;
    diffuse : td3dcolor;
  end;

const
  d3dfvf_td3dlvertex = d3dfvf_xyz or d3dfvf_diffuse;

var
  form1: tform1;
  direct3d9     : idirect3d9;
  d3ddev9       : idirect3ddevice9;
  vertexbuffer  : idirect3dvertexbuffer9;
  indexbuffer   : idirect3dindexbuffer9;

implementation

{$R *.dfm}

{** Eine kleine Hilfsfunktion, die aus den übergebenen Parametern das gewünschte Record vom Typ TD3dLVertex bastelt und zurück gibt
  @param  _x,_y,_z Die Koordinaten des Vertex
  @param  _diffuse Die Farbe des Vertex
  @return Das ausgefüllte Record vom Typ TD3DXVector
  }
function gettd3dlvertex( _x, _y, _z : single; _diffuse : td3dcolor ): td3dlvertex;
begin
  result.position := d3dxvector3( _x, _y, _z );
  result.diffuse  := _diffuse;
end;

{** Erstellt den Vertex- und den Indexbuffer
}
function initgeometry : hresult;
var
  vertices: array[0..99] of td3dlvertex;
  pvertices: pointer;
  hoehe : single;
  indizes: array[0..((81*6) - 1)] of word;
  x, y, z: word;
  pindizes: pointer;
begin
  // Erstellten der Vertices
  for z:= 0 to 9 do begin
    for x:= 0 to 9 do begin
      hoehe := -(x-4.5)*(x-4.5)*0.1 + (z-4.5)*(z-4.5)*0.07;
      vertices[z*10 + x]:= gettd3dlvertex( x-4.5,
                                           hoehe,
                                           z-4.5,
                                           d3dcolor_rgba(x*10, 255 - z*10, (x+z)*10, 0));
    end;
  end;

  // Erstellen der Indizes
  y:= 0;
  for z:= 0 to 8 do begin
    for x:= 0 to 8 do begin
      indizes[y]:= z*10 + x;
      inc(y);
      indizes[y]:= (z+1)*10 + x;
      inc(y);
      indizes[y]:= z*10 + x + 1;
      inc(y);
      indizes[y]:= (z+1)*10 + x;
      inc(y);
      indizes[y]:= (z+1)*10 + x + 1;
      inc(y);
      indizes[y]:= z*10 + x + 1;
      inc(y);
    end;
  end;

  // Erstellen des Vertex- und Indexbuffer
  result := d3ddev9.createvertexbuffer(
              100 * sizeof(td3dlvertex),
              0,
              d3dfvf_td3dlvertex,
              d3dpool_default,
              vertexbuffer,
              nil);
  if (result <> d3d_ok) then exit;
  result := d3ddev9.createindexbuffer(
              sizeof(indizes),
              0,
              d3dfmt_index16 ,
              d3dpool_default,
              indexbuffer,
              nil);
  if (result <> d3d_ok) then exit;

  // Vertexinformationen in den Vertexbuffer schieben
  vertexbuffer.lock(0, sizeof(vertices), pvertices, 0);
    move( vertices, pvertices^, sizeof(vertices) );
  vertexbuffer.unlock;

  // Indizes in den Indexbuffer schieben
  indexbuffer.lock( 0, sizeof(indizes), pindizes, 0);
    move( indizes, pindizes^, sizeof(indizes));
  indexbuffer.unlock;

  result:= d3d_ok;
end;

{** Einstellungen, die beim Start der Anwendung vorgenommen werden
    @param  Sender: TObject
}
procedure tform1.formcreate(sender: tobject);
begin
  if (not dhinitdgfx( handle, false, 0, 0, 0, true, true, direct3d9, d3ddev9 )) then begin
    application.terminate;
    exit;
  end;

  if (initgeometry <> d3d_ok) then application.terminate;
  d3ddev9.setrenderstate( d3drs_lighting, longword( false ) );

  application.onidle := onidle;
end;

{** vb_triangle und DirectXGraphics-Interfaces werden wieder frei gegeben
    @param  Sender: TObject;
    @param  Action: TCloseAction
}
procedure tform1.formclose(sender: tobject; var action: tcloseaction);
begin
  vertexbuffer := nil;
  indexbuffer := nil;
  dhclosedgfx(direct3d9, d3ddev9);
end;

{** View- und Projektionsmatrix werden eingestellt. In der gesamten Anwendung bleiben Sie unverändert
 }
procedure setupviewandprojection;
var
  pos, dir, up : td3dxvector3;
  matview, matproj : td3dxmatrix;
begin
  // Position, Richtung und Ausrichtung festlegen
  pos := d3dxvector3( sin(gettickcount*0.001)*8, 10.0, cos(gettickcount*0.001)*8 );
  dir := d3dxvector3( 0.0, 0.0, 0.0 );
  up  := d3dxvector3( 0.0, 1.0, 0.0 );

  // View-Matrix festlegen
  d3dxmatrixlookatlh( matview, pos, dir, up );
  d3ddev9.settransform( d3dts_view, matview );

  // Projektionsmatrix festlegen
  d3dxmatrixperspectivefovlh( matproj,
                              d3dx_pi / 4,
                              form1.width / form1.height,
                              1.0,
                              100 );
  d3ddev9.settransform( d3dts_projection, matproj );
end;


{** Das Dreieck wird um die z-Achse gedreht
}
procedure setuptriangletransformation;
var
  matrotz : td3dxmatrix;
begin
  d3dxmatrixrotationz( matrotz, gettickcount * 0.001 );
  d3ddev9.settransform( d3dts_worldmatrix(0), matrotz );
end;

{** Die eigentliche Renderprozedur
}
procedure render;
begin
  d3ddev9.beginscene;
  d3ddev9.clear( 0, nil, d3dclear_target or d3dclear_zbuffer, d3dcolor_argb(0, 0, 0, 0), 1.0, 0);

  setupviewandprojection;

  d3ddev9.setstreamsource( 0, vertexbuffer, 0, sizeof(td3dlvertex));
  d3ddev9.setfvf( d3dfvf_td3dlvertex );
  // ( 1 ) Indexbuffer setzen
  d3ddev9.setindices(indexbuffer);
  // ( 2 ) Objekt rendern
  d3ddev9.drawindexedprimitive( d3dpt_trianglelist, 0, 0, 100, 0, 486 div 3);

  d3ddev9.endscene;
  d3ddev9.present(nil, nil, 0, nil);
end;

{** Die OnIdle-Prozedur wird immer dann ausgeführt, wenn die Anwendung grade keine Prozesse ausführt
    @param  Sender: TObject
    @param  done: boolean Muss in der Schleife auf false gesetzt werden um eine Endlosschleife hervorzurufen
}
procedure tform1.onidle(sender: tobject; var done : boolean);
begin
  done := false;
  render;
end;

end.


hm
ich glaube ich sollte den Autor des Buches anschreiben

Offline

 

#11 03.07.2012 22:29:46

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehler beim Beispielprojekt

Bei meinen Projekten wird nicht d3d9 eingebunden, dafür die Datei Direct3D9.

Offline

 

#12 04.07.2012 09:59:34

CreativeMD
Member
Registriert: 22.02.2012
Beiträge: 15

Re: Fehler beim Beispielprojekt

ja,
welche Projekte benutzt du den?
Mit deinen Header Dateinen kommt genau derselbe Fehler.

Beitrag geändert von CreativeMD (04.07.2012 10:02:29)

Offline

 

#13 04.07.2012 16:32:17

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehler beim Beispielprojekt

In meiner uses-klausel stehen neben den Windows-Sachen immer nur "Direct3D9" und "d3dx9", manchmal auch "directInput8".

Wo kommt denn dieses ominöse d3d9 her? Bei meinen Headern ist das nicht dabei.

DerPeer

Beitrag geändert von DerPeer (04.07.2012 16:33:57)

Offline

 

#14 04.07.2012 17:19:19

DragonFlyOfGold
ProMember
Ort: Berlin
Registriert: 09.11.2005
Beiträge: 139

Re: Fehler beim Beispielprojekt

Das ist die selbe Datei! In manchen Headern heißt die Datei halt Direct3D9.pas und in anderen d3d9.pas . Es gibt halt nich nur eine Headerübersetzung, daher der Unterschied.

Du solltest zum Kompilieren der Beispieldatein auch die Header des Buches nehmen, zu finden unter http://www.minfos.de/buch/ ("Die benötigten Header-Dateien ( 143k )" und "Die DLL-Dateien ( 1.2 MB )"). Mit diesen könnt ihr dann ohne Probleme die Beispiele kompilieren (von mir getestet!).
Durch Unterschiede der Cooltie Header und der Header des Buches kann es sonst zu Problemen kommen, bzw. ist es gekommen;)
Noch ein kleiner Hinweis: Leider enthalten die Header ein paar Fehler, daher empfehle ich euch am Anfang die Header des Buches zu nutzen und erstmal alles in Ruhe nach zu vollziehen. Wenn ihr das Buch durch habt und ihr soweit alles verstanden habt, solltest ihr auf die Cooltie Header umsteigen. Dann bekommt ihr auch die Behebung der Fehler, die Aufgrund der Headerunteschiede auftauchen, ohne größere Probleme hin.

Beitrag geändert von DragonFlyOfGold (04.07.2012 17:30:26)

Offline

 

#15 05.07.2012 09:38:52

CreativeMD
Member
Registriert: 22.02.2012
Beiträge: 15

Re: Fehler beim Beispielprojekt

hm
also brauch man für den Anfang gar keine anderen Header Dateien und du meinst der Fehler kommt daher da manche Header Dateien den
gleichen Namen haben und sich gegenseitig "behindern"?

Offline

 

#16 05.07.2012 11:33:47

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Fehler beim Beispielprojekt

Vielleicht. Wo hast du denn deine Header-Dateien hingetan? Ins Projekt-Verzeichnis oder in ein Extra-Verzeichnis wo Delphi suchen soll?

DerPeer

Offline

 

#17 05.07.2012 12:18:24

CreativeMD
Member
Registriert: 22.02.2012
Beiträge: 15

Re: Fehler beim Beispielprojekt

Extra-Verzeichnis

Offline

 

#18 05.07.2012 16:38:44

DragonFlyOfGold
ProMember
Ort: Berlin
Registriert: 09.11.2005
Beiträge: 139

Re: Fehler beim Beispielprojekt

Genau, sobald du andere Header Dateien nutzt wird es schnell zu Problemen mit den Beispielen kommen. Am besten stellst du sicher das sich im Ordner der Header Dateien nur die Header von der Webseite befinden und keine anderen.

Beitrag geändert von DragonFlyOfGold (05.07.2012 16:39:08)

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson