Autor Beitrag
iterion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21
Erhaltene Danke: 2

Win XP ,Suse 11.3
Delphi 7
BeitragVerfasst: Mi 29.09.10 04:18 
Hallo, ich bin neu auf der entwickler ecke, ich murxe an dem projekt fast ein jahr rum und komm nicht drauf, es handelt es sich um eine verbesserung von Pump/Guitar hero, ich habe soweit die engine fertig, mit editor.
Der editor speichert die pfeile in einem array als nummer, inklusive der laufzeit des songs in ms, beim abspielen habe ich das problem mit der synchronisation beim abspielen, da weiss ich nicht wie ich die pfeile an die richtige position zeichne.
Die pfeile sollen vom unteren rand nach oben laufen, so dass sie genau auf den beat fallen, wenn sie oben ankommen.

Im moment zeichnet es die laufenden pfeile, leider 20-35 Sekunden zu spaet, und der abstand zwischen den pfeilen wird jedesmal groesser.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Function PgetTdiff(time:cardinal):glfloat;
begin
pend:=GetTickCount;
ptotal:=pend-Pstart;
result:=ptotal-time;
result:=result /1000;
end;

procedure play;
begin
..
gltranslatef(-steptypepos,PgetTDiff(time),0);//Steptypepos=Pfeil ID; PgetTdiff=zeitabstand zwischen spielanfang und dem gezeichneten pfeil /1000
>Zeichne Pfeil
..
end;

[Format der pfeilpositionen im array]
[ms:Pfeil Id]
0;0
14735;4
15235;3
15641;5

Enschuldigt den langen post, Philipp.
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mi 29.09.10 11:19 
GetTickCOunt ist sehr ungenau! Nimm lieber die aktuelle Position im Lied als Zeit.

Und guck dir mal Stepmania an. Ist ein OpenSource Klon von Dance Dance Revolution, bei dem es auch um solche Synchronisationen geht.

Für diesen Beitrag haben gedankt: iterion
iterion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21
Erhaltene Danke: 2

Win XP ,Suse 11.3
Delphi 7
BeitragVerfasst: Fr 01.10.10 01:05 
Ich habe mir den quelltext von StepMania angesehen, habe aber noch nicht gefunden wie die timings der pfeile laufen, der quelltext ist ziemlich lang, 5MB+ in 530 dateien, werde also noch ne weile suchen XD.
In meinem fall kommen die pfeile schon zur richtigen zeit auf das bild wenn ich sie an eine feste stelle schicke, mein problem liegt eher darin wie ich die pfeile vor ihrer zeit an den unteren rand werfe, damit sie dann genau oben ankommen wenn sie dran sind.
Vielen Dank,
Iterion
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Fr 01.10.10 04:43 
Hey,

erstma zu der Sache mit der Zeitmessung: GetTickCount ist nich die besste Lösung, wie FlameFire schon gesagt hat. Ich würde dir auch für zukünftige Projekte QueryPerformanceCounter empfehlen. Ich hab da auch irgendwo noch ne Klasse, die das alles verwaltet und als Timer für OpenGL-Anwendungen genutzt werden kann. Die kann ich noch suchen, wenn du die haben möchtest.
Zum eigentlichen Problem: Du musst sowas wie ein Offset einbauen. Starte die Wiedergabe (bzw. Visualisierung) des Arrays 3sec vor Liedbeginn. Die Zeit kann man ja wie bei Guitarhero mit dem Aufeinanderschlagen der Drum-Sticks verschönern, dann weiß auch der User wann's los geht. Und wenn die Pfeile dann nach 3 Sec vom Bildschirmrand nach oben gelaufen sind, müssten sie zum Lied passen. Kann sein das du da noch paar Sachen anpassen musst, je nachdem wie schnell deine Pfeile wandern, aber das kann man ja alles ausrechnen.

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: iterion
iterion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21
Erhaltene Danke: 2

Win XP ,Suse 11.3
Delphi 7
BeitragVerfasst: Fr 01.10.10 06:57 
Danke Bergmann, ich habe mir gerade QueryPerformanceCounter angesehen, im vergleich zeigt GetTickCount immer noch 0 wenn's 15ms waren Lol , kein wunder das mein Time based movement nicht geht, und die fps nicht genau sind !

Da die pfeile nicht an ein bestimtes raster angepasst sind wie bei den anderen spielen, brauche ich eigentlich nur die zeit zwischen zwei frames zu messen und diese in jedem durchlauf von der zeit im array abziehen, da die zeit bei jedem Pfeil den skalierten koordinaten entsprechen sollten, und dadurch die bewegung nach oben kommt.
So haette ich automatisch ein offset, ich weiss nur nicht ob ich hier richtig denke.
Zitat:

