unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, ExtCtrls;

type
  TForm1 = class(TDXForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    DXInput1: TDXInput;
    DXSpriteEngine1: TDXSpriteEngine;
    DXTimer1: TDXTimer;
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i:boolean;                                //переменная движения в сторону BOSA
  plx:double;            //X плэера

implementation

{$R *.dfm}
  type
TPlayerSprite = class(TImageSprite)
   private
    lngpolet:integer;
    oldlngpolet:integer;
     procedure Hit;
  protected
    procedure DoMove(MoveCount: Integer); override;
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override; //вот это мы add
  end;




  TBoSS = class(TImageSprite)
   protected
      procedure DoMove(MoveCount: Integer); override;
     procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
  public
    constructor Create(AParent: TSprite); override;
    destructor Destroy; override;
  end;

   TPlayerFa = class(TImageSprite)
   private
   stril:integer; // Как вы заметили добавилась переменная
   protected
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
    procedure DoMove(MoveCount: Integer); override;
   public
    constructor Create(AParent: TSprite); override;
    destructor Destroy; override;
  end;

  procedure TplayerSprite.Hit;
begin
  Collisioned := False;
    Image := Form1.dxImageList1.Items.Find('Ex');
    Width := Image.Width;
    Height := Image.Height;
    AnimCount := Image.PatternCount;
    AnimLooped := False;
    AnimSpeed := 15/1000;
    AnimPos := 0;
end;


  procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
     begin
     if sprite is Tplayerfa then
     begin
    TPlayerSprite(Sprite).Hit;
    dead;
    end;
     Done := False;
     end;



Procedure TPlayerSprite.DoMove(MoveCount: Integer);
  begin
     inherited DoMove(MoveCount);
       plx:=x;
      if isLeft in Form1.DXInput1.States then
      begin
      x:=x-5;
      plx:=x;
      end;
      if isRight in Form1.DXInput1.States
      then
      begin
      X:=x+5;
      plx:=x;
      end;
      if isup in Form1.DXInput1.States then
      begin
       if lngpolet-oldlngpolet>=250 then
      begin
       Inc(lngpolet);
      with TPlayerFa.Create(Engine) do
      begin
      PixelCheck := True;
      Image := form1.dxImageList1.Items.Find('Pula');
      X := Self.X+Self.Width  -40;                    
      Y := Self.Y+Self.Height -80 ;                   
      Width := Image.Width;
      Height := Image.Height;
      stril:=-4;
      end;
      oldlngpolet := lngpolet;
      end;
      end;
      if  y >= form1.DXDraw1.SurfaceHeight-image.Height then  
      y := form1.DXDraw1.SurfaceHeight-image.Height;               
      if  x >= form1.DXDraw1.SurfaceWidth -image.Width  then  
      x := form1.DXDraw1.SurfaceWidth -image.Width;                 
      if  y <= 0 then
      y := 1;
      if  x <= 0 then
      x:=1;
       lngpolet := lngpolet + MoveCount;
       Collision;
end;

  Procedure TPlayerFa.DoMove(MoveCount: Integer);
begin
   inherited DoMove(MoveCount);
   y:=y+stril;
    if y<= 0 then Dead;
    if y>= 600 then Dead;
end;

 Procedure TBoSS.DoMove(MoveCount: Integer);
  begin
   inherited DoMove(MoveCount);
   if x>= 600 then I:= false;
   if x<= 0 then I:= true;
   if i= true then X := X+5;
   if i= false then X := X-5;
   if plx=x then
   begin
     with TPlayerFa.Create(Engine) do
      begin
      PixelCheck := True;
      Image := form1.dxImageList1.Items.Find('Pula');
      X := Self.X+Self.Width-70;
      Y := Self.Y+Self.Height+10;
      Width := Image.Width;
      Height := Image.Height;
      stril:=5;
      end;
   end;
    Collision;
end;


procedure TPlayerFa.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TBoss then dead;
 Collision;
end;

procedure TBoss.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
     if sprite is Tplayerfa then
     begin
    TPlayerSprite(Sprite).Hit;
    dead;
    end;
     Done := False;
end;


constructor TBOSS.Create(AParent: TSprite);
begin
  inherited Create(AParent);
  Image := form1.DXImageList1.Items.Find('BOSS');
  Width := Image.Width;
  Height := Image.Height;
end;

constructor TPlayerFa.Create(AParent: TSprite);
begin
  inherited Create(AParent);
  Image := form1.DXImageList1.Items.Find('Pula');
  Width := Image.Width;
  Height := Image.Height;
  AnimCount := Image.PatternCount;    //число кадров
  AnimLooped := True;                 //повторять ли анимацию
  AnimSpeed := 10 / 1000;
  Collision;
end;

destructor TPlayerFa.Destroy;
begin
  inherited Destroy;
end;

destructor TBoss.Destroy;
begin
  inherited Destroy;
end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then exit;
  DXInput1.Update;
  DXSpriteEngine1.Move(LagCount);
  DXSpriteEngine1.Dead;
  DXDraw1.Surface.Fill(0);
  DXSpriteEngine1.Draw;
  DXDraw1.Flip;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  I:=true;

    with TBackgroundSprite.Create(DXSpriteEngine1.Engine) do
begin
  SetMapSize(1,1);
  Image := dxImageList1.Items.Find('bg');
  Z:= -2;
  Tile := True;
end; 
with TBOSS.Create(Dxspriteengine1.Engine) do
begin
  PixelCheck := True;
  Image := form1.dxImageList1.Items.Find('BOSS');
  x:=350;
  y:=10;
  Width := Image.Width;
  Height := Image.Height;
end;

with TPlayerSprite.Create(Dxspriteengine1.Engine) do
begin
 PixelCheck := True;
  Image := form1.dxImageList1.Items.Find('Pla');
  x:=350;
  y:=500;
  Width := Image.Width;
  Height := Image.Height;
end;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=VK_ESCAPE then application.Terminate
end;

end.
