All pastes #2087064 Raw Edit

Someone

public text v1 · immutable
#2087064 ·published 2011-10-05 07:08 UTC
rendered paste body
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.