Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kollision mit Reflektion - Ich raffs net... (https://www.delphipraxis.net/158225-kollision-mit-reflektion-ich-raffs-net.html)

Fussel9 9. Feb 2011 22:30

Delphi-Version: 2006

Kollision mit Reflektion - Ich raffs net...
 
Liste der Anhänge anzeigen (Anzahl: 1)
hallo...

ich würde gerne nen BreakoutClone schreiben in Delphi mit nem Shape als Ball und Panels als Schläger und Bricks...

erst hatte ich diesen Quelltext selber geschrieben:

Delphi-Quellcode:
function TFormMain.collision(pCollisionObject: TPanel) : Boolean;
var
  I: Integer;
  J: Integer;
begin
result:=FALSE;
  for J := 0 to pCollisionObject.Height do
    begin
      if ((SBall.Left+SBall.Width)=(pCollisionObject.Top+J)) then
        begin
          result:=TRUE;
        end
      else
        begin
          if (SBall.Top=(pCollisionObject.Top+J)) then
            begin
              result:=TRUE;
            end
          else
            begin
              for I := 0 to pCollisionObject.Width do
                begin
                  if ((SBall.Top+SBall.Height)=(pCollisionObject.Left+I)) then
                    begin
                      result:=TRUE;
                    end
                  else
                    begin
                      if (SBall.Top=(pCollisionObject.Left+I)) then
                        begin
                          result:=TRUE;
                        end;
                    end;
                end;
            end;
        end;
    end;
end;
der funktioniert überhaupt nicht, dann hab ich von der Funktion IntersectRect gelesen,
die funktioniert zwar, aber ich weiß nicht wie ich damit das Reflektieren hinbekommen soll...

dann bin ich darauf gestoßen:
Zitat:

Zitat von Smokey002 (Beitrag 1013872)
hi,

danke für die Hilfe. Der Ball reflektiert jetzt korrekt.

Delphi-Quellcode:

unit Uball;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Schlaeger: TShape;
    Pgrenze: TPanel;
    sball: TShape;
    BStart: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure BStartClick(Sender: TObject);
    procedure SchlaegerMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bx: Integer;
  by: integer;
implementation

{$R *.DFM}

procedure TForm1.BStartClick(Sender: TObject);
begin
     bx:=5;
     by:=5;
     Timer1.enabled:=true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin

       sball.left:=sball.left+bx;
       if sball.left < 0 then
          begin
          sball.left := 1;
          bx := -bx;
          end;
          if sball.left > pgrenze.width - sball.width then
          begin
          sball.left := pgrenze.width - sball.width;
          bx := -bx;
          end;

       sball.top := sball.top+by;
       if sball.top < 0 then
          begin
          sball.Top := 1;
          by := -by;
          end;
       if sball.top > pgrenze.height - sball.height then
          begin
          sball.top := pgrenze.height - sball.height;
          by := -by;
          end;

end;


procedure TForm1.SchlaegerMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Schlaeger.Left := X - Schlaeger.Width div 2;
end;

end.

Bei dem Mousemove procedure stimmt anscheinend auch etwas nicht. Meine Shape haftet sich sofort an die linke Wand und bewegt sich nur ab und zu mit meiner Maus. Aber auch nur um dann sofort wieder an die linke Wand zu hüpfen.

Wie kann ich einen Schläger programmieren?

den Quelltext kann ich nicht ganz nachvollziehen und ich weiß nicht was das mit dem Pannel PGrenze auf sich hat...

Vielleicht bin ich einfach zu doof :mrgreen:


Grundsätzlich hab ich einfach nur vor den einfallswinkel je nach dem ob er > oder < 90,180 oder 270 bzw. 360 ist, in seiner differenz zu 180 zu behandeln.

(klingt komplizierter als es ist <siehe Anhang>)
__________________________________________________ __________________________________________________ __________

Jetz noch mal ganz bündig mein Problem: Mir fehlt bei IntersectRect der Einfallswinkel um den Ausfallswinkel zu berechnen und weiß nicht wie mans richtig machen muss....

Kann mir da bitte jemand helfen :|

Delphi-Laie 9. Feb 2011 23:22

AW: Kollision mit Reflektion - Ich raffs net...
 
Das "Raffen", wie Du es wohl zu verwenden scheinst, ist Jargon und bedeutet eigentlich - etwas gehoben, aber immer noch umgangssprachlich - gieriges Sammeln von Werten. Davon ausgehend, frage ich mich, was Du nicht "raffst".... oder begreifst Du etwas nicht - falls ja, was, und warum drückst Du Dich dann nicht so aus?

Wo ist denn in Deinen Quelltexten der Einfallswinkel parametriert (d.h., welche Variable verkörpert ihn)?

Fussel9 9. Feb 2011 23:35

AW: Kollision mit Reflektion - Ich raffs net...
 
Verzeihet, mir wart nicht geläufig das Dudenschreiben bei Hofe sind...

Ja ich verstehe den Quelltext nicht...

und zwar diese Stelle
Delphi-Quellcode:
       sball.left:=sball.left+bx;
       if sball.left < 0 then
          begin
          sball.left := 1;
          bx := -bx;
          end;
          if sball.left > pgrenze.width - sball.width then
          begin
          sball.left := pgrenze.width - sball.width;
          bx := -bx;
          end;

       sball.top := sball.top+by;
       if sball.top < 0 then
          begin
          sball.Top := 1;
          by := -by;
          end;
       if sball.top > pgrenze.height - sball.height then
          begin
          sball.top := pgrenze.height - sball.height;
          by := -by;
          end;
wieso: if sball.left > pgrenze.width - sball.width then
begin
sball.left := pgrenze.width - sball.width;

Und der Quelltext den ich geschrieben habe diente nur dazu festzustellen ob eine Kollision vorliegt evtl. auch noch wo..(oben unten rechts links) und nicht der reflektion ...


Ich hoffe das meine Ausführungen der deutschen Syntax genuge wurden...:stupid:

BUG 9. Feb 2011 23:39

AW: Kollision mit Reflektion - Ich raffs net...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Delphi-Laie (Beitrag 1080701)
Davon ausgehend, frage ich mich, was Du nicht "raffst".... oder begreifst Du etwas nicht - falls ja, was, und warum drückst Du Dich dann nicht so aus?

Er versteht es nicht, das kann man ja aus dem Kontext folgern :roll:

Zitat:

Zitat von Fussel9 (Beitrag 1080688)
Jetz noch mal ganz bündig mein Problem: Mir fehlt bei IntersectRect der Einfallswinkel um den Ausfallswinkel zu berechnen und weiß nicht wie mans richtig machen muss....

Du kannst den Winkel aus der aktuellen Verschiebung ermitteln.

Ich habe mal ein schönes häßliches Bild gemalt:
Anhang 33320

Fussel9 9. Feb 2011 23:52

AW: Kollision mit Reflektion - Ich raffs net...
 
ein wunder fabuloses bild, nur hab ich cosinus,tangens und sinus schon im Matheunterricht aufs verrecken gehasst... :stupid:

naja als ich weiß das man mit dem Tangens diese reflektion ausrechnet,
du hast geschrieben/gemalt tan=dy/dx
das ist z.B. was mir nix sagt... wenn ich ein dreieck habe mit den seitenlängen 3cm(dy),5cm(dx) und 2cm
und dan ist der Tangens von a 3/5 ... was hab ich davon?

in delphi ist der ursrung des koordinatensystems ja oben links statt unten links wie in einem normalen...
wirkt sich das irgendwie auf die berechnungen aus?

wenn ich jetzt meinen Ball hab und der läuft da gerade mit nem Winkel von ...ka... 30Grad übers feld und trifft auf den schläger, woher krieg ich dann dy und dx? (dx wahrscheinlich Schläger.Width ... aber dy?)

ach ich glaub das reicht an fragen für heute... hoffe das mir die jemand beantworten kann und dann gehts morgen weiter ^^ gute n8

QuickAndDirty 10. Feb 2011 09:17

AW: Kollision mit Reflektion - Ich raffs net...
 
Du speicherst für deinen Ball einen Geschwindigkeitsvector.
Dieser Vector hat in einem 2 Dimensionalen System 2 Teilgeschwindigkeiten.
Die Vx und die Vy Geschwindigkeit.

Wenn du diese nicht schon wüsstest sondern erst ermitteln wolltest kämest du auf dx und dy.
Ball bei T1 hat die Koordinaten X1 und Y1
Ball bei T2 hat die Koordinaten X2 und Y2

Wenn für T2 -T1 = 1 gilt dann
ist Vxy
Vx = dx = X2-X1
Vy = dy = Y2-Y1

Daraus kannst du dann über den Tangens den Winkel ermitteln...

Wenn dein Ball nur an horizontalen und Vertikalen Flächen reflektiert ist es sogar noch einfacher...
...dann musst du nur das Vorzeichen einer der Teilgeschwindigkeiten umkehren.

jfheins 10. Feb 2011 11:28

AW: Kollision mit Reflektion - Ich raffs net...
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1080759)
Wenn dein Ball nur an horizontalen und Vertikalen Flächen reflektiert ist es sogar noch einfacher...
...dann musst du nur das Vorzeichen einer der Teilgeschwindigkeiten umkehren.

Mit ein bisschen Vektorzeugs geht das immer (und nicht nur an horizontalen/vertikalen Flächen) - dann braucht man den Tangens gar nicht mehr :-)

Formel: v_neu = v_alt - 2 * (v_alt*n)*n
n ist der Normalenvektor der Fläche, v_neu und v_alt die vorher/nachher Geschwindigkeitsvektoren.

Zitat:

wieso:
Delphi-Quellcode:
if sball.left > pgrenze.width - sball.width then
begin
sball.left := pgrenze.width - sball.width; //(1)
bx := -bx;//(2)

Naja, wenn der Ball rechts rausfliegt, wird der Ball (1) zurückgesetzt an den Rand und (2) die x Geschwindigkeit negiert, damit er wieder in die andere Richtung fliegt. (1) ist nötig weil es sonst passieren könnte, dass der Ball etwas zu weit raus fliegt und im nächsten Schritt wieder eine Kollision erkannt wird. Das darf nicht sein weil der Ball dann am rechten Rand hängen bleiben würde.

Fussel9 10. Feb 2011 22:41

AW: Kollision mit Reflektion - Ich raffs net...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Naja, wenn der Ball rechts rausfliegt, wird der Ball (1) zurückgesetzt an den Rand und (2) die x Geschwindigkeit negiert, damit er wieder in die andere Richtung fliegt. (1) ist nötig weil es sonst passieren könnte, dass der Ball etwas zu weit raus fliegt und im nächsten Schritt wieder eine Kollision erkannt wird. Das darf nicht sein weil der Ball dann am rechten Rand hängen bleiben würde.
ok das hab ich jetz verstanden, aber das mit dem ganzen vektorengedönz...#_#

Zitat:

Wenn für T2 -T1 = 1 gilt dann
ist Vxy
Vx = dx = X2-X1
Vy = dy = Y2-Y1
T2-T1=1
das ist nur der Fall wenn T2 zufällig T1*2 ist
angenommen T2 wäre (4|4) dann muss T1 (2|2) sein damit diese Kondition erfüllt ist... nicht unbedingt wahrscheinlich...

und wo bleibt der Richtungsvektor? Ich hab jetz ma ne Zeichnung gemacht und erkenne keine Zusammenhänge...

:wiejetzt:
Zitat:

Formel: v_neu = v_alt - 2 * (v_alt*n)*n
n ist der Normalenvektor der Fläche, v_neu und v_alt die vorher/nachher Geschwindigkeitsvektoren.
venn VNeu darstellt wo sich der Ball jetzt befinden wird und VAlt wo der Ball vorher war, woher nehme ich dann den Normalenvektor der Fläche (ich denke mal das soll z.B. der Schläger oder der Brick sein)
Und worauf basiert die Formel? 2* den alten Vektor*Normalenvektor und dann nochmal * den Normalenvektor ...
...

und das sind so die punkte an denen ich dann wieder raus bin,,,

ich speicher übrigens nicht die xy sondern den winkel für den ball hilft mir das irgendwie weiter?
ich glaub das kann ich so gar nicht machen oder?
Delphi-Quellcode:
procedure TFormMain.MoveByAngle(pWinkel: Integer);
begin
  if (pWinkel<90) then
    begin
      SBall.Top:=SBall.Top+10;
      SBall.Left:=SBall.Left-pWinkel;
    end
  else
    begin
      if (pWinkel=90) then
        begin
          SBall.Left:=SBall.Left-pWinkel;
        end
      else
        begin
          if (pWinkel<=180) then
            begin
              SBall.Top:=SBall.Top-10;
              SBall.Left:=SBall.Left-pWinkel;
            end
          else
            begin
              if (pWinkel<270) then
                begin
                  SBall.Top:=SBall.Top-10;
                  SBall.Left:=SBall.Left+pWinkel;
                end
              else
                begin
                  if (pWinkel=270) then
                    begin
                      SBall.Left:=SBall.Left+pWinkel;
                    end
                  else
                    begin
                      if (pWinkel<=360) then
                        begin
                          SBall.Top:=SBall.Top+10;
                          SBall.Left:=SBall.Left+pWinkel;
                        end;
                    end;
                end;
            end;
        end;
    end;
