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

Aktuelle Zeit: So Jul 06, 2025 10:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Sa Apr 09, 2011 13:40 
Offline
DGL Member

Registriert: Mo Aug 23, 2010 19:45
Beiträge: 16
Programmiersprache: Delphi und noch mehr
*ausgrab*
So hab das Programm ein wenig vergessen und da wir jetzt Vektoren im Unterricht angefangen haben, dachte ich mir, ich kann das doch mal fertig machen. Nur stehe ich mal wieder vor einem Problem. Mein Rechteck (also das Auto) will sich nicht bewegen.

Also hier meine Unit:
Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, ExtCtrls, dglOpenGL, StdCtrls, Vektor;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     panOpenGL: TPanel;
  13.     Label1: TLabel;
  14.     Label2: TLabel;
  15.     procedure FormCreate(Sender: TObject);
  16.     procedure FormDestroy(Sender: TObject);
  17.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  18.     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  19.   private
  20.     { Private-Deklarationen }
  21.     StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
  22.     Frames, DrawTime                  : Cardinal; //& Timebased Movement
  23.     procedure SetupGL;
  24.     procedure Render;
  25.     procedure ErrorHandler;
  26.     procedure Init;
  27.   public
  28.     { Public-Deklarationen }
  29.     DC                                : HDC;  //Handle auf Zeichenfläche
  30.     RC                                : HGLRC;//Rendering Context
  31.   end;
  32.  
  33. var
  34.   Form1: TForm1;
  35.   x1,y1,x2,y2,z1:real;
  36. //  TexCar : glUInt;
  37. //  TexSzenario: glUInt;
  38.   timeElapsed,angle, acceleration: Single;
  39.   positioncar,velocity,temp: TVector;
  40.  
  41. const
  42.   NearClipping = 0.1;
  43.   FarClipping  = 100;
  44.  
  45. implementation
  46.  
  47. {$R *.dfm}
  48.  
  49. // FormCreate
  50. procedure TForm1.FormCreate(Sender: TObject);
  51. begin
  52.   DC:= GetDC(panOpenGL.Handle);
  53.   if not InitOpenGL then Application.Terminate;
  54.   RC:= CreateRenderingContext( DC,
  55.                                [opDoubleBuffered],
  56.                                32,
  57.                                24,
  58.                                0,0,0,
  59.                                0);
  60.   ActivateRenderingContext(DC, RC);
  61.   SetupGL;
  62.   Init;
  63.   Application.OnIdle := IdleHandler;
  64. end;
  65.  
  66. // FormDestroy
  67. procedure TForm1.FormDestroy(Sender: TObject);
  68. begin
  69.   DeactivateRenderingContext;
  70.   DestroyRenderingContext(RC);
  71.   ReleaseDC(Handle, DC);
  72. end;
  73.  
  74. //KeyDown
  75. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  76.   Shift: TShiftState);
  77. begin
  78.   case key of
  79.     39: begin angle := angle - 1 * timeElapsed;
  80.               if angle < 0 then angle := angle + 2*PI; end;       //Pfeiltaste rechts
  81.     37: begin angle := angle + 1 * timeElapsed;
  82.               if angle > 2*PI then angle := angle - 2*PI; end;       //Pfeiltaste links
  83.     40: acceleration := acceleration - 1;       //Pfeiltaste nach unten
  84.     38: acceleration := acceleration + 1;       //Pfeiltaste nach oben
  85.     87: y2 := y2 + 0.1;       //w                       -   Szenario nach oben
  86.     65: x2 := x2 - 0.1;       //a                       -   Szenario nach links
  87.     83: y2 := y2 - 0.1;       //s                       -   Szenario nach unten
  88.     68: x2 := x2 + 0.1;       //d                       -   Szenario nach rechts
  89.     69: z1 := z1 + 0.01;       //e                       -   Reinzoomen
  90.     81: z1 := z1 - 0.01;       //q                       -   Rauszoomen
  91.   end;
  92. end;
  93.  
  94. // Setup - OpenGL
  95. procedure TForm1.SetupGL;
  96. begin
  97.   glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe:
  98.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  99.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  100.  
  101.   glEnable(GL_BLEND) ;
  102.   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  103. end;
  104.  
  105. // Init - OpenGL
  106. procedure TForm1.Init;
  107. begin
  108. //  LoadTexture(ExtractFilePath(ParamStr(0))+'auto.tga', TexCar, False);
  109. //  LoadTexture(ExtractFilePath(ParamStr(0))+'\Texturen\straße.tga', TexSzenario, False);
  110.   positioncar.MakeVector(0,0,0);
  111.   velocity.MakeVector(0,0,0);
  112.   temp.MakeVector(0,0,0)
  113. end;
  114.  
  115. // Render - OpenGL
  116. procedure TForm1.Render;
  117. begin
  118.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  119.  
  120.   glMatrixMode(GL_PROJECTION);
  121.   glLoadIdentity;
  122.   gluPerspective(90.0, panOpenGL.ClientWidth/panOpenGL.ClientHeight, NearClipping, FarClipping);
  123.   glMatrixMode(GL_MODELVIEW);
  124.   glLoadIdentity;
  125.  
  126.   glTranslatef(0+x2, 0+y2, -3+z1);
  127.  
  128.   glBegin(GL_QUADS);
  129.     // Beschleunigung ausführen
  130.     velocity.x := velocity.x + acceleration * timeElapsed * sin(angle);
  131.     velocity.y := velocity.y + acceleration * timeElapsed * cos(angle);
  132.  
  133.     // Bewegung ausführen
  134.     temp.ScaleVector(velocity , timeElapsed);
  135.     positioncar.AddVectors(positioncar , temp);
  136.  
  137.     glTexCoord2f(0,0); glVertex3f(0+positioncar.x, 0+positioncar.y, 0);
  138.     glTexCoord2f(0,1); glVertex3f(1+positioncar.x, 0+positioncar.y, 0);
  139.     glTexCoord2f(1,1); glVertex3f(1+positioncar.x, 2+positioncar.y, 0);
  140.     glTexCoord2f(1,0); glVertex3f(0+positioncar.x, 2+positioncar.y, 0);
  141.  
  142.  
  143.     //Ursprung setzen
  144.     glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
  145.     glColor3f(0, 1, 0); glVertex3f(0.5, 0, 0);
  146.     glColor3f(0, 0, 1); glVertex3f(0.5, 0.5, 0);
  147.     glColor3f(1, 1, 0); glVertex3f(0, 0.5, 0);
  148.   glEnd;
  149.  
  150.   SwapBuffers(DC);
  151. end;
  152.  
  153. // ErrorHandle - OpenGL
  154. procedure TForm1.ErrorHandler;
  155. begin
  156.   Label2.Caption := string(gluErrorString(glGetError));
  157. end;
  158.  
  159. // IdleHandle - OpenGL
  160. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  161. begin
  162.   StartTime:= GetTickCount;
  163.   Render;
  164.   DrawTime:= GetTickCount - StartTime;
  165.   timeElapsed := drawtime;
  166.   Inc(TimeCount, DrawTime);
  167.   Inc(FrameCount);
  168.  
  169.   if TimeCount >= 1000 then begin
  170.     Frames:= FrameCount;
  171.     TimeCount:= TimeCount - 1000;
  172.     FrameCount:= 0;
  173.     Label1.Caption:= InttoStr(Frames) + ' FPS';
  174.     ErrorHandler;
  175.   end;
  176.   Done:= false;
  177. end;
  178.  
  179. end.
  180.  


