rendered paste bodyunit mazewalk_collisionobjectclass;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, LCLType, Math;
type
TMoveDirection = (mdUp, mdDown, mdLeft, mdRight);
TCollisionobject = class;
{ TCollisionObject }
TCollisionEvent = procedure(sCollisionObject: TCollisionObject) of object;
TCollisionObject = class(TCustomImage)
private
fObjectList: TList;
fPixelsPerMove: extended;
fMoveDirection: TMoveDirection;
fOnCollision: TCollisionEvent;
fCurrentPos: extended;
{ private declarations }
protected
{ protected declarations }
function CollisionDetected (const sRect: TRect) : boolean;
property OnCollision : TCollisionEvent read fOnCollision write fOnCollision;
public
{ public declarations }
constructor Create (AOwner: TComponent) ; override;
destructor Destroy ; override;
procedure Move;
property Parent;
property Visible;
property Direction : TMoveDirection read fMoveDirection write fMoveDirection;
property PixelsPerMove : extended read fPixelsPerMove write fPixelsPerMove;
property ObjectList : TList read fObjectList write fObjectList;
end;
// Description:
implementation
{ TCollisionObject }
// Description: Create
constructor TCollisionObject.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fPixelsPerMove := 1;
fCurrentPos := 0;
fMoveDirection := mdUp;
end;
// Description: Destroy
destructor TCollisionObject.Destroy;
begin
inherited Destroy;
end;
// Description: CollisionDetected
function TCollisionObject.CollisionDetected(const sRect: TRect): boolean;
begin
Result := ((Top + Height >= sRect.Top)
and (Top <= sRect.Bottom)
and ((Left + Width) >= sRect.Left)
and (Left <= sRect.Right)); // Collision on
end;
// Description: Move
procedure TCollisionObject.Move;
var zColObj: TCollisionObject;
zCounter: integer;
begin
fCurrentPos := fCurrentPos + fPixelsPerMove;
if fCurrentPos >= 1 then begin
if Direction = mdLeft then Left := Left - Trunc(fCurrentPos)
else if Direction = mdRight then Left := Left + Trunc(fCurrentPos)
else if Direction = mdUp then Top := Top - Trunc(fCurrentPos)
else Top := Top + Trunc(fCurrentPos);
fCurrentPos := fCurrentPos - Trunc(fCurrentPos);
end;
for zCounter := 0 to fObjectList.Count - 1 do begin
zColObj := TCollisionObject(fObjectList[zCounter]);
if CollisionDetected(Rect(zColObj.Left, zColObj.Top, zColObj.Left + zColObj.Width, zColObj.Top + zColObj.Height)) then begin
if Assigned(fOnCollision) then fOnCollision(zColObj);
exit;
end;
end;
end;
end.