📄 gameclasses.pas
字号:
begin
alpha:=Trunc(tempy);
tempx:=tempx + 1;
X:=X + Round(10 * Cos(tempx / 10 * Pi));
Y:=Y + Round(10 * Sin(tempx / 10 * Pi));
if tempx = Random(36) then tempx:=0;
tempy:=tempy + 1;
if tempy = 255 then FLineType:=TALLine;
end;
TALULine:
begin
X:=X - FSpeed;
if X < FMain.DXDraw.Width shr 2 then FSpeed:= -FSpeed;
end;
TALVLine:
begin
X:=X - Abs(FSpeed);
Y:=Y + FSpeed;
if Y >= FMain.DXDraw.Height - Image.Height then FSpeed:= -FSpeed;
end;
TALV1Line:
begin
X:=X - Abs(FSpeed);
Y:=Y - FSpeed;
if Y <= 0 then FSpeed:= -FSpeed;
end;
TALWLine:; //V
TALXLine:; //X
TALZLine:
begin
X:=X - FSpeed;
Y:=Y + tempy;
if (X <= FMain.DXDraw.Width shr 2) and (tempy = 0) then
begin
FSpeed:= -FSpeed;
tempy:= -FSpeed;
end;
if Y >= FMain.DXDraw.Height - Image.Height then
begin
FSpeed:=Abs(FSpeed);
tempy:=0.000001;
end;
end;
TALZ1Line:
begin
X:=X - FSpeed;
Y:=Y - tempy;
if (X <= FMain.DXDraw.Width shr 2) and (tempy = 0) then
begin
FSpeed:= -FSpeed;
tempy:= -FSpeed;
end;
if Y <= Image.Height then
begin
FSpeed:=Abs(FSpeed);
tempy:=0.000001;
end;
end;
TALRandLine:
begin
//
end;
end;
if (X < FMain.DXDraw.Width) and (Random(101 - FTransmitProbability) = 0) then Transmit;
end;
procedure TEnemy.Transmit;
var
i:Integer;
begin
with TEnemyBullet.Create(FMain.SpriteEngine.Engine,Self) do
begin
if Bullet <> '' then
Image:=FMain.Image.Items.Find(FBullet)
else
Image:=FMain.Image.Items.Find('EnemyBullet1');
Width:=Image.Width;
Height:=Image.Height;
if Self.Bulletspeed = 0 then Self.Bulletspeed:=1;
Speed:=Self.Bulletspeed;
AnimCount:=Image.PatternCount - 1;
DeadImage:= '';
FTransmitType:=Self.TransmitType;
case Self.FTransmitType of
TTRand:
begin
if Abs(Self.X - FMain.MainPlayer.X) > 150 then
begin
//比例因子
FPorY:=Abs((Self.Y - (FMain.MainPlayer.Y + Random(FProbability) + 11))) / Abs((Self.X - (FMain.MainPlayer.X + Random(FProbability) + 16))) * Self.Bulletspeed;
FDirectionOff:=False;
end
else
begin
FPorY:=Abs((Self.X - (FMain.MainPlayer.X + Random(FProbability) + 16))) / Abs((Self.Y - (FMain.MainPlayer.Y + Random(FProbability) + 11))) * Self.Bulletspeed;
FDirectionOff:=True;
end;
if Self.X > FMain.MainPlayer.X then
XX:= -1
else
XX:=1;
if Self.Y > FMain.MainPlayer.Y then
YY:= -1
else
YY:=1;
if FPorY > 25 then FPorY:=20;
end;
TTLine:; //
TTCircle:
begin
Dead;
for i:=0 to 2 do
begin
with TEnemyBullet.Create(FMain.SpriteEngine.Engine,Self) do
begin
if Bullet <> '' then
Image:=FMain.Image.Items.Find(FBullet)
else
Image:=FMain.Image.Items.Find('EnemyBullet1');
Width:=Image.Width;
Height:=Image.Height;
if Self.Bulletspeed = 0 then Self.Bulletspeed:=1;
Speed:=Self.Bulletspeed;
AnimCount:=Image.PatternCount - 1;
DeadImage:= '';
FTransmitType:=TTCircle;
FCircleCenter:=0.5;
X:=X + Round(FCircleCenter * Cos(i / FCircleCenter * Pi));
Y:=Y + Round(FCircleCenter * Sin(i / FCircleCenter * Pi));
FCircleCenter:=i / FCircleCenter;
if Self.Y > FMain.MainPlayer.Y then FCircleCenter:= -FCircleCenter;
end;
end;
end;
TTRadian:
begin
Dead;
//重构,与TTRand合并
for i:=1 to 3 do
begin
with TEnemyBullet.Create(FMain.SpriteEngine.Engine,Self) do
begin
if Bullet <> '' then
Image:=FMain.Image.Items.Find(FBullet)
else
Image:=FMain.Image.Items.Find('EnemyBullet1');
Width:=Image.Width;
Height:=Image.Height;
if Self.Bulletspeed = 0 then Self.Bulletspeed:=1;
Speed:=Self.Bulletspeed;
AnimCount:=Image.PatternCount - 1;
DeadImage:= '';
FTransmitType:=TTRand;
if Abs(Self.X - FMain.MainPlayer.X) > 150 then
begin
FPorY:=Abs((Self.Y - (i * RadianRange {+random(100) } + Random(FProbability) + 11))) / Abs((Self.X - (FMain.MainPlayer.X + Random(FProbability) + 16))) * Self.Bulletspeed;
FDirectionOff:=False;
end
else
begin
FPorY:=Abs((Self.X - (FMain.MainPlayer.X + Random(FProbability) + 16))) / Abs((Self.Y - (i * RadianRange + {random(100) +} Random(FProbability) + 11))) * Self.Bulletspeed;
FDirectionOff:=True;
end;
if Self.X > FMain.MainPlayer.X then
XX:= -1
else
XX:=1;
if Self.Y > FMain.MainPlayer.Y then
YY:= -1
else
YY:=1;
end;
end;
end;
//Case End
end;
end;
end;
{ TBackPlayer }
procedure TBackPlayer.DoMove(MoveCount:Integer);
begin
inherited DoMove(MoveCount);
if Quiescence then Exit;
X:=X - FSpeed + Random(5) + 1;
Y:=Y + FSpeed;
if ((Y > FMain.DXDraw.SurfaceHeight) or (X < 0)) and not (FStop) then
begin
FSpeed:=Random(25) + 1;
X:=Random(FMain.DXDraw.Width) + 300;
Y:= -(Random(20)) - 32;
AnimSpeed:=(Random(500) + 300) / 1000;
end;
end;
{ TGameSprite }
constructor TGameSprite.Create(AParent:TSprite);
begin
inherited Create(AParent);
PixelCheck:=True; //像素级碰撞处理!!!
FDeadImage:= 'BombEnemy';
// FDeadOffRect.X:=0;
// FDeadOffRect.Y:=0;
Z:=0;
FSpeed:=2;
FDeadTimes:=50;
FDeadSound:=EnemyBom;
FDeadAnimSpeed:=200;
AnimLooped:=True;
AnimSpeed:=100 / 1000;
end;
destructor TGameSprite.Destroy;
begin
inherited Destroy;
end;
procedure TGameSprite.DoMove(MoveCount:Integer);
begin
inherited DoMove(MoveCount);
//进入区域播放声音,其实有更好的方法。
{ if Trunc(FMain.DXDraw.SurfaceWidth - X) in [0..5] then
if FShowSound <> '' then
FMain.WaveList.Items.Find(FShowSound).Play(False);}
if (not (Self is TBackPlayer)) and (not (Self is TBoss)) then
if (X < -48) or (Y < -48) or (Y > FMain.DXDraw.Height + 48) then Dead;
Collision;
end;
class procedure TGameSprite.PalleteAnim(DX:TDXDraw;Col:TRGBQuad;Time:Integer);
//------------------------------------------------------------------------------
function ComposeColor(Dest,Src:TRGBQuad;Percent:Integer):TRGBQuad;
begin
with Result do
begin
rgbRed:=Src.rgbRed + ((Dest.rgbRed - Src.rgbRed) * Percent div 256);
rgbGreen:=Src.rgbGreen + ((Dest.rgbGreen - Src.rgbGreen) * Percent div 256);
rgbBlue:=Src.rgbBlue + ((Dest.rgbBlue - Src.rgbBlue) * Percent div 256);
rgbReserved:=0;
end;
end;
//------------------------------------------------------------------------------
var
i:Integer;
t,t2:DWORD;
ChangePalette:Boolean;
c:Integer;
begin
if DX.Initialized then
begin
c:=DX.Surface.ColorMatch(RGB(Col.rgbRed,Col.rgbGreen,Col.rgbBlue));
{ Palette animation }
ChangePalette:=False;
if DX.CanPaletteAnimation then
begin
t:=GetTickCount;
while Abs(GetTickCount - t) < Time do
begin
t2:=Trunc(Abs(GetTickCount - t) / Time * 255);
for i:=0 to 255 do
DX.ColorTable[i]:=ComposeColor(Col,DX.DefColorTable[i],t2);
DX.UpdatePalette;
ChangePalette:=True;
end;
end
else
Sleep(Time);
DX.Surface.Fill(c);
DX.Flip;
DX.Surface.Fill(c);
DX.Flip;
DX.Surface.Fill(c);
DX.Flip;
DX.Surface.Fill(c);
DX.Flip;
if ChangePalette then
begin
DX.ColorTable:=DX.DefColorTable;
DX.UpdatePalette;
end;
DX.Surface.Fill(c);
DX.Flip;
end;
end;
{ TDeadSprite }
constructor TDeadSprite.Create(AParent:TSprite);
begin
inherited Create(AParent);
FDeadSpeed:=15;
end;
procedure TDeadSprite.DoMove(MoveCount:Integer);
begin
inherited DoMove(MoveCount);
X:=X + FDeadSpeed;
if X - FDeadTime > FDeadTimeCount then Dead;
end;
procedure TGameSprite.Hit;
begin
if not (FMain.GameStatus = GameExit) then
begin
if DeadSound <> BomNone then
FMain.WaveList.Items.Find(DeadSoundName[Ord(DeadSound)]).Play(False); //使用时需注意<Fixed
if Self.FDeadImage <> '' then
with TDeadSprite.Create(FMain.SpriteEngine.Engine) do
begin
Image:=FMain.Image.Items.Find(Self.FDeadImage);
Width:=Self.Image.Width; //保持大小Self.image.width
Height:=Self.Image.Height;
AnimCount:=Image.PatternCount; // - 1;
AnimLooped:=False;
AnimSpeed:=Self.FDeadAnimSpeed / 1000;
if Self.FSpeed > 15 then DeadSpeed:=Self.FSpeed;
FDeadTime:=Self.X;
X:=FDeadTime - Self.FDeadOffRect.X;
Y:=Self.Y + Self.FDeadOffRect.Y;
FDeadTimeCount:=Self.FDeadTimes;
end;
Dead;
end;
end;
{ TArticle }
procedure TArticle.DoCollision(Sprite:TSprite;var Done:Boolean);
begin
if Sprite is TMainPlayer then //Fixed "Stack overflow" at 2006-1-10 20:31:37
TMainPlayer(Sprite).DoCollision(Self,Done);
end;
procedure TArticle.DoMove(MoveCount:Integer);
begin
inherited DoMove(MoveCount);
X:=X - FSpeed;
end;
procedure TArticle.SetArticleType(const Value:TArticleType);
begin
if Ord(Value) = 0 then Exit;
if ArticleName[Ord(FArticleType)] <> FMain.Image.Name then
begin
FArticleType:=Value;
Image:=FMain.Image.Items.Find(ArticleName[Ord(FArticleType)]);
AnimCount:=Image.PatternCount - 1;
Width:=Image.Width;
Height:=Image.Height;
end;
end;
{ TEnemyBullet }
constructor TEnemyBullet.Create(AParent:TSprite;
FEnemy:TEnemy);
begin
inherited Create(AParent);
X:=FEnemy.X + (FEnemy.Width div 2);
Y:=FEnemy.Y + (FEnemy.Height div 2);
FAccuracy:=ACStandard;
end;
procedure TEnemyBullet.DoCollision(Sprite:TSprite;var Done:Boolean);
begin
if Sprite is TMainPlayer then TMainPlayer(Sprite).DoCollision(Self,Done);
//
end;
procedure TEnemyBullet.DoMove(MoveCount:Integer);
begin
//子弹轨迹算法
inherited DoMove(MoveCount);
case FTransmitType of
TTRand:
begin
if not (FDirectionOff) then
begin
X:=X + FSpeed * XX;
Y:=Y + FPorY * YY;
end
else
begin
Y:=Y + FSpeed * YY;
X:=X + FPorY * XX;
end;
end;
TTLine:
X:=X - FSpeed;
TTCircle:
begin
X:=X - FSpeed;
Y:=Y + FCircleCenter;
end;
end;
end;
{ TBoss }
constructor TBoss.Create(AParent:TSprite);
begin
inherited Create(AParent);
FBossBomb:=DeadSound;
FShootSound:=DeadSound;
DeadSound:=BomNone;
tempcount1:=FMain.FCount;
end;
destructor TBoss.Destroy;
var
i:Integer;
begin
FMain.BossFCount:=FMain.FCount; //Boss死亡时的祯数
if (not (FMain.ApplicationExit)) and (FMain.GameStatus <> GameExit) then //Fixed:Close GameApplication at Boss Show but Program can't exit. Modify:2006-1-12 20:35:46
begin
for i:=0 to 49 do
with TBossDead.Create(FMain.SpriteEngine.Engine) do
begin
Image:=FMain.Image.Items.Find(Self.FDeadImage);
Width:=Self.Image.Width; //保持大小Self.image.width
Height:=Self.Image.Height;
AnimCount:=Image.PatternCount; // - 1;
AnimLooped:=True;
AnimSpeed:=Self.FDeadAnimSpeed / 1000;
if Self.FSpeed > 15 then DeadSpeed:=Self.FSpeed;
FDeadTime:=Self.X;
FDeadTimeCount:=Self.FDeadTimes;
X:=Self.X - 100 + Random(150);
Y:=Self.Y - 100 + Random(150);
end;
FMain.WaveList.Items.Find(DeadSoundName[Ord(FBossBomb)]).Play(False);
FMain.GameStatus:=GamePassing;
end;
inherited Destroy;
end;
procedure TBoss.DoMove(MoveCount:Integer);
begin
inherited DoMove(MoveCount);
case FMain.FCount - tempcount1 of
300:FLineType:=TALCLine;
600:FLineType:=TALOLine;
end;
if Y > FMain.DXDraw.Height - Image.Height then FSpeed:= -FSpeed;
if Y < 0 then FSpeed:=Abs(FSpeed);
Y:=Y + FSpeed;
{ case Random(6) of
0:Bullet:= 'EnemyBullet2';
1:Bullet:= 'EnemyBullet3';
2:Bullet:= 'EnemyBullet4';
3:Bullet:= 'EnemyBullet5';
4:Bullet:= 'EnemyBullet6';
5:Bullet:= 'EnemyBullet7';
end;}
if (FHP < 40) and (FHP > 10) then
begin
Bullet:= 'Enemybullet7';
TransmitProbability:=98;
FLineType:=TALJLine;
if Random(10) = 0 then
TransmitType:=TTRand
else
TransmitType:=TTCircle;
Exit;
end;
if FHP < 10 then
begin
FLineType:=TALOLine;
ShootSound:=Gun;
Bullet:= 'EnemyBullet1';
TransmitType:=TTRadian;
TransmitProbability:=100;
end;
end;
procedure TBoss.Transmit;
begin
if FShootSound <> BomNone then FMain.WaveList.Items.Find(DeadSoundName[Ord(FShootSound)]).Play(False);
inherited Transmit;
end;
{ TBossDead }
procedure TBossDead.DoMove(MoveCount:Integer);
begin
inherited DoMove(MoveCount);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -