delphiX控件,我觉得最难用就是Tspriteengine了。不知怎么用的。请用过的大是解释一下。我现在连怎么样显示精灵都还没弄懂。
解决方案 »
- DELPHI加壳后如何处理才能不被杀软"误报"
- 请教:怎么用Delphi教excel表中数据导入到sql2000中
- 关于delphi 自制IE浏览器的问题(高分求)
- 请给出一个把STRINGGRID导出为EXCEL的例子,谢谢!
- IdFTP1 如何取得服务器上的文件名呀,急死我了.
- delphi+access的程序发布??
- 帮帮忙
- 请DelPhi里手进来帮个忙,最好一次性搞定,应该是比较简单的问题:)
- 寻找menu控件!
- 有没有出售Delphi搞的MPEG编解码软件的?
- 拜求7zip源代码能够编译好的能够供delphi连接使用的*.obj文件
- 用FAST REPORT进行报表查询时,提示'LOCK TIME OUT,SQL SERVER 连接超时'怎么办?
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的动作
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不什么消失呢?
我写的有个例子,注解很详细的跳舞机
http://expert.csdn.net/Expert/TopicView1.asp?id=2317510
不知怎么产生碰撞。和不知怎么产生人物行走时的动画。
产生动画已基本解决。
animstart
animpos
animcount
animspee..
问题是我参考demo和初步看了一下delphiX的源代码。
在docollision里作碰撞时的处理(不是这样的吗?)。可是这种处理不被调用。并且collisioned属性一直都是true.证明了他并sprite并没有产生碰撞。不知为什么。
麻烦看看我的上面的代码。
//Tplay.docollision是用于产生碰撞时,让对方消失。为什么没有sprite不什么消失呢?
procedure docollision(Sprite:TSprite;....
begin
if sprite is TMonSprite then
Dead;//TmonSprite 是你自己扩展的怪物精灵类...
end;有兴趣交个朋友一起研究delphix的引擎细节吗?
begin
sprite.dead;
done:=false;
end;我这个做法只是为了测试一下碰撞,只要tplayersprite与其它精灵产生碰撞了,那个精灵就死。然后我创建一个tplayersprite的实便,再创建一个Timagesprite的实便。然后把Tplaysprite移去Timagesprite那里。不知为什么Timagesprite就是不会消失。
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;
交个朋友吧
我的QQ
55806658
DXSpriteEngine.Dead;
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;