end;

jfheins 10. Feb 2011 23:16

AW: Kollision mit Reflektion - Ich raffs net...
 
Du würdest dir mit Vektoren wesentlich einfacher tun.
Zitat:

ich speicher übrigens nicht die xy sondern den winkel für den ball hilft mir das irgendwie weiter?
ich glaub das kann ich so gar nicht machen oder?
Genau dafür sind die nämlich praktisch - anstatt des Winkels speicherst du ein deltaX und ein deltaY. Und jedesmal, wenn sich der Ball bewegen soll, veränderst du seine X Postition um deltaX udn seine Y Position um deltaY.

Die Prozedur sieht dann so aus:
Delphi-Quellcode:
procedure TFormMain.MoveByAngle(pWinkel: Integer);
begin
    SBall.Top := SBall.Top + deltaX;
    SBall.Left := SBall.Left + deltaY;
end;
Und über diese deltas steuerst du dann die Bewegungsrichtung.

P.S.: In diesem Zusammenhang ist ein "Vektor" auch nur etwas, um 2 Zahlen "zusammenzufassen". die kannst also deltaX und deltaY als einen Vektor interpretieren. Oder CBall.Left und SBall.Top als einen Vektor.
Zitat:

venn VNeu darstellt wo sich der Ball jetzt befinden wird und VAlt wo der Ball vorher war, woher nehme ich dann den Normalenvektor der Fläche (ich denke mal das soll z.B. der Schläger oder der Brick sein)
Und worauf basiert die Formel? 2* den alten Vektor*Normalenvektor und dann nochmal * den Normalenvektor ...
Und das v aus meinem Beitrag ist dann genau dieser Vektor deltaX/deltaY. Das v ist also nicht die Position, sondern die Geschwindigkeit des Balls!
Die Formel basiert auf Einfallswinkel=Ausfallswinkel. Habe ich vorhin selbst hergeleitet, aber ist sicher noch woanders zu finden.[1] [2] 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)
Ach, und: Die Produkte sind Skalarprodukte, die musst du schon genau so rechnen. Assoziativgesetz gilt nicht, also die Klammern sind wichtig!

ich hoffe das hat mehr geholfen als verwirrt :stupid:

Fussel9 11. Feb 2011 17:07

AW: Kollision mit Reflektion - Ich raffs net...
 
Liste der Anhänge anzeigen (Anzahl: 1)
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...

Notxor 11. Feb 2011 17:39

AW: Kollision mit Reflektion - Ich raffs net...
 
ein Normalvektor ist jeder Vektor, der auf die Gerade/Fläche/(Raum) normal steht. 2 Vektoren stehen aufeinander Normal, wenn ihr Skalarprodukt 0 ergibt. Im 2-dimensionalen kann man dies sehr einfach berechnen(wurde aber schon in diesem Thread irgendwo gesagt...)

v = (x,y)

1.Normalvektor auf v = (y,-x)
2.Normalvektor auf v = (-y,x)

es gibt aber unendlich viele davon, da du n1,n2 mit einem beliebigen Skalar multiplizieren kannst (außer 0), ohne dass sich die Richtung ändert.

jfheins 11. Feb 2011 17:51

AW: Kollision mit Reflektion - Ich raffs net...
 
Das wird ihm auch nicht weiterhelfen ^^

Das mit den Vektoren hatte ich nur ins Spiel gebracht, weil jemand meinte:
Zitat:

Daraus kannst du dann über den Tangens den Winkel ermitteln...´
Wenn dein Ball nur an horizontalen und Vertikalen Flächen reflektiert ist es sogar noch einfacher...
...dann musst du nur das Vorzeichen einer der Teilgeschwindigkeiten umkehren.
Um zu zeigen: Man kann auf den Tangens verzichten, auch wenn die Geraden schräg im Raum liegen. Die Formel und den Normalenvektor kannst du daher wieder vergessen - du hast ja anscheinend nur vertikale/horizontale Flächen ;)

Zu dem Problem: Du hast ja bereits so eine Art Kollisionserkennung drin. Das Problem ist nur: IntersectRect liefert dir zwar zurück, ob es eine Kollision gab, aber nicht wo. Das musst du selbst herausfinden!

Unter der Annahme dass der übrige Code funktioniert (sieht etwas umständlich aber sonst okay aus...) musst du also in der Schleife feststellen a) ob der Ball kollidiert und b) Wenn ja, wo er kollidiert.
Du musst halt manuell nacheinander die Ober & Unterseite und die linke und die rechte Seite abchecken. Bei Ober/Unterseite die Y Komponente invertieren, Bei links/rechts eben die X-Komponente invertieren.

Fussel9 11. Feb 2011 20:42

AW: Kollision mit Reflektion - Ich raffs net...
 
...solangsam gehn mir die Ideen aus... jetz funktionierts nix mehr ^^

Delphi-Quellcode:
procedure TFormMain.MoveBall(pCollisionObject: array of TPanel);
var tempObject,CollisionRect: TRect;
    I,J,a,b,c,d: 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;
for J := 0 to SBall.Width - 1 do
  begin
    tempObject.Left:=pCollisionObject[J].Left;
    tempObject.Right:=pCollisionObject[J].Left+pCollisionObject[J].Width;
    tempObject.Top:=pCollisionObject[J].Top;
    tempObject.Bottom:=pCollisionObject[J].Top+pCollisionObject[J].Height;
    if InterSectRect(CollisionRect,Ball,tempObject) then
      begin
        if not (pCollisionObject[J]=nil) then
          begin
            if (sball.Left < (pCollisionObject[J].Left+pCollisionObject[J].Width)) then
              begin
                XCor := -XCor;
                pCollisionObject[J]:=nil;
              end;
            if ((sball.Left+sball.Width)>pCollisionObject[J].Left) then
              begin
                XCor:= -XCor;
                pCollisionObject[J]:=nil;
              end;
          end;
      end;
  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;
        XCor:= XCor-1;
      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 SBall.Height - 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
        if not (pCollisionObject[I]=nil) then
          begin
            if (sball.Top < (pCollisionObject[I].Top+pCollisionObject[I].Height)) then
              begin
                YCor := -YCor;
                pCollisionObject[I]:=nil;
              end;
            if ((sball.Top+sball.Height)>pCollisionObject[I].Top) then
              begin
                YCor:= -YCor;
                pCollisionObject[I]:=nil;
              end;
          end;
      end;
    end;
end;

Delphi-Laie 11. Feb 2011 23:32

AW: Kollision mit Reflektion - Ich raffs net...
 
Zitat:

Zitat von Fussel9 (Beitrag 1081126)
...solangsam gehn mir die Ideen aus... jetz funktionierts nix mehr ^^

Und, soll das eine Frage sein? Was soll man damit anfangen?

Einfach hingeklatschte Mammutquelltexte.....

Ich muß mal ein wenig deutlicher werden: Du scheinst mathematisch und/oder physikalisch mit der Aufgabe(nstellung) überfordert zu sein. Doch derlei Defizite auszubügeln, dürfte dieses (Programmier-!)Forum nicht der geeignete Ort sein (auch wenn es nicht meine Aufgabe ist, darüber zu wachen und zu befinden). Ich staune über die Geduld der anderen Schreiberlinge und der Moderatoren.

Fussel9 12. Feb 2011 02:41

AW: Kollision mit Reflektion - Ich raffs net...
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1081156)
Zitat:

Zitat von Fussel9 (Beitrag 1081126)
...solangsam gehn mir die Ideen aus... jetz funktionierts nix mehr ^^

Und, soll das eine Frage sein? Was soll man damit anfangen?

Einfach hingeklatschte Mammutquelltexte.....

Ich muß mal ein wenig deutlicher werden: Du scheinst mathematisch und/oder physikalisch mit der Aufgabe(nstellung) überfordert zu sein. Doch derlei Defizite auszubügeln, dürfte dieses (Programmier-!)Forum nicht der geeignete Ort sein (auch wenn es nicht meine Aufgabe ist, darüber zu wachen und zu befinden). Ich staune über die Geduld der anderen Schreiberlinge und der Moderatoren.

Niemand zwingt dich hier zu antworten und wenn die anderen freundlicher weise versuchen mir zu helfen und mir darlegen wo meine fehler liegen, dann ist das ihre eigene entscheidung gewesen mir zu helfen.

Und da es hier um Programmierung geht denke ich das dies schon der ort ist so etwas zu lernen/sich so etwas erklären zu lassem.

Medium 12. Feb 2011 03:02

AW: Kollision mit Reflektion - Ich raffs net...
 
Da ist der Denkfehler: Es geht hier um mathematische Grundlagen, nicht um die Umsetzung. Zwar kann man die sicherlich auch diskutieren, aber nur schwerlich mit jemandem der diese, und ich fasse dies mal mutwillig in eigenen Worten zusammen: "alles nur doof" findet bzw. sich dagegen sperrt. Von daher bin ich auch über die kritikfreiheit bisher in diesem Thread verwundert, nicht zuletzt weil auch diese Kritik Hilfe sein würde (bzgl. Motivation sich diesen Dingen etwas bereitwilliger gegenüber zu stellen vor allem).

Delphi-Laie 12. Feb 2011 10:37

AW: Kollision mit Reflektion - Ich raffs net...
 
Zitat:

Zitat von Fussel9 (Beitrag 1081174)
Niemand zwingt dich hier zu antworten und wenn die anderen freundlicher weise versuchen mir zu helfen und mir darlegen wo meine fehler liegen, dann ist das ihre eigene entscheidung gewesen mir zu helfen.

Vielen Dank für diese für mich völlig neue Information!

Wenn jemand Defizite hinsichtlich der nötigen Grundlagenkenntnisse und dazu auch noch fehlende Lernbereitschaft ("Vektorgedönz" (es heißt übrigens Gedöns), "nur hab ich cosinus,tangens und sinus schon im Matheunterricht aufs verrecken gehasst...") signalisiert, dann vergeht mir die Hilfelust bei meinen ohnehin nur bescheidenen Hilfevoraussetzungen. Sollte mich wundern, wenn hier noch jemand erhebliches Engagement zeigen sollte.

Dann noch "Ich raffs net", "jetz funktionierts nix mehr" (fehlt nur noch mein Favorit: "proggi funzt net"), was m.E. ebenso die hochgradige Lustlosigkeit und den insgeheimen Wunsch, die anderen mögen es doch bitte für mich erledigen, als Botschaften transportiert.

