unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, ExtCtrls, DXPlay,{незаб!!}DirectX;

  const
  DXACTION_MESSAGE = 1;
  DXKEY_LEFT = 1;
  DXKEY_RIGHT = 2;
  DXKEY_SHOOT = 3;

  type
  TDXActionMessage = record
    dwType: DWORD;
    ActionCode: Integer;
  end;
  
    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;
  end;

  TPLU = 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;
  
type
  TForm1 = class(TDXForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    DXInput1: TDXInput;
    DXSpriteEngine1: TDXSpriteEngine;
    DXTimer1: TDXTimer;
    DXPlay1: TDXPlay;
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DXPlay1Message(Sender: TObject; From: TDXPlayPlayer;
      Data: Pointer; DataSize: Integer);
    procedure DXDraw1Initialize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  plu:Tplu;
  PlayerSprite:TPlayerSprite;

implementation

{$R *.dfm}

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);
  var
   Msg: ^TDXActionMessage;
   msgSize: Integer;
  begin
   inherited DoMove(MoveCount);
   if form1.DXPlay1.Players.Count =2 then
   begin
     if isLeft in Form1.DXInput1.States then
      begin
      x:=x-5;
      msgSize := SizeOf( TDXActionMessage );
      GetMem(Msg, MsgSize);
      msg.dwType := DXACTION_MESSAGE;
      msg.ActionCode := DXKEY_LEFT;
      form1.DXPlay1.SendMessage(DPID_ALLPLAYERS,msg,msgsize);
      end;
      if isRight in Form1.DXInput1.States
      then
      begin
      X:=x+5;
      msgSize := SizeOf( TDXActionMessage );
      GetMem(Msg, MsgSize);
      msg.dwType := DXACTION_MESSAGE;
      msg.ActionCode := DXKEY_RIGHT;
      form1.DXPlay1.SendMessage(DPID_ALLPLAYERS,msg,msgsize);
      end;
      if isup in Form1.DXInput1.States then
      begin
       if lngpolet-oldlngpolet>=900 then
      begin
       Inc(lngpolet);
      with TPlayerFa.Create(Engine) do
      begin
      msgSize := SizeOf( TDXActionMessage );
      GetMem(Msg, MsgSize);
      msg.dwType := DXACTION_MESSAGE;
      msg.ActionCode := DXKEY_SHOOT;
      form1.DXPlay1.SendMessage(DPID_ALLPLAYERS,msg,msgsize);
      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;
 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 TPLU.DoMove(MoveCount: Integer);
  begin
   inherited DoMove(MoveCount);
   Collision;
end;

procedure TPlayerFa.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TPLU then dead;
 Collision;
end;

procedure TPLU.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if sprite is Tplayerfa then
   begin
    TPlayerSprite(Sprite).Hit;
    dead;
    end;
    Done := False;
end;

constructor TPLU.Create(AParent: TSprite);
begin
  inherited Create(AParent);
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 TPLU.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
 try
    DXPlay1.Open;
  except
   on E: Exception do
    begin
      Application.ShowMainForm := False;
      Application.HandleException(E);
      Application.Terminate;
    end;
  end;

with TBackgroundSprite.Create(DXSpriteEngine1.Engine) do
begin
  SetMapSize(1,1);
  Image := dxImageList1.Items.Find('bg');
  Z:= -2;
  Tile := True;
end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=VK_ESCAPE then application.Terminate;
end;

procedure TForm1.DXPlay1Message(Sender: TObject; From: TDXPlayPlayer;
  Data: Pointer; DataSize: Integer);
begin
   if TDXActionMessage( Data^ ).actioncode AND DXKEY_LEFT = DXKEY_LEFT then
          plu.X:=plu.X -5;
   if TDXActionMessage( Data^ ).actioncode AND DXKEY_RIGHT = DXKEY_RIGHT then
          plu.X:=plu.X +5;
   if TDXActionMessage( Data^ ).actioncode AND DXKEY_SHOOT = DXKEY_SHOOT then
begin
     with TPlayerFa.Create(dxspriteengine1.Engine) do
      begin
      PixelCheck := True;
      Image := form1.dxImageList1.Items.Find('Pula');
      X := plu.X+plu.Width-70;
      Y := plu.Y+plu.Height+10;
      Width := Image.Width;
      Height := Image.Height;
      stril:=4;
      Collision;
      end;
      end;
end;

procedure TForm1.DXDraw1Initialize(Sender: TObject);
begin
  plu:= Tplu.Create(DXSpriteEngine1.Engine);
  plu.PixelCheck  := True;
  plu.Image := form1.dxImageList1.Items.Find('plu');
  plu.x:=350;
  plu.y:=10;
  plu.Width := plu.Image.Width;
  plu.Height := plu.Image.Height;

  PlayerSprite:= TPlayerSprite.Create(DXSpriteEngine1.Engine);
  PlayerSprite.PixelCheck := True;
  PlayerSprite.Image := form1.dxImageList1.Items.Find('Pla');
  PlayerSprite.x:=350;
  PlayerSprite.y:=500;
  PlayerSprite.Width := PlayerSprite.Image.Width;
  PlayerSprite.Height := PlayerSprite.Image.Height;
end;
end.
