Changeset 51 for trunk/UEngine.pas


Ignore:
Timestamp:
Dec 20, 2021, 6:45:12 PM (3 years ago)
Author:
chronos
Message:
  • Modified: Updated Common package.
  • Removed: CoolTranslator merged into Common package.
  • Modified: Code cleanup.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UEngine.pas

    r45 r51  
    66
    77uses
    8   Dialogs, Classes, SysUtils, Graphics, SpecializedMatrix, SpecializedList,
     8  Dialogs, Classes, SysUtils, Graphics, SpecializedMatrix,
    99  IntfGraphics, FPImage, LCLType, SpecializedBitmap, GraphType, Math, URectangle,
    1010  Syncobjs, UThreading, Forms, DateUtils, UAudioSystem, XMLConf, DOM, fgl;
     
    5656    StopByDirt: Boolean;
    5757    constructor Create;
     58  end;
     59
     60  TBullets = class(TFPGObjectList<TBullet>)
    5861  end;
    5962
     
    118121    Keys: TPlayerKeys;
    119122    Tanks: TTanks;
    120     Bullets: TListObject; // TListObject<TBullet>
     123    Bullets: TBullets;
    121124    LastShootTime: TDateTime;
    122125    LastDigTime: TDateTime;
     
    237240    PlayerPool: TPlayers;
    238241    Players: TPlayers;
    239     DigMasks: TListObject; // TListObject<TMatrixByte>
     242    DigMasks: TFPGObjectList<TMatrixByte>;
    240243    Lock: TCriticalSection;
    241244    CurrentRound: Integer;
     
    279282  SPlayer = 'Player';
    280283
    281 
    282 
    283284function SwapBRComponent(Value: Cardinal): Cardinal; inline;
    284285begin
     
    307308  for I := 0 to Count - 1 do begin
    308309    Items[I] := TTank.Create;
    309     TTank(Items[I]).Assign(TTank(Source.Items[I]));
     310    Items[I].Assign(Source.Items[I]);
    310311  end;
    311312end;
     
    326327  while Count > Players.Count do Delete(Count - 1);
    327328  for I := 0 to Count - 1 do
    328     TPlayer(Items[I]).Assign(TPlayer(Players[I]));
     329    Items[I].Assign(Players[I]);
    329330end;
    330331
     
    335336  Config.SetValue(DOMString(Path + '/Count'), Count);
    336337  for I := 0 to Count - 1 do
    337     TPlayer(Items[I]).SaveConfig(Config, Path + '/Player' + IntToStr(I));
     338    Items[I].SaveConfig(Config, Path + '/Player' + IntToStr(I));
    338339end;
    339340
     
    347348  while Count < NewCount do Add(TPlayer.Create);
    348349  for I := 0 to Count - 1 do begin
    349     Items[I] := TPlayer.Create;
    350     TPlayer(Items[I]).Engine := Engine;
    351     TPlayer(Items[I]).Id := I;
    352     TPlayer(Items[I]).LoadConfig(Config, Path + '/Player' + IntToStr(I));
     350    Items[I].Engine := Engine;
     351    Items[I].Id := I;
     352    Items[I].LoadConfig(Config, Path + '/Player' + IntToStr(I));
    353353  end;
    354354end;
     
    410410  FreeAndNil(Mask);
    411411  FreeAndNil(Image);
    412   inherited Destroy;
     412  inherited;
    413413end;
    414414
     
    574574  FreeAndNil(Surface);
    575575  FreeAndNil(Matters);
    576   inherited Destroy;
     576  inherited;
    577577end;
    578578
     
    586586  P: Integer;
    587587begin
     588  Bitmap.BeginUpdate;
    588589  try
    589     Bitmap.BeginUpdate;
    590590    RawImage := Bitmap.RawImage;
    591591    PixelRowPtr := PInteger(RawImage.Data);
     
    594594      PixelPtr := PixelRowPtr;
    595595      for X := 0 to Bitmap.Width - 1 do begin
    596         P := TMatter(Matters[Surface.ItemsXY[Trunc(X / Bitmap.Width * Surface.Count.X),
    597             Trunc(Y / Bitmap.Height * Surface.Count.Y)]]).Color;
     596        P := Matters[Surface.ItemsXY[Trunc(X / Bitmap.Width * Surface.Count.X),
     597            Trunc(Y / Bitmap.Height * Surface.Count.Y)]].Color;
    598598        PixelPtr^ := SwapBRComponent(P);
    599599        Inc(PByte(PixelPtr), BytePerPixel);
     
    753753  // Bullet movement
    754754  for I := Bullets.Count - 1 downto 0 do
    755   with TBullet(Bullets[I]), Engine.World.Surface do begin
     755  with Bullets[I], Engine.World.Surface do begin
    756756    Pos := Point(Trunc(Position.X), Trunc(Position.Y));
    757757    if (ItemsXY[LastPos.X, LastPos.Y] = Byte(miBullet1)) or
     
    787787        end else begin
    788788          for P := 0 to Engine.Players.Count - 1 do
    789           with TPlayer(Engine.Players[P]) do
     789          with Engine.Players[P] do
    790790          if (Self.Id <> P) and
    791             (TMatter(Engine.World.Matters[ItemsXY[Pos.X, Pos.Y]]).Kind = mkTankBody) and
    792             (TMatter(Engine.World.Matters[ItemsXY[Pos.X, Pos.Y]]).Player = P) then
     791            (Engine.World.Matters[ItemsXY[Pos.X, Pos.Y]].Kind = mkTankBody) and
     792            (Engine.World.Matters[ItemsXY[Pos.X, Pos.Y]].Player = P) then
    793793            Shield := Shield - 1 / ShieldSteps;
    794794          if StopByDirt then Explosion(LastPos, BulletExplosionRange);
     
    820820  XX, YY: Integer;
    821821  I: Integer;
     822  B: TColor;
    822823begin
    823824  with Engine.FBitmapLower do begin
    824 //    Brush.Color := SurfaceMatterColors[smRock];
    825 //    FillRect(ScreenFrame);
     825    //Brush.Color := SurfaceMatterColors[smRock];
     826    //FillRect(ScreenFrame);
     827    for Y := ScreenFrame.Top to ScreenFrame.Bottom - 1 do
     828      for X := ScreenFrame.Left to ScreenFrame.Right - 1 do begin
     829        ItemsXY[X, Y] := 0;
     830      end;
     831
    826832    Fill(CreateIndex(ScreenFrame.Left, ScreenFrame.Top),
    827       CreateIndex(ScreenFrame.Right, ScreenFrame.Bottom),
    828       TMatter(Engine.World.Matters[Integer(miRock)]).Color);
     833      CreateIndex(ScreenFrame.Width, ScreenFrame.Height),
     834      Engine.World.Matters[Integer(miRock)].Color);
     835
    829836
    830837    with Engine.World do
     
    833840        XX := X - ScreenFrame.Left - ((ScreenFrame.Right - ScreenFrame.Left) div 2) + Position.X;
    834841        YY := Y - ScreenFrame.Top - ((ScreenFrame.Bottom - ScreenFrame.Top) div 2) + Position.Y;
    835         if (YY >= 0) and (YY < Surface.Count.Y) and (XX >= 0) and (XX < Surface.Count.X) then
    836           ItemsXY[X, Y] := TMatter(Engine.World.Matters[Surface.ItemsXY[XX, YY]]).Color;
     842        if (YY >= 0) and (YY < Surface.Count.Y) and
     843        (XX >= 0) and (XX < Surface.Count.X) then begin
     844          B := Engine.World.Matters[Surface.ItemsXY[XX, YY]].Color;
     845          ItemsXY[X, Y] := B;
     846        end;
    837847      end;
    838848
     
    841851      if Energy < I / (ScreenFrame.Width - 2) then
    842852        ItemsXY[ScreenFrame.Left + I, ScreenFrame.Bottom - 2] := clBlack
    843         else ItemsXY[ScreenFrame.Left + I, ScreenFrame.Bottom - 2] := clYellow;
     853        else ItemsXY[ScreenFrame.Left + I, ScreenFrame.Bottom - 2] := 0; //clYellow;
    844854
    845855    // Shield bar
     
    851861    for I := ScreenFrame.Left to ScreenFrame.Right - 1 do
    852862      ItemsXY[I, 0] := $010101 * I;
     863
     864      for Y := ScreenFrame.Top to ScreenFrame.Bottom - 1 do
     865      for X := ScreenFrame.Left to ScreenFrame.Right - 1 do begin
     866        ItemsXY[X, Y] := 0;
     867      end;
    853868  end;
    854869end;
     
    10221037
    10231038  NewTank := TTank.Create;
    1024   NewTank.Image.Assign(TTank(Tanks[0]).Image);
     1039  NewTank.Image.Assign(Tanks[0].Image);
    10251040  NewTank.Image.Reverse;
    10261041  NewTank.Image.ReverseHorizontal;
     
    10281043
    10291044  NewTank := TTank.Create;
    1030   NewTank.Image.Assign(TTank(Tanks[1]).Image);
     1045  NewTank.Image.Assign(Tanks[1].Image);
    10311046  NewTank.Image.ReverseVertical;
    10321047  Tanks.Add(NewTank);
    10331048
    10341049  NewTank := TTank.Create;
    1035   NewTank.Image.Assign(TTank(Tanks[0]).Image);
     1050  NewTank.Image.Assign(Tanks[0].Image);
    10361051  NewTank.Image.ReverseVertical;
    10371052  Tanks.Add(NewTank);
    10381053
    10391054  NewTank := TTank.Create;
    1040   NewTank.Image.Assign(TTank(Tanks[1]).Image);
     1055  NewTank.Image.Assign(Tanks[1].Image);
    10411056  NewTank.Image.ReverseVertical;
    10421057  NewTank.Image.ReverseHorizontal;
     
    10441059
    10451060  NewTank := TTank.Create;
    1046   NewTank.Image.Assign(TTank(Tanks[0]).Image);
     1061  NewTank.Image.Assign(Tanks[0].Image);
    10471062  NewTank.Image.Reverse;
    10481063  Tanks.Add(NewTank);
    10491064
    10501065  NewTank := TTank.Create;
    1051   NewTank.Image.Assign(TTank(Tanks[1]).Image);
     1066  NewTank.Image.Assign(Tanks[1].Image);
    10521067  NewTank.Image.ReverseHorizontal;
    10531068  Tanks.Add(NewTank);
    10541069
    10551070  for I := 0 to Tanks.Count - 1 do
    1056   with TTank(Tanks[I]) do begin
     1071  with Tanks[I] do begin
    10571072    Mask.Assign(Image);
    10581073    for Y := 0 to Mask.Count.Y - 1 do
     
    10651080begin
    10661081  Tanks := TTanks.Create;
    1067   Bullets := TListObject.Create;
     1082  Bullets := TBullets.Create;
    10681083  House := TRectangle.Create;
    10691084  ScreenFrame := TRectangle.Create;
     
    10761091  FreeAndNil(Bullets);
    10771092  FreeAndNil(Tanks);
    1078   inherited Destroy;
     1093  inherited;
    10791094end;
    10801095
     
    11681183  Result := False;
    11691184  for I := 0 to Players.Count - 1 do
    1170     if TPlayer(Players[I]).House.IsInside(Pos) then begin
     1185    if Players[I].House.IsInside(Pos) then begin
    11711186      Result := True;
    11721187    end;
     
    13281343
    13291344  NewMask := TMatrixByte.Create;
    1330   NewMask.Assign(TMatrixByte(DigMasks[0]));
     1345  NewMask.Assign(DigMasks[0]);
    13311346  NewMask.Reverse;
    13321347  NewMask.ReverseHorizontal;
     
    13341349
    13351350  NewMask := TMatrixByte.Create;
    1336   NewMask.Assign(TMatrixByte(DigMasks[1]));
     1351  NewMask.Assign(DigMasks[1]);
    13371352  NewMask.ReverseVertical;
    13381353  DigMasks.Add(NewMask);
    13391354
    13401355  NewMask := TMatrixByte.Create;
    1341   NewMask.Assign(TMatrixByte(DigMasks[0]));
     1356  NewMask.Assign(DigMasks[0]);
    13421357  NewMask.ReverseVertical;
    13431358  DigMasks.Add(NewMask);
    13441359
    13451360  NewMask := TMatrixByte.Create;
    1346   NewMask.Assign(TMatrixByte(DigMasks[1]));
     1361  NewMask.Assign(DigMasks[1]);
    13471362  NewMask.ReverseVertical;
    13481363  NewMask.ReverseHorizontal;
     
    13501365
    13511366  NewMask := TMatrixByte.Create;
    1352   NewMask.Assign(TMatrixByte(DigMasks[0]));
     1367  NewMask.Assign(DigMasks[0]);
    13531368  NewMask.Reverse;
    13541369  DigMasks.Add(NewMask);
    13551370
    13561371  NewMask := TMatrixByte.Create;
    1357   NewMask.Assign(TMatrixByte(DigMasks[1]));
     1372  NewMask.Assign(DigMasks[1]);
    13581373  NewMask.ReverseHorizontal;
    13591374  DigMasks.Add(NewMask);
     
    14401455  end;
    14411456  for I := 0 to PlayerPool.Count - 1 do
    1442   with TPlayer(PlayerPool[I]) do begin
     1457  with PlayerPool[I] do begin
    14431458    Engine := Self;
    14441459    Id := I;
    14451460    InitTanks;
    14461461    Name := SPlayer + ' ' + IntToStr(I + 1);
    1447     if I < 8 then Enabled := True;
     1462    if I < 2 then Enabled := True;
    14481463  end;
    14491464end;
     
    14561471  Players.Clear;
    14571472  for I := 0 to PlayerPool.Count - 1 do
    1458   with TPlayer(PlayerPool[I]) do
     1473  with PlayerPool[I] do
    14591474  if Enabled then begin
    14601475    NewPlayer := TPlayer.Create;
    1461     NewPlayer.Assign(TPlayer(PlayerPool[I]));
     1476    NewPlayer.Assign(PlayerPool[I]);
    14621477    Players.Add(NewPlayer);
    14631478    Score := 0;
     
    14761491  AliveCount := 0;
    14771492  for I := 0 to Players.Count - 1 do
    1478   with TPlayer(Players[I]) do
     1493  with Players[I] do
    14791494    if not Exploded then Inc(AliveCount);
    14801495  if AliveCount <= 1 then begin
    14811496    for I := 0 to Players.Count - 1 do
    1482     with TPlayer(Players[I]) do
     1497    with Players[I] do
    14831498      if not Exploded then Inc(Score);
    14841499    if CurrentRound < MaxRound then
     
    15071522      PlayerFrameHeight * VertFrameCount);
    15081523    for I := 0 to Players.Count - 1 do begin
    1509       TPlayer(Players[I]).ScreenFrame.AsTRect := Rect(
     1524      Players[I].ScreenFrame.AsTRect := Rect(
    15101525        (I mod HorizFrameCount) * (FBitmapLower.Count.X div HorizFrameCount) + 1,
    15111526        (I div HorizFrameCount) * (FBitmapLower.Count.Y div VertFrameCount) + 1,
     
    15381553  AudioExplode.Open;
    15391554  InitPlayerPool;
    1540   DigMasks := TListObject.Create;
     1555  DigMasks := TFPGObjectList<TMatrixByte>.Create;
    15411556  InitDigMasks;
    15421557  Redraw;
     
    15571572  FreeAndNil(AudioShot);
    15581573  FreeAndNil(AudioExplode);
    1559   inherited Destroy;
     1574  inherited;
    15601575end;
    15611576
     
    15641579  I: Integer;
    15651580begin
     1581  Lock.Acquire;
    15661582  try
    1567     Lock.Acquire;
    15681583    for I := 0 to Players.Count - 1 do begin
    1569       TPlayer(Players[I]).Control;
    1570       TPlayer(Players[I]).Tick;
     1584      Players[I].Control;
     1585      Players[I].Tick;
    15711586    end;
    15721587  finally
     
    15831598    DrawStart := NowPrecise;
    15841599    FRedrawPending := False;
     1600    Lock.Acquire;
    15851601    try
    1586       Lock.Acquire;
    15871602      //if ClearBackground then FBitmapLower.FillAll(clNavy);
    15881603      for I := 0 to Players.Count - 1 do
    15891604      if Players[I].Enabled then begin
    1590         TPlayer(Players[I]).Paint;
     1605        Players[I].Paint;
    15911606      end;
    15921607    finally
     
    16171632
    16181633  for I := 0 to Players.Count - 1 do
    1619   with TPlayer(Players[I]) do begin
    1620     Init;
    1621   end;
     1634    Players[I].Init;
    16221635  ClearBackground := True;
    16231636  Redraw;
Note: See TracChangeset for help on using the changeset viewer.