Ehrlich, von jemandem, der über 300 Beiträge (!) allein in diesem Forum vorzuweisen hat, hätte ich etwas mehr Professionalität im Umgang mit einem Forum und dem Altruismus seiner Mitglieder erwartet (bei Einsteigern ist eine gewisse Unbeholfenheit, Unbedarftheit und Unkenntnis ja unumgänglich). In einem anderen Delphiforum hätte Dich ein gewisser ((Super-)Moderations-)Drachen, der beileibe kein Kind von Traurigkeit und sich für bestimmte Bereinigungsaktionen nicht zu schade ist (der läßt dafür auch und sogar menschlich ab und zu die Fetzen fliegen), längst zur Schnecke gemacht und einen solchen Diskussionsverlauf wie diesen hier finalisiert.

Fussel9 12. Feb 2011 14:25

AW: Kollision mit Reflektion - Ich raffs net...
 
Kannst du mir mal bitte sagen was dein problem ist? weil es wohl kaum darum gehen kann das ich mathematisch weniger begabt bin als euer lordschaft. Sollte mir der fehler unterlaufen sein doch tatsächlich anzudeuten das ich im bereich des Sinus Cosinus und Tangens nicht gerade viel verstanden habe, so trolle ich mich nun in tiefster verzweiflung in meine ecke....


Dies ist ein Forum d.h. jeder kann (muss aber nicht) hier Fragen stellen, ob diese beantwortet werden hängt einzig und allein von den übrigen Forenmitgliedern ab.
Möchte jemand antworten tut er dies, wenn nicht dann nicht.
Allerdings möchte ich einmal anmerken das solche unqualifizierten und mehr als unnützen Bemerkungen weder mir noch irgendjemandem sonst in diesem Forum helfen.
Und da ist Medium ja wieder ganz groß drin, stimmts nicht?
Hat zwar noch nicht einen Beitrag zu dem Thread geschrieben, aber zum Nörgeln kommt er doch gerne vorbei.

Zitat:

dann vergeht mir die Hilfelust bei meinen ohnehin nur bescheidenen Hilfevoraussetzungen.
Dann lass es doch einfach statt mich hier als faulen dummen Idioten zu bezeichnen.
Denn ich wüsste nicht das wir uns kennen und ich wüsste nicht das du es dir erlauben kannst mich zu beurteilen.

Anbei schreibe ich das Programm an dem ich arbeite freiwillig und würde nur zu gern verstehen wie ich denn jetzt herausfinde wo die Kollision stattgefunden hat. Und wenn ich meine Fragen dann nicht ausformuliert habe, dann liegt das daran, das ich ernsthaft angenommen habe das jemand mit Verstand aus dem Kontext das Problem herauslesen kann.

Und damit ist die Sache für mich gegessen wenn du mich also weiterhin Beleidigen willst und oder mir irgendwelche Vorwürfe machen willst meine Motivation betreffend oder wieso auch immer, dann mach das doch bitte per PN , denn in diesem Thread hat das nichts zu suchen.

Irgendjemand hat vielleicht irgendwann das selbe Problem wie ich, das er es nie richtig gelernt hat und nun versucht es sich selbst anzueignen indem er ein Forum befragt und vielleicht stößt dieser Jemand dann auf diesen Thread und da helfen ihm deine oder Mediums Meinungen über mich nicht weiter.

Medium 12. Feb 2011 15:53

AW: Kollision mit Reflektion - Ich raffs net...
 
Ich freu mich schon, wie du mit deiner Einstellung versuchts mal in der Informatik-Arbeitswelt zu überleben. Der Gedanke daran allein stimmt mich schon fröhlich genug, um hier jetzt nicht ausfallend werden zu müssen. Du fällst mit deinen Threads hier alle Nase lang schon auf die Nase, und ich bin nach wie vor einfach nur baff, dass bei dir nicht im Ansatz die Idee überhaupt aufkommt, dass das an dir liegen könnte.
Und wie du ja selber schon schreibst: Es ist jedem selbst überlassen in einem Forum zu schreiben, und auch was man schreibt. Jetzt kommst du daher, und wirfst mir genau dieses Verhalten vor? :) Ganz ehrlich: Gerade dieses "Vektorgedönz" ist mein Spezialgebiet, und ich könnte dir alles was du brauchst hier hin klatschen. Ist dir damit geholfen? NÖ! Mal davon abgesehen, dass ich dir, mit Blick auf Vergangenes, ohnehin keine Hilfe sein wöllte. Der Hinweis auf Öffnung gegenüber der Grundlagen war mein letzter Versuch.

