Changeset 21 for trunk/UGame.pas


Ignore:
Timestamp:
Mar 1, 2014, 5:39:22 PM (11 years ago)
Author:
chronos
Message:
  • Modified: Player View rectangle separated to CellPos and ViewSize which are values in different coordinate system.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UGame.pas

    r20 r21  
    5555    DefaultCellSize: TPoint;
    5656    Cells: array of array of TCell;
    57     function PosToCell(Pos: TPoint; Rect: TRect; Zoom: Double
    58       ): TCell;
    59     function CellToPos(Cell: TCell; Rect: TRect; Zoom: Double
    60       ): TPoint;
     57    function PosToCell(Pos: TPoint; Rect: TRect; Zoom: Double): TCell;
     58    function CellToPos(Cell: TCell; Rect: TRect; Zoom: Double): TPoint;
    6159    function GetHexagonPolygon(Pos: TPoint; HexSize: TPoint): TPointArray;
    6260    procedure Paint(Canvas: TCanvas; Rect: TRect; Zoom: Double; SelectedCell: TCell);
     
    7775    Game: TGame;
    7876    Name: string;
    79     View: TRect;
     77    CellPos: TPoint;
     78    ViewSize: TPoint;
    8079    Color: TColor;
    8180    ViewZoom: Double;
     
    8584    TotalCells: Integer;
    8685    StartUnits: Integer;
     86    function CanvasToCellPos(Pos: TPoint): TPoint;
     87    function CellToCanvasPos(Pos: TPoint): TPoint;
     88    function CanvasToCellRect(Pos: TRect): TRect;
     89    function CellToCanvasRect(Pos: TRect): TRect;
    8790    procedure ComputerTurn;
    8891    procedure SelectCell(Pos: TPoint);
     
    222225{ TPlayer }
    223226
     227function TPlayer.CanvasToCellPos(Pos: TPoint): TPoint;
     228begin
     229  Result := Point(Trunc(Pos.X / ViewZoom + CellPos.X),
     230    Trunc(Pos.Y / ViewZoom + CellPos.Y));
     231end;
     232
     233function TPlayer.CellToCanvasPos(Pos: TPoint): TPoint;
     234begin
     235  Result := Point(Trunc((Pos.X - CellPos.X) * ViewZoom),
     236    Trunc((Pos.Y - CellPos.Y) * ViewZoom));
     237end;
     238
     239function TPlayer.CanvasToCellRect(Pos: TRect): TRect;
     240begin
     241  Result.TopLeft := CanvasToCellPos(Pos.TopLeft);
     242  Result.BottomRight := CanvasToCellPos(Pos.BottomRight);
     243end;
     244
     245function TPlayer.CellToCanvasRect(Pos: TRect): TRect;
     246begin
     247  Result.TopLeft := CellToCanvasPos(Pos.TopLeft);
     248  Result.BottomRight := CellToCanvasPos(Pos.BottomRight);
     249end;
     250
    224251procedure TPlayer.ComputerTurn;
    225252begin
     
    230257var
    231258  NewSelectedCell: TCell;
    232 begin
    233   NewSelectedCell := Game.Map.PosToCell(Pos, View, ViewZoom);
     259  TopLeft: TPoint;
     260  BottomRight: TPoint;
     261begin
     262  NewSelectedCell := Game.Map.PosToCell(CanvasToCellPos(Pos), CanvasToCellRect(Bounds(0, 0, ViewSize.X, ViewSize.Y)), ViewZoom);
    234263  if Assigned(NewSelectedCell) then begin
    235264    if Assigned(SelectedCell) and IsCellsNeighbor(NewSelectedCell, SelectedCell) then begin
     
    247276procedure TPlayer.Paint(PaintBox: TPaintBox);
    248277begin
    249   Game.Map.Paint(PaintBox.Canvas, View, ViewZoom, SelectedCell);
     278  Game.Map.Paint(PaintBox.Canvas, CanvasToCellRect(Bounds(0, 0, ViewSize.X, ViewSize.Y)), ViewZoom, SelectedCell);
    250279end;
    251280
     
    460489    ViewZoom := 1;
    461490    // Center board
    462     View := Bounds(-(View.Right - View.Left) div 2 + Map.GetPixelSize.X div 2,
    463       -(View.Bottom - View.Top) div 2 + Map.GetPixelSize.Y div 2,
    464       View.Right - View.Left,
    465       View.Bottom - View.Top);
     491    CellPos := Point(Trunc(Map.GetPixelSize.X div 2 - ViewSize.X div 2 / ViewZoom),
     492      Trunc(Map.GetPixelSize.Y div 2 - ViewSize.Y div 2 / ViewZoom));
    466493  end;
    467494  CurrentPlayer := TPlayer(Players[0]);
     
    516543  Points: array of TPoint;
    517544begin
     545  // TODO: This is implemented as simple sequence lookup. It needs some faster algorithm
    518546  Result := nil;
    519547  CellSize := FloatPoint(DefaultCellSize.X / 1.15 * Zoom, DefaultCellSize.Y / 1.35 * Zoom);
Note: See TracChangeset for help on using the changeset viewer.