Changeset 51 for trunk/UEngine.pas
- Timestamp:
- Dec 20, 2021, 6:45:12 PM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/UEngine.pas
r45 r51 6 6 7 7 uses 8 Dialogs, Classes, SysUtils, Graphics, SpecializedMatrix, SpecializedList,8 Dialogs, Classes, SysUtils, Graphics, SpecializedMatrix, 9 9 IntfGraphics, FPImage, LCLType, SpecializedBitmap, GraphType, Math, URectangle, 10 10 Syncobjs, UThreading, Forms, DateUtils, UAudioSystem, XMLConf, DOM, fgl; … … 56 56 StopByDirt: Boolean; 57 57 constructor Create; 58 end; 59 60 TBullets = class(TFPGObjectList<TBullet>) 58 61 end; 59 62 … … 118 121 Keys: TPlayerKeys; 119 122 Tanks: TTanks; 120 Bullets: T ListObject; // TListObject<TBullet>123 Bullets: TBullets; 121 124 LastShootTime: TDateTime; 122 125 LastDigTime: TDateTime; … … 237 240 PlayerPool: TPlayers; 238 241 Players: TPlayers; 239 DigMasks: T ListObject; // TListObject<TMatrixByte>242 DigMasks: TFPGObjectList<TMatrixByte>; 240 243 Lock: TCriticalSection; 241 244 CurrentRound: Integer; … … 279 282 SPlayer = 'Player'; 280 283 281 282 283 284 function SwapBRComponent(Value: Cardinal): Cardinal; inline; 284 285 begin … … 307 308 for I := 0 to Count - 1 do begin 308 309 Items[I] := TTank.Create; 309 TTank(Items[I]).Assign(TTank(Source.Items[I]));310 Items[I].Assign(Source.Items[I]); 310 311 end; 311 312 end; … … 326 327 while Count > Players.Count do Delete(Count - 1); 327 328 for I := 0 to Count - 1 do 328 TPlayer(Items[I]).Assign(TPlayer(Players[I]));329 Items[I].Assign(Players[I]); 329 330 end; 330 331 … … 335 336 Config.SetValue(DOMString(Path + '/Count'), Count); 336 337 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)); 338 339 end; 339 340 … … 347 348 while Count < NewCount do Add(TPlayer.Create); 348 349 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)); 353 353 end; 354 354 end; … … 410 410 FreeAndNil(Mask); 411 411 FreeAndNil(Image); 412 inherited Destroy;412 inherited; 413 413 end; 414 414 … … 574 574 FreeAndNil(Surface); 575 575 FreeAndNil(Matters); 576 inherited Destroy;576 inherited; 577 577 end; 578 578 … … 586 586 P: Integer; 587 587 begin 588 Bitmap.BeginUpdate; 588 589 try 589 Bitmap.BeginUpdate;590 590 RawImage := Bitmap.RawImage; 591 591 PixelRowPtr := PInteger(RawImage.Data); … … 594 594 PixelPtr := PixelRowPtr; 595 595 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; 598 598 PixelPtr^ := SwapBRComponent(P); 599 599 Inc(PByte(PixelPtr), BytePerPixel); … … 753 753 // Bullet movement 754 754 for I := Bullets.Count - 1 downto 0 do 755 with TBullet(Bullets[I]), Engine.World.Surface do begin755 with Bullets[I], Engine.World.Surface do begin 756 756 Pos := Point(Trunc(Position.X), Trunc(Position.Y)); 757 757 if (ItemsXY[LastPos.X, LastPos.Y] = Byte(miBullet1)) or … … 787 787 end else begin 788 788 for P := 0 to Engine.Players.Count - 1 do 789 with TPlayer(Engine.Players[P])do789 with Engine.Players[P] do 790 790 if (Self.Id <> P) and 791 ( TMatter(Engine.World.Matters[ItemsXY[Pos.X, Pos.Y]]).Kind = mkTankBody) and792 ( TMatter(Engine.World.Matters[ItemsXY[Pos.X, Pos.Y]]).Player = P) then791 (Engine.World.Matters[ItemsXY[Pos.X, Pos.Y]].Kind = mkTankBody) and 792 (Engine.World.Matters[ItemsXY[Pos.X, Pos.Y]].Player = P) then 793 793 Shield := Shield - 1 / ShieldSteps; 794 794 if StopByDirt then Explosion(LastPos, BulletExplosionRange); … … 820 820 XX, YY: Integer; 821 821 I: Integer; 822 B: TColor; 822 823 begin 823 824 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 826 832 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 829 836 830 837 with Engine.World do … … 833 840 XX := X - ScreenFrame.Left - ((ScreenFrame.Right - ScreenFrame.Left) div 2) + Position.X; 834 841 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; 837 847 end; 838 848 … … 841 851 if Energy < I / (ScreenFrame.Width - 2) then 842 852 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; 844 854 845 855 // Shield bar … … 851 861 for I := ScreenFrame.Left to ScreenFrame.Right - 1 do 852 862 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; 853 868 end; 854 869 end; … … 1022 1037 1023 1038 NewTank := TTank.Create; 1024 NewTank.Image.Assign(T Tank(Tanks[0]).Image);1039 NewTank.Image.Assign(Tanks[0].Image); 1025 1040 NewTank.Image.Reverse; 1026 1041 NewTank.Image.ReverseHorizontal; … … 1028 1043 1029 1044 NewTank := TTank.Create; 1030 NewTank.Image.Assign(T Tank(Tanks[1]).Image);1045 NewTank.Image.Assign(Tanks[1].Image); 1031 1046 NewTank.Image.ReverseVertical; 1032 1047 Tanks.Add(NewTank); 1033 1048 1034 1049 NewTank := TTank.Create; 1035 NewTank.Image.Assign(T Tank(Tanks[0]).Image);1050 NewTank.Image.Assign(Tanks[0].Image); 1036 1051 NewTank.Image.ReverseVertical; 1037 1052 Tanks.Add(NewTank); 1038 1053 1039 1054 NewTank := TTank.Create; 1040 NewTank.Image.Assign(T Tank(Tanks[1]).Image);1055 NewTank.Image.Assign(Tanks[1].Image); 1041 1056 NewTank.Image.ReverseVertical; 1042 1057 NewTank.Image.ReverseHorizontal; … … 1044 1059 1045 1060 NewTank := TTank.Create; 1046 NewTank.Image.Assign(T Tank(Tanks[0]).Image);1061 NewTank.Image.Assign(Tanks[0].Image); 1047 1062 NewTank.Image.Reverse; 1048 1063 Tanks.Add(NewTank); 1049 1064 1050 1065 NewTank := TTank.Create; 1051 NewTank.Image.Assign(T Tank(Tanks[1]).Image);1066 NewTank.Image.Assign(Tanks[1].Image); 1052 1067 NewTank.Image.ReverseHorizontal; 1053 1068 Tanks.Add(NewTank); 1054 1069 1055 1070 for I := 0 to Tanks.Count - 1 do 1056 with T Tank(Tanks[I])do begin1071 with Tanks[I] do begin 1057 1072 Mask.Assign(Image); 1058 1073 for Y := 0 to Mask.Count.Y - 1 do … … 1065 1080 begin 1066 1081 Tanks := TTanks.Create; 1067 Bullets := T ListObject.Create;1082 Bullets := TBullets.Create; 1068 1083 House := TRectangle.Create; 1069 1084 ScreenFrame := TRectangle.Create; … … 1076 1091 FreeAndNil(Bullets); 1077 1092 FreeAndNil(Tanks); 1078 inherited Destroy;1093 inherited; 1079 1094 end; 1080 1095 … … 1168 1183 Result := False; 1169 1184 for I := 0 to Players.Count - 1 do 1170 if TPlayer(Players[I]).House.IsInside(Pos) then begin1185 if Players[I].House.IsInside(Pos) then begin 1171 1186 Result := True; 1172 1187 end; … … 1328 1343 1329 1344 NewMask := TMatrixByte.Create; 1330 NewMask.Assign( TMatrixByte(DigMasks[0]));1345 NewMask.Assign(DigMasks[0]); 1331 1346 NewMask.Reverse; 1332 1347 NewMask.ReverseHorizontal; … … 1334 1349 1335 1350 NewMask := TMatrixByte.Create; 1336 NewMask.Assign( TMatrixByte(DigMasks[1]));1351 NewMask.Assign(DigMasks[1]); 1337 1352 NewMask.ReverseVertical; 1338 1353 DigMasks.Add(NewMask); 1339 1354 1340 1355 NewMask := TMatrixByte.Create; 1341 NewMask.Assign( TMatrixByte(DigMasks[0]));1356 NewMask.Assign(DigMasks[0]); 1342 1357 NewMask.ReverseVertical; 1343 1358 DigMasks.Add(NewMask); 1344 1359 1345 1360 NewMask := TMatrixByte.Create; 1346 NewMask.Assign( TMatrixByte(DigMasks[1]));1361 NewMask.Assign(DigMasks[1]); 1347 1362 NewMask.ReverseVertical; 1348 1363 NewMask.ReverseHorizontal; … … 1350 1365 1351 1366 NewMask := TMatrixByte.Create; 1352 NewMask.Assign( TMatrixByte(DigMasks[0]));1367 NewMask.Assign(DigMasks[0]); 1353 1368 NewMask.Reverse; 1354 1369 DigMasks.Add(NewMask); 1355 1370 1356 1371 NewMask := TMatrixByte.Create; 1357 NewMask.Assign( TMatrixByte(DigMasks[1]));1372 NewMask.Assign(DigMasks[1]); 1358 1373 NewMask.ReverseHorizontal; 1359 1374 DigMasks.Add(NewMask); … … 1440 1455 end; 1441 1456 for I := 0 to PlayerPool.Count - 1 do 1442 with TPlayer(PlayerPool[I])do begin1457 with PlayerPool[I] do begin 1443 1458 Engine := Self; 1444 1459 Id := I; 1445 1460 InitTanks; 1446 1461 Name := SPlayer + ' ' + IntToStr(I + 1); 1447 if I < 8then Enabled := True;1462 if I < 2 then Enabled := True; 1448 1463 end; 1449 1464 end; … … 1456 1471 Players.Clear; 1457 1472 for I := 0 to PlayerPool.Count - 1 do 1458 with TPlayer(PlayerPool[I])do1473 with PlayerPool[I] do 1459 1474 if Enabled then begin 1460 1475 NewPlayer := TPlayer.Create; 1461 NewPlayer.Assign( TPlayer(PlayerPool[I]));1476 NewPlayer.Assign(PlayerPool[I]); 1462 1477 Players.Add(NewPlayer); 1463 1478 Score := 0; … … 1476 1491 AliveCount := 0; 1477 1492 for I := 0 to Players.Count - 1 do 1478 with TPlayer(Players[I])do1493 with Players[I] do 1479 1494 if not Exploded then Inc(AliveCount); 1480 1495 if AliveCount <= 1 then begin 1481 1496 for I := 0 to Players.Count - 1 do 1482 with TPlayer(Players[I])do1497 with Players[I] do 1483 1498 if not Exploded then Inc(Score); 1484 1499 if CurrentRound < MaxRound then … … 1507 1522 PlayerFrameHeight * VertFrameCount); 1508 1523 for I := 0 to Players.Count - 1 do begin 1509 TPlayer(Players[I]).ScreenFrame.AsTRect := Rect(1524 Players[I].ScreenFrame.AsTRect := Rect( 1510 1525 (I mod HorizFrameCount) * (FBitmapLower.Count.X div HorizFrameCount) + 1, 1511 1526 (I div HorizFrameCount) * (FBitmapLower.Count.Y div VertFrameCount) + 1, … … 1538 1553 AudioExplode.Open; 1539 1554 InitPlayerPool; 1540 DigMasks := T ListObject.Create;1555 DigMasks := TFPGObjectList<TMatrixByte>.Create; 1541 1556 InitDigMasks; 1542 1557 Redraw; … … 1557 1572 FreeAndNil(AudioShot); 1558 1573 FreeAndNil(AudioExplode); 1559 inherited Destroy;1574 inherited; 1560 1575 end; 1561 1576 … … 1564 1579 I: Integer; 1565 1580 begin 1581 Lock.Acquire; 1566 1582 try 1567 Lock.Acquire;1568 1583 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; 1571 1586 end; 1572 1587 finally … … 1583 1598 DrawStart := NowPrecise; 1584 1599 FRedrawPending := False; 1600 Lock.Acquire; 1585 1601 try 1586 Lock.Acquire;1587 1602 //if ClearBackground then FBitmapLower.FillAll(clNavy); 1588 1603 for I := 0 to Players.Count - 1 do 1589 1604 if Players[I].Enabled then begin 1590 TPlayer(Players[I]).Paint;1605 Players[I].Paint; 1591 1606 end; 1592 1607 finally … … 1617 1632 1618 1633 for I := 0 to Players.Count - 1 do 1619 with TPlayer(Players[I]) do begin 1620 Init; 1621 end; 1634 Players[I].Init; 1622 1635 ClearBackground := True; 1623 1636 Redraw;
Note:
See TracChangeset
for help on using the changeset viewer.