-
Notifications
You must be signed in to change notification settings - Fork 46
Expand file tree
/
Copy pathSimulation.java
More file actions
108 lines (89 loc) · 3.13 KB
/
Simulation.java
File metadata and controls
108 lines (89 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package edu.nd.sarec.railwaycrossing;
import java.util.ArrayList;
import java.util.Collection;
import edu.nd.sarec.railwaycrossing.model.infrastructure.MapBuilder;
import edu.nd.sarec.railwaycrossing.model.infrastructure.RailwayTracks;
import edu.nd.sarec.railwaycrossing.model.infrastructure.Road;
import edu.nd.sarec.railwaycrossing.model.infrastructure.gate.CrossingGate;
import edu.nd.sarec.railwaycrossing.model.vehicles.Car;
import edu.nd.sarec.railwaycrossing.model.vehicles.Train;
import edu.nd.sarec.railwaycrossing.model.vehicles.Train2;
import edu.nd.sarec.railwaycrossing.view.MapDisplay;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Simulation extends Application{
private Pane root;
private Scene scene;
private MapBuilder mapBuilder;
private MapDisplay mapDisplay;
@Override
public void start(Stage stage) throws Exception {
root = new Pane();
// Build infrastructure
mapBuilder = new MapBuilder();
mapDisplay = new MapDisplay(root, mapBuilder.getRoads(), mapBuilder.getTracks(),mapBuilder.getAllGates());
mapDisplay.drawTracks();
mapDisplay.drawRoad();
mapDisplay.drawGate();
scene = new Scene(root,1200,1000);
stage.setTitle("Railways");
stage.setScene(scene);
stage.show();
// Train
RailwayTracks track = mapBuilder.getTrack("Royal");
RailwayTracks track2 = mapBuilder.getTrack("Magenta");
Train train = new Train(track.getEndX()+100,track.getEndY()-25);
Train2 train2 = new Train2(track2.getStartX()-100,track2.getStartY()-25);
root.getChildren().add(train.getImageView());
root.getChildren().add(train2.getImageView());
train.addObserver(mapBuilder.getGate("Gate1"));
train.addObserver(mapBuilder.getGate("Gate2"));
train2.addObserver(mapBuilder.getGate("Gate3"));
train2.addObserver(mapBuilder.getGate("Gate4"));
// Sets up a repetitive loop i.e., in handle that runs the actual simulation
new AnimationTimer(){
@Override
public void handle(long now) {
createCar();
train.move();
train2.move();
for(CrossingGate gate: mapBuilder.getAllGates())
gate.operateGate();
if (train.offScreen())
train.reset();
if (train2.offScreen())
train2.reset();
clearCars();
}
}.start();
}
// Clears cars as they leave the simulation
private void clearCars(){
Collection<Road> roads = mapBuilder.getRoads();
for(Road road: roads){
if (road.getCarFactory()!= null){
ArrayList<Car> junkCars = road.getCarFactory().removeOffScreenCars();
mapDisplay.removeCarImages(junkCars);
}
}
}
private void createCar(){
Collection<Road> roads = mapBuilder.getRoads();
for(Road road: roads){
if (road.getCarFactory() != null){
if ((int)(Math.random() * 100) == 15){
Car car = road.getCarFactory().buildCar();
if (car != null){
root.getChildren().add(car.getImageView());
}
}
}
}
}
public static void main(String[] args){
launch(args);
}
}