Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 18:30

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Timebased Movement
BeitragVerfasst: Mi Aug 09, 2006 21:57 
Offline
DGL Member

Registriert: Di Aug 01, 2006 13:31
Beiträge: 4
Hi Leutz,

irgendwie möchte das bei mir nicht klappen - hab dutzende thread gelesen und auch im wiki geguckt aber irgendwas muss falsch sein. Denke ich habe das Grundprinzip verstanden nur weiss ich nicht was ich falsch mache.

zuerst deklariere ich :
Code:
  1. var Freq, StartCount, FrameEndCount, SpeedFactor : Int64;


dann:
Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3. QueryPerformanceFrequency(Freq);
  4. .....
  5. end;


Code:
  1. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  2. begin
  3.   QueryPerformanceCounter(StartCount);
  4.   StartTime:= GetTickCount;
  5.   Render;
  6.   QueryPerformanceCounter(FrameEndCount);
  7.   SpeedFactor := ((FrameEndCount-StartCount) DIV Freq)*100;
  8.   DrawTime:= GetTickCount - StartTime;
  9.   Inc(TimeCount, DrawTime);
  10.   Inc(FrameCount);
  11.  
  12.   if TimeCount >= 1000 then begin
  13.     Frames:= FrameCount;
  14.     TimeCount:= TimeCount - 1000;
  15.     FrameCount:= 0;
  16.     Caption:= InttoStr(Frames) + 'FPS';
  17.     ErrorHandler;
  18.   end;
  19.  
  20.   sleep(1);
  21.   Done:= false;
  22. end;


übrigens werden die Frame bei mir auch nicht als caption angezeigt ?!

und hinterher:
Code:
  1. procedure TForm1.Bewegung;
  2. begin
  3. Ball.X:=(Ball.X+speed*SpeedFactor)*Ball.VektorX;
  4. Ball.Y:=(Ball.Y+speed*SpeedFactor)*Ball.VektorY;
  5. end;


Ball.Vektor ist nur 1 oder -1

Das Ergebnis ist, dass der Ball sich nicht mehr bewegt sindern still steht.

Bitte helft mir - verzweifle nun


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 09, 2006 22:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Was macht denn das "DIV" da? Damit machst du ja eine Integer-Division, bei der das Ergebnis als ein in Richtung 0 gerundeter ganzer Wert ausgegeben wird (in diesem Fall 0). Da aber Speedfactor immer eine Fließkommazahl sein dürfte, muss da "normal" geteilt werden.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 10, 2006 10:04 
Offline
DGL Member

Registriert: Mi Aug 02, 2006 16:58
Beiträge: 22
Wohnort: Clausthal-Zellerfeld
Und das die FPS nicht angezeigt werden ist eigentllich auch klar. ( ich weiss nicht warum das in dem Tutorial funktioniert hat ) Aber ich musste bei mir auch TForm1.Caption schreiben. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 10, 2006 10:33 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Also TForm1.Caption dürfte eigentlich nichgt funkionieren. Nur Form1.Caption und einfach nur Caption (weil der IdleHandler eine Methode von TForm1 ist)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 10, 2006 10:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Im offiziellen DGL-Header heißt es "GLForm". Nichtsdestotrotz sollte das Caption alleine ausreichen.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 10, 2006 14:23 
Offline
DGL Member

Registriert: Di Aug 01, 2006 13:31
Beiträge: 4
Also, hab jetzt SpeedFactor Extended gemacht, damit
Code:
  1.  /
funktioniert und ich nicht
Code:
  1. DIV
nehmen muss. Trotzdem funktioniert es noch nicht. Der Ball fliegt zwar erst los (vorher tat sich garnichts) jedoch immer noch FPS abhängig, denn wenn ich nebenbei mehr Programme anmache, wechselt die Geschwindigkeit.
Dazu gibt es nun ein sehr merkwürdiges Verhalten nach der 1. Kollision. (zu einer 2. kommt es auch erst garnicht ;) )

Nun warte ich wieder auf Hilfe und probier in derzeit mal ein wenig rum.

Das mit dem TForm1.Caption dacht ich auch erst, aber ging auch nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 10, 2006 15:21 
Offline
DGL Member

