Autor Beitrag
Fabian E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: Di 05.09.06 18:06 
schreib grad nen kleinen pong klon und habe folgendes problem:
ich weiß nicht so wirklich wie ich die Kollision mit dem schläger realisieren soll.
wenn ich einfach die beiden x-koordinaten vergleiche dann klappt das natürlich nicht da
der schläger ja größer ist als eine korrdinate.
ausblenden Delphi-Quelltext
1:
If Ball.Position.x = Schlaeger_a.Position.x					


und deswegen such ich jetz ne möglichkeit den ganzen schläger einzubeziehen.
Weiß nich obs ne rolle spielt aber ich benutze die fear2d engine.
danke schon mal
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Di 05.09.06 20:42 
Ich schließe Abweichungen von "reinen OpenGL" und Fear2D aus:
Ein Vergleich von Koordinaten ist eher schlecht, da OpenGL im Idealfall mit Floats arbeitet und diese bekanntlich nicht exakt sind. Nehme einfach mal zwei Floats (s=1.0000 und x=1.43) rechne diese zusammen und Du erhälst 2.429999948 und damit einen Wert ungleich 2.43. Daher sind solche Abfragen zumeist nicht sinnvoll zu gebrauchen und insbesondere im Bereich der Kollisionsabfragen sogar sehr schädlich. So kann ein Objekt so schnell sein, dass es über die Grenze hinaus springt... und dann? Würde eine solche Abfrage niemals mehr den Ball bremsen und er nimmt seinen Kurs gen der Unendlichkeit.

Für Dich gäbe es also zwei sinnvolle Ansätze:
1. Wenn dein Schläger traditionell wie das Urpong auf einer Ebene liegt, so kannst Du es Dir leicht machen und einfach eine Abfrage a la
ausblenden Delphi-Quelltext
1:
if Ball.Position.x < Schlaeger_a.Position.x					

Sofern die Schlägerposition auch wirklich die "Schlagseite" ist. Auch versteht es sich von selbst, dass dies nur für den linken Schläger gilt.

2. Sofern Du Dich nicht auf einer Ebene befindest, so brauchst Du drei Punkte und die Position des Balles. Die Drei Punkte müssen auf der ebene der Schlagseite liegen! Hierfür solltest Du eine Vektor-Lib deines Vertrauens verwenden. Die Test-Funktion könnte wie folgt aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function planePointDistance(p0,p1,p2,p:TVector3f):Single;
var
  v,u,n: TVector3f;
  d: Single;
  distance: Single;
begin
  v := vectorSubtract(p1,p0);
  u := vectorSubtract(p2,p0);

  n := vectorCrossProduct(v,u);
  n := vectorNormalize(n);

  d := vectorDotProduct(vectorScale(n,-1),p0);

  distance :=vectorDotProduct(n,p)+d;

  if distance < 0 then distance := distance *-1;
  result := distance;
end;

p0,p1,p2 sind Punkte auf der Schlägerebene (am besten: Schlägelinks runten, Schlägerrechts untten, Schläger links oben), sowie P als Position des Balles. Ist die Distanz kleiner als der Radius des Balles, fand eine Kollision statt. Beachte bitte, dass diese Funktion stets einen positive Distanz zurückgibt und damit ebenfalls übers Ziel hinausschießen könnte!

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
Fabian E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: Mi 06.09.06 13:54 
Ok! Wenn ich aber doch jetz einfach
ausblenden Delphi-Quelltext
1:
if Ball.Position.x < Schlaeger_a.Position.x					

abfrage dann weiß ich doch nur ob der Ball hinter der x-Koordinate meines schlägers ist oder? Aber ich weiß nicht ob der Ball auch AN meinem Schläger ist. Da fehlt doch irgendwie noch die Position auf der y-Achse. Oder bin ich jetz einfach zu blöd um das zu rallen? ;-)
Aber danke schon mal!
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Mi 06.09.06 14:15 
Naja, ich gehe schon davon aus, dass Du des Programmierens mächtig bist. ;) Du hast also ein gerade ausgerichtet Spielfeld von Links nach Rechts. Dann dient meine Abfrage dazu um zu kontrollieren, ob der Ball sich hinter der Kollisionsebene befindet. Das ist als erste Prüfung wohl sinnvoll, da Du vielleicht auch unterscheiden willst, ob der Ball raus geflogen ist. Um nun rauszufinden, ob der Ball den Schläger getroffen hat (oder nicht), brauchst Du doch nur noch entlang der Y-Achse prüfen. Der Ansatz ist dabei der gleiche. Befindet sich der Ball im nächsten Frame auf (oder hinter) der Kollisionsebene UND auf der Höhe des Schlägers, so fand eine Kollision statt. Üblicherweise hat der Schläger eine Position und eine Höhe.

Ergo, bei einem System von unten links ausgehend:
ausblenden Delphi-Quelltext
1:
  if (ball.y > schlaeger.y) and (ball.y < schlaeger.y+schlaeger.height) then //Kollision					

liefert Dir, ob das Ball sich auf der gleichen Höhe wie der Schläger befindet. Befindet er sich dann auf oder hinter der Kollisionebene war es ein Treffer, ansonsten ist der Ball gerade dabei ins Abseits zu drifften.

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
Fabian E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: Mi 06.09.06 14:27 
hmm... ich glaub ich hab das echt bissel vercheckt!
Naja egal! Aber danke!
Sollte eig so klappen! Wenn nich dürft ihr mich alle steinigen^^