Autor Beitrag
ACiDRAiN
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 25.03.12 01:36 
Guten Tag,
ich bin ziemlich neu in Sachen OpenGL und brauche ein paar Hilfestellungen.

Zunächst ist mein Problem, dass bei meinem Spiel der rechte Schläger und der Ball abhängig vom linken Schläger sind.
Wenn ich den linken Schläger bewege, dann bewegen sich die anderen beiden Objekte mit. Wenn ich nur den rechten Schläger bewege, dann bewegt sich der Ball mit.
Wenn ich den OpenGL Befehl "glLoadIdentity" oder "glpushmatrix"/"glpostmatrix" benutze, dann verschwinden der rechte Schläger und der Ball.
Hier ein bisschen Quelltext dazu:

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:
33:
34:
35:
36:
procedure TForm1.Schlaeger;
begin
 // Spieler 1
 glTranslatef(-300, -50);
  glTranslated(0, s1, 0);
 glBegin(GL_QUADS);
  glColor3f(010); glVertex3f(-1,1,-1);
  glColor3f(010); glVertex3f(-1,-9,-1);
  glColor3f(010); glVertex3f(1,-9,-1);
  glColor3f(010); glVertex3f(1,1,-1);
  glEnd;

 // Spieler2
 glTranslatef(6000);
  glTranslated(0, s2, 0);
 glBegin(GL_QUADS);
  glColor3f(010); glVertex3f(-1,1,-1);
  glColor3f(010); glVertex3f(-1,-9,-1);
  glColor3f(010); glVertex3f(1,-9,-1);
  glColor3f(010); glVertex3f(1,1,-1);
  glEnd;
end;



procedure TForm1.Ball;
begin
  glTranslatef(-3000);
  glTranslated(bx, by, 0);
  glBegin(GL_QUADS);
    glColor3f(010); glVertex3f(-1,1,-1); //lo
    glColor3f(010); glVertex3f(-1,-1,-1); //lu
    glColor3f(010); glVertex3f(1,-1,-1); //ru
    glColor3f(010); glVertex3f(1,1,-1);  //ro
  glEnd;
end;


Soweit,
acidrain
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: So 25.03.12 03:58 
Moin und :welcome: in der Entwickler-Ecke!

Mit PushMatrix und PopMatrix hast du schon die richtigen Befehle bei der Hand - aber anscheinend falsch eingesetzt. In deinem geposteten Code stapelst du nur Änderungen der Modelview-Matrix aufeinander, ohne irgendeinen Bezug zwischendurch herzustellen.

Dir sollte dieses Tutorial von DelphiGL helfen...

Viele Grüße,
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: ACiDRAiN
ACiDRAiN Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 25.03.12 13:34 
Ich komm einfach nicht drauf, wie ich PushMatrix und PopMatrix in meiner Prozedur positionieren soll.
Habe schon zwischen den einzelnen Objekten diese eingesetzt und auch alle Objekte zwischen denen positioniert, aber verändern tut sich trotzdem nichts.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 25.03.12 14:01 
PushMatrix sichert die aktuelle Transformation und PopMatrix stellt diese wieder her.

Es muss also so laufen:

1. Matrix sichern
2. Bewegen und Schläger 1 malen
3. Matrix wiederherstellen (jetzt hast du wieder die Initialposition, d.h die Translationen wurden rückgängig gemacht, das erste Objekt ist aber noch dort, wo du es hingezeichnet hast. Alternativ könntest du auch einfach die Translationen mit umgekehrtem Vorzeichen statt dem Push/Pop nutzen, ist aber meist nicht so angenehm)
4. Matrix sichern (da ja nichtmehr auf dem Stack und wir brauchen sie in 6. nochmal)
5. Bewegen und Schläger 2 malen
6. Matrix wiederherstellen
7. Bewegen und Ball malen

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: ACiDRAiN
ACiDRAiN Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 25.03.12 14:16 
Vielen Dank! Mit der Anleitung hat's geklappt. Das Problem war, dass durch die resetteten Kooordinaten, die Objekte ja nichtmehr sichtbar waren, weil sie ganz woanders waren.

Ich hätte noch eine Frage und bräuchte eine Hilfestellung.
1. Bei mir ist das ja jetzt so, dass nur ein Spieler die Tasten drücken kann, wenn der andere seine zugehörigen Tasten gleichzeitig drückt, dann passiert nichts.
Das verschafft ja ein unfaires Spielerlebnis für denjenigen Spieler, der später reagiert.

