![]() |
AW: OpenGL Pong
Das hatte ich ja auch alles gemacht, trotzdem ist es ein einziges Wirrwarr in meinem Kopf, auf Wunsch kann ich mein ganzes Projekt als Quelltext zeigen :oops:
|
AW: OpenGL Pong
Zitat:
Was ist denn da so geheim ? Hat mit dem Header nichts zu tun sondern ist eine vom mir festgelegte Variable (GLOBAL) Du benötigst aber das DC wie du es benennst ist letztendlich egal. DC: HDC oder was auch immer das ist der Gerätekontex also das DC von deiner Render Form bzw. Image oder was du als GLWindow verwendest. Ansonsten hat FlatIron doch schon alles ausführlich erklärt. ;) gruss |
AW: OpenGL Pong
Ich hab nichts zu verbergen ;)
Hier ist alles:
Code:
unit uPong;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DGLOpenGL, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure SetupGL; procedure FormResize(Sender: TObject); procedure FormDestroy(Sender: TObject); { procedure IdleHandler(Sender: TObject; var Done: Boolean); } procedure ErrorHandler; procedure Render; procedure Schlaeger; procedure GLDraw; procedure InitOpenGL; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Timer1Timer(Sender: TObject); private StartTime, TimeCount, FrameCount : Cardinal; Frames, DrawTime : Cardinal; public DC: HDC; RC: HGLRC; end; const NearClipping = 1; FarClipping = 1000; var Form1: TForm1; Spieler1hoch: boolean; Spieler1runter: boolean; Spieler2hoch: boolean; Spieler2runter: boolean; s1, s2: Integer; implementation {$R *.dfm} procedure TForm1.InitOpenGL; begin // Gerätekontext holen h_DC := GetDC(_FNormal.Handle); // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering) h_RC := CreateRenderingContext(h_DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0); // Erstellten Renderkontext aktivieren ActivateRenderingContext(h_DC, h_RC); begin; procedure TForm1.FormCreate(Sender: TObject); begin DC:= GetDC(Handle); if not InitOpenGL then Application.Terminate; RC:= CreateRenderingContext( DC, [opDoubleBuffered], 32, 24, 0,0,0, 0); ActivateRenderingContext(DC, RC); SetupGL; end; procedure TForm1.SetupGL; begin glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); end; procedure TForm1.FormResize(Sender: TObject); var tmpBool : Boolean; begin glViewport(0, 0, ClientWidth, ClientHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping); glMatrixMode(GL_MODELVIEW); glLoadIdentity; {IdleHandler(Sender, tmpBool);} end; procedure TForm1.FormDestroy(Sender: TObject); begin DeactivateRenderingContext; DestroyRenderingContext(RC); ReleaseDC(Handle, DC); end; {procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean); begin StartTime:= GetTickCount; Render; Schlaeger; DrawTime:= GetTickCount - StartTime; Inc(TimeCount, DrawTime); Inc(FrameCount); if TimeCount >= 1000 then begin Frames:= FrameCount; TimeCount:= TimeCount - 1000; FrameCount:= 0; Caption:= InttoStr(Frames) + 'FPS'; ErrorHandler; end; Done:= false; end; } procedure TForm1.ErrorHandler; begin Form1.Caption:= gluErrorString(glGetError); end; procedure TForm1.Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping); glMatrixMode(GL_MODELVIEW); glLoadIdentity; // Ball glTranslatef(30, 0, 0); glBegin(GL_QUADS); glColor3f(0, 1, 0); glVertex3f(-1,1,-1); //lo glColor3f(0, 1, 0); glVertex3f(-1,-1,-1); //lu glColor3f(0, 1, 0); glVertex3f(1,-1,-1); //ru glColor3f(0, 1, 0); glVertex3f(1,1,-1); //ro glEnd; SwapBuffers(DC); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = ord('W') then Spieler1hoch := true; if Key = ord('S') then Spieler1runter := true; if Key = VK_UP then Spieler2hoch := true; if Key = VK_DOWN then Spieler2runter := true; end; procedure TForm1.Timer1Timer(Sender: TObject); begin GLDraw; if Spieler1hoch then begin s1:= s1+5; Spieler1hoch:= false; if Spieler1runter then begin s1:= s1-5; Spieler1runter:= false; end; end; end; procedure TForm1.Schlaeger; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); //Spieler 1 glTranslatef(-60, 0, 0); glTranslated (0, s1, 0); glBegin(GL_QUADS); glColor3f(0, 1, 0); glVertex3f(-1,1,-1); //lo glColor3f(0, 1, 0); glVertex3f(-1,-9,-1); //lu glColor3f(0, 1, 0); glVertex3f(1,-9,-1); //ru glColor3f(0, 1, 0); glVertex3f(1,1,-1); //ro glEnd; // Spieler 2 glTranslatef(30, 6, -50); glTranslated(0, s2, 0); glBegin(GL_QUADS); glColor3f(0, 1, 0); glVertex3f(-1,1,-1); //lo glColor3f(0, 1, 0); glVertex3f(-1,-9,-1); //lu glColor3f(0, 1, 0); glVertex3f(1,-9,-1); //ru glColor3f(0, 1, 0); glVertex3f(1,1,-1); //ro glEnd; end; procedure TForm1.GLDraw; begin // Clear The Screen And The Depth Buffer glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Change Matrix Mode to Projection glMatrixMode(GL_PROJECTION); // Reset View glLoadIdentity; gluPerspective(45, (320 / 240), 1, 1000.0); // Change Projection to Matrix Mode glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Schlaeger; // Update the display SwapBuffers(h_DC); end; end. |
AW: OpenGL Pong
Rauswerfen!
Delphi-Quellcode:
procedure TForm1.InitOpenGL;
begin // Gerätekontext holen h_DC := GetDC(_FNormal.Handle); // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering) h_RC := CreateRenderingContext(h_DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0); // Erstellten Renderkontext aktivieren ActivateRenderingContext(h_DC, h_RC); begin;
Delphi-Quellcode:
OPENGL wird doch schon in FormCreate initialisiert.
procedure TForm1.GLDraw;
begin // Clear The Screen And The Depth Buffer glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Change Matrix Mode to Projection glMatrixMode(GL_PROJECTION); // Reset View glLoadIdentity; gluPerspective(45, (320 / 240), 1, 1000.0); // Change Projection to Matrix Mode glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Schlaeger; // Update the display SwapBuffers(h_DC); end; Sorry so wird das nichts mit Copy und Paste. gruss |
AW: OpenGL Pong
Also dem Problem bin ich mir bewusst, vor dem ich stehe, aber ich wüsste nicht, wie das zu ändern ist. Nach den ganzen Tipps, die ihr mit gegeben habt ist das Problem, dass die Schläger nicht angezeigt werden.
EDIT: Ich muss ja entweder IdleHandler oder den Timer rausschmeissen, denn das ist ja das gleiche. Ich würde ja gerne den IdleHandler rausschmeißen, aber der wird bei FormResize aufgerufen |
AW: OpenGL Pong
Zitat:
denn da wird die Render procedure und das anschließende neu zeichnen von Schläger ausgeführt. gruss |
AW: OpenGL Pong
EWeiss hat es schon gesagt - du hast dir da einfach etwas schnell zusammen kopiert. Die Lösung: Alles löschen und von vorne anfangen. Geh draußen schnell ne runde joggen oder mach irgendwas, wobei du den Kopf frei kriegst, und dann leg einfach nochmal los.
Dann fängst du einfach mit dem Grundlagentutorial an - liest es dir durch. Lädst dir das Listing runter. Vergleichst den Quellcode mit dem Tutorial und versuchst so zu verstehen. Danach kannst du, wenn du unter Zeitdruck bist, einfach das Template übernehmen oder du schreibst es einfach nochmal mit der Anleitung neu. Das wäre Schritt 1. Danach versuchst du die folgenden Tutorials zu verstehen und dann kannst du dir die wichtigen Punkte raussuchen, die du für die Umsetzung deines Projekts brauchst - vgl. die Tutorials einfach mit deinen Aufzeichnungen/Konzept oder was du dir sonst handschriftlich notiert hast (einfach drauflos programmieren bringt nichts). Dann kannst du erstmal loslegen deinen Ball zu programmieren bzw. die Schläger. Wenn diese Komponenten deines Spiels unabhängig voneinander funktionieren kannst du dich mit deiner Kollisionsabfrage beschäfftigen. So wird dein Projekt nach und nach zu einem Spiel. Wichtig ist aber, dass du verstehst was du da grade machst. Wir können dir das Spiel nicht programmieren noch können wir dir helfen OpenGL sofort zu verstehen. - Fang lieber mal strukturiert an. Ich hoffe für dich, dass Montag nicht schon der Abgabetermin ist. Ich wünsche dir trotzdem viel Spaß und Erfolg. MFG FlatIron |
AW: OpenGL Pong
Dann kann ich das doch auch ganz einfach in den Timer reinpacken. Ich brauch ja nicht mehr wie 25FPS für Pong.
EDIT: Danke FlatIron, das werd ich wohl tun! Ne, Abgabetermin ist noch was bisschen hin, hab erstmal das schriftliche gemacht und wollte mich zuletzt an's Programmieren setzen. Ich guck mir alles nochmal von vorne an und melde mich, falls nötig!:thumb: |
AW: OpenGL Pong
Mach das.
[OT] Darf ich fragen wie das Thema der Facharbeit lautet? Und welches Fach das ist? Mathe? Info? [/OT] |
AW: OpenGL Pong
Versuch das mal..
Delphi-Quellcode:
Habs mal getestet!
unit uPong;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DGLOpenGL, ExtCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure SetupGL; procedure FormResize(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure IdleHandler(Sender: TObject; var Done: Boolean); procedure ErrorHandler; procedure Render; procedure Schlaeger; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private StartTime, TimeCount, FrameCount : Cardinal; Frames, DrawTime : Cardinal; public DC: HDC; RC: HGLRC; end; const NearClipping = 1; FarClipping = 1000; var Form1: TForm1; s1, s2: Integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin DC:= GetDC(Handle); if not InitOpenGL then Application.Terminate; RC:= CreateRenderingContext( DC, [opDoubleBuffered], 32, 24, 0,0,0, 0); ActivateRenderingContext(DC, RC); SetupGL; end; procedure TForm1.SetupGL; begin glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); end; procedure TForm1.FormResize(Sender: TObject); var tmpBool : Boolean; begin glViewport(0, 0, ClientWidth, ClientHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping); glMatrixMode(GL_MODELVIEW); glLoadIdentity; IdleHandler(Sender, tmpBool); end; procedure TForm1.FormDestroy(Sender: TObject); begin DeactivateRenderingContext; DestroyRenderingContext(RC); ReleaseDC(Handle, DC); end; procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean); begin StartTime:= GetTickCount; Render; DrawTime:= GetTickCount - StartTime; Inc(TimeCount, DrawTime); Inc(FrameCount); if TimeCount >= 1000 then begin Frames:= FrameCount; TimeCount:= TimeCount - 1000; FrameCount:= 0; Caption:= InttoStr(Frames) + 'FPS'; ErrorHandler; end; Done:= false; end; procedure TForm1.ErrorHandler; begin Form1.Caption:= gluErrorString(glGetError); end; procedure TForm1.Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping); glMatrixMode(GL_MODELVIEW); glLoadIdentity; Schlaeger; // alter code gehört zu Ball {glTranslatef(30, 0, 0); glBegin(GL_QUADS); glColor3f(0, 1, 0); glVertex3f(-1,1,-1); //lo glColor3f(0, 1, 0); glVertex3f(-1,-1,-1); //lu glColor3f(0, 1, 0); glVertex3f(1,-1,-1); //ru glColor3f(0, 1, 0); glVertex3f(1,1,-1); //ro glEnd; } SwapBuffers(DC); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = ord('W') then s1:= s1+5; if Key = ord('S') then s1:= s1-5; if Key = VK_UP then s2:= s2+5; if Key = VK_DOWN then s2:= s2-5; Render; end; procedure TForm1.Schlaeger; begin //Spieler 1 glTranslatef(-60, 0, 0); glTranslated (0, s1, 0); glBegin(GL_QUADS); glColor3f(0, 1, 0); glVertex3f(-1,1,-1); //lo glColor3f(0, 1, 0); glVertex3f(-1,-9,-1); //lu glColor3f(0, 1, 0); glVertex3f(1,-9,-1); //ru glColor3f(0, 1, 0); glVertex3f(1,1,-1); //ro glEnd; // Spieler 2 glTranslatef(30, 6, -50); glTranslated(0, s2, 0); glBegin(GL_QUADS); glColor3f(0, 1, 0); glVertex3f(-1,1,-1); //lo glColor3f(0, 1, 0); glVertex3f(-1,-9,-1); //lu glColor3f(0, 1, 0); glVertex3f(1,-9,-1); //ru glColor3f(0, 1, 0); glVertex3f(1,1,-1); //ro glEnd; end; end. Also da ist einiges im argen Koordinaten usw.. Der linke Schläger wird aber jetzt gezeichnet wenn du die Tasten verwendest. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz