Kan ikke finde ud af artiklen om 3D

Tags:    delphi

User
Bruger #353 @ 02.08.04 16:04
Jeg har kastet mig ud i artiklen om 3D
Måske er det for stor en mundfuld for mig, for jeg er allerede løbet ind i problemer i de første linjer.

Jeg har skrevet følgende


unit GameClass;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OpenGL, Math,
ExtCtrls;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
procedure FormCreate(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

type
TContext = record
RenderContext, DeviceContext : THandle;
end;

function SetupContext(Sender : TObject) : TContext;
var
PFD: PixelFormatDescriptor;
I : Integer;
begin
with TWinControl(Sender) do
Result.DeviceContext := GetDC(Handle);

ZeroMemory(@PFD,SizeOf(PFD));

with PFD do
begin
nSize := Sizeof(PixelFormatDescriptor);
nVersion := 1;
dwFlags := pfd_Support_OpenGL or pfd_Draw_to_Window or pfd_DoubleBuffer;
iPixelType := pfd_Type_RGBA;
cColorBits := 24;
cDepthBits := 32;
iLayerType := pfd_Main_Plane;
end;

I := ChoosePixelFormat(Result.DeviceContext,@PFD);

if I = 0 then
Exit;

if not SetPixelFormat(Result.DeviceContext, I, @PFD) then
Exit;

Result.RenderContext := wglCreateContext(Result.DeviceContext);

if Result.RenderContext = 0 then
Exit;

if not wglMakeCurrent(Result.DeviceContext, Result.RenderContext) then
Exit;
end;

var
Context : TContext;
procedure TForm1.FormCreate(Sender: TObject);
begin
//Referere til vores funktion, der vil returnere en context til vores form
Context := SetupContext(Form1);
end;


procedure TForm1.FormPaint(Sender: TObject);
begin
//Definere farven der skal overskrive Color bufferen
glClearColor(0,0,0,0);

//Overskriver Color bufferen
glClear(gl_Color_Buffer_Bit);

//Bytter OpenGL's Color buffer med Windows (GDI'en)
SwapBuffers(Context.DeviceContext);
end;


end.[/pre]

Når jeg prøver at kompile koden (der står jo i artiklen at man skal prøve det på dette tidspunkt) kommer der en fejl om "Invalid properties"

Nogen der kan hjælpe mig med at komme videre?



3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Jeg har kastet mig ud i artiklen om 3D
Måske er det for stor en mundfuld for mig, for jeg er allerede løbet ind i problemer i de første linjer.

Jeg har skrevet følgende


unit GameClass;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OpenGL, Math,
ExtCtrls;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
procedure FormCreate(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

type
TContext = record
RenderContext, DeviceContext : THandle;
end;

function SetupContext(Sender : TObject) : TContext;
var
PFD: PixelFormatDescriptor;
I : Integer;
begin
with TWinControl(Sender) do
Result.DeviceContext := GetDC(Handle);

ZeroMemory(@PFD,SizeOf(PFD));

with PFD do
begin
nSize := Sizeof(PixelFormatDescriptor);
nVersion := 1;
dwFlags := pfd_Support_OpenGL or pfd_Draw_to_Window or pfd_DoubleBuffer;
iPixelType := pfd_Type_RGBA;
cColorBits := 24;
cDepthBits := 32;
iLayerType := pfd_Main_Plane;
end;

I := ChoosePixelFormat(Result.DeviceContext,@PFD);

if I = 0 then
Exit;

if not SetPixelFormat(Result.DeviceContext, I, @PFD) then
Exit;

Result.RenderContext := wglCreateContext(Result.DeviceContext);

if Result.RenderContext = 0 then
Exit;

if not wglMakeCurrent(Result.DeviceContext, Result.RenderContext) then
Exit;
end;

var
Context : TContext;
procedure TForm1.FormCreate(Sender: TObject);
begin
//Referere til vores funktion, der vil returnere en context til vores form
Context := SetupContext(Form1);
end;


procedure TForm1.FormPaint(Sender: TObject);
begin
//Definere farven der skal overskrive Color bufferen
glClearColor(0,0,0,0);

//Overskriver Color bufferen
glClear(gl_Color_Buffer_Bit);

//Bytter OpenGL's Color buffer med Windows (GDI'en)
SwapBuffers(Context.DeviceContext);
end;


end.[/pre]

Når jeg prøver at kompile koden (der står jo i artiklen at man skal prøve det på dette tidspunkt) kommer der en fejl om "Invalid properties"

Nogen der kan hjælpe mig med at komme videre?


Jepper, svaret er nemt. Du har deklareret FormCreate under Form1's private sektion. Derved har andre funktioner og klasser ikke adgang til den, da den er privat til Form1. Flyt den op til den anden (FormPaint), og slet eventuelt private og public erklæringerne hvis ikke du har brug for dem, så får du i hvert fald ikke samme fejl igen.
I øvrigt burde du deklarere TContext længere oppe, da du formentlig godt kunne få brug for en global variabel af den type senere hen.
For at gøre exe-filen mindre burde du også droppe messages, dialogs og sysutils (math bliver vist brugt senere hen i artiklen, men lige nu bruger du heller ikke den), da du ikke bruger deres funktioner (sysutils har mange gode ting, så den er nok god for de fleste at beholde). Bare råd til senere hen i udviklingen...
Har ændret det med FormCreate her (resten af rådene må du selv om, men nu virker det i hvert fald):
Fold kodeboks ind/udKode 


n i f e
115 105 102 105
6E 69 66 69

[Redigeret d. 02/08-04 16:46:12 af Nicolai Lyster Fersner]



Hejsa jeg har også et problem i min kode:

Fold kodeboks ind/udKode 


Fejlen er: "stream read error"

jeg er nået ned ved det første sted med to billeder i nummer 2 artikel... håber lige på et svar



User
Bruger #353 @ 18.08.04 11:39
Tak for hjælpen.



t