Changeset 40 for trunk/UGame.pas
- Timestamp:
- Mar 11, 2014, 9:09:56 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/UGame.pas
r39 r40 7 7 uses 8 8 Classes, SysUtils, ExtCtrls, Graphics, Contnrs, XMLConf, XMLRead, XMLWrite, 9 DOM ;9 DOM, Math; 10 10 11 11 const 12 12 DefaultPlayerStartUnits = 5; 13 CellMulX = 1.12; 14 CellMulY = 1.292; 13 HexCellMulX = 1.12; 14 HexCellMulY = 1.292; 15 SquareCellMulX = 1.1; 16 SquareCellMulY = 1.1; 15 17 MaxPlayerCount = 8; 16 18 … … 85 87 MaxPower: Integer; 86 88 DefaultCellSize: TPoint; 89 procedure DrawArrow(Canvas: TCanvas; View: TView; Pos: TPoint; Angle: Double; Size: TPoint); 87 90 function IsCellsNeighbor(Cell1, Cell2: TCell): Boolean; virtual; 88 91 function IsValidIndex(Index: TPoint): Boolean; virtual; … … 268 271 SComputer = 'Computer'; 269 272 SCannotSetPlayerStartCells = 'Cannot choose start cell for player'; 273 SUnfinishedBattle = 'Unfinished battle'; 270 274 271 275 procedure InitStrings; … … 374 378 // TODO: This is implemented as simple sequence lookup. Needs some faster algorithm 375 379 Result := nil; 376 CellSize := FloatPoint(DefaultCellSize.X , DefaultCellSize.Y);380 CellSize := FloatPoint(DefaultCellSize.X * SquareCellMulX, DefaultCellSize.Y * SquareCellMulX); 377 381 HexSize := FloatPoint(DefaultCellSize.X, DefaultCellSize.Y); 378 382 with View do … … 403 407 Points: array of TPoint; 404 408 begin 405 CellSize := FloatPoint(DefaultCellSize.X , DefaultCellSize.Y);409 CellSize := FloatPoint(DefaultCellSize.X * SquareCellMulX, DefaultCellSize.Y * SquareCellMulX); 406 410 HexSize := FloatPoint(DefaultCellSize.X, DefaultCellSize.Y); 407 411 X := Cell.Pos.X; … … 457 461 Cell: TCell; 458 462 PosFrom, PosTo: TPoint; 463 Angle: Double; 459 464 460 465 procedure PaintHexagon(Pos: TPoint; Text: string); … … 479 484 Pen.Width := 0; 480 485 end; 481 FillRect(Trunc(Pos.X - HexSize.X / 2), Trunc(Pos.Y - HexSize.Y / 2), Trunc(Pos.X + HexSize.X / 2), Trunc(Pos.Y + HexSize.Y / 2));486 Rectangle(Trunc(Pos.X - HexSize.X / 2), Trunc(Pos.Y - HexSize.Y / 2), Trunc(Pos.X + HexSize.X / 2), Trunc(Pos.Y + HexSize.Y / 2)); 482 487 //Rectangle(Trunc(Pos.X), Trunc(Pos.Y), Trunc(Pos.X + HexSize.X), Trunc(Pos.Y + HexSize.Y)); 483 488 Pen.Style := psSolid; … … 489 494 490 495 begin 491 CellSize := FloatPoint(DefaultCellSize.X , DefaultCellSize.Y);496 CellSize := FloatPoint(DefaultCellSize.X * SquareCellMulX, DefaultCellSize.Y * SquareCellMulY); 492 497 HexSize := FloatPoint(DefaultCellSize.X * View.Zoom, DefaultCellSize.Y * View.Zoom); 493 498 CellSizeZoomed := FloatPoint(CellSize.X * View.Zoom, CellSize.Y * View.Zoom); … … 515 520 if TMove(Cell.MovesFrom[I]).CountRepeat > 0 then Pen.Width := 2 516 521 else Pen.Width := 1; 517 Line(View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 4), 518 Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 4))), 519 View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 2), 520 Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 2)))); 522 Angle := ArcTan((PosTo.Y - PosFrom.Y) / (PosTo.X - PosFrom.X)); 523 if Sign(PosTo.X - PosFrom.X) = -1 then Angle := Angle + Pi; 524 DrawArrow(Canvas, View, View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 3), 525 Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 3))), 526 Angle, Point(Trunc(HexSize.X / 4), Trunc(HexSize.Y / 4))); 521 527 Pen.Width := 1; 522 528 end; … … 549 555 begin 550 556 557 end; 558 559 procedure TMap.DrawArrow(Canvas: TCanvas; View: TView; Pos: TPoint; Angle: Double; Size: TPoint); 560 var 561 Points: array of TPoint; 562 FPoints: array of TFloatPoint; 563 I: Integer; 564 begin 565 Canvas.Brush.Color := clWhite; 566 Canvas.Pen.Color := clBlack; 567 SetLength(Points, 8); 568 SetLength(FPoints, 8); 569 FPoints[0] := FloatPoint(+0.5 * Size.X, +0 * Size.Y); 570 FPoints[1] := FloatPoint(+0 * Size.X, +0.5 * Size.Y); 571 FPoints[2] := FloatPoint(+0 * Size.X, +0.25 * Size.Y); 572 FPoints[3] := FloatPoint(-0.5 * Size.X, +0.25 * Size.Y); 573 FPoints[4] := FloatPoint(-0.5 * Size.X, -0.25 * Size.Y); 574 FPoints[5] := FloatPoint(+0 * Size.X, -0.25 * Size.Y); 575 FPoints[6] := FloatPoint(+0 * Size.X, -0.5 * Size.Y); 576 FPoints[7] := FloatPoint(+0.5 * Size.X, 0 * Size.Y); 577 // Rotate 578 for I := 0 to Length(Points) - 1 do 579 FPoints[I] := FloatPoint(FPoints[I].X * cos(Angle) - FPoints[I].Y * sin(Angle), 580 FPoints[I].X * sin(Angle) + FPoints[I].Y * cos(Angle)); 581 // Shift 582 for I := 0 to Length(Points) - 1 do 583 Points[I] := Point(Trunc(FPoints[I].X + Pos.X), Trunc(FPoints[I].Y + Pos.Y)); 584 Canvas.Polygon(Points); 551 585 end; 552 586 … … 1034 1068 CellTo.Power := DefenderPower; 1035 1069 end else 1036 raise Exception.Create( 'Unfinished battle');1070 raise Exception.Create(SUnfinishedBattle); 1037 1071 end; 1038 1072 CellFrom.Power := CellFrom.Power - CountOnce; … … 1442 1476 // TODO: This is implemented as simple sequence lookup. Needs some faster algorithm 1443 1477 Result := nil; 1444 CellSize := FloatPoint(DefaultCellSize.X / CellMulX, DefaultCellSize.Y /CellMulY);1478 CellSize := FloatPoint(DefaultCellSize.X / HexCellMulX, DefaultCellSize.Y / HexCellMulY); 1445 1479 HexSize := FloatPoint(DefaultCellSize.X, DefaultCellSize.Y); 1446 1480 with View do … … 1474 1508 Points: array of TPoint; 1475 1509 begin 1476 CellSize := FloatPoint(DefaultCellSize.X / CellMulX, DefaultCellSize.Y /CellMulY);1510 CellSize := FloatPoint(DefaultCellSize.X / HexCellMulX, DefaultCellSize.Y / HexCellMulY); 1477 1511 HexSize := FloatPoint(DefaultCellSize.X, DefaultCellSize.Y); 1478 1512 X := Cell.Pos.X; … … 1498 1532 Cell: TCell; 1499 1533 PosFrom, PosTo: TPoint; 1534 Angle: Double; 1500 1535 1501 1536 procedure PaintHexagon(Pos: TPoint; Text: string); … … 1533 1568 1534 1569 begin 1535 CellSize := FloatPoint(DefaultCellSize.X / CellMulX, DefaultCellSize.Y /CellMulY);1570 CellSize := FloatPoint(DefaultCellSize.X / HexCellMulX, DefaultCellSize.Y / HexCellMulY); 1536 1571 HexSize := FloatPoint(DefaultCellSize.X * View.Zoom, DefaultCellSize.Y * View.Zoom); 1537 1572 CellSizeZoomed := FloatPoint(CellSize.X * View.Zoom, CellSize.Y * View.Zoom); 1538 with Canvas, View do try 1573 with Canvas, View do 1574 try 1539 1575 Lock; 1540 1576 for CY := Trunc(SourceRect.Top / CellSize.Y) to Trunc(SourceRect.Bottom / CellSize.Y) + 1 do … … 1563 1599 if TMove(Cell.MovesFrom[I]).CountRepeat > 0 then Pen.Width := 2 1564 1600 else Pen.Width := 1; 1565 Line(View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 4), 1566 Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 4))), 1567 View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 2), 1568 Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 2)))); 1601 Angle := ArcTan((PosTo.Y - PosFrom.Y) / (PosTo.X - PosFrom.X)); 1602 if Sign(PosTo.X - PosFrom.X) = -1 then Angle := Angle + Pi; 1603 DrawArrow(Canvas, View, View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 3), 1604 Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 3))), 1605 Angle, Point(Trunc(HexSize.X / 4), Trunc(HexSize.Y / 4))); 1569 1606 Pen.Width := 1; 1570 1607 end;
Note:
See TracChangeset
for help on using the changeset viewer.