Changeset 77 for trunk/UEngine.pas


Ignore:
Timestamp:
May 19, 2021, 11:30:41 AM (3 years ago)
Author:
chronos
Message:
  • Added: Control icons for Pause, Play and Fast forward.
  • Modified: Image buttons changed to custom TImage control with Enabled property supported.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UEngine.pas

    r76 r77  
    99  {$IFDEF Darwin}MacOSAll, CocoaAll, CocoaUtils,{$ENDIF}
    1010  Classes, SysUtils, Graphics, Controls, ExtCtrls, Math, DateUtils,
    11   UMetaCanvas, fgl, UMenu;
     11  UMetaCanvas, fgl, UMenu, UControls;
    1212
    1313type
     
    278278    FDarkMode: Boolean;
    279279    FOnDarkModeChange: TNotifyEvent;
     280    FState: TGameState;
    280281    LastMousePos: TPoint;
    281282    LastFocusedStation: TMapStation;
     
    294295    MenuGame: TMenu;
    295296    LastState: TGameState;
     297    TimePerSecond: TDateTime;
    296298    function GetServedDaysCount: Integer;
    297299    procedure ResizeView;
     
    315317    procedure SetDarkMode(AValue: Boolean);
    316318    procedure InitColors;
     319    procedure SetState(AValue: TGameState);
    317320    procedure TrainMovement;
    318321    function GetUnusedLine: TMetroLine;
     
    325328    procedure MenuItemGameRestart(Sender: TObject);
    326329    procedure MenuItemBack(Sender: TObject);
     330    procedure ButtonPlay(Sender: TObject);
     331    procedure ButtonPause(Sender: TObject);
     332    procedure ButtonFastForward(Sender: TObject);
    327333    procedure ButtonBackClick(Sender: TObject);
    328334    procedure DarkModeChanged(Sender: TObject);
    329335    procedure LanguageChanged(Sender: TObject);
    330336    procedure FullScreenChanged(Sender: TObject);
     337    procedure UpdateInterface;
    331338  public
    332339    Colors: TColors;
     
    343350    TrackStationUp: TTrackPoint;
    344351    ServedPassengerCount: Integer;
    345     State: TGameState;
    346352    RedrawPending: Boolean;
    347     ButtonBack: TMenuItemImage;
     353    ButtonBack: TImage;
    348354    ImagePassenger: TImage;
    349355    ImageLocomotive: TImage;
     356    ImagePlay: TImage;
     357    ImagePause: TImage;
     358    ImageFastForward: TImage;
    350359    HighestServedPassengerCount: Integer;
    351360    HighestServedDaysCount: Integer;
     
    365374    property Time: TDateTime read FTime;
    366375    property DarkMode: Boolean read FDarkMode write SetDarkMode;
     376    property State: TGameState read FState write SetState;
    367377    property ServedDaysCount: Integer read GetServedDaysCount;
    368378    property OnDarkModeChange: TNotifyEvent read FOnDarkModeChange
     
    386396  ImageLocomotiveName = 'Images/Locomotive.png';
    387397  ImageLeftArrowName = 'Images/Left arrow.png';
     398  ImagePlayName = 'Images/Play.png';
     399  ImagePauseName = 'Images/Pause.png';
     400  ImageFastForwardName = 'Images/Fast forward.png';
    388401  TrainPassengerCount = 6;
    389402  StationMinDistance = 100;
     
    395408  EndStationLength = 50;
    396409  ShowDistances = False;
    397   TimePerSecond = 60 * OneMinute;
     410  TimePerSecondNormal = 60 * OneMinute;
     411  TimePerSecondFast = 2 * TimePerSecondNormal;
    398412  NewStationPeriod = 1;
    399413  NewShapePeriod = 10;
     
    16921706    MenuItemBackgroundSelected := $f7bC61;
    16931707  end;
     1708end;
     1709
     1710procedure TEngine.SetState(AValue: TGameState);
     1711begin
     1712  if FState = AValue then Exit;
     1713  FState := AValue;
     1714  UpdateInterface;
    16941715end;
    16951716
     
    19491970end;
    19501971
     1972procedure TEngine.ButtonPlay(Sender: TObject);
     1973begin
     1974  TimePerSecond := TimePerSecondNormal;
     1975  if State = gsPaused then State := gsRunning;
     1976  UpdateInterface;
     1977end;
     1978
     1979procedure TEngine.ButtonPause(Sender: TObject);
     1980begin
     1981  if State = gsRunning then State := gsPaused;
     1982  UpdateInterface;
     1983end;
     1984
     1985procedure TEngine.ButtonFastForward(Sender: TObject);
     1986begin
     1987  TimePerSecond := TimePerSecondFast;
     1988  if State = gsPaused then State := gsRunning;
     1989  UpdateInterface;
     1990end;
     1991
    19511992procedure TEngine.MenuItemGameContinue(Sender: TObject);
    19521993begin
     
    19892030  FormMain.FullScreen := TMenuItemCheckBox(Sender).Checked;
    19902031  FormMain.PersistentForm1.SetFullScreen(FormMain.FullScreen);
     2032end;
     2033
     2034procedure TEngine.UpdateInterface;
     2035begin
     2036  ImagePlay.Enabled := not ((State = gsRunning) and (TimePerSecond = TimePerSecondNormal));
     2037  ImageFastForward.Enabled := not ((State = gsRunning) and (TimePerSecond = TimePerSecondFast));
     2038  ImagePause.Enabled := FState = gsRunning; //not (State = gsPaused);
    19912039end;
    19922040
     
    20952143  Angle: Double;
    20962144  Text: string;
    2097   Text2: string;
    20982145  I: Integer;
     2146  Y: Integer;
    20992147const
    21002148  ClockSize = 20;
     
    21152163      ClockCenter.Y + Round(Sin(Angle) * ClockSize * 0.9));
    21162164  end;
     2165  Y := ClockCenter.Y + ScaleY(5, 96);
    21172166
    21182167  Canvas.Font.Color := Colors.Text;
    21192168  Text := FormatDateTime('ddd', Time + 2);
    2120   Canvas.TextOut(ClockCenter.X - ClockSize - Canvas.TextWidth(Text) - 10, ClockCenter.Y -
    2121     Canvas.TextHeight(Text) div 2, Text);
    2122 
    2123   Text2 := SDay + ' ' + IntToStr(Trunc(Time));
    2124   Canvas.TextOut(ClockCenter.X - ClockSize - Canvas.TextWidth(Text) - 10, ClockCenter.Y -
    2125     Canvas.TextHeight(Text2) div 2 + Trunc(Canvas.TextHeight(Text) * 1.1), Text2);
     2169  Canvas.TextOut(ClockCenter.X - ClockSize - Canvas.TextWidth(Text) - 10,
     2170    Y - Canvas.TextHeight(Text) div 2, Text);
     2171  Y := Y + Canvas.TextHeight(Text)  + ScaleY(5, 96);
     2172
     2173  Text := SDay + ' ' + IntToStr(Trunc(Time));
     2174  Canvas.TextOut(ClockCenter.X - ClockSize - Canvas.TextWidth(Text) - 10,
     2175    Y - Canvas.TextHeight(Text) div 2, Text);
     2176  Y := Y + Canvas.TextHeight(Text)  + ScaleY(5, 96);
     2177
     2178  ImagePause.Canvas := Canvas;
     2179  ImagePause.Bounds := Bounds(CanvasSize.X - ScaleX(20 + 10, 96), Y, ScaleX(20, 96), ScaleY(20, 96));
     2180  ImagePause.Paint;
     2181  Y := Y + ImagePause.Bounds.Height + ScaleY(5, 96);
     2182
     2183  ImagePlay.Canvas := Canvas;
     2184  ImagePlay.Bounds := Bounds(CanvasSize.X - ScaleX(20 + 10, 96) , Y, ScaleX(20, 96), ScaleY(20, 96));
     2185  ImagePlay.Paint;
     2186  Y := Y + ImagePlay.Bounds.Height + ScaleY(5, 96);
     2187
     2188  ImageFastForward.Canvas := Canvas;
     2189  ImageFastForward.Bounds := Bounds(CanvasSize.X - ScaleX(20 + 10, 96) , Y, ScaleX(20, 96), ScaleY(20, 96));
     2190  ImageFastForward.Paint;
     2191  Y := Y + ImageFastForward.Bounds.Height + ScaleY(5, 96);
    21262192end;
    21272193
     
    23942460  Text := IntToStr(Trains.GetUnusedCount);
    23952461  Canvas.Draw(CanvasSize.X div 2 - Length(LineColors) div 2 * LineColorsDist - 100,
    2396     CanvasSize.Y - LineColorsDist - ImageLocomotive.Picture.Bitmap.Height div 2, ImageLocomotive.Picture.Bitmap);
     2462    CanvasSize.Y - LineColorsDist - ImageLocomotive.Bitmap.Height div 2, ImageLocomotive.Bitmap);
    23972463  Canvas.Brush.Style := bsClear;
    23982464  Canvas.Font.Size := 14;
     
    24032469  // Status interface
    24042470  Text := IntToStr(ServedPassengerCount);
    2405   Canvas.Draw(CanvasSize.X - 50, CanvasSize.Y - 60, ImagePassenger.Picture.Bitmap);
     2471  Canvas.Draw(CanvasSize.X - 50, CanvasSize.Y - 60, ImagePassenger.Bitmap);
    24062472  Canvas.Brush.Style := bsClear;
    24072473  Canvas.Font.Size := 14;
     
    24152481  Canvas.Font.Size := 40;
    24162482  Canvas.Font.Color := Colors.Text;
    2417   ButtonBack.Paint(Canvas, Point(10, 10));
     2483  ButtonBack.Canvas := Canvas;
     2484  ButtonBack.Bounds.Left := 10;
     2485  ButtonBack.Bounds.Top := 10;
     2486  ButtonBack.Paint;
    24182487
    24192488  // Show train grabbed by mouse
     
    24412510  if State = gsRunning then begin
    24422511    FTime := FTime + (Now - LastTickTime) / OneSecond * TimePerSecond;
    2443     Redraw; // Redraw on every because engine time is changed so clock should be redrawn
     2512    Redraw; // Redraw on every tick because engine time is changed so clock should be redrawn
    24442513
    24452514  // Add new trains
     
    25932662      end;
    25942663
     2664      // Pause button
     2665      if ImagePause.Bounds.Contains(Position) then begin
     2666        if Assigned(ImagePause.OnClick) then
     2667          ImagePause.OnClick(ImagePause);
     2668      end;
     2669
     2670      // Play button
     2671      if ImagePlay.Bounds.Contains(Position) then begin
     2672        if Assigned(ImagePlay.OnClick) then
     2673          ImagePlay.OnClick(ImagePlay);
     2674      end;
     2675
     2676      // Fast forward button
     2677      if ImageFastForward.Bounds.Contains(Position) then begin
     2678        if Assigned(ImageFastForward.OnClick) then
     2679          ImageFastForward.OnClick(ImageFastForward);
     2680      end;
     2681
    25952682      // Place selected train if focused track
    25962683      if Assigned(SelectedTrain) then begin
     
    27922879constructor TEngine.Create;
    27932880begin
    2794   ButtonBack := TMenuItemImage.Create;
     2881  TimePerSecond := TimePerSecondNormal;
     2882  ButtonBack := TImage.Create;
    27952883  ButtonBack.OnClick := ButtonBackClick;
    2796   ButtonBack.BackgroundColor := clNone;
    27972884  ButtonBack.Bounds := Bounds(0, 0, ScaleX(80, 96), ScaleY(80, 96));
    27982885  MenuMain := TMenu.Create;
     
    28102897  View := TView.Create;
    28112898  Trains := TMetroTrains.Create;
    2812   ImagePassenger := TImage.Create(nil);
    2813   ImageLocomotive := TImage.Create(nil);
     2899  ImagePassenger := TImage.Create;
     2900  ImageLocomotive := TImage.Create;
     2901  ImagePlay := TImage.Create;
     2902  ImagePlay.OnClick := ButtonPlay;
     2903  ImagePause := TImage.Create;
     2904  ImagePause.OnClick := ButtonPause;
     2905  ImageFastForward := TImage.Create;
     2906  ImageFastForward.OnClick := ButtonFastForward;
    28142907  //if FileExists(ImagePassengerName) then
    28152908  //  ImagePassenger.Picture.LoadFromFile(ImagePassengerName);
     
    28242917  FreeAndNil(MetaCanvas);
    28252918  FreeAndNil(Trains);
     2919  FreeAndNil(ImagePlay);
     2920  FreeAndNil(ImageFastForward);
     2921  FreeAndNil(ImagePause);
    28262922  FreeAndNil(ImageLocomotive);
    28272923  FreeAndNil(ImagePassenger);
Note: See TracChangeset for help on using the changeset viewer.