unit Unit1;
 // Автор Энгельгардт Влад mailto:Hex@samtel.ru
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, ExtCtrls,math,
  DXSounds, MPlayer;

type
  TForm1 = class(TDXForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    DXInput1: TDXInput;
    DXSpriteEngine1: TDXSpriteEngine;
    DXTimer1: TDXTimer;
    Timer1: TTimer;
    AI: TTimer;
    DXSound1: TDXSound;
    DXWaveList1: TDXWaveList;
    MediaPlayer1: TMediaPlayer;
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
    procedure DXDraw1Initialize(Sender: TObject);
    procedure AITimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

   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;

var
  Form1: TForm1;
  speed,ang,ang2: integer;
  fragpl,fragpl2:integer;
  plres:boolean; // plres переменная респавна true= погиб 1 игрок false 2 игрок
  fa:boolean; //выстрел нашего Ai true стрелял, false не стрелял
  Player:TPlayerone;
  Playerai:TPlayertwo;
  pulxpl,CurrentPanpl:integer;            //Координата патрона,"высота звука"
implementation

{$R *.dfm}


 procedure TPlayerone.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is Tplayerfa then
begin
dead;
fragpl2:=fragpl2+1;
plres:=true;
form1.Timer1.enabled:=true;
end;
end;

procedure TPlayertwo.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is Tplayerfa then
begin
dead;
fragpl:=fragpl+1;
plres:=false;
form1.Timer1.enabled:=true;
end;
   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:=5;
      if isDown in Form1.DXInput1.States then speed:=-5;
      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
           form1.DXWaveList1.Items.Find('fa').Play(true);  ////////////////////
           Image := form1.DXImageList1.Items.Find('pul');
           X:=self.X+cos256(ang)*55;
           Y:=self.y+sin256(ang)*55;
           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;
  AnimCount := Image.PatternCount;    //число кадров
  AnimLooped := True;         //повторять ли анимацию
  AnimSpeed := 10 / 1000;
end;

 destructor TPlayerFa.Destroy;
begin
  inherited Destroy;
end;

  procedure TPlayerFa.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
  angle := anglefa;
  x:=x+cos256(angle)*8;
  y:=y+sin256(angle)*8;
  pulxpl := trunc(x);
   CurrentPanpl := -20000 * pulxpl div form1.DXDraw1.ClientWidth + 10000; ///
    form1.dxwavelist1.Items.Find('fa').pan := CurrentPanpl;  ////
  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;
  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
      if fa=true then
      begin
       if lngpolet-oldlngpolet>=250 then
      begin
       Inc(lngpolet);
         with TPlayerFa.Create(Engine) do
          begin
           form1.DXWaveList1.Items.Find('fa').Play(true);  ////////////
           Image := form1.DXImageList1.Items.Find('pul');
           X:=self.X+cos256(ang2)*55;
           Y:=self.y+sin256(ang2)*55;
           anglefa:=ang2;
           oldlngpolet := lngpolet;
         end;
         fa:=false;
         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(30, 40, 'Фраги первого игрока: '+inttostr(fragpl));
    Textout(240, 40, 'Фраги второго игрока: '+inttostr(fragpl2));
    Textout(0, 0, 'FPS: '+inttostr(DXTimer1.FrameRate));
    Textout(0, 24, 'Спрайтов: '+inttostr(DXSpriteEngine1.Engine.AllCount));
    Textout(0, 60, 'angle: '+inttostr(playerai.angle));
    Textout(0, 70, 'plx: '+inttostr(round(player.x)));
    Textout(0, 80, 'ply: '+inttostr(Round(player.y)));
    Textout(0, 90, 'plxai: '+inttostr(round(playerai.x)));
    Textout(0, 100, 'plyai: '+inttostr(round(playerai.y)));
     Textout(0, 110, 'CurrentPanpl: '+inttostr(CurrentPanpl));
    Release;
  end;
  DXDraw1.Flip;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MediaPlayer1.Play;
randomize;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=VK_ESCAPE then application.Terminate
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin

if plres=true then
begin
  Player:= TPlayerone.Create(DXSpriteEngine1.Engine);
  Player.Image := form1.dxImageList1.Items.Find('krut');
  Player.x:=350;
  Player.y:=250;
  Player.Width := Player.Image.Width;
  Player.Height := Player.Image.Height;
end;

if plres=false then
begin
 Playerai:= TPlayertwo.Create(DXSpriteEngine1.Engine);
 Playerai.Image := DXImageList1.Items.Find('krut');
 Playerai.X := 50;
 Playerai.Y := 250;
 Playerai.Width := Playerai.Image.Width;
 Playerai.Height := Playerai.Image.Height;
end;
timer1.Enabled := false;
  end;
procedure TForm1.DXDraw1Initialize(Sender: TObject);
begin
 Playerai:= TPlayertwo.Create(DXSpriteEngine1.Engine);
 Playerai.Image := DXImageList1.Items.Find('krut');
 Playerai.X := 50;
 Playerai.Y := 250;
 Playerai.Width := Playerai.Image.Width;
 Playerai.Height := Playerai.Image.Height;
 
 Player:= TPlayerone.Create(DXSpriteEngine1.Engine);
 Player.Image := form1.dxImageList1.Items.Find('krut');
 Player.x:=350;
 Player.y:=250;
 Player.Width := Player.Image.Width;
 Player.Height := Player.Image.Height;
end;

procedure TForm1.AITimer(Sender: TObject);
begin
playerai.angle:=trunc(1/sin256(trunc((player.y-playerai.y)/(player.x-playerai.x))));
If (player.y-playerai.y < 0)and(player.x-playerai.x > 0) then  playerai.angle:=playerai.angle+192;
If (player.y-playerai.y < 0)and(player.x-playerai.x < 0) then  playerai.angle:=playerai.angle+128;
If (player.y-playerai.y > 0)and(player.x-playerai.x < 0) then  playerai.angle:=playerai.angle+64;
   if player.x <= playerai.x then
      playerai.x:=playerai.x-2.5;
    if player.x > playerai.x then
      playerai.x:=playerai.x+2.5;
    if player.y <= playerai.y then
      playerai.y:=playerai.y-2.5;
    if player.y > playerai.y then
      playerai.y:=playerai.y+2.5;
  if playerai.x >= player.x-140 then
    begin
      playerai.x:=playerai.x-2.5;
     end;
  if playerai.y>= player.y-140 then
    begin
     playerai.y:=playerai.y-2.5;
     end;
  if playerai.y >=player.y-150 then
    begin
    if playerai.x >=player.x-150 then
    begin
    fa:=true;
    end;
    end;
end;

end.