aber das kann man ja alles ausrechnen.

:shock: Ich habe dieses projekt angefangen um an Mathe und Physik etwas sinn zu finden, ohne dass es zu trocken ist :lol:
Vielen Dank,
Philipp.
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 01.10.10 10:56 
Was am besten laufen dürfte: Anhand der BPM des Liedes/Anzahl der Pfeile pro Sekunde eine Pfeilgeschwindigkeit definieren. Dann dürftest du zu jedem Pfeil einen Zeitpunkt haben, zu dem der gespielt werden soll. Und anhand der 2 Werte kannst du die exakte Position des Pfeiles anhand der aktuellen Position im Lied bestimmen. Sonst bekommst du später Probleme wenn mal die FPS ungenau sind order das Lied springt oder verzögert wird.
iterion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21
Erhaltene Danke: 2

Win XP ,Suse 11.3
Delphi 7
BeitragVerfasst: Sa 02.10.10 01:14 
Jetzt habe ich erst einmal alle GettickCount Gefeuert und mit QueryPerformanceCount ersetzt, jetzt Fliegen die pfeile zur richtigen zeit am ziel vorbei.


user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
Was am besten laufen dürfte: Anhand der BPM des Liedes/Anzahl der Pfeile pro Sekunde eine Pfeilgeschwindigkeit definieren. Dann dürftest du zu jedem Pfeil einen Zeitpunkt haben, zu dem der gespielt werden soll. Und anhand der 2 Werte kannst du die exakte Position des Pfeiles anhand der aktuellen Position im Lied bestimmen. Sonst bekommst du später Probleme wenn mal die FPS ungenau sind order das Lied springt oder verzögert wird.


Mein editor laeuft on-the-fly dh. das lied wird abgespielt, und der user drueckt die pfeile wenn er meint das da n beat hinkommt, der editor Setzt die aktuelle laufzeit vom lied in ms zusammen mit der id. vom step in ein array.
Meine eigentliche Idee war den abstand der pfeile aus dem zeitabstand auszurechnen, aber ich weiss nicht wie ich die zeit in genaue OpenGL Koordinaten und den scroll-faktor umrechne.
Oder ist die einzige moeglichkeit die bpm zu verwenden?

Ich habe noch nicht viel uebung in OpenGl , ich habe bis jetzt nur eine komische uhr und ein paar screensaver geschrieben, ansonsten habe ich mich meistens mit UI anwendungen beschaeftiegt.

Danke
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 02.10.10 01:26 
Hey,

erstma zum Verständniss: Wie soll den dein Spiel aussehen? 2D oder 3D? Aufbau und Position der "Gitarre"? Wenn du die Gitarre genau so schräg haben möchstest wie in GuitarHero, dann würde ich die XZ-Ebene benutzen, um die Pfeile darzustellen und dann nur die Camera etwas nach unten drehen. Dann würde es sich evtl anbieten den Pfeilen eine eigene Klasse zu schreiben. Die verwaltet dann das Timebased Movement, das spielen der Note, das ausblenden am Ende/Anfang und das Rendern an sich. Dann kannst du die Pfeile alle ganz leicht in einer ObjectList verwalten.
Wenn du noch nich so viel mit OpenGL gemacht hast, dann kann ich dir die Tutorials auf DelphiGL empfehlen. Da gibts es für die Grundlegenden Sachen Tutorials, die man als Anfänger durcharbeiten sollte.

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
iterion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21
Erhaltene Danke: 2

Win XP ,Suse 11.3
Delphi 7
BeitragVerfasst: Sa 02.10.10 02:11 
Das spiel ist 2D, es ist eher so wie StepMania , ich habe Guitar Hero nur angegeben weil es aehnlich ist, um das ganze auch verstaendlich zu machen fuer diejenigen die Pump oder StepMania nicht kennen ,es hat keine gitarre, nur die zielpfeile, zu denen die anderen wandern, das mit der kamera ist ein guter vorschlag, ich kenne die DGL website, mein template war eins von NeHe´s beispielen, angehaengt ein snapshot vom editor:
Einloggen, um Attachments anzusehen!
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 02.10.10 14:15 
Hey,

