diff -r f759aae1062f -r ea195268734f hedgewars/uVisualGears.pas --- a/hedgewars/uVisualGears.pas Tue Jul 01 22:26:36 2008 +0000 +++ b/hedgewars/uVisualGears.pas Fri Jul 04 14:40:52 2008 +0000 @@ -40,7 +40,7 @@ function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; procedure ProcessVisualGears(Steps: Longword); -procedure DrawVisualGears(); +procedure DrawVisualGears(Layer: LongWord); procedure DeleteVisualGear(Gear: PVisualGear); procedure AddClouds; @@ -50,6 +50,7 @@ implementation uses uWorld, uMisc, uStore; +const cExplFrameTicks = 80; // ================================================================== procedure doStepFlake(Gear: PVisualGear; Steps: Longword); @@ -93,8 +94,14 @@ Gear^.Y:= Gear^.Y + Gear^.dY; Gear^.dY:= Gear^.dY + cGravity; -dec(Gear^.FrameTicks); -if Gear^.FrameTicks = 0 then DeleteVisualGear(Gear) +if Gear^.FrameTicks <= Steps then + if Gear^.Frame = 0 then DeleteVisualGear(Gear) + else + begin + dec(Gear^.Frame); + Gear^.FrameTicks:= cExplFrameTicks + end + else dec(Gear^.FrameTicks, Steps) end; // ================================================================== @@ -107,6 +114,8 @@ function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; var Result: PVisualGear; + t: Longword; + sp: hwFloat; begin New(Result); FillChar(Result^, sizeof(TVisualGear), 0); @@ -138,11 +147,14 @@ end; vgtExplPart: with Result^ do begin + t:= random(1024); + sp:= _0_001 * (random(700) + 150); + dx:= AngleSin(t) * sp; dx.isNegative:= random(2) = 0; - dx.QWordValue:= random(300000) + 1000000; + dy:= AngleCos(t) * sp; dy.isNegative:= random(2) = 0; - dy.QWordValue:= random(300000) + 1000000; - FrameTicks:= 700 + Frame:= 7 - random(3); + FrameTicks:= cExplFrameTicks end; end; @@ -179,22 +191,30 @@ end end; -procedure DrawVisualGears(); +procedure DrawVisualGears(Layer: LongWord); var Gear: PVisualGear; begin Gear:= VisualGearsList; -while Gear <> nil do - begin - case Gear^.Kind of - vgtFlake: if vobVelocity = 0 then - DrawSprite(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame) - else - DrawRotatedF(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle); - - vgtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame); - end; - Gear:= Gear^.NextGear - end; +case Layer of + 0: while Gear <> nil do + begin + case Gear^.Kind of + vgtFlake: if vobVelocity = 0 then + DrawSprite(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame) + else + DrawRotatedF(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle); + vgtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame); + end; + Gear:= Gear^.NextGear + end; + 1: while Gear <> nil do + begin + case Gear^.Kind of + vgtExplPart: DrawSprite(sprExplPart, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 7 - Gear^.Frame); + end; + Gear:= Gear^.NextGear + end + end end; procedure AddClouds;