Einzelnen Beitrag anzeigen

Benutzerbild von Fussel9
Fussel9

Registriert seit: 25. Mai 2009
322 Beiträge
 
Turbo Delphi für Win32
 
#1

Kollision mit Reflektion - Ich raffs net...

  Alt 9. Feb 2011, 21:30
Delphi-Version: 2006
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:
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


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
Miniaturansicht angehängter Grafiken
winkel.jpg