AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

OpenGL Pong

Ein Thema von acidrain · begonnen am 24. Mär 2012 · letzter Beitrag vom 24. Mär 2012
Antwort Antwort
Seite 3 von 4     123 4   
acidrain

Registriert seit: 18. Mär 2012
17 Beiträge
 
#21

AW: OpenGL Pong

  Alt 24. Mär 2012, 12:48
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#22

AW: OpenGL Pong

  Alt 24. Mär 2012, 12:49
Brauche ich dann trotzdem noch den IdleHandler oder kann ich den auslassen, wegen dem Timer?

EDIT: h_DC & h_RC werden bei mir nicht erkannt, hab wohl einen veralteten Header :s
Zeig doch mal mehr Code!
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

Geändert von EWeiss (24. Mär 2012 um 12:52 Uhr)
  Mit Zitat antworten Zitat
acidrain

Registriert seit: 18. Mär 2012
17 Beiträge
 
#23

AW: OpenGL Pong

  Alt 24. Mär 2012, 12:53
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#24

AW: OpenGL Pong

  Alt 24. Mär 2012, 12:55
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:
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;
OPENGL wird doch schon in FormCreate initialisiert.
Sorry so wird das nichts mit Copy und Paste.

gruss

Geändert von EWeiss (24. Mär 2012 um 13:00 Uhr)
  Mit Zitat antworten Zitat
acidrain

Registriert seit: 18. Mär 2012
17 Beiträge
 
#25

AW: OpenGL Pong

  Alt 24. Mär 2012, 12:57
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

Geändert von acidrain (24. Mär 2012 um 13:03 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#26

AW: OpenGL Pong

  Alt 24. Mär 2012, 13:02
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
Wenn du den IdleHandler deaktivierst kann auch nichts Rendern
denn da wird die Render procedure und das anschließende neu zeichnen von Schläger ausgeführt.

gruss
  Mit Zitat antworten Zitat
FlatIron

Registriert seit: 22. Mär 2012
13 Beiträge
 
Delphi 7 Enterprise
 
#27

AW: OpenGL Pong

  Alt 24. Mär 2012, 13:05
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
Das bügeln wir schon aus
  Mit Zitat antworten Zitat
acidrain

Registriert seit: 18. Mär 2012
17 Beiträge
 
#28

AW: OpenGL Pong

  Alt 24. Mär 2012, 13:08
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!
  Mit Zitat antworten Zitat
FlatIron

Registriert seit: 22. Mär 2012
13 Beiträge
 
Delphi 7 Enterprise
 
#29

AW: OpenGL Pong

  Alt 24. Mär 2012, 13:11
Mach das.

[OT]
Darf ich fragen wie das Thema der Facharbeit lautet? Und welches Fach das ist? Mathe? Info?
[/OT]
Das bügeln wir schon aus
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#30

AW: OpenGL Pong

  Alt 24. Mär 2012, 13:14
Versuch das mal..

Delphi-Quellcode:
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.
Habs mal getestet!
Also da ist einiges im argen Koordinaten usw..
Der linke Schläger wird aber jetzt gezeichnet wenn du die Tasten verwendest.

gruss

Geändert von EWeiss (24. Mär 2012 um 14:18 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz