|
@@ -1,8 +1,10 @@
|
1
|
1
|
import * as PIXI from 'pixi.js';
|
|
2
|
+import * as tinycolor from 'tinycolor2';
|
|
3
|
+
|
2
|
4
|
import Line from './Line';
|
3
|
5
|
import Station from './Station';
|
4
|
6
|
import Train from './Train';
|
5
|
|
-import { avgHexColor, distance, pointsAlmostEqual, pointsEqual, randomInt, randomPoint,
|
|
7
|
+import { distance, pointsAlmostEqual, pointsEqual, randomInt, randomPoint,
|
6
|
8
|
rangeMap, weightedRandom } from './utils';
|
7
|
9
|
|
8
|
10
|
import './style.css';
|
|
@@ -44,7 +46,7 @@ const initStations = (numStations: number): Station[] => {
|
44
|
46
|
stations.push(new Station(
|
45
|
47
|
randomDistantPoint(stations, 30),
|
46
|
48
|
randomInt(300, 2000),
|
47
|
|
- randomInt(0x000000, 0xFFFFFF)));
|
|
49
|
+ tinycolor.random()));
|
48
|
50
|
}
|
49
|
51
|
return stations;
|
50
|
52
|
};
|
|
@@ -79,12 +81,16 @@ const moveTrains = (trains: Train[], stations: Station[]) => {
|
79
|
81
|
// train reached destination, stop moving and let passengers off
|
80
|
82
|
if (pointsAlmostEqual(train.location, train.destination.location)) {
|
81
|
83
|
train.speed = 0;
|
|
84
|
+
|
|
85
|
+ train.destination.color = tinycolor.mix(
|
|
86
|
+ train.destination.color,
|
|
87
|
+ train.origin.color,
|
|
88
|
+ Math.round((train.passengers / train.destination.population) * 100),
|
|
89
|
+ );
|
|
90
|
+
|
82
|
91
|
train.destination.population += train.passengers;
|
83
|
92
|
train.passengers = 0;
|
84
|
93
|
|
85
|
|
- // TODO: average colors
|
86
|
|
- // train.destination.color = avgHexColor(train.origin.color, train.destination.color);
|
87
|
|
-
|
88
|
94
|
// prepare for next journey
|
89
|
95
|
train.origin = train.destination;
|
90
|
96
|
train.destination = undefined;
|
|
@@ -112,7 +118,7 @@ const moveTrains = (trains: Train[], stations: Station[]) => {
|
112
|
118
|
const drawStations = (stations: Station[], graphics: PIXI.Graphics) => {
|
113
|
119
|
for (const station of stations) {
|
114
|
120
|
const radius = station.population / 60;
|
115
|
|
- graphics.beginFill(station.color, 0.5);
|
|
121
|
+ graphics.beginFill(parseInt(station.color.toHex(), 16), 0.5);
|
116
|
122
|
graphics.drawCircle(station.location.x, station.location.y, radius);
|
117
|
123
|
graphics.endFill();
|
118
|
124
|
station.label.x = station.location.x + radius + 1;
|
|
@@ -122,7 +128,7 @@ const drawStations = (stations: Station[], graphics: PIXI.Graphics) => {
|
122
|
128
|
|
123
|
129
|
const drawTrains = (trains: Train[], graphics: PIXI.Graphics) => {
|
124
|
130
|
for (const train of trains) {
|
125
|
|
- graphics.beginFill(train.origin.color, 0.8);
|
|
131
|
+ graphics.beginFill(parseInt(train.origin.color.toHex(), 16), 0.8);
|
126
|
132
|
graphics.drawCircle(train.location.x, train.location.y,
|
127
|
133
|
rangeMap(train.passengers, 0, TRAIN_CAPACITY, 1, 5));
|
128
|
134
|
graphics.endFill();
|
|
@@ -154,7 +160,7 @@ const run = () => {
|
154
|
160
|
fpsText.y = 0;
|
155
|
161
|
|
156
|
162
|
const stations = initStations(30);
|
157
|
|
- const trains = initTrains(100, stations);
|
|
163
|
+ const trains = initTrains(50, stations);
|
158
|
164
|
// const line = new Line(stations, 10);
|
159
|
165
|
|
160
|
166
|
ticker.stop();
|