wenn du das mit der Kamera so machen willst must du aber 3D Rendern. Im Ortho-Modus wird das nix. Im 2D is das ganze natürlich einfacher. Mach dir ne Variable, die die aktuelle Position im Lied speichert, also die Zeit. Die Zeit addierst du dann dann zu der Zeit des Pfeils. Wenn der Pfeil im sichtbereich liegt musst du ihn nur noch zeichnen. Wnn du glOrtho richtig benutzt, dann kannst du das das genau so machen, wie mit den normalen Delphi-Komonentnen:
glOrtho(0, ClientWidth, ClientHeight, 0010);
so würde der X-Wert dem Left-Wert und der Y-Wert dem Top-Wert entsprechen. Da sollte dir die Arbeit etwas erleichter, weil das System müsstest du ja gewohnt sein ;)

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: iterion
iterion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21
Erhaltene Danke: 2

Win XP ,Suse 11.3
Delphi 7
BeitragVerfasst: So 03.10.10 09:14 
Vielen dank Bergmann, ich werde das ganze mal ausprobieren, an GlOrtho hatte ich nicht gedacht, aber wird sicher funktionieren,also versuche ich das mal und gebe euch bescheid.

Viele Grüsse,
Iterion
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: So 03.10.10 15:15 
Hey,

was hast du denn bis jetzt benutz?! Wenn es 2D ist, dann muss es eig glOrtho in irgend einer Form sein. Wenn du 3D (gluPerspective) nimmst und dann einfach bloß auf einer Ebene zeichnest wirkt es zwar 2D, aber es ist 3D ;)

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
iterion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21
Erhaltene Danke: 2

Win XP ,Suse 11.3
Delphi 7
BeitragVerfasst: Mo 04.10.10 03:01 
Bitte entschuldige meine undeutlichkeit, ich benutze opengl in 3D modus aber zeichne nur 2D,
um genauer zu sein so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
  
  GlLoadidentity...
  ...
  glTranslatef(0,0,-30);// 30 einheiten tiefe; Mit 1000 geht es auch zu schnell
 
  gltranslatef(-steptypepos,PgetTdiff(time),0);//Zeichne den pfeil an die Kordinaten
  glBindTexture( GL_TEXTURE_2D, texture[ step ] );
  glColor3f( 1.01.01.0 ); // Blending Farbe                      
  glBegin( GL_QUADS ); // 
  glTexCoord2d( 0.00.0 ); 
  glVertex2f( -1.01.0 ); 
  glTexCoord2d( 1.00.0 );
  glVertex2f( 1.01.0 ); 
  glTexCoord2d( 1.01.0 );
  glVertex2f( 1.0, -1.0 ); 
  glTexCoord2d( 0.01.0 );
  glVertex2f( -1.0, -1.0 );
  glEnd;
 gltranslatef(steptypepos,-PgetTdiff(time),0);// Stift Zuruecksetzen wo er vorher war.Sonst Wird die ausgabe verschoben

//   gluPerspective( 45.0, width / height, 0.1, 100.0 ); \\


Mein problem ist eigentlich eine rechenfrage, da opengl mit floating point Koordinaten arbeitet, wie rechne ich die milisekunden in Koordinaten um? ich habe versucht:

ausblenden Delphi-Quelltext
1:
gltranslatef(-steptypepos,PgetTdiff(time)/1000,0)					


Das geht auch, man sieht die pfeile, aber die distanz zwischen den pfeilen verandert sich dadurch, ohne die division durch 1000
sieht man die pfeile nur aufblitzen, und das zur richtigen zeit, aber ich muss warscheinlich einen bewegungsfaktor nehmen und von dem abstand der pfeile abziehen, nur keine vorstellung wie das genau geht. Vielleicht sollte ich mathe noch einmal wiederholen :?
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 04.10.10 22:36 
Hey,

zeichne das alles erstma in 2D, dann kannst du nämlich die Koordinaten in Pixeln ausrechnen und es wird einfacher als im 3D Modus...
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TForm1.Render;

  procedure DrawRect(Rect: TRect);
  begin
    glBegin(GL_QUADS);
      glTexCoord2f(00); glVertex2f( Rect.Left,    Rect.Top);
      glTexCoord2f(01); glVertex2f( Rect.Left, Rect.Bottom);
      glTexCoord2f(11); glVertex2f(Rect.Right, Rect.Bottom);
      glTexCoord2f(10); glVertex2f(Rect.Right,    Rect.Top);
    glEnd;
  end;

begin
  glClearColor(0,0,0,0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glViewport(00, ClientWidth, ClientHeight);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(0, ClientWidth, ClientHeight, 0, -1010);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glDisable(GL_DEPTH_TEST);

  glColor4f(1111);
  DrawRect(Rect(100100500500));

  SwapBuffers(RC.DC);
end;

jetz musst du eig nur noch ne Schleife über alle Pfeile machen und die vergangene Zeit auf die Position drauf addieren, Fertsch^^

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^