unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls;

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;
  speed,speed2,ang,ang2: integer;
implementation

{$R *.dfm}
  type
 TPlayerone = class(TImageSprite)
     private
    lngpolet:integer;
    oldlngpolet:integer;
  protected
    procedure DoMove(MoveCount: Integer); override;
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
  end;

  TPlayerFa = class(TImageSprite)  // playerов пуля
  private
    anglefa:integer; // угол под которым летит пуля
   protected
    procedure DoMove(MoveCount: Integer); override;
   public
    constructor Create(AParent: TSprite); override;
    destructor Destroy; override;
  end;

 TPlayertwo = class(TImageSprite)
     private
    lngpolet:integer;
    oldlngpolet:integer;
  protected
    procedure DoMove(MoveCount: Integer); override;
        procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
  end;

     procedure TPlayerone.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is Tplayerfa then dead;
   end;
   
     procedure TPlayertwo.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is Tplayerfa then dead;
   end;

 Procedure tPlayerone.DoMove(MoveCount: Integer);
  begin
     inherited DoMove(MoveCount);
  ang:=angle;
  x:=x+cos256(Angle)*speed;
  y:=y+sin256(Angle)*speed;
  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;
    begin
     speed:=0;
      if isLeft in Form1.DXInput1.States then angle:=angle-5;
      if isRight in Form1.DXInput1.States then angle:=angle+5;;
      if isup in Form1.DXInput1.States then speed:=4 ;
      if isDown in Form1.DXInput1.States then speed:=-4;
      if isbutton2 in Form1.DXInput1.States then
      begin
      x:= x+cos256 (angle+64)*3;
      y:= y+sin256 (angle+64)*3 ;
      end;
      if isbutton3 in Form1.DXInput1.States then
      begin
      x:= x+cos256 (angle-64)*3;
      y:= y+sin256 (angle-64)*3 ;
      end;
      if isbutton1 in Form1.DXInput1.States then
      begin
       if lngpolet-oldlngpolet>=250 then
      begin
       Inc(lngpolet);
         with TPlayerFa.Create(Engine) do
          begin
           Image := form1.DXImageList1.Items.Find('pul');
           X:=self.X+cos256(ang)*50;
           Y:=self.y+sin256(ang)*50;
           anglefa:=ang;
           oldlngpolet := lngpolet;
         end;
         end;
    end;
      lngpolet := lngpolet + MoveCount;
end;
 Collision;
end;
     constructor TPlayerFa.Create(AParent: TSprite);
begin
  inherited Create(AParent);
  Image := form1.DXImageList1.Items.Find('pul');
  Width := Image.Width;
  Height := Image.Height;
end;

 destructor TPlayerFa.Destroy;
begin
  inherited Destroy;
end;

  procedure TPlayerFa.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
  angle := anglefa;
  x:=x+cos256(angle)*7;
  y:=y+sin256(angle)*7;
  if X>= 800 then Dead;
  if y>= 600 then Dead;
  if X<= 0 then Dead;
  if y<= 0 then Dead;
  Collision;
end;

 Procedure TPlayertwo.DoMove(MoveCount: Integer);
  begin
     inherited DoMove(MoveCount);
  ang2:=angle;
  x:=x+cos256(Angle)*speed2;
  y:=y+sin256(Angle)*speed2;
  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;
    begin
    speed2:=0;
      if isbutton6 in Form1.DXInput1.States then angle:=angle-5;
      if isbutton7 in Form1.DXInput1.States then angle:=angle+5;;
      if isbutton4 in Form1.DXInput1.States then speed2:=4 ;
      if isbutton5 in Form1.DXInput1.States then speed2:=-4;
      if isbutton9 in Form1.DXInput1.States then
           begin
      x:= x+cos256 (angle-64)*3;
      y:= y+sin256 (angle-64)*3 ;
           end;
      if isbutton10 in Form1.DXInput1.States then
        begin
          x:= x+cos256 (angle+64)*3;
      y:= y+sin256 (angle+64)*3 ;
      end;
      if isbutton8 in Form1.DXInput1.States then
      begin
       if lngpolet-oldlngpolet>=250 then
      begin
       Inc(lngpolet);
         with TPlayerFa.Create(Engine) do
          begin
           Image := form1.DXImageList1.Items.Find('pul');
           X:=self.X+cos256(ang2)*50;
           Y:=self.y+sin256(ang2)*50;
           anglefa:=ang2;
           oldlngpolet := lngpolet;
         end;
         end;
    end;
      lngpolet := lngpolet + MoveCount;
end;
 Collision;
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;
    with DXDraw1.Surface.Canvas do
  begin
    Brush.Style := bsClear;
    Font.Color := clWhite;
    Font.Size := 12;
    Textout(0, 0, 'FPS: '+inttostr(DXTimer1.FrameRate));
    Textout(0, 24, 'Спрайтов: '+inttostr(DXSpriteEngine1.Engine.AllCount));
    Release;
  end;
  DXDraw1.Flip;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with TPlayerone.Create(Dxspriteengine1.Engine) do
begin
 PixelCheck := True;
  Image := form1.dxImageList1.Items.Find('krut');
  x:=350;
  y:=250;
  Width := Image.Width;
  Height := Image.Height;
end;

with TPlayertwo.Create(Dxspriteengine1.Engine) do
begin
 PixelCheck := True;
  Image := form1.dxImageList1.Items.Find('krut');
  x:=50;
  y:=250;
  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.


