- Timestamp:
- Mar 27, 2015, 1:13:50 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/UEngine.pas
r14 r15 158 158 UpdatedShape: TStationShape; Distance: Integer); 159 159 function GetTime: TDateTime; 160 procedure TrainMovement; 160 161 public 161 162 Passengers: TMetroPassengers; … … 793 794 end; 794 795 795 procedure TEngine.DrawClock(Canvas: TCanvas); 796 var 797 ClockCenter: TPoint; 798 Angle: Double; 799 Text: string; 800 I: Integer; 801 const 802 ClockSize = 20; 803 begin 804 Canvas.Pen.Style := psSolid; 805 Canvas.Pen.Color := clBlack; 806 Canvas.Pen.Width := 2; 807 ClockCenter := Point(Canvas.Width - 30, 40); 808 Angle := Time / (12 * OneHour) * 2 * Pi - Pi / 2; 809 Canvas.EllipseC(ClockCenter.X, ClockCenter.Y, ClockSize, ClockSize); 810 Canvas.Line(ClockCenter, Point(ClockCenter.X + Round(Cos(Angle) * ClockSize * 0.8), 811 ClockCenter.Y + Round(Sin(Angle) * ClockSize * 0.8))); 812 Text := FormatDateTime('ddd', Time); 813 Canvas.TextOut(ClockCenter.X - ClockSize - Canvas.TextWidth(Text) - 5, ClockCenter.Y - 814 Canvas.TextWidth(Text) div 2, Text); 815 for I := 0 to 12 do begin 816 Angle := I / 12 * 2 * Pi; 817 Canvas.Line(ClockCenter.X + Round(Cos(Angle) * ClockSize * 0.8), 818 ClockCenter.Y + Round(Sin(Angle) * ClockSize * 0.8), 819 ClockCenter.X + Round(Cos(Angle) * ClockSize * 0.9), 820 ClockCenter.Y + Round(Sin(Angle) * ClockSize * 0.9)); 821 end; 822 end; 823 824 procedure TEngine.DrawTrains(Canvas: TCanvas); 825 var 826 I: Integer; 796 procedure TEngine.TrainMovement; 797 var 798 I: Integer; 799 CurrentStationIndex: Integer; 800 CurrentStation: TMetroStation; 827 801 P: Integer; 828 Pos: TPoint;829 Points: array of TPoint;830 Angle: Double;831 ShapePos: TPoint;832 begin833 // Draw trains834 for I := 0 to Trains.Count - 1 do835 with TMetroTrain(Trains[I]) do begin836 if Assigned(Line) then begin837 Canvas.Brush.Color := Line.Color;838 Canvas.Brush.Style := bsSolid;839 Canvas.Pen.Style := psClear;840 Pos := GetPosition;841 Angle := GetAngle;842 843 SetLength(Points, 4);844 Points[0] := RotatePoint(Pos, Point(Pos.X - TrainSize div 2, Pos.Y - TrainSize div 3), Angle);845 Points[1] := RotatePoint(Pos, Point(Pos.X + TrainSize div 2, Pos.Y - TrainSize div 3), Angle);846 Points[2] := RotatePoint(Pos, Point(Pos.X + TrainSize div 2, Pos.Y + TrainSize div 3), Angle);847 Points[3] := RotatePoint(Pos, Point(Pos.X - TrainSize div 2, Pos.Y + TrainSize div 3), Angle);848 Canvas.Polygon(Points);849 Canvas.Brush.Color := clWhite;850 for P := 0 to Passengers.Count - 1 do851 with TMetroPassenger(Passengers[P]) do begin852 ShapePos := Point(Pos.X - Trunc(TrainSize div 3 * 1) + (P mod 3) * TrainSize div 3,853 Pos.Y - Trunc(TrainSize div 6 * 1) + (P div 3) * TrainSize div 3);854 ShapePos := RotatePoint(Pos, ShapePos, Angle);855 DrawShape(Canvas, ShapePos, Shape, TrainSize div 3, Angle + Pi / 2);856 end;857 end;858 end;859 860 end;861 862 procedure TEngine.Tick;863 const864 NewStationPeriod = OneSecond * 20;865 NewPassengerPeriod = OneSecond;866 NewPassengerProbability = 0.1;867 var868 802 Passenger: TMetroPassenger; 869 I: Integer;870 P: Integer;871 803 PosDelta: Integer; 872 CurrentStation: TMetroStation; 873 CurrentStationIndex: Integer; 874 begin 875 if State = gsRunning then begin 876 877 // Add new trains 878 if (Now - LastNewWeekTime) > 7 then begin 879 LastNewWeekTime := Now; 880 Trains.AddNew; 881 // TODO: Show notification screen with confirmation 882 end; 883 884 // Add new shape 885 if (Now - LastNewShapeTime) > 10 then begin 886 LastNewShapeTime := Now; 887 if ShapeCount <= Integer(High(TStationShape)) then Inc(ShapeCount); 888 end; 889 890 // Add new stations 891 if (Now - LastNewStationTime) > NewStationPeriod then begin 892 LastNewStationTime := Now; 893 Stations.AddNew; 894 end; 895 896 // Add new passengers 897 if (Now - LastNewPassengerTime) > NewPassengerPeriod then begin 898 LastNewPassengerTime := Now; 899 for I := 0 to Stations.Count - 1 do 900 with TMetroStation(Stations[I]) do 901 if Random < NewPassengerProbability then begin 902 Passenger := Self.Passengers.AddNew; 903 Passenger.Station := TMetroStation(Stations[I]); 904 Passengers.Add(Passenger); 905 906 // Passenger is not allowed to have same shape 907 while (Passenger.Shape = Passenger.Station.Shape) or not (Passenger.Shape in GetExistStationShapes) do 908 Passenger.Shape := TStationShape((Integer(Passenger.Shape) + 1) mod Integer(ShapeCount)); 909 end; 910 end; 911 804 begin 912 805 // Move trains 913 806 for I := 0 to Trains.Count - 1 do … … 1004 897 end; 1005 898 end; 899 end; 900 901 procedure TEngine.DrawClock(Canvas: TCanvas); 902 var 903 ClockCenter: TPoint; 904 Angle: Double; 905 Text: string; 906 I: Integer; 907 const 908 ClockSize = 20; 909 begin 910 Canvas.Pen.Style := psSolid; 911 Canvas.Pen.Color := clBlack; 912 Canvas.Pen.Width := 2; 913 ClockCenter := Point(Canvas.Width - 30, 40); 914 Angle := Time / (12 * OneHour) * 2 * Pi - Pi / 2; 915 Canvas.EllipseC(ClockCenter.X, ClockCenter.Y, ClockSize, ClockSize); 916 Canvas.Line(ClockCenter, Point(ClockCenter.X + Round(Cos(Angle) * ClockSize * 0.8), 917 ClockCenter.Y + Round(Sin(Angle) * ClockSize * 0.8))); 918 Text := FormatDateTime('ddd', Time); 919 Canvas.TextOut(ClockCenter.X - ClockSize - Canvas.TextWidth(Text) - 5, ClockCenter.Y - 920 Canvas.TextWidth(Text) div 2, Text); 921 for I := 0 to 12 do begin 922 Angle := I / 12 * 2 * Pi; 923 Canvas.Line(ClockCenter.X + Round(Cos(Angle) * ClockSize * 0.8), 924 ClockCenter.Y + Round(Sin(Angle) * ClockSize * 0.8), 925 ClockCenter.X + Round(Cos(Angle) * ClockSize * 0.9), 926 ClockCenter.Y + Round(Sin(Angle) * ClockSize * 0.9)); 927 end; 928 end; 929 930 procedure TEngine.DrawTrains(Canvas: TCanvas); 931 var 932 I: Integer; 933 P: Integer; 934 Pos: TPoint; 935 Points: array of TPoint; 936 Angle: Double; 937 ShapePos: TPoint; 938 begin 939 // Draw trains 940 for I := 0 to Trains.Count - 1 do 941 with TMetroTrain(Trains[I]) do begin 942 if Assigned(Line) then begin 943 Canvas.Brush.Color := Line.Color; 944 Canvas.Brush.Style := bsSolid; 945 Canvas.Pen.Style := psClear; 946 Pos := GetPosition; 947 Angle := GetAngle; 948 949 SetLength(Points, 4); 950 Points[0] := RotatePoint(Pos, Point(Pos.X - TrainSize div 2, Pos.Y - TrainSize div 3), Angle); 951 Points[1] := RotatePoint(Pos, Point(Pos.X + TrainSize div 2, Pos.Y - TrainSize div 3), Angle); 952 Points[2] := RotatePoint(Pos, Point(Pos.X + TrainSize div 2, Pos.Y + TrainSize div 3), Angle); 953 Points[3] := RotatePoint(Pos, Point(Pos.X - TrainSize div 2, Pos.Y + TrainSize div 3), Angle); 954 Canvas.Polygon(Points); 955 Canvas.Brush.Color := clWhite; 956 for P := 0 to Passengers.Count - 1 do 957 with TMetroPassenger(Passengers[P]) do begin 958 ShapePos := Point(Pos.X - Trunc(TrainSize div 3 * 1) + (P mod 3) * TrainSize div 3, 959 Pos.Y - Trunc(TrainSize div 6 * 1) + (P div 3) * TrainSize div 3); 960 ShapePos := RotatePoint(Pos, ShapePos, Angle); 961 DrawShape(Canvas, ShapePos, Shape, TrainSize div 3, Angle + Pi / 2); 962 end; 963 end; 964 end; 965 966 end; 967 968 procedure TEngine.Tick; 969 const 970 NewStationPeriod = OneSecond * 20; 971 NewPassengerPeriod = OneSecond; 972 NewPassengerProbability = 0.1; 973 var 974 Passenger: TMetroPassenger; 975 I: Integer; 976 begin 977 if State = gsRunning then begin 978 979 // Add new trains 980 if (Now - LastNewWeekTime) > 7 then begin 981 LastNewWeekTime := Now; 982 Trains.AddNew; 983 // TODO: Show notification screen with confirmation 984 end; 985 986 // Add new shape 987 if (Now - LastNewShapeTime) > 10 then begin 988 LastNewShapeTime := Now; 989 if ShapeCount <= Integer(High(TStationShape)) then Inc(ShapeCount); 990 end; 991 992 // Add new stations 993 if (Now - LastNewStationTime) > NewStationPeriod then begin 994 LastNewStationTime := Now; 995 Stations.AddNew; 996 end; 997 998 // Add new passengers 999 if (Now - LastNewPassengerTime) > NewPassengerPeriod then begin 1000 LastNewPassengerTime := Now; 1001 for I := 0 to Stations.Count - 1 do 1002 with TMetroStation(Stations[I]) do 1003 if Random < NewPassengerProbability then begin 1004 Passenger := Self.Passengers.AddNew; 1005 Passenger.Station := TMetroStation(Stations[I]); 1006 Passengers.Add(Passenger); 1007 1008 // Passenger is not allowed to have same shape 1009 while (Passenger.Shape = Passenger.Station.Shape) or not (Passenger.Shape in GetExistStationShapes) do 1010 Passenger.Shape := TStationShape((Integer(Passenger.Shape) + 1) mod Integer(ShapeCount)); 1011 end; 1012 end; 1013 1014 TrainMovement; 1006 1015 1007 1016 // Game over
Note:
See TracChangeset
for help on using the changeset viewer.