Einzelnen Beitrag anzeigen

Green

Registriert seit: 11. Jun 2006
156 Beiträge
 
#3

Re: Image darf nicht durch Image bewegt werden!

  Alt 27. Feb 2008, 22:54
So ein Zufall das ich gerade einen Kollisionsmanager schreibe:


Als CollisionManager.pas speichern:
Delphi-Quellcode:
unit CollisionManager;

interface

type
  TCollisionManager = class(TObject)
    private
      cmA: TQuad;
      cmB: TQuad;
      function getA: TQuad;
      function getB: TQuad;
      procedure setA(pA: TQuad);
      procedure setB(pB: TQuad);
    public
      property PointA: TQuad read getA write setA;
      property PointB: TQuad read getB write setB;
      function Collision: boolean;
      function Over2Points(x1, y1, x2, y2, x: double): double;
  end;

implementation

  function TCollisionManager.getA;
  begin
    Result := cmA;
  end;

  function TCollisionManager.getB;
  begin
    Result := cmB;
  end;
  
  procedure TCollisionManager.setA(pA: TQuad);
  begin
    cmA := pA;
  end;

  procedure TCollisionManager.setB(pB: TQuad);
  begin
    cmB := pB;
  end;

  function TCollisionManager.Collision: boolean;
  begin
    Result := false;
    if (cmA.LU.x <= cmB.LU.x + cmB.width) and (cmA.LU.x + cmA.width >= cmB.LU.x) then //X-Achsen Kollision
      if (cmA.LU.y <= cmB.LU.y + cmB.height) and (cmA.LU.y + cmA.height >= cmB.LU.y) then //Y-Achsen Kollision
        Result := true //X+Y Achesn Kollision = Kollision
  end;

  function TCollisionManager.Over2Points(x1, y1, x2, y2, x: double): double;
  begin
    Result := ((y1-y2)*x + x1*y2 - x2*y1) / (x1 - x2);
  end;

end.
Noch eine Zweite Datei "MyTypes.pas" im gleichen Verzeichnis anlegen:
Delphi-Quellcode:
unit MyTypes;

interface

uses Windows, Graphics;

type
  T2DimPoint = packed record
    x: double;
    y: double;
  end;
  TQuad = packed record
    LU: T2DimPoint;
    Width: double;
    Height: double;
  end;
implementation

end.
Und jetzt die neue Form die du machst:
Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  CollisionManager: TCollisionManager;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  tempQuad: TQuad;
begin
    TempQuad.Lu.x := Image1.Top; //XWert links Unten
    TempQuad.Lu.y := Image1.Left; //YWert Links Unten
    TempQuad.width := Image1.Width;
    TempQuad.height:= Image1.Height;

    CollisionManager.PointA := TempQuad;

    TempQuad.Lu.x := Image2.Top; //XWert links Unten
    TempQuad.Lu.y := Image2.Left; //YWert Links Unten
    TempQuad.width := Image2.Width;
    TempQuad.height:= Image2.Height;
    
    CollisionManager.PointB := TempQuad;

    if CollisionManager.Collision then showmessage('Kollision!');
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  CollisionManager := TCollisionManager.Create;
end;

end.
In Uses werden MyTypes und CollisionManager includet, dann im Formcreate wird eine neue CollisionManager iNstanz erzeugt.
Dann setzt du die Punkte mit einem Temporären Quad in den Manager ein und fragst ihn obs ne Kollision ist.
Fertig!

lG Green
  Mit Zitat antworten Zitat