delphiX控件,我觉得最难用就是Tspriteengine了。不知怎么用的。请用过的大是解释一下。我现在连怎么样显示精灵都还没弄懂。

解决方案 »

  1.   

    最好看Demounit Main;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, Menus, DXClass, DXSprite, DXInput, DXDraws,
      DXSounds, MMSystem, Wave;type
      TMainForm = class(TDXForm)
        DXTimer: TDXTimer;
        DXDraw: TDXDraw;
        DXSpriteEngine: TDXSpriteEngine;
        DXInput: TDXInput;
        ImageList: TDXImageList;
        DXWaveList: TDXWaveList;
        DXSound: TDXSound;
        procedure FormKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure DXDrawFinalize(Sender: TObject);
        procedure DXDrawInitialize(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
        procedure DXTimerActivate(Sender: TObject);
        procedure DXTimerDeactivate(Sender: TObject);
        procedure DXDrawClick(Sender: TObject);
      private
        FMoveMode: Boolean;
      end;var
      MainForm: TMainForm;implementation{$R *.DFM}type  TMonoSprite = class(TImageSprite)
      private
        FCounter: Double;
        FS: Integer;
        procedure Hit;
      public
        procedure DoMove(MoveCount: Integer); override;
      end;  TPlayerSprite = class(TImageSprite)
      protected
        procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
        procedure DoMove(MoveCount: Integer); override;
      end;procedure TMonoSprite.DoMove(MoveCount: Integer);
    begin
      inherited DoMove(MoveCount);
      PixelCheck := True;
      FCounter := FCounter + (100/1000)*MoveCount;
      X := X+Sin256(Trunc(FCounter))*(200/1000)*MoveCount;
      Y := Y+Cos256(Trunc(FCounter))*(200/1000)*MoveCount;  if not Collisioned then
      begin
        Inc(FS, MoveCount);
        if FS>200 then Dead;
      end;
    end;procedure TMonoSprite.Hit;
    begin
      Collisioned := False;  Image := MainForm.ImageList.Items.Find('img1-2');
      MainForm.DXWaveList.Items.Find('snd').Play(False);
      MainForm.DXInput.Joystick.Effects.Find('eff1').Start;
    end;procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
    begin
      if Sprite is TMonoSprite then
        TMonoSprite(Sprite).Hit;
      Done := False;
    end;procedure TPlayerSprite.DoMove(MoveCount: Integer);
    begin
      inherited DoMove(MoveCount);  if (MainForm.DXInput.Joystick.X<>0) or (MainForm.DXInput.Joystick.Y<>0) then
      begin
        X := X + (MainForm.DXInput.Joystick.X/1000)*MoveCount;
        Y := Y + (MainForm.DXInput.Joystick.Y/1000)*MoveCount;
      end else
      begin
        if isUp in MainForm.DXInput.States then
          Y := Y - (300/1000)*MoveCount;    if isDown in MainForm.DXInput.States then
          Y := Y + (300/1000)*MoveCount;    if isLeft in MainForm.DXInput.States then
          X := X - (300/1000)*MoveCount;    if isRight in MainForm.DXInput.States then
          X := X + (300/1000)*MoveCount;
      end;  Collision;  Engine.X := -X+Engine.Width div 2-Width div 2;
      Engine.Y := -Y+Engine.Height div 2-Height div 2;
    end;procedure TMainForm.DXTimerActivate(Sender: TObject);
    begin
      Caption := Application.Title;
    end;procedure TMainForm.DXTimerDeactivate(Sender: TObject);
    begin
      Caption := Application.Title + ' [Pause]';
    end;procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
    begin
      if not DXDraw.CanDraw then exit;  DXInput.Update;  if FMoveMode then
        LagCount := 1000 div 60;  DXSpriteEngine.Move(LagCount); 
      DXSpriteEngine.Dead;  {  Description  }
      DXDraw.Surface.Fill(0);
      DXSpriteEngine.Draw;  {  Frame rate display  }
      with DXDraw.Surface.Canvas do
      begin
        Brush.Style := bsClear;
        Font.Color := clWhite;
        Font.Size := 12;
        Textout(0, 0, 'FPS: '+inttostr(DXTimer.FrameRate));
        Textout(0, 24, 'Sprite: '+inttostr(DXSpriteEngine.Engine.AllCount));
        Textout(0, 48, 'Draw: '+inttostr(DXSpriteEngine.Engine.DrawCount));
        if FMoveMode then                  
          Textout(0, 72, 'Time mode: 60 FPS')
        else
          Textout(0, 72, 'Time mode: Real time');    Release;
      end;  DXDraw.Flip;
    end;procedure TMainForm.DXDrawFinalize(Sender: TObject);
    begin
      DXTimer.Enabled := False;
    end;procedure TMainForm.DXDrawInitialize(Sender: TObject);
    begin
      DXTimer.Enabled := True;
    end;procedure TMainForm.FormCreate(Sender: TObject);
    var
      i: Integer;
      PlayerSprite: TSprite;
    begin
      Randomize;  ImageList.Items.MakeColorTable;  DXDraw.ColorTable := ImageList.Items.ColorTable;
      DXDraw.DefColorTable := ImageList.Items.ColorTable;
      DXDraw.UpdatePalette;  with TBackgroundSprite.Create(DXSpriteEngine.Engine) do
      begin
        SetMapSize(1, 1);
        Image := ImageList.Items.Find('background');
        Z := -2;
        Tile := True;
      end;  for i:=0 to 200 do
        with TMonoSprite.Create(DXSpriteEngine.Engine) do
        begin
          Image := ImageList.Items.Find('img1');
          X := Random(5000)-2500;
          Y := Random(5000)-2500;
          Z := 2;
          Width := Image.Width;
          Height := Image.Height;
          FCounter := Random(MaxInt);
        end;  PlayerSprite := TPlayerSprite.Create(DXSpriteEngine.Engine);
      with TPlayerSprite(PlayerSprite) do
      begin
        Image := ImageList.Items.Find('img2');
        Z := 2;
        Width := Image.Width;
        Height := Image.Height;
      end;
    end;procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      {  Application end  }
      if Key=VK_ESCAPE then
        Close;  {  Screen mode change  }
      if (ssAlt in Shift) and (Key=VK_RETURN) then
      begin
        DXDraw.Finalize;    if doFullScreen in DXDraw.Options then
        begin
          RestoreWindow;      DXDraw.Cursor := crDefault;
          BorderStyle := bsSizeable;
          DXDraw.Options := DXDraw.Options - [doFullScreen];
        end else
        begin
          StoreWindow;      DXDraw.Cursor := crNone;
          BorderStyle := bsNone;
          DXDraw.Options := DXDraw.Options + [doFullScreen];
        end;    DXDraw.Initialize;
      end;
    end;procedure TMainForm.DXDrawClick(Sender: TObject);
    begin
      FMoveMode := not FMoveMode;
      if FMoveMode then
      begin
        DXTimer.Interval := 1000 div 60;
      end else
      begin
        DXTimer.Interval := 0;
      end;
    end;end.Tspriteengine是List对象来的,要添加自定义的Sprite对象才能使用
    DelphiX要求对OOP很熟悉才可以的,因为你要自己继承TimageSprite,编写Sprite的动作
      

  2.   

    我就是不知道Timagesprite.domove有什么用?我现在已经能显示出来了,可是就是不知道怎么样使sprite移动时改变图象(就是完成行走时的各个动作。)是不是一定要重写domove啊?怎么产生动画效果?不懂。
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DXInput, DXClass, DXDraws, DXSprite;type
      TForm1 = class(TForm)
        DXImageList1: TDXImageList;
        DXDraw1: TDXDraw;
        DXTimer1: TDXTimer;
        DXInput1: TDXInput;
        DXSpriteEngine1: TDXSpriteEngine;
        procedure FormCreate(Sender: TObject);
        procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  tplayer=class(TImageSprite)
      protected
      procedure DoCollision(Sprite:TSprite;var Done:Boolean);override;
      procedure domove(movecount:integer);override;
      end;var
      Form1: TForm1;
      s1,s2:Tplayer;
      temp:Timagesprite;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
    temp:=Timagesprite.Create(dxspriteengine1.Engine);
    temp.image:=dximagelist1.Items[0];
    temp.x:=100;
    temp.y:=100;s1:=Tplayer.Create(dxspriteengine1.Engine);
    s1.Image:=dximagelist1.Items[0];
    s1.X:=200;
    s1.y:=300;
    end;{ tplay }
    procedure tplayer.DoCollision(Sprite: TSprite; var Done: Boolean);
    begin
    sprite.dead;
    done:=false;
    end;procedure tplayer.domove(movecount: integer);
    begin
      inherited domove(movecount);
    if isleft in form1.DXInput1.States then x:=x-4;
    if isright in form1.DXInput1.States then x:=x+4;
    if isup in form1.dxinput1.States then y:=y-4;
    if isdown in form1.DXInput1.States then y:=y+4;
    collision;
    end;procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
    begin
    dxinput1.Update;
    dxdraw1.Surface.Fill(0);
    dxspriteengine1.Move(30);
    dxspriteengine1.Dead;
    dxspriteengine1.Draw;
    dxdraw1.Flip;
    end;end.//Tplay.docollision是用于产生碰撞时,让对方消失。没什么没有sprite不什么消失呢?
      

  4.   

    Tspriteengine                     这个玩意儿是管理精灵的………………………………………………………………………………建议楼主好好看看看看看delphix 带的 demo
    我写的有个例子,注解很详细的跳舞机
    http://expert.csdn.net/Expert/TopicView1.asp?id=2317510
      

  5.   

    我知道Tspritengine是管精灵的,可就是不会用。
    不知怎么产生碰撞。和不知怎么产生人物行走时的动画。
      

  6.   

    产生碰撞,delphix 提供的有机制,并且支持像素级碰撞检测;移动的行走是根据精灵的动画属性去设置的;在create中和domove 中都可以修改,是Ani 开头命名的,自己找找
      

  7.   

    谢谢!
    产生动画已基本解决。
    animstart
    animpos
    animcount
    animspee..
    问题是我参考demo和初步看了一下delphiX的源代码。
    在docollision里作碰撞时的处理(不是这样的吗?)。可是这种处理不被调用。并且collisioned属性一直都是true.证明了他并sprite并没有产生碰撞。不知为什么。
    麻烦看看我的上面的代码。
    //Tplay.docollision是用于产生碰撞时,让对方消失。为什么没有sprite不什么消失呢?
      

  8.   

    要 让精灵消失是 Dead方法;判断碰撞是根据传递的类去检测,比如
    procedure docollision(Sprite:TSprite;....
    begin
      if sprite is TMonSprite then
        Dead;//TmonSprite 是你自己扩展的怪物精灵类...
    end;有兴趣交个朋友一起研究delphix的引擎细节吗?
      

  9.   

    当然有。我好像已经交了你了。我的QQ:173257128但是我这样的做法也没错的啊。为什么精灵就是不能删除。procedure Tplayersprite.docollision(sprite:....)
    begin
    sprite.dead;
    done:=false;
    end;我这个做法只是为了测试一下碰撞,只要tplayersprite与其它精灵产生碰撞了,那个精灵就死。然后我创建一个tplayersprite的实便,再创建一个Timagesprite的实便。然后把Tplaysprite移去Timagesprite那里。不知为什么Timagesprite就是不会消失。
      

  10.   

    看一下这一段,可能有启发
    type
      TMonoSprite = class(TImageSprite)
      private
        FCounter: Double;
        FS: Integer;
        procedure Hit;
      public
        procedure DoMove(MoveCount: Integer); override;
      end;  TPlayerSprite = class(TImageSprite)
      protected
        procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
        procedure DoMove(MoveCount: Integer); override;
      end;procedure TMonoSprite.DoMove(MoveCount: Integer);
    begin
      inherited DoMove(MoveCount);
      PixelCheck := True;
      FCounter := FCounter + (100/1000)*MoveCount;
      X := X+Sin256(Trunc(FCounter))*(200/1000)*MoveCount;
      Y := Y+Cos256(Trunc(FCounter))*(200/1000)*MoveCount;  if not Collisioned then
      begin
        Inc(FS, MoveCount);
        if FS>200 then Dead;
      end;
    end;procedure TMonoSprite.Hit;
    begin
      Collisioned := False;  Image := MainForm.ImageList.Items.Find('img1-2');
      MainForm.DXWaveList.Items.Find('snd').Play(False);
      MainForm.DXInput.Joystick.Effects.Find('eff1').Start;
    end;procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
    begin
      if Sprite is TMonoSprite then
        TMonoSprite(Sprite).Hit;
      Done := False;
    end;
      

  11.   

    delphiX是个什么东西啊,我查查的。做游戏很好吗?
      

  12.   

    to cst01() 就是嘛。可是为什么经过那个Timagesprite都不会消失?
      

  13.   

    : S.F.(CSDN:896410000) 
    交个朋友吧
    我的QQ
    55806658
      

  14.   

    注意调用:
    DXSpriteEngine.Dead;
      

  15.   

    procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
    begin
      if not DXDraw.CanDraw then exit;  DXInput.Update;  if FMoveMode then
        LagCount := 1000 div 60;  DXSpriteEngine.Move(LagCount); 
      DXSpriteEngine.Dead;             /*  注意这里 */   {  Description  }
      DXDraw.Surface.Fill(0);
      DXSpriteEngine.Draw;  {  Frame rate display  }
      with DXDraw.Surface.Canvas do
      begin
        Brush.Style := bsClear;
        Font.Color := clWhite;
        Font.Size := 12;
        Textout(0, 0, 'FPS: '+inttostr(DXTimer.FrameRate));
        Textout(0, 24, 'Sprite: '+inttostr(DXSpriteEngine.Engine.AllCount));
        Textout(0, 48, 'Draw: '+inttostr(DXSpriteEngine.Engine.DrawCount));
        if FMoveMode then                  
          Textout(0, 72, 'Time mode: 60 FPS')
        else
          Textout(0, 72, 'Time mode: Real time');    Release;
      end;  DXDraw.Flip;
    end;
      

  16.   

    下载我的单机泡泡堂的源码看看,是用delphix写的http://community.csdn.net/Expert/TopicView.asp?id=3100736