unit Unit1;
//c'est exemple vous montre comment utiliser une carte créer
//avec DxMapEdit en utilisant le composant Dxmap
//Congré Stéphane : StefCongre@aol.com
// Web : www.cdfrance.com/dbi/steph.htm 
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DXDraws, StdCtrls, ExtCtrls, DXClass, DXSprite, DXInput, DxMap, SprAnim;

type

TPlayerSprite = class(TImageSprite)
  protected
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
    procedure DoMove(MoveCount: Integer); override;
  end;

  TForm1 = class(TdxForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    DXSpriteEngine1: TDXSpriteEngine;
    DXTimer1: TDXTimer;
    DXInput1: TDXInput;
    DxMap1: TDxMap;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
    procedure DXDraw1Initializing(Sender: TObject);
  private
      { Déclarations privées }
  public
  PlayerSprite: TSprite;
  speed:integer;
  oldx,oldy:double;


    { Déclarations publiques }

  end;


var
  Form1: TForm1;

implementation

{$R *.DFM}
// Déclaration de la class du Sprite du joueur
procedure TPlayerSprite.DoCollision(sprite:Tsprite;var Done:Boolean);
begin
//test si le sprite est en collision avec un décors inaccessible
//de DxMapEdit si c'est la ces le remet aux coordonnées
// avant le déplacement.
if (sprite is TDecAcces )=false or (sprite is TBackgroundsprite) then begin
TPlayerSprite(form1.playerSprite).x:=form1.oldx;
TPlayerSprite(form1.playerSprite).y:=form1.oldy;
end;
  done:=false;
end;

procedure TPlayerSprite.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
    AnimSpeed := 30/1000;   //Vitesse d'animation 10 images / seconds
    form1.speed:=3000;

  if isUp in form1.DXInput1.States then BEGIN  //si touche clavier ou
  // joystick vers le haut
    Y := Y - (200/1000)*MoveCount;//déplacement de la carte
    animlooped:=true;//animation démarré;
    AnimStart := 18; //position de départ
    AnimCount := 4;//nombre d'image de l'animation
    end;

  if isDown in form1.DXInput1.States then begin
    Y := Y + (200/1000)*MoveCount;
      animlooped:=true;
      AnimStart := 14;
      AnimCount := 4;
    end;
  if isLeft in form1.DXInput1.States then begin
    form1.speed:=5000;
    X := X - (200/1000)*MoveCount;
    AnimStart := 0;
    AnimCount := 6;
    animlooped:=true;
    end;
  if isRight in Form1.DXInput1.States then begin
    form1.speed:=5000;
    X := X + (200/1000)*MoveCount;
    AnimStart := 7;
    AnimCount := 6;
    animlooped:=true;
    end;

    collision;  //test de collision
    form1.oldx:=x;//position du sprite avant déplacement
    form1.oldy:=y;//position du sprite avant déplacement
    //déplacement de la carte
    Engine.X := -X+Engine.Width div 2-Width div 2;
    Engine.Y := -Y+Engine.Height div 2-Height div 2;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i,x,y:integer;
begin
//Initialisation de la palette
dxImageList1.Items.MakeColorTable;
DXDraw1.ColorTable := dxImageList1.Items.ColorTable;
DXDraw1.DefColorTable := dxImageList1.Items.ColorTable;
DXDraw1.UpdatePalette;
//initialisation du sprite principal
PlayerSprite := TPlayerSprite.Create(DXSpriteEngine1.Engine);
with TPlayerSprite(PlayerSprite) do
begin
 Image := dxImageList1.Items.Find('heroine');  //recherche de l'image pour
 x:=-50 ;
 y:=-50;                                         // le sprite
 Z := 1;
   end;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
//passage en plein écran ou en fenêtre
    if doFullScreen in DXDraw1.Options then
   begin
     RestoreWindow;

   DXDraw1.Cursor := crDefault;
     BorderStyle := bsSizeable;
    DXDraw1.Options := DXDraw1.Options - [doFullScreen];
  end else
   begin
     StoreWindow;

    DXDraw1.Cursor := crNone;
    BorderStyle := bsNone;
  DXDraw1.Options := DXDraw1.Options + [doFullScreen];
    end;

  DXDraw1.Initialize;

end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
 DXInput1.Update;
 LagCount := speed div 100;
 DXSpriteEngine1.Move(lagcount);    //lagcount-> vitesse de déplacement
 {Dessin du sprite à sa nouvelle position}
 DXSpriteEngine1.Dead;
 DXDraw1.Surface.Fill(1);
 DXSpriteEngine1.Draw;
 {flip}
 DXdraw1.flip;
end;

procedure TForm1.DXDraw1Initializing(Sender: TObject);
begin
 //appel du dessin de la carte créée avec DxMapEdit
 dxmap1.DrawMap('nex.dxc');
end;

end.