Und hier meine Unit Vektoren:
Code:
  1.  
  2. unit Vektor;
  3.  
  4. interface
  5.  
  6. uses
  7.   dglOpenGL;
  8.  
  9.  type
  10.    TVector = record
  11.     X : Single; //Dasselbe wie TGLFloat
  12.     Y : Single;
  13.     Z : Single;
  14.     function MakeVector(X, Y,Z : Single) : TVector;
  15.     function AddVectors(VectorA, VectorB : TVector) : TVector;
  16.     function SubVectors(VectorA, VectorB : TVector) : TVector;
  17.     function Magnitude(Vector : TVector) : Single;
  18.     procedure Normalize(var Normal : TVector);
  19.     function ScaleVector(Vector : TVector; Multi : Single) : TVector;
  20.     function DotProduct(VectorA,VectorB : TVector) : Single;
  21.     function CrossProduct(VectorA,VectorB : TVector) : TVector;
  22. //    TTriangle = array[0..2] of TVector;
  23. //    function GetNormal(Triangle : TTriangle) : TVector;
  24.   end;
  25.  
  26. implementation
  27.  
  28. function TVector.MakeVector(X,Y,Z : Single) : TVector;
  29. begin
  30.   result.x := x;
  31.   result.y := y;
  32.   result.z := z;
  33. end;
  34.  
  35. function TVector.AddVectors(VectorA, VectorB : TVector) : TVector;
  36. begin
  37.   {Einfache Vektoraddition}
  38.   Result := MakeVector(VectorA.X + VectorB.X,
  39.                        VectorA.Y + VectorB.Y,
  40.                        VectorA.Z + VectorB.Z);
  41. end;
  42.  
  43. function TVector.SubVectors(VectorA, VectorB : TVector) : TVector;
  44. begin
  45.   {Einfache Vektorsubtraktion}
  46.   Result := MakeVector(VectorA.X - VectorB.X,
  47.                        VectorA.Y - VectorB.Y,
  48.                        VectorA.Z - VectorB.Z);
  49. end;
  50.  
  51. function TVector.Magnitude(Vector : TVector) : Single;
  52. begin
  53.   {Gibt die Länge (Betrag) eines Vektors zurück}
  54.    result := sqrt(Vector.X * Vector.X+
  55.                   Vector.Y * Vector.Y+
  56.                   Vector.Z * Vector.Z);
  57. end;
  58.  
  59. procedure TVector.Normalize(var Normal : TVector);
  60. var
  61.   Length : Single;
  62. begin
  63.   {Der angegebene Vektor wird auf eine Länge (Betrag) von 1 gekürzt,
  64.    um dies zu erreichen muss jede Vektorkomponente durch die Länge
  65.    (Betrag) des Vektors selbst dividiert werden }
  66.   Length := Magnitude(Normal);
  67.   if (Length = 0) then Length := 1;//Wir wollen keine Division durch 0
  68.   Normal.X := Normal.X / Length;
  69.   Normal.Y := Normal.Y / Length;
  70.   Normal.Z := Normal.Z / Length;
  71. end;
  72.  
  73. function TVector.ScaleVector(Vector : TVector; Multi : Single) : TVector;
  74. begin
  75.   { Der Vektor wird skaliert mit dem angegeben Faktor Multi }
  76.   { Dies ändert nicht die Richtung des Vektors! }
  77.   result.x := Vector.x * Multi;
  78.   result.y := Vector.y * Multi;
  79.   result.z := Vector.z * Multi;
  80. end;
  81.  
  82. function TVector.DotProduct(VectorA,VectorB : TVector) : Single;
  83. begin
  84.   {Das Ergebnis des Punktprodukts ist der Kosinus des Winkels
  85.    zwischen den beiden Vektoren, wenn Vektor A und Vektor B normalisiert
  86.    wurden, ansonsten muss man das Punktprodukt noch durch die Längen
  87.    der Vektoren teilen.
  88.  
  89.    Ist der Kosinus positiv, dann ist der Winkel kleiner 90°, ist der
  90.    Kosinus negativ dann ist der Winkel größer 90°. Benutze den ArcusKosinus
  91.    um den Winkel aus den Werten zwischen -1 und 1 wieder in Grad-Bogenmaß
  92.   (Rad) zu erhalten. }
  93.  
  94.    result := VectorA.X*VectorB.X+
  95.              VectorA.Y*VectorB.Y+
  96.              VectorA.Z*VectorB.Z;
  97. end;
  98.  
  99. function TVector.CrossProduct(VectorA,VectorB : TVector) : TVector;
  100. begin
  101.   {Erzeugt einen Vektor der senkrecht zur Fläche ist,
  102.    die durch die zwei gegeben Vektoren erzeugt wurde }
  103.  
  104.    Result.X := VectorA.Y*VectorB.Z - VectorA.Z*VectorB.Y;
  105.    Result.Y := VectorA.Z*VectorB.X - VectorA.X*VectorB.Z;
  106.    Result.Z := VectorA.X*VectorB.Y - VectorA.Y*VectorB.X;
  107. end;
  108.  
  109. //function TTriangle.GetNormal(Triangle : TTriangle) : TVector;
  110. //var
  111. //  VectorA, VectorB, Normal : TVector;
  112. //begin
  113. //  {To get the normal we first need to define a plane.
  114. //   To do this we use the three vertices to create two
  115. //   vectors, thereby defining a plane. If we give these
  116. //   two vectors to the CrossProduct function we get a
  117. //   vector that is perpendicular to the plane in return.
  118. //   All we then need to do is cut this vector to a length
  119. //   of 1 and we have our normal.}
  120. //
  121. // { Um die Normale zu erhalten müssen wir als erstes
  122. //   eine Fläche festlegen. Um dies zu erreichen benutzen
  123. //   wir die drei Eckpunkte um zwei Vektoren zu erhalten.
  124. //   Wenn wir diese Vektoren der Punktprodukt Funktion
  125. //   übergeben, bekommen wir einen Vektor zurück der
  126. //   Senkrecht zur Fläche ist. Alles was wir dann noch
  127. //   machen müssen ist den Vektor auf eine Länge von 1
  128. //   zu kürzen und wir erhalten unseren Normalenvektor. }
  129. //
  130. //   VectorA := SubVectors(Triangle[0],Triangle[1]);
  131. //   VectorB := SubVectors(Triangle[1],Triangle[2]);
  132. //   Normal := CrossProduct(VectorA,VectorB);
  133. //   Normalize(Normal);
  134. //   result := Normal;
  135. //end;
  136.  
  137. end.
  138.  