2. Wie sollte ich das mit den Kollisionen klären? Ich weiss ja nicht, wo genau das Spielfeld bei meiner Fenstergröße endet bzw. wo genau die Schläger sind.
Ich hab mich Gestern ein bisschen durchgelesen und hab immer nur gesehen, dass die Leute Variablen nehmen nur die Deklarationen sind nirgends vorzufinden.
Also wäre die genaue Frage, wie ich die genauen Koordinaten einlesen kann, dass ich mit stinknormalen IF Schleifen die Kollisionen festlegen kann.+


Vielen Dank im Vorraus,
acidrain
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 25.03.12 18:24 
user profile iconACiDRAiN hat folgendes geschrieben Zum zitierten Posting springen:
1. Bei mir ist das ja jetzt so, dass nur ein Spieler die Tasten drücken kann, wenn der andere seine zugehörigen Tasten gleichzeitig drückt, dann passiert nichts.

Da müsste man erstmal deinen Code dazu sehen. Am besten du machst einen eigenes Thema dazu und postet dort den Code den du bereits hast, damit das inhaltlich getrennt ist :) Als Tipp kann ich hier mal GetAsyncKeyState nennen, damit kannst du prüfen, ob eine bestimmte Taste gerade gedrückt wird.

user profile iconACiDRAiN hat folgendes geschrieben Zum zitierten Posting springen:
2. Wie sollte ich das mit den Kollisionen klären? Ich weiss ja nicht, wo genau das Spielfeld bei meiner Fenstergröße endet bzw. wo genau die Schläger sind.

Dreidimensionales Rendern und Fenstergröße als Begrenzung ist keine gute Idee (ich glaub da müsste man ziemlich mit Formeln hantieren).
Mach es doch so: Zeichne eine Begrenzung mit OpenGL ein. OpenGL skaliert die Größe ja einigermaßen (abhängig von der Höhe).

Die Kollisionen selbst zu berechnen ist angewandte Mathematik. Solange du nur Rechtwinklige Objekte hast, geht es einigermaßen gut, indem du guckst:

ausblenden Delphi-Quelltext
1:
2:
if Kugel.Left+Kugel.Radius>RandRechts.Left then
  Kugel.v.x := -Kugel.v.x;


Wird auch hier weiter unten beschrieben:
wiki.delphigl.com/in.../Tutorial_Kollision1

Es gibt da gewisse Probleme. Zum einen musst du das schnell genug testen, da sonst der Ball durch die Wand durch ist und dann zurück durch die Wand fliegen wird. Außerdem ist der Abprallwinkel ziemlich komisch, wenn die Ecke des Schlägers getroffen wird.

Um es ordentlich zu machen müsstest du mit Geometrie anrücken (2D würde ja reichen) und Schnittpunkte zwischen Geraden berechnen etc. Das ist aber nicht ganz einfach.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: ACiDRAiN
ACiDRAiN Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 25.03.12 18:48 
Bei mir ist auch selbst die Kugel rechtwinklig, also ein Quadrat.

Pong soll bei mir in 2D sein, daher ist das mit 3D nicht wichtig, denk ich mal.
Wo kann ich nachgucken, wie die größe skaliert wurde und wie komm ich bei deinem Beispiel an das Kugel.Left bzw. RandRechts ran?

Ich freue mich auf eine Antwort.

Grüße, acidrain
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 26.03.12 20:39 
user profile iconACiDRAiN hat folgendes geschrieben Zum zitierten Posting springen:
Wo kann ich nachgucken, wie die größe skaliert wurde

Ich meinte, du solltest einfach deine Begrenzung in OpenGL einzeichnen (als Rahmen), der muss aber nicht mit dem echten Bildschirmrahmen übereinstimmen (sollte kleiner sein). Also etwa wie hier. Wenn du jetzt das Fenster vergrößerst, dann wird das Spielfeld niemals breiter als der Bildschirm sein, da OpenGL dies so macht. Selbst ausrechnen ist schwierig durch die 3D-Ansicht.

user profile iconACiDRAiN hat folgendes geschrieben Zum zitierten Posting springen:
und wie komm ich bei deinem Beispiel an das

Das hab ich in deinem andren Post beschrieben, ich hab dabei einfach die Position deines Balls/der Bande gemeint. Zur Berechnung der Kollision brauchst du dabei nicht die echte Position im Fenster (left/top), die OpenGL-Koordinaten sind ja auch ok.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)