Registriert: Di Aug 01, 2006 13:31
Beiträge: 4
wie gesagt, hab jetzt mal ein wenig (viel) rumgespielt und einfach manches aus dem OpenGL1.5 Templates (hier in den Files) übernommen. FPS werden jetzt angezeigt, nur das mit dem Ball hat noch nicht hin....

hier einfach mal mein ganzer code, ausgenommen die Schlaeger und das Spielfeld, hab ich in extra units gelassen. Hoffe ich könnt mir weiterhelfen, soass ich weiter an meinem Projekt arbeiten kann.

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, dglOpengl;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     procedure FormCreate(Sender: TObject);
  12.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  13.     procedure FormResize(Sender: TObject);
  14.     procedure FormDestroy(Sender: TObject);
  15.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  16.   private
  17.     { Private declarations }
  18.     ShowFPS   : Boolean;    FontBase  : GLUInt;    StartTick : Cardinal;
  19.     Frames    : Integer;    FPS       : Single;
  20.     procedure GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  21.     procedure BuildFont(pFontName : String);
  22.     procedure PrintText(pX,pY : Integer; const pText : String);
  23.     procedure ShowText;
  24.     procedure SetupGL;
  25.     procedure Render;
  26.     procedure ErrorHandler;
  27.     procedure Perspektive;
  28.     procedure init;
  29.     procedure Pong;
  30.     procedure Bewegung;
  31.     procedure KollisionWand;
  32.     procedure KollisionSchlaeger;
  33.   public
  34.     { Public declarations }
  35.     DC                                : HDC;   //Handle auf Zeichenfläche
  36.     RC                                : HGLRC; //Rendering Context
  37.   end;
  38.  
  39. type TBall = record
  40.      X       : GlFloat;
  41.      Y       : GlFloat;
  42.      VektorX : GlFloat;
  43.      VektorY : GlFloat;
  44.      end;
  45.  
  46. var
  47.   Form1: TForm1;
  48.  
  49. implementation
  50.  
  51. uses Spielfeld, Schlaeger;//, Spielball;
  52.  
  53. {$R *.dfm}
  54.  
  55. const NearClipping = 0.1;
  56.       FarClipping  = 100;
  57.  
  58. var   Ball : TBall;
  59.       speed: GlFloat;
  60.       Freq, StartCount, FrameEndCount : Int64;
  61.       SpeedFactor : Extended;
  62.  
  63. procedure TForm1.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  64. var
  65.  dmScreenSettings : DevMode;
  66. begin
  67. // Fenster vor Vollbild vorbereiten
  68. WindowState := wsMaximized;
  69. BorderStyle := bsNone;
  70. ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  71. with dmScreenSettings do
  72.  begin
  73.  dmSize              := SizeOf(dmScreenSettings);
  74.  dmPelsWidth         := pWidth;                    // Breite
  75.  dmPelsHeight        := pHeight;                   // Höhe
  76.  dmBitsPerPel        := pBPP;                      // Farbtiefe
  77.  dmDisplayFrequency  := pFrequency;                // Bildwiederholfrequenz
  78.  dmFields            := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  79.  end;
  80. if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
  81.  begin
  82.  MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
  83.  exit
  84.  end;
  85. end;
  86.  
  87. procedure TForm1.BuildFont(pFontName : String);
  88. var
  89.  Font : HFONT;
  90. begin
  91. // Displaylisten für 256 Zeichen erstellen
  92. FontBase := glGenLists(96);
  93. // Fontobjekt erstellen
  94. Font     := CreateFont(16, 0, 0, 0, FW_MEDIUM, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
  95.                        ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH, PChar(pFontName));
  96. // Fontobjekt als aktuell setzen
  97. SelectObject(DC, Font);
  98. // Displaylisten erstellen
  99. wglUseFontBitmaps(DC, 0, 256, FontBase);
  100. // Fontobjekt wieder freigeben
  101. DeleteObject(Font)
  102. end;
  103.  
  104. procedure TForm1.PrintText(pX,pY : Integer; const pText : String);
  105. begin
  106. if (pText = '') then
  107.  exit;
  108. glPushAttrib(GL_LIST_BIT);
  109.  glRasterPos2i(pX, pY);
  110.  glListBase(FontBase);
  111.  glCallLists(Length(pText), GL_UNSIGNED_BYTE, PChar(pText));
  112. glPopAttrib;
  113. end;
  114.  
  115. procedure TForm1.ShowText;
  116. begin
  117. // Tiefentest und Texturierung für Textanzeige deaktivieren
  118. glDisable(GL_DEPTH_TEST);
  119. glDisable(GL_TEXTURE_2D);
  120. // In orthagonale (2D) Ansicht wechseln
  121. glMatrixMode(GL_PROJECTION);
  122. glLoadIdentity;
  123. glOrtho(0,640,480,0, -1,1);
  124. glMatrixMode(GL_MODELVIEW);
  125. glLoadIdentity;
  126. PrintText(5,15, FloatToStr(FPS)+' fps');
  127. glEnable(GL_DEPTH_TEST);
  128. glEnable(GL_TEXTURE_2D);
  129. end;
  130.  
  131. procedure TForm1.FormCreate(Sender: TObject);
  132. begin
  133. // GoToFullscreen(1600, 1200, 32, 75);
  134. InitOpenGL;
  135. QueryPerformanceFrequency(Freq);
  136. DC:= GetDC(Handle);
  137.   if not InitOpenGL then Application.Terminate;
  138.   RC:= CreateRenderingContext( DC,
  139.                                [opDoubleBuffered],
  140.                                32,
  141.                                24,
  142.                                0,0,0,
  143.                                0);
  144.   ActivateRenderingContext(DC, RC);
  145.   SetupGL;
  146.   init;
  147.   BuildFont('MS Sans Serif');
  148.   Application.OnIdle := IdleHandler;
  149. end;
  150.  
  151. procedure TForm1.SetupGL;
  152. begin
  153.   glClearColor(0, 0, 0, 0);         //Hintergrundfarbe
  154.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  155.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  156. end;
  157.  
  158. procedure TForm1.init;
  159. begin
  160. S1.Y:=0;             //Startposition Spieler1
  161. S2.Y:=0;             //Startposition Spieler2
  162. Ball.X:=0;           //Startposition Ball X-Koordinate
  163. Ball.Y:=0;           //Startposition Ball Y-Koordinate
  164. speed:=0.1;            //Bewegung des Balls in X-Richtung/Y-Richtung
  165. Ball.VektorX:=1;     // 1 = nach rechts / -1 nach links
  166. Ball.VektorY:=1;     // 1 = nach oben   / -1 nach unten
  167. end;
  168.  
  169. procedure TForm1.FormResize(Sender: TObject);
  170. var tmpBool : Boolean;
  171. begin
  172.   glViewport(0, 0, ClientWidth, ClientHeight);
  173.   glMatrixMode(GL_PROJECTION);
  174.   glLoadIdentity;
  175.   gluPerspective(60, ClientWidth/ClientHeight, NearClipping, FarClipping);
  176.  
  177.   glMatrixMode(GL_MODELVIEW);
  178.   IdleHandler(Sender, tmpBool);
  179. end;
  180.  
  181. procedure TForm1.FormDestroy(Sender: TObject);
  182. begin
  183.   DeactivateRenderingContext;
  184.   DestroyRenderingContext(RC);
  185.   ReleaseDC(Handle, DC);
  186. end;
  187.  
  188. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  189. begin
  190. // In die Projektionsmatrix wechseln
  191. glMatrixMode(GL_PROJECTION);
  192. // Identitätsmatrix laden
  193. glLoadIdentity;
  194. // Viewport an Clientareal des Fensters anpassen
  195. glViewPort(0, 0, ClientWidth, ClientHeight);
  196. // Perspective, FOV und Tiefenreichweite setzen
  197. gluPerspective(45, ClientWidth/ClientHeight, 1, 128);
  198.  
  199. // In die Modelansichtsmatrix wechseln
  200. glMatrixMode(GL_MODELVIEW);
  201. // Identitätsmatrix laden
  202. glLoadIdentity;
  203. // Farb- und Tiefenpuffer löschen
  204. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  205.  
  206. QueryPerformanceCounter(StartCount);
  207. Render;
  208. QueryPerformanceCounter(FrameEndCount);
  209. SpeedFactor := ((FrameEndCount-StartCount) / Freq)*100;
  210.  
  211. ShowText;
  212.  
  213. // Hinteren Puffer nach vorne bringen
  214. SwapBuffers(DC);
  215.  
  216. // Windows denken lassen, das wir noch nicht fertig wären
  217. Done := False;
  218.  
  219. // Nummer des gezeichneten Frames erhöhen
  220. inc(Frames);
  221. // FPS aktualisieren
  222. if GetTickCount - StartTick >= 500 then
  223.  begin
  224.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  225.  Frames    := 0;
  226.  StartTick := GetTickCount
  227.  end;
  228. end;
  229.  
  230. procedure TForm1.ErrorHandler;
  231. begin
  232.   Form1.Caption := gluErrorString(glGetError);
  233. end;
  234.  
  235. procedure TForm1.Render;
  236. begin
  237.   {//Matrizen vorbereiten
  238.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  239.   glMatrixMode(GL_PROJECTION);
  240.   glLoadIdentity;
  241.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  242.   glMatrixMode(GL_MODELVIEW);}
  243.  
  244.   //Spielfeld zeichnen
  245.   Perspektive; glTranslatef( 35, -25, 0); Wvertikal;   //Rechts
  246.   Perspektive; glTranslatef(-35, -25, 0); Wvertikal;   //Links
  247.   Perspektive; glTranslatef(-35,  25, 0); Woben;       //Oben
  248.   Perspektive; glTranslatef(-35, -25, 0); Whorizontal; //Unten
  249.   Perspektive; glTranslatef(0  , -25, 0); Mittellinie;
  250.  
  251.   //Schläger zeichen + Schläger Bewegungen
  252.   Perspektive; Spieler1;  Perspektive; Spieler2;
  253.  
  254.   //Ballposition Bestimmen + Ball zeichnen
  255.   Perspektive; Pong;
  256.  
  257.   SwapBuffers(DC);
  258. end;
  259.  
  260. procedure TForm1.Perspektive;
  261. begin
  262. glLoadIdentity;
  263. glTranslatef(0, 0, -65);
  264. end;
  265.  
  266.  
  267.  
  268. // Spielball
  269.  
  270. procedure TForm1.Pong;
  271. begin
  272. KollisionSchlaeger;
  273. KollisionWand;
  274. Bewegung;
  275. glTranslatef(Ball.X,Ball.Y,0);
  276.   glBegin(GL_QUADS);
  277.     glColor3f(1, 0, 0); glVertex3f(0  , 0,   0); //Unten Links
  278.     glColor3f(1, 0, 0); glVertex3f(1.5, 0,   0); //Unten Rechts
  279.     glColor3f(1, 0, 0); glVertex3f(1.5, 1.5, 0); //Oben Rechts
  280.     glColor3f(1, 0, 0); glVertex3f(0  , 1.5, 0); //Oben Links
  281.   glEnd;
  282. end;
  283.  
  284. procedure TForm1.Bewegung;
  285. begin
  286. Ball.X:=(Ball.X+speed*SpeedFactor)*Ball.VektorX;
  287. Ball.Y:=(Ball.Y+speed*SpeedFactor)*Ball.VektorY;
  288. end;
  289.  
  290. procedure TForm1.KollisionWand;
  291. begin
  292. if Ball.X>=33.5  then Ball.VektorX:=-1;
  293. if Ball.X<=-34.5 then Ball.VektorX:=1;
  294. if Ball.Y>=23.5  then Ball.VektorY:=-1;
  295. if Ball.Y<=-24.5  then Ball.VektorY:=1;
  296. end;
  297.  
  298. procedure TForm1.KollisionSchlaeger;
  299. begin
  300. if (Ball.X<=-31.5) AND (Ball.Y>=S1.Y) AND (Ball.Y<=S1.Y+10) then
  301.   begin
  302.     Ball.VektorX:=1;
  303.   end;
  304.  
  305. if (Ball.X>=30.5) AND (Ball.Y>=S2.Y) AND (Ball.Y<=S2.Y+10) then
  306.   begin
  307.     Ball.VektorX:=-1;
  308.   end;
  309. end;
  310.  
  311. procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
  312. begin
  313. case Key of
  314.  #27 : Close;
  315. end;
  316. end;
  317.  
  318. end.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 10, 2006 15:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Hmm dass das Ganze immer noch FPS-abhängig abläuft kann ich nicht nachvollziehen.

Grundsätzlich solltest du aber alle OpenGL-Operationen in Idle mit in die Zeitberechnung miteinbeziehen.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.017s | 17 Queries | GZIP : On ]