Zuletzt geändert von Lord Horazont am Sa Apr 09, 2011 13:45, insgesamt 1-mal geändert.
Codetags zu delphi geändert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Sa Apr 09, 2011 15:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Wenn ich das richtig sehe, liegt es an Folgendem:

Code:
  1.     // Beschleunigung ausführen
  2.     velocity.x := velocity.x + acceleration * timeElapsed * sin(angle);
  3.     velocity.y := velocity.y + acceleration * timeElapsed * cos(angle);
  4.  
  5.     // Bewegung ausführen
  6.     temp.ScaleVector(velocity , timeElapsed);
  7.     positioncar.AddVectors(positioncar , temp);


Das ganze liegt daran, dass deine Vektor-Klasse ziemlich "komisch" ist. Wieso sind alle Vektoroperationen Methoden, obwohl sie nicht von "self"-Objekt abhängig sind? Du könntest "ScaleVector" und konsorten als normale Funktionen deklarieren.

Daher kommt auch dein Fehler: temp.ScaleVector(velocity , timeElapsed); verändert nicht temp, sondern hat im Rückgabewert den neuen Vektor. Danach addierst du temp zu positioncar, temp hat sich aber nicht verändert. EDIT: Du machst nichtmal das, auch der Wert der Addition ist im Rückgabewert, positioncar verändert sich auch nicht.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.009s | 15 Queries | GZIP : On ]