📄 usprite.pas
字号:
AnimCount:=1;
AnimStart:=0;
end;
end;
procedure TPlayerSprite.ApplyGoods;
begin
end;
function TPlayerSprite.Clone: TGameSprite;
begin
Result:=nil;
end;
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
inherited DoCollision(Sprite, Done);
end;
procedure TPlayerSprite.DoMove(MoveCount:integer);
begin
inherited DoMove(MoveCount);
end;
procedure TPlayerSprite.MoveDown;
var
iTmp: Integer;
begin
if not (sNormal in FStates) then
begin
SwitchToState([sNormal]);
end;
AnimCount:=4;
AnimStart:=0;
iTmp:=Trunc(Y)+FCurSpeed;
if iTmp>FGameMap.Height-Height then
iTmp:=FGameMap.Height-Height;
Y :=iTmp;
ResetIdledTime;
end;
procedure TPlayerSprite.MoveLeft;
var
iTmp: Integer;
begin
if not (sNormal in FStates) then
begin
SwitchToState([sNormal]);
end;
AnimCount:=4;
AnimStart:=8;
iTmp:=Trunc(X)-FCurSpeed;
if iTmp<FGameMap.Left then
iTmp:=FGameMap.Left;
X :=iTmp;
ResetIdledTime;
end;
procedure TPlayerSprite.MoveRight;
var
iTmp: Integer;
begin
if not (sNormal in FStates) then
begin
SwitchToState([sNormal]);
end;
AnimCount:=4;
AnimStart:=4;
iTmp:=Trunc(X )+ FCurSpeed;
if iTmp>FGameMap.Width-Width then
iTmp:=FGameMap.Width-Width;
X :=iTmp;
ResetIdledTime;
end;
procedure TPlayerSprite.MoveUp;
var
iTmp: Integer;
begin
if not (sNormal in FStates) then
begin
SwitchToState([sNormal]);
end;
AnimCount:=4;
AnimStart:=12;
iTmp:=Trunc(Y)-FCurSpeed;
if iTmp<FGameMap.Top then
iTmp:=FGameMap.Top;
Y :=iTmp;
ResetIdledTime;
end;
procedure TPlayerSprite.ResetIdledTime;
begin
FIdledTime:=0;
end;
procedure TPlayerSprite.ResetTrapedTime;
begin
FTrapedTime:=0;
end;
procedure TPlayerSprite.SetDXISL(Value: TDXImageList);
begin
inherited SetDXISL(Value);
Image:=Value.Items.Find('BaoBao');
Width:=Image.Width ;
Height:=Image.Height;
PlayerNumber:=0;
AnimCount:=4;
AnimStart:=0;
AnimLooped:=True;
AnimSpeed:=0.1;
ADX:=0;
ADY:=(Height div 2)-10;
end;
procedure TPlayerSprite.SettleBomb;
var
oTmpSprite: TBombSprite;
begin
if ((FCurBombsSettled<FCurMaxBombs)and
(not Assigned(FGameMap.GetBombAt(SX,SY)))
)
then
begin
oTmpSprite:=TBombSprite((TPoolSingleton.GetSpritePool()).GetSprite('TBombSprite'));
if Assigned(oTmpSprite) then
begin
oTmpSprite.Init(FCurPower,SX,SY);
oTmpSprite.Player:=self;
oTmpSprite.Activate;
inc(FCurBombsSettled);
ResetIdledTime;
end;
end;
end;
procedure TPlayerSprite.SubCurBombsSettled;
begin
Dec(FCurBombsSettled);
end;
procedure TPlayerSprite.SwitchToState(const sState:TPlayerStates);
begin
if sDead in sState then
begin
FStates:=[sDead];
end else
if sTrap in sState then
begin
FStates:=[sTrap];
end else
if sNormal in sState then
begin
FStates:=FStates+[sNormal];
FStates:=FStates-[sSparkling];
Image:=DXISL.Items.Find('BaoBao');
Width:=Image.Width ;
Height:=Image.Height;
AnimSpeed:=0.1;
FStates:=FStates-[sSparkling];
end else
if sSparkling in sState then
begin
FStates:=FStates+[sSparkling];
FStates:=FStates-[sNormal];
Image:=DXISL.Items.Find('BaoBaoEye');
Width:=Image.Width ;
Height:=Image.Height;
AnimCount:=2;
AnimStart:=0;
AnimLooped:=True;
AnimSpeed:=0.05;
end;
end;
procedure TPlayerSprite.Trap;
begin
end;
procedure TPlayerSprite.UnTrap;
begin
end;
{
********************************* TBombSprite **********************************
}
constructor TBombSprite.Create(ASprite:TSprite);
begin
inherited Create(ASprite);
FSpriteName:='泡泡';
FTimeSpanToExplode:=3200;
end;
procedure TBombSprite.Act;
begin
if GetTickCount()>=Cardinal(FTimeSpanToExplode+FActivateTime) then
//若定时时间到
begin
Explode;
Dead;
end;
end;
procedure TBombSprite.Activate;
begin
FGameMap.SetSpriteAt(SX,SY,self);
inherited Activate;
end;
function TBombSprite.Clone: TGameSprite;
begin
Result:=TBombSprite.Create(Parent);
Result.DXISL:=DXISL;
Result.GameMap:=GameMap;
end;
procedure TBombSprite.Dead;
begin
FGameMap.ClearSpriteAt(SX,SY);
inherited Dead;
end;
procedure TBombSprite.DoMove(MoveCount:integer);
begin
inherited DoMove(MoveCount);
end;
procedure TBombSprite.Explode;
var
oTmpFireSprite: TCenterFireSprite;
begin
Player.SubCurBombsSettled();
//泡泡爆炸后,减少玩家已放的但还处于定时中的泡泡个数。
oTmpFireSprite:=TCenterFireSprite((TPoolSingleton.GetSpritePool()).GetSprite('TCenterFireSprite'));
//得到中心水柱对象
oTmpFireSprite.Init(FPower,SX,SY);//初始化参数
oTmpFireSprite.Activate;//激活此中心水柱
end;
procedure TBombSprite.Init(const iExtendPower,iSX,iSY:integer);
begin
FPower:=iExtendPower;
SX:=iSX;
SY:=iSY;
end;
function TBombSprite.IsLinkWith(const oSprite:TGameSprite): Boolean;
var
iTmpPower,iTmpSX1,iTmpSY1,iTmpSX2,iTmpSY2: Integer;
begin
Result:=False;
if not (oSprite is TBombSprite) then Exit;
if FPower>=TBombSprite(oSprite).Power then
iTmpPower:=FPower
else iTmpPower:=TBombSprite(oSprite).Power;
iTmpSX1:=SX;
iTmpSY1:=SY;
iTmpSX2:=oSprite.SX;
iTmpSY2:=oSprite.SY;
if ((iTmpSX1=iTmpSX2) and (ABS(iTmpSY1-iTmpSY2)<=iTmpPower))or
((iTmpSY1=iTmpSY2) and (ABS(iTmpSX1-iTmpSX2)<=iTmpPower))
then
begin
Result:=true;
Exit;
end;
end;
function TBombSprite.MakeSelfDes: string;
begin
Result:='施放时间点:'+IntToStr(FActivateTime);
Result:=Result+'-'+'威力:'+IntToStr(FPower);
Result:=Result+'-'+'池中位序:'+IntToStr(FQInPool);
Result:=Result+'-'+'位置:('+FloatToStr(WorldX)+
','+FloatToStr(WorldY)+')';
end;
procedure TBombSprite.SetDXISL(Value: TDXImageList);
begin
inherited SetDXISL(Value);
Image:=Value.Items.Find('Bomb');
Width:=Image.Width;
Height:=Image.Height;
AnimCount:=3;
AnimStart:=0;
AnimLooped:=True;
AnimSpeed:=0.06;
end;
{
********************************* TFireSprite **********************************
}
procedure TFireSprite.Act;
begin
case FExtended of
True:begin
if GetTickCount()>=Cardinal(FExtendTimeSpan+FActivateTime) then
begin//若水柱存在的时间到
Dead;
end;
end;
False:begin
Extend;
end;
end;//endcase
end;
function TFireSprite.Clone: TGameSprite;
begin
Result:=nil;
end;
procedure TFireSprite.Dead;
begin
inherited Dead;
FExtended:=False;
end;
procedure TFireSprite.Extend;
begin
FExtended:=True;
end;
function TFireSprite.MakeSelfDes: string;
begin
Result := inherited MakeSelfDes;
end;
{
****************************** TCenterFireSprite *******************************
}
constructor TCenterFireSprite.Create(ASprite:TSprite);
begin
inherited Create(ASprite);
FSpriteName:='中心火';
end;
function TCenterFireSprite.Clone: TGameSprite;
begin
Result:=TCenterFireSprite.Create(Parent);
Result.DXISL:=DXISL;
Result.GameMap:=GameMap;
end;
procedure TCenterFireSprite.Extend;
var
oTmpPool: TGameSpritePool;
oTmpFireSprite: TExtendFireSprite;
begin
inherited Extend;
oTmpPool:=TPoolSingleton.GetSpritePool();
oTmpFireSprite:=TExtendFireSprite(oTmpPool.GetSprite('TExtendFireSprite'));
if Assigned(oTmpFireSprite) then
begin
oTmpFireSprite.Init(FExtendPower-1,1,SX,SY);//右方向
oTmpFireSprite.Activate;
end;
oTmpFireSprite:=TExtendFireSprite(oTmpPool.GetSprite('TExtendFireSprite'));
if Assigned(oTmpFireSprite) then
begin
oTmpFireSprite.Init(FExtendPower-1,2,SX,SY);//上方向
oTmpFireSprite.Activate;
end;
oTmpFireSprite:=TExtendFireSprite(oTmpPool.GetSprite('TExtendFireSprite'));
if Assigned(oTmpFireSprite) then
begin
oTmpFireSprite.Init(FExtendPower-1,3,SX,SY);//左方向
oTmpFireSprite.Activate;
end;
oTmpFireSprite:=TExtendFireSprite(oTmpPool.GetSprite('TExtendFireSprite'));
if Assigned(oTmpFireSprite) then
begin
oTmpFireSprite.Init(FExtendPower-1,4,SX,SY);//下方向
oTmpFireSprite.Activate;
end;
end;
procedure TCenterFireSprite.Init(const iExtendPower:integer;iSX,iSY:integer);
begin
FExtendPower:=iExtendPower;
FExtendTimeSpan:=(iExtendPower-1)*15+300;
SX:=iSX;
SY:=iSY;
//此后面要加入设置动画参数程序;
end;
function TCenterFireSprite.MakeSelfDes: string;
begin
Result := inherited MakeSelfDes;
end;
procedure TCenterFireSprite.SetDXISL(Value: TDXImageList);
begin
inherited SetDXISL(Value);
Image:=Value.Items.Find('Fire');
Width:=Image.Width;
Height:=Image.Height;
AnimCount:=1;
AnimStart:=0;
AnimLooped:=True;
AnimSpeed:=0.1;
end;
{
****************************** TExtendFireSprite *******************************
}
constructor TExtendFireSprite.Create(ASprite:TSprite);
begin
inherited Create(ASprite);
FSpriteName:='方向火';
end;
function TExtendFireSprite.Clone: TGameSprite;
begin
Result:=TExtendFireSprite.Create(Parent);
Result.DXISL:=DXISL;
Result.GameMap:=GameMap;
end;
procedure TExtendFireSprite.Extend;
var
oTmpFireSprite: TExtendFireSprite;
begin
inherited Extend;
if (FExtendPower>0) then
begin
oTmpFireSprite:=TExtendFireSprite((TPoolSingleton.GetSpritePool()).GetSprite('TExtendFireSprite'));
oTmpFireSprite.Init(FExtendPower-1,FDirection,SX,SY);
oTmpFireSprite.Activate;
end;
end;
procedure TExtendFireSprite.Init(const iExtendPower,iDrection:integer;iSX,
iSY:integer);
begin
FExtendPower:=iExtendPower;
FExtendTimeSpan:=(iExtendPower-1)*15+300;
FDirection:=iDrection;
case FDirection of
1:begin
SX:=iSX+1;
SY:=iSY;
//此后面要加入设置动画参数程序;
if FExtendPower=0 then
begin
AnimStart:=6;
Exit;
end;
AnimStart:=2;
end;
2:begin
SX:=iSX;
SY:=iSY-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -