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

Aktuelle Zeit: Mo Jul 07, 2025 08:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Spiel programmieren - Fragen
BeitragVerfasst: Fr Dez 17, 2010 18:41 
Offline
DGL Member

Registriert: Mo Aug 23, 2010 19:45
Beiträge: 16
Programmiersprache: Delphi und noch mehr
Hallo alle miteinander,

ich hab beschlossen ein kleines Spiel mit OpenGl in Delphi zu programmieren. Da es in 2D sein soll, dachte ich dass es nicht so schwer ist. Ich hab aber trotzdem ein paar Fragen. ;)
Programmieren will ich einen Klon von diesem App für Ipod/Iphone: http://www.gameswelt.ch/videos/videos/1 ... ailer.html
Also mein Stand ist jetzt soweit, dass ich ein Quadrat auf Quadrat hab und das mit den Pfeiltasten verschieben kann. Das andere Quadrat dient nur wegen der Mapverschiebung, die über WASD stattfindet und mit Q/E kann man zoomen.

Jetzt will ich mich um die "Physik" kümmern. Also mit Pfeiltaste nach oben Gas geben, mit Pfeiltaste nach unten bremsen und jeweils lenken. Ich denke das driften ist eine Sache für später. Ich dachte, dass ich eine Variable nehme, die ich fürs Gas immer erhöhe oder verminder, und das dann auf das Quadrat (ok, eigentlich Rechteck) hinzurechnen. Mein Problem ist jetzt, dass wie mache ich das mit dem lenken, dass man auch diagonal fahren kann. Vielleicht kann mir jmd. ein Tipp geben. Ich werd trotzdem mal den Code anhängen. ;)

Ach und eine Frage hab ich auch noch. Ich gebe die Framezahl und ob ein Fehler vorliegt jeweils auf einem Label aus. Das Problem ist nur, dass das mehrere Sekunden bis Minuten dauert bis da was angezeigt wird. Vielleicht weiß ja jemand was dazu. :D

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, dglOpenGL, StdCtrls;

Type
  TVector2f = Array [0..1] of Single;
  TVector3f = Array [0..2] of Single;

type
  TForm1 = class(TForm)
    panOpenGL: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure IdleHandler(Sender: TObject; var Done: Boolean);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
    Frames, DrawTime                  : Cardinal; //& Timebased Movement
    procedure SetupGL;
    procedure Render;
    procedure ErrorHandler;
    procedure Init;
  public
    { Public-Deklarationen }
    DC                                : HDC;  //Handle auf Zeichenfläche
    RC                                : HGLRC;//Rendering Context
  end;

var
  Form1: TForm1;
  x1,y1,x2,y2,z1:real;

const
  NearClipping = 0.1;
  FarClipping  = 100;

implementation

{$R *.dfm}

// FormCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
  DC:= GetDC(panOpenGL.Handle);
  if not InitOpenGL then Application.Terminate;
  RC:= CreateRenderingContext( DC,
                               [opDoubleBuffered],
                               32,
                               24,
                               0,0,0,
                               0);
  ActivateRenderingContext(DC, RC);
  SetupGL;
  Init;
  Application.OnIdle := IdleHandler;
end;

// FormDestroy
procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeactivateRenderingContext;
  DestroyRenderingContext(RC);
  ReleaseDC(Handle, DC);
end;

//KeyDown
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    39: x1 := x1 + 0.1;       //Pfeiltaste rechts       -   Objekt nach rechts
    37: x1 := x1 - 0.1;       //Pfeiltaste links        -   Objekt nach links
    40: y1 := y1 - 0.1;       //Pfeiltaste nach unten   -   Objekt nach unten
    38: y1 := y1 + 0.1;       //Pfeiltaste nach oben    -   Objekt nach oben
    87: y2 := y2 + 0.1;       //w                       -   Szenario nach oben
    65: x2 := x2 - 0.1;       //a                       -   Szenario nach links
    83: y2 := y2 - 0.1;       //s                       -   Szenario nach unten
    68: x2 := x2 + 0.1;       //d                       -   Szenario nach rechts
    69: z1 := z1 + 0.01;       //e                       -   Reinzoomen
    81: z1 := z1 - 0.01;       //q                       -   Rauszoomen
  end;
end;

// Setup - OpenGL
procedure TForm1.SetupGL;
begin
  glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe:
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren

  glEnable(GL_BLEND) ;
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
end;

// Init - OpenGL
procedure TForm1.Init;
begin
// Initsachen wie Texturzuordnung hier rein
end;

// Render - OpenGL
procedure TForm1.Render;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(90.0, panOpenGL.ClientWidth/panOpenGL.ClientHeight, NearClipping, FarClipping);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0+x2, 0+y2, -3+z1);

  glBegin(GL_QUADS);
    glTexCoord2f(0,0); glVertex3f(0+x1, 0+y1, 0);
    glTexCoord2f(0,1); glVertex3f(1+x1, 0+y1, 0);
    glTexCoord2f(1,1); glVertex3f(1+x1, 2+y1, 0);
    glTexCoord2f(1,0); glVertex3f(0+x1, 2+y1, 0);
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
    glColor3f(0, 1, 0); glVertex3f(0.5, 0, 0);
    glColor3f(0, 0, 1); glVertex3f(0.5, 0.5, 0);
    glColor3f(1, 1, 0); glVertex3f(0, 0.5, 0);
  glEnd;

  SwapBuffers(DC);
