unit ddddtest;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DDDD,
  StdCtrls,DDDDut, ExtCtrls, ddraw;

type
  TForm1 = class(TForm)
    DDDD1: TDDDD;
    procedure FormDestroy(Sender: TObject);
    procedure DDDD1Init(Sender: TObject; fNeedChange: Boolean);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private 宣言 }
    Surf:Array[0..2] of TDDDDSurface;
    Spr:TDDDDSprite;
    Bg,Bg2:TDDDDBg;
  public
    { Public 宣言 }
    procedure AppIdle(Sender: TObject; var Done: Boolean);
  end;

var
  Form1: TForm1;
const
  NUM_SNAKE = 16;

implementation



procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  //ヘビのような動き
  Spr[0].X:=X-32;
  Spr[0].Y:=Y-32;
end;

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
var
  i:Integer;
begin
  For i:=NUM_SNAKE-1 downto 1 do begin
    Spr[i].Pos:=Spr[i-1].Pos;
  end;

  Bg.RollX:=Bg.RollX+4;
  Bg.RollY:=Bg.RollY+4;
  Bg2.RollX:=Bg2.RollX+1;
  //Bg2.RollY:=Bg2.RollY+2;

  DDDD1.Clear;
  Bg2.Update;
  Spr.Update;
  Bg.Update;

  DDDD1.Flip;

  Done:=False;
end;

procedure TForm1.DDDD1Init(Sender: TObject; fNeedChange: Boolean);
var
  r:Trect;
  i,x,y:Integer;
  ck:DWord;
begin
  //AutoDisplayModeInitializeがFalseの場合でもコメントカットするだけ
  //DDDD1.SetDisplayMode(False,320,240,8,0);

  //サーフェス作って
  Surf[0]:=TDDDDSurface.Create(DDDD1,64,64, 0);
  Surf[1]:=TDDDDSurface.Create(DDDD1,256,128, 0);  //カラーキーはとりあえず適当
  Surf[2]:=TDDDDSurface.Create(DDDD1,128,64, 0);

  //ビットマップをロードして
  Surf[0].LoadBMP('mech1.bmp');
  ck:=Surf[0].Pixels[0,0];
  Surf[0].ColorKey:=ck;  //カラーキーをここで設定
  Surf[1].LoadBMP('cloud1.bmp');
  Surf[1].ColorKey:=Surf[1].Pixels[0,0];
  Surf[2].LoadBMP('cloud2.bmp');

  DDDD1.BackColor:=Surf[1].Pixels[0,0];   //背景色を設定


  //スプライトレジスタへの登録
  Spr:=TDDDDSprite.Create(NUM_SNAKE,1);
  r:=Rect(0,0,64,64);
  Spr.SetShape(0, Surf[0], r);
  for i:=0 to NUM_SNAKE-1 do begin
    Spr[i].IShape:=0;
    Spr[i].Visible:=True;
  end;

  //BGレジスタへの登録
  Bg:=TDDDDBG.Create(4,3, 256,128); //横に4個,縦に3個、チップサイズは256*128
  Bg.SetChip(0,Surf[1], 0,0,True);
  for x:=0 to 3 do begin
    for y:=0 to 2 do begin
      if (y+x) Mod 2 = 1 then
        Bg[x,y]:=0
      else
        Bg[x,y]:=DDBG_UNSEEN;
    end;
  end;


  //二面目への登録
  Bg2:=TDDDDBG.Create(5,8, 128,64); //横に5個,縦に8個、チップサイズは128*64
  Bg2.SetChip(0,Surf[2], 0,0,False);
  for x:=0 to 4 do begin
    for y:=0 to 7 do begin
      if (y+x) Mod 3 = 0 then
        Bg2[x,y]:=0
      else
        Bg2[x,y]:=DDBG_UNSEEN;
    end;
  end;

  //マウスカーソルを消す
  ShowCursor(False);

  //アイドル時のループを付ける
  Application.OnIdle:=AppIdle;

end;


{$R *.DFM}

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ShowCursor(True);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then begin
    Spr[0].Width:=Spr[0].Width+1;
    //Spr[0].Height:=Spr[0].Height+1;
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_ESCAPE then begin
    Application.Terminate;
  end;
end;

end.
