Changeset 128 for trunk/UTrack.pas


Ignore:
Timestamp:
May 1, 2023, 11:21:30 AM (12 months ago)
Author:
chronos
Message:
  • Added: Ability to save and load a game.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UTrack.pas

    r122 r128  
    55uses
    66  Classes, SysUtils, Math, Generics.Collections, UGeometric, DOM, XMLRead,
    7   XMLWrite, UXMLUtils;
     7  XMLWrite, UXMLUtils, UItems;
    88
    99type
     
    2222    function GetVector: TVector;
    2323    procedure Move(Distance: Double);
     24    procedure LoadFromXmlNode(Node: TDOMNode; Points: TTrackPoints);
     25    procedure SaveToXmlNode(Node: TDOMNode);
    2426  end;
    2527
    2628  { TTrackPoint }
    2729
    28   TTrackPoint = class
     30  TTrackPoint = class(TItem)
    2931    OwnerPoint: TObject;
    3032    Position: TPoint;
    31     //PositionShift: TPoint;
    3233    PositionDesigned: TPoint;
    3334    Pending: Boolean;
     
    5051    function GetDistance: Integer;
    5152
    52     procedure LoadFromXmlNode(Node: TDOMNode);
    53     procedure SaveToXmlNode(Node: TDOMNode);
     53    class function GetClassSysName: string; override;
     54    procedure LoadFromXmlNode(Node: TDOMNode); override;
     55    procedure SaveToXmlNode(Node: TDOMNode); override;
    5456    constructor Create;
    5557    destructor Destroy; override;
     
    5860  { TTrackPoints }
    5961
    60   TTrackPoints = class(TObjectList<TTrackPoint>)
     62  TTrackPoints = class(TItems<TTrackPoint>)
    6163    Track: TTrack;
    62     function AddNew: TTrackPoint;
    63     procedure LoadFromXmlNode(Node: TDOMNode);
    64     procedure SaveToXmlNode(Node: TDOMNode);
     64    class function GetClassSysName: string; override;
     65    function CreateItem: TTrackPoint; override;
    6566  end;
    6667
    6768  { TTrackLink }
    6869
    69   TTrackLink = class
     70  TTrackLink = class(TItem)
    7071    Points: TTrackPoints;
    7172    Shift: TPoint;
    72     procedure LoadFromXmlNode(Node: TDOMNode);
    73     procedure SaveToXmlNode(Node: TDOMNode);
     73    class function GetClassSysName: string; override;
     74    procedure LoadFromXmlNode(Node: TDOMNode); override;
     75    procedure SaveToXmlNode(Node: TDOMNode); override;
    7476    constructor Create;
    7577    destructor Destroy; override;
     
    7880  { TTrackLinks }
    7981
    80   TTrackLinks = class(TObjectList<TTrackLink>)
     82  TTrackLinks = class(TItems<TTrackLink>)
     83    class function GetClassSysName: string; override;
    8184    function SearchPoints(Point1, Point2: TTrackPoint): TTrackLink;
    82     function AddNew: TTrackLink;
    83     procedure LoadFromXmlNode(Node: TDOMNode);
    84     procedure SaveToXmlNode(Node: TDOMNode);
    8585  end;
    8686
    8787  { TTrack }
    8888
    89   TTrack = class
     89  TTrack = class(TItem)
    9090    Points: TTrackPoints;
    9191    Links: TTrackLinks;
     
    9696    constructor Create;
    9797    destructor Destroy; override;
    98     procedure LoadFromXmlNode(Node: TDOMNode);
    99     procedure SaveToXmlNode(Node: TDOMNode);
     98    class function GetClassSysName: string; override;
     99    procedure LoadFromXmlNode(Node: TDOMNode); override;
     100    procedure SaveToXmlNode(Node: TDOMNode); override;
    100101  end;
    101102
     
    192193end;
    193194
     195procedure TTrackPosition.LoadFromXmlNode(Node: TDOMNode; Points: TTrackPoints);
     196begin
     197  RelPos := ReadDouble(Node, 'RelPos', RelPos);
     198  BaseTrackPoint := Points.FindById(ReadInteger(Node, 'BaseTrackPoint', 0));
     199end;
     200
     201procedure TTrackPosition.SaveToXmlNode(Node: TDOMNode);
     202begin
     203  WriteDouble(Node, 'RelPos', RelPos);
     204  if Assigned(BaseTrackPoint) then
     205    WriteInteger(Node, 'BaseTrackPoint', BaseTrackPoint.Id)
     206    else WriteInteger(Node, 'BaseTrackPoint', 0)
     207end;
     208
    194209{ TTrackLinks }
     210
     211class function TTrackLinks.GetClassSysName: string;
     212begin
     213  Result := 'Links';
     214end;
    195215
    196216function TTrackLinks.SearchPoints(Point1, Point2: TTrackPoint): TTrackLink;
     
    207227end;
    208228
    209 function TTrackLinks.AddNew: TTrackLink;
    210 begin
    211   Result := TTrackLink.Create;
    212 end;
    213 
    214 procedure TTrackLinks.LoadFromXmlNode(Node: TDOMNode);
    215 var
    216   Node2: TDOMNode;
    217   NewItem: TTrackLink;
    218 begin
    219   Node2 := Node.FirstChild;
    220   while Assigned(Node2) and (Node2.NodeName = 'Link') do begin
    221     NewItem := TTrackLink.Create;
    222     NewItem.LoadFromXmlNode(Node2);
    223     Add(NewItem);
    224     Node2 := Node2.NextSibling;
    225   end;
    226 end;
    227 
    228 procedure TTrackLinks.SaveToXmlNode(Node: TDOMNode);
    229 var
    230   I: Integer;
    231   Node2: TDOMNode;
    232 begin
    233   for I := 0 to Count - 1 do begin;
    234     Node2 := Node.OwnerDocument.CreateElement('Link');
    235     Node.AppendChild(Node2);
    236     Items[I].SaveToXmlNode(Node2);
    237   end;
    238 end;
    239 
    240229{ TTrackPoints }
    241230
    242 function TTrackPoints.AddNew: TTrackPoint;
    243 begin
    244   Result := TTrackPoint.Create;
     231class function TTrackPoints.GetClassSysName: string;
     232begin
     233  Result := 'Points';
     234end;
     235
     236function TTrackPoints.CreateItem: TTrackPoint;
     237begin
     238  Result := inherited;
    245239  Result.Track := Track;
    246 end;
    247 
    248 procedure TTrackPoints.LoadFromXmlNode(Node: TDOMNode);
    249 var
    250   Node2: TDOMNode;
    251   NewItem: TTrackPoint;
    252 begin
    253   Node2 := Node.FirstChild;
    254   while Assigned(Node2) and (Node2.NodeName = 'Point') do begin
    255     NewItem := TTrackPoint.Create;
    256     NewItem.LoadFromXmlNode(Node2);
    257     Add(NewItem);
    258     Node2 := Node2.NextSibling;
    259   end;
    260 end;
    261 
    262 procedure TTrackPoints.SaveToXmlNode(Node: TDOMNode);
    263 var
    264   I: Integer;
    265   Node2: TDOMNode;
    266 begin
    267   for I := 0 to Count - 1 do begin;
    268     Node2 := Node.OwnerDocument.CreateElement('Point');
    269     Node.AppendChild(Node2);
    270     Items[I].SaveToXmlNode(Node2);
    271   end;
    272240end;
    273241
     
    288256end;
    289257
     258class function TTrack.GetClassSysName: string;
     259begin
     260  Result := 'Track';
     261end;
     262
    290263procedure TTrack.LoadFromXmlNode(Node: TDOMNode);
    291 begin
    292   Points.LoadFromXmlNode(Node);
    293   Links.LoadFromXmlNode(Node);
     264var
     265  NewNode: TDOMNode;
     266begin
     267  NewNode := Node.FindNode(DOMString(TTrackPoints.GetClassSysName));
     268  if Assigned(NewNode) then
     269    Points.LoadFromXmlNode(NewNode);
     270
     271  NewNode := Node.FindNode(DOMString(TTrackLinks.GetClassSysName));
     272  if Assigned(NewNode) then
     273    Links.LoadFromXmlNode(NewNode);
    294274end;
    295275
    296276procedure TTrack.SaveToXmlNode(Node: TDOMNode);
    297 begin
    298   Points.SaveToXmlNode(Node);
    299   Links.SaveToXmlNode(Node);
     277var
     278  NewNode: TDOMNode;
     279begin
     280  Points.RebuildItemsId;
     281  Links.RebuildItemsId;
     282
     283  NewNode := Node.OwnerDocument.CreateElement(DOMString(TTrackPoints.GetClassSysName));
     284  Node.AppendChild(NewNode);
     285  Points.SaveToXmlNode(NewNode);
     286
     287  NewNode := Node.OwnerDocument.CreateElement(DOMString(TTrackLinks.GetClassSysName));
     288  Node.AppendChild(NewNode);
     289  Links.SaveToXmlNode(NewNode);
    300290end;
    301291
     
    322312  P1 := Points[Index1].PositionDesigned;
    323313  P2 := Points[Index2].PositionDesigned;
    324   NewTrackPoint := Points.AddNew;
     314  NewTrackPoint := Points.CreateItem;
    325315  Delta := Point(P2.X - P1.X, P2.Y - P1.Y);
    326316  if Abs(Delta.X) > Abs(Delta.Y) then begin
     
    357347{ TTrackLink }
    358348
     349class function TTrackLink.GetClassSysName: string;
     350begin
     351  Result := 'Link';
     352end;
     353
    359354procedure TTrackLink.LoadFromXmlNode(Node: TDOMNode);
    360355begin
    361 
     356  inherited;
    362357end;
    363358
    364359procedure TTrackLink.SaveToXmlNode(Node: TDOMNode);
    365360begin
    366 
     361  inherited;
    367362end;
    368363
     
    416411
    417412    // Add new link to both self and connected track point
    418     NewLink := Track.Links.AddNew;
     413    NewLink := Track.Links.CreateItem;
    419414    NewLink.Points.Add(TrackPoint);
    420415    NewLink.Points.Add(Self);
     
    530525end;
    531526
     527class function TTrackPoint.GetClassSysName: string;
     528begin
     529  Result := 'Point';
     530end;
     531
    532532procedure TTrackPoint.LoadFromXmlNode(Node: TDOMNode);
    533533begin
     534  inherited;
    534535  Position.X := ReadInteger(Node, 'PositionX', Position.X);
    535536  Position.Y := ReadInteger(Node, 'PositionY', Position.Y);
     537  PositionDesigned.X := ReadInteger(Node, 'PositionDesignedX', PositionDesigned.X);
     538  PositionDesigned.Y := ReadInteger(Node, 'PositionDesignedY', PositionDesigned.Y);
    536539end;
    537540
    538541procedure TTrackPoint.SaveToXmlNode(Node: TDOMNode);
    539542begin
     543  inherited;
    540544  WriteInteger(Node, 'PositionX', Position.X);
    541545  WriteInteger(Node, 'PositionY', Position.Y);
     546  WriteInteger(Node, 'PositionDesignedX', PositionDesigned.X);
     547  WriteInteger(Node, 'PositionDesignedY', PositionDesigned.Y);
    542548end;
    543549
     
    554560  FreeAndNil(NeighLinks);
    555561  FreeAndNil(NeighPoints);
     562  Track := nil;
     563  OwnerPoint := nil;
    556564  inherited;
    557565end;
Note: See TracChangeset for help on using the changeset viewer.