end;

// ErrorHandle - OpenGL
procedure TForm1.ErrorHandler;
begin
  Label2.Caption := string(gluErrorString(glGetError));
end;

// IdleHandle - OpenGL
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;
    Label1.Caption:= InttoStr(Frames) + ' FPS';
    ErrorHandler;
  end;

  Done:= false;
end;

end.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Fr Dez 17, 2010 21:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also bei Physik und allgemein bei 2D oder 3D Mathematik ist es immer gut mit Vektoren zu arbeiten. Die erleichtern einem das Leben ;) Du hast dir ja auch schon TVector2f definiert...also benutzen wir das. Ich persönlich habe lieber eine Schreibweise mit .x oder .y statt dem Arrayindex, aber das ist Geschmackssache. Die Schreibweise ist immer Komponentenweise, also z.B.:

vektor1 + vektor2;
heißt
vektor1.x + vektor2.x;
vektor1.y + vektor2.y;

oder

vektor * zahl
heißt
vektor.x * zahl;
vektor.y * zahl;

Also ich würde das Auto wie folgt repräsentieren
- ein 2D-Vector für die Position (position), Maßeinheit ist "Meter"
- ein 2D-Vector für die Geschwindigkeit (velocity), Maßeinheit ist "Meter pro Sekunde"
- ein Single für den Winkel (angle) wie das Auto ausgerichtet ist, Maßeinheit ist natürlich das Bogenmaß
- ein Single für den Beschleunigungswert (acceleration), Maßeinheit ist "Meter pro (Sekunde zum Quadrat)"

Eine simple "Physik" in jedem Frame wäre dann wie folgt. Dabei ist "timeElapsed" die Zeit in Sekunden die seit dem letzten Frame vergangen ist.

Code:
// Pfeiltasten oben/unten
acceleration = 0;
if (Pfeiltaste oben gedrückt) then acceleration = acceleration + 1;
if (Pfeiltaste unten gedrückt) then acceleration = acceleration - 1;

// Pfeiltaste links gedrückt
angle = angle + drehenProSekunde * timeElapsed;
if angle > 2*PI then angle = angle - 2*PI;

// Pfeiltaste rechts gedrückt
angle = angle - drehenProSekunde * timeElapsed
if angle < 0 then angle = angle + 2*PI;

// Beschleunigung ausführen
velocity.x = velocity.x + acceleration * timeElapsed * sin(angle)
velocity.y = velocity.y + acceleration * timeElapsed * cos(angle)

// Bewegung ausführen
position = position + velocity * timeElapsed   


Damit hättest du bereits ein Driften eingebaut. Wahrscheinlich ist dir das zu stark, müsste man das was dämpfen in dem man der velocity einen Grenzwert für Bewegungen quer zur Fahrtrichtung gibt. Wenn der Grenzwert (Reifenhaftung) unterschritten wird, wird die Querbewegung auf 0 gesetzt. => Machen wie dann wenn das obige schon mal funzt.


Zitat:
Ach und eine Frage hab ich auch noch. Ich gebe die Framezahl und ob ein Fehler vorliegt jeweils auf einem Label aus. Das Problem ist nur, dass das mehrere Sekunden bis Minuten dauert bis da was angezeigt wird. Vielleicht weiß ja jemand was dazu. :D

Du benutzt GetTickCount, was wenn ich das richtig im Kopf habe mit Millisekunden arbeitet. Viel zu ungenau für deine Zwecke. Deine Grafikkarte langweilt sich wenn du nur ein Quad zeichnest. DrawTime dürfte recht häufig 0 sein, entsprechend lange dauert es bis TimeCount 1000 erreicht.

Du solltest zudem besser die Zeit messen die du vom Aufruf von IdleHandler bis zum nächsten Aufruf brauchst, nicht die Zeit zum Aufruf von Render.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Fr Dez 17, 2010 22:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Für einen Einstieg in das Thema Vektoren würde ich dir die Tutorials Lineare Algebra und Nachsitzen empfehlen!

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Sa Dez 18, 2010 20:16 
Offline
DGL Member

Registriert: Mo Aug 23, 2010 19:45
Beiträge: 16
Programmiersprache: Delphi und noch mehr
Gut danke. Werd mich mal mit den Tutorials beschäftigen.
Hoffe das ich das kapiere bin in der 10. Klasse Gymnasium und wird sind erst bei Differenzialgleichung bzw. Ableitungsfunktionen. Ich weiß wird sind weit hinterher mit dem Stoff, aber das liegt nicht an mir, sondern an meinen weiblichen Mitschülerinnen. :D
Aber eigentlich kapier ich Mathe immer recht schnell und ich bin auch Physik/Mathe/Chemie/NWT sowie Elektrotechnik interessiert. :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Sa Dez 18, 2010 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Hoffe das ich das kapiere bin in der 10. Klasse Gymnasium

