unit 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.