Autor Beitrag
Debo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: Mi 02.08.06 20:41 
Bastle gerde an einem sehr schlichtem Pong in 2D mit OpenGL.

Kollision an den Wänden klappt soweit aber nicht am Schlaeger.

Habe eine feste x Koordinate des Schlägers (-26) und eine x bzw. y Koordinate für den Ball. (xb und yb)

Den Ball bewege ich mit:
ausblenden Delphi-Quelltext
1:
2:
xb:=xb+0.05*movementx;
yb:=yb+0.05*movementy;


movementx ist entweder 1 oder -1, movementy genauso. (quasi meine Richtungsvektoren)

Meine Schlägerkollision ist folgende:
ausblenden Delphi-Quelltext
1:
2:
if (movementx=-1AND (movementy=1AND (xb=-24.5AND (yb>=y) 
AND (yb<=y+8then movementx:=1;


Also:
movementx=-1 (Ball fliegt nach links)
UND movementy=1 (Ball fliegt nach oben)
UND der Ball ist an der x-Position -24.5 (also am Schläger, denn der Schläger ist 1.5 Einheiten breit)
UND der Ball ist an einer y-Position größer gleich die y-Position des Schläger
UND der Ball ist an einer y-Position kleiner gleich der Länge des Schlägers ( Der Schläger ist 8 Einheiten lang)

Sind alle Bedingungen erfüllt befinden sich der Ball am Schläger (oder?)
dann soll der Ball natürlich nach rechts fliegen, also movementx:=1 und nach oben, aber tut er ja schon, deswegen spar ich mir movementy

Hab ich da irgendwo nen Denkfehler?

Danke schon mal
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 02.08.06 21:12 
Du könntest natürlich auch PtInRect verwenden. So wäre eine Kollisionsabfrage einfacher:
ausblenden Delphi-Quelltext
1:
2:
3:
aRect := Rect(SchlaegerTop, SchlaeglerLeft, SchlaegerBottom, SchlaegerRight);
if PtInRect(aRect, Point(BallX, BallY)) then
  // Ball ist am / im Schläger

Um den Ball schon ein bisschen früher abprallen zu lassen (nicht erst, wenn er im Schläger steckt ^^), einfach an den Rect-Koordinaten rumspielen (+3 / -3).

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Debo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: Mi 02.08.06 22:39 
ja idee ist ja okeh nur hab ich das Problem, dass meine Ballkoordinaten vom Typ GLfloat sind. TPoint verlangt aber Single.

jedoch weiss ich noch immer nicht , was bei meiner Lösung falsch ist.
Debo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: Mi 02.08.06 22:51 
Meine Lösung find ich schon ganz gut! Habs jetzt auch hinbekommen und noch vereinfacht!

ausblenden Delphi-Quelltext
1:
2:
if (xb<=-25AND (yb>=y) AND (yb<=y+10)
    then movementx:=1;


der Fehler war die Bedingung xb=-25, es muss <= heissen, da meine Ballbewegung nicht so genau ist, dass der Ball den x-Wert -25 bekommt.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 03.08.06 20:53 
Das hatte ich mir sogar gedacht, wollte aber die andere Methode mal vorgeschlagen haben ;-).

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)