Registriert seit: 25. Mai 2009
322 Beiträge
Turbo Delphi für Win32
|
AW: Kollision mit Reflektion - Ich raffs net...
11. Feb 2011, 17:07
Zitat:
ich hoffe das hat mehr geholfen als verwirrt
Nope ^^
Ich versteh jetz nicht, woher ich zur laufzeit den Normalenvektor her nehmen soll.. hier ist meine Move methode ohne winkelberechnung... so wie ich sie in nem anderen threat gefunden hatte nur weiter ausgebaut.
Delphi-Quellcode:
procedure TFormMain.MoveBall(pCollisionObject: array of TPanel);
var tempObject,CollisionRect: TRect;
I: Integer;
begin
sball.left:=sball.left+XCor;
Ball.Left:=SBall.Left;
Ball.Right:=SBall.Left+SBall.Width;
if sball.left < (PLinks.Left+PLinks.Width) then
begin
sball.left := (PLinks.Left+PLinks.Width);
Xcor := -Xcor;
end;
if sball.left > PRechts.Left - sball.width then
begin
sball.left := (PRechts.Left - sball.width);
XCor := -XCor;
end;
sball.top := sball.top+YCor;
Ball.Top:=SBall.Top;
Ball.Bottom:=SBall.Top+SBall.Height;
if sball.top < (POben.Top+POben.Height) then
begin
sball.Top := (POben.Top+POben.Height);
YCor := -YCor;
end;
if sball.top > (self.height - sball.height) then
begin
sball.top := (self.height - sball.height);
YCor := -YCor;
end;
if IntersectRect(Collision,Ball,Stick) then
begin
sball.top := (PStick.top - sball.height);
YCor:= -YCor;
end;
if Sball.Top > PStick.Top then
begin
SBall.Visible:=False;
TMover.Enabled:=False;
MessageDLG('Game Over!',mtWarning,[mbOk],0);
SpawnBall;
end;
for I := 0 to High(pCollisionObject) - 1 do
begin
tempObject.Left:=pCollisionObject[I].Left;
tempObject.Right:=pCollisionObject[I].Left+pCollisionObject[I].Width;
tempObject.Top:=pCollisionObject[I].Top;
tempObject.Bottom:=pCollisionObject[I].Top+pCollisionObject[I].Height;
if IntersectRect(CollisionRect,Ball,tempObject) then
begin
YCor:= -YCor;
XCor:= -XCor;
pCollisionObject[I].Visible:=False;
pCollisionObject[I].Left:=0-PCollisionObject[I].Width;
pCollisionObject[I].Top:=0-PCollisionObject[I].Height;
end;
end;
end;
hier der Methodenaufruf:
Delphi-Quellcode:
procedure TFormMain.TMoverTimer(Sender: TObject);
begin
MoveBall([Panel2,Panel3,Panel4,Panel5,Panel6,Panel7,Panel8,Panel9,Panel10,
Panel11,Panel12,Panel13,Panel14,Panel15,Panel16,Panel17,Panel18,
Panel19,Panel20,Panel21,Panel22,Panel23,Panel24,Panel25,Panel26,
Panel27,Panel28,Panel29,Panel30,Panel31,Panel32,Panel33,Panel34,
Panel35,Panel36,Panel37,Panel38,Panel39,Panel40,Panel41,Panel42,
Panel43,Panel44,Panel45,Panel46,Panel47,Panel48,Panel49,Panel50,
Panel51,Panel52,Panel53,Panel54,Panel55,Panel56,Panel57]);
end;
und im anhang mal die pas
Wenn mein Ball jetzt auf einen Stein trifft, woher nehme ich dann den Normalenvektor? Der Normalenvektor beschreibt doch eine im rechten winkel zur fläche stehende gerade, oder?
ich geb es einfach mal auf die formel nachzuvollziehen und sehe sie als gegeben...
Wenn mir jetzt jemand sagen kann woher ich den dusseligen Normalenvektor nehmen soll dann könnte ichs ja programmieren...
Zitat:
Den Normalenvektor der Fläche musst du wissen - wenn der Ball z.B. oben an den Rand gestoßen ist, dann ist der Normalenvektor (0|1) (Y Achse zeigt ja nach unten, daher +1)
... das hat mir irgendwie nicht weitergeholfen...
|