Alles kein Problem, einfach nur solange Fragen stellen bis du es verstanden hast. Auch dumme Fragen sind erlaubt :)

Zusatz: Um meinen obigen Code ohne Kentnisse der Vektorschreibweise zu verstehen musst du eigentlich nur die letzte Zeile duplizieren, einmal für ".x" und einmal für ".y". Das mit den Vektoren war nur "vorbeugend", weil du es brauchen wirst wenn du das Driften schöner haben willst. ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: So Dez 19, 2010 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Müllermilchtrinker hat geschrieben:
Ich weiß wird sind weit hinterher mit dem Stoff, aber das liegt nicht an mir, sondern an meinen weiblichen Mitschülerinnen.
tz, tz, tz, tz .....

Viele Grüße
Traude :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Mo Dez 20, 2010 00:59 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@Traude: Weil er sich von ihnen Ablenken lässt - deshalb... ;) 8)

@MMT: Gib den Mädels doch mal Nachhilfe. Hat sich bei mir nie angeboten, war da leider nicht sehr begabt. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Mo Dez 20, 2010 20:55 
Offline
DGL Member

Registriert: Mo Aug 23, 2010 19:45
Beiträge: 16
Programmiersprache: Delphi und noch mehr
Flash hat geschrieben:
@Traude: Weil er sich von ihnen Ablenken lässt - deshalb... ;) 8)

Die hocken einer Reihe vor mir und das sind nicht die Mädchen von denen ich gerne abgelenkt werde. ;)

Flash hat geschrieben:
@MMT: Gib den Mädels doch mal Nachhilfe. Hat sich bei mir nie angeboten, war da leider nicht sehr begabt. ;)

Ich kann leider nicht so gut erklären bzw. noch komplizierter als im Matheheft und dann kapiert es keiner mehr. Wieso einfach wenns auch kompliziert geht. :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Di Dez 21, 2010 10:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Müllermilchtrinker hat geschrieben:
Die hocken einer Reihe vor mir und das sind nicht die Mädchen von denen ich gerne abgelenkt werde. ;)
Selber schuld. Was hockst du dich auch hinter Mädchen, von denen du nicht gerne abgelenkt wirst? 8) Hock dich doch hinter die, von denen du schon gerne abgelenkt wirst (*). Oder sitzen die schon neben dir?

(*)Hab ich damals in meiner Schulzeit gemacht. Gebracht hats erstaunlicherweise ;) nix.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Di Dez 21, 2010 16:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Die Dynamik dieses Forums überrascht mich jedes Mal aufs neue…

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Di Dez 21, 2010 20:09 
Offline
DGL Member

Registriert: Di Sep 07, 2010 14:28
Beiträge: 34
Wohnort: Frankfurt
Programmiersprache: C++,C#,VB(,Delphi)
Weit zurück?

Bin auch in der 10 un wir haben jetz er mit Potenzen angefangen.
Das is weit zurück.

Ps. Bei uns gibt überhaupt nur fünf leute, die das verstehen, bei dennen ich übrigens dabei bin, aber der Rest schläft meistens nach 15 min.

_________________
Das mit dem Dx tut mir leid.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Di Dez 21, 2010 22:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Tja, das sind Integrationsprobleme.

Man sollte z.b. den Rohrstock wieder in das Unterrichtssystem integrieren. :twisted:

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Fr Dez 24, 2010 14:50 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ziz hat geschrieben:
Man sollte z.b. den Rohrstock wieder in das Unterrichtssystem integrieren. :twisted:


Solche Sprüche bringst du erstaunlicherweise erst jetzt, nachdem du mit dem Abi fertig bist.... :twisted:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Mo Jan 10, 2011 18:47 
Offline
DGL Member

Registriert: Mo Aug 23, 2010 19:45
Beiträge: 16
Programmiersprache: Delphi und noch mehr
OK ich muss jetzt nochmal fragen.

Um das oben geschriebene Umzusetzen mache ich mich an die Tutorials. Nun gibt es ja dieses Vektoren-Tut.
Im Grunde muss ich doch das lesen, verstehen und die Funktionen in eine Unit packen. Richtig?

Sorry, dass ich mich so spät melde. Hatte nie Zeit dran zu arbeiten ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Spiel programmieren - Fragen
BeitragVerfasst: Mo Jan 10, 2011 19:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Im Grunde muss ich doch das lesen, verstehen und die Funktionen in eine Unit packen. Richtig?

Ich nehme an du meinst dieses Tut. Ja, im Grunde da alles wichtige drin was du für den Anfang brauchst. Matrizen sind im nächsten Tutorial ("Nachsitzen") erklärt.

_________________
Yeah! :mrgreen:


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 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 6 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.011s | 16 Queries | GZIP : On ]