Ich wünsche noch viel "Erfolg" mit deiner Art!

Delphi-Laie 12. Feb 2011 15:57

AW: Kollision mit Reflektion - Ich raffs net...
 
Da stach ich wohl in ein Wespennest...was ich gar nicht beabsichtigte.

Hitzige Emotionen sind leider ein ganz schlechter Schreibberater (z.B. kam die Kritik von zweien, das nur am Rande!).

Zitat:

Zitat von Fussel9 (Beitrag 1081220)
Hat zwar noch nicht einen Beitrag zu dem Thread geschrieben, aber zum Nörgeln kommt er doch gerne vorbei.

Diese Anspielung nehme ich auf mich bezogen - und sie ist, wenn meine Vermutung stimmt, leider falsch. Schau doch mal, wer Dir als erster zum Thema (und nicht Thread!) antwortete (und immerhin war der Versuch einer Hilfe in jenem Beitrage enthalten). Edit: Galt anscheinend doch nicht mir, bleibt jetzt aber dennoch stehen, weil ich Undank wahrnehme.

Im übrigen warte ich genauso gespannt wie Du, ob und welche Hilfe hier wohl noch kommen mag.

blauweiss 12. Feb 2011 21:26

AW: Kollision mit Reflektion - Ich raffs net...
 
Hallo Fussel9,

Dein geplantes Projekt ist nicht trivial. Du kannst also nicht erwarten, daß es "einfach so" im Handumdrehen funktioniert, wenn Du Code aus dem Internet zusammensuchst und nur mit klein(er)en Anpassungen zum Laufen bringen willst.
Und nichts für ungut, Deine letzten Beiträge klangen auch für mich etwas...unmotiviert...:|

Ich würd Dir folgendes vorschlagen:
1. fang nochmal komplett neu an mit dem Breakout-Clone
2. beschränke Dich am Anfang auf eine einfache Variante
-> z.B. nur 45°-Winkel, nur 4 Wände, ...
3. überlege Dir (auf Papier!), welche Klassen, Methoden und Interaktionen Du brauchen wirst
4. versuche auf fremden Code aus dem Internet zu verzichten (zumindest weitgehend)
5. baue Deine Klassen jetzt von Grund auf
6. programmiere uberschaubar kurze Methoden, die möglichst nur 1 Aufgabe erledigen
7. mach Dich bekannt mit dem Delphi-Debugger
8. teste Einzelfunktionen separat, vielleicht sogar in einem Extra-Projekt
9. dann setze Deine Programmlogik und GUI zusammen
-> sagt sich natürlich leicht, aber wenn Du alles gut vorbereitet hast, haut das hin

Gruß,
blauweiss

Fussel9 13. Feb 2011 03:39

AW: Kollision mit Reflektion - Ich raffs net...
 
Zitat:

Da stach ich wohl in ein Wespennest...was ich gar nicht beabsichtigte.
:lol: das lassen wir mal so stehen....


Danke BlauWeiss, aber für mich die Sache hiermit beendet.


Im Grunde genommen habe ich gesagt worums mir geht und wie ich es sehe, aber manche Leute sind einfach nur zu ... tja da fällt mir nicht mal ein wort für ein ... um mal zu reflektieren was sie getan und was sie gesagt haben...

Zitat:

dass bei dir nicht im Ansatz die Idee überhaupt aufkommt, dass das an dir liegen könnte.
tja.. aber es liegt ja an mir das jemand immer in meine threads kommt und alles nieder ringen will.

Hast du eigendlich nichts besseres zu tun als regelmäßig zu überprüfen ob ich neue threads geschrieben hab, oder machst du das einfach mit jedem hier?

aber wie auch immer dieser Thread ist für mich beendet

@Mod bitte schließ den Thread

Matze 13. Feb 2011 08:34

AW: Kollision mit Reflektion - Ich raffs net...
 
Auf Wunsch des Themenerstellers geschlossen.

G E S C H L O S S E N


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz