Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 100 additions & 0 deletions src/edu/nd/sarec/railwaycrossing/Simulation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
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.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");
Train train = new Train(track.getEndX()+100,track.getEndY()-25);
root.getChildren().add(train.getImageView());

for(CrossingGate gate: mapBuilder.getAllGates())
train.addObserver(gate);

// 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();

for(CrossingGate gate: mapBuilder.getAllGates())
gate.operateGate();

if (train.offScreen())
train.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);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package edu.nd.sarec.railwaycrossing.model.infrastructure;

public enum Direction {
NORTH,
SOUTH,
EAST,
WEST,
CUSTOM;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package edu.nd.sarec.railwaycrossing.model.infrastructure;

import java.awt.Point;
import java.util.Collection;
import java.util.HashMap;

import edu.nd.sarec.railwaycrossing.model.infrastructure.gate.CrossingGate;

/**
* Creates all infrastructure for the simulation
* @author jane
*
*/
public class MapBuilder {
HashMap<String, Road> roads;
HashMap<String, CrossingGate> gates;
HashMap<String, RailwayTracks> tracks;

public MapBuilder(){
roads = new HashMap<String,Road>();
gates = new HashMap<String,CrossingGate>();
tracks = new HashMap<String,RailwayTracks>();
buildRoads();
buildCrossingGates();
buildTracks();
assignGatesToRoads();
buildCarFactories();
}

private void buildRoads(){
roads.put("Western Highway",new Road(new Point(800,0),new Point (800,1000),Direction.SOUTH,true,false));
roads.put("Skyway",new Road(new Point(400,0),new Point (400,1000),Direction.SOUTH,true,false));
roads.put("EastWest",new Road(new Point(415,800),new Point (785,800),Direction.EAST,true,true));
}

private void buildCrossingGates(){
gates.put("Gate1", new CrossingGate(780,480, "Gate1"));
gates.put("Gate2", new CrossingGate(380,480, "Gate2"));
}

private void buildTracks(){
tracks.put("Royal", new RailwayTracks(new Point(0,500),new Point(1200,500)));
}

private void assignGatesToRoads(){
roads.get("Western Highway").assignGate(gates.get("Gate1"));
roads.get("Skyway").assignGate(gates.get("Gate2"));
}

private void buildCarFactories(){
roads.get("Western Highway").addCarFactory();
roads.get("Skyway").addCarFactory();
}

public Collection<CrossingGate> getAllGates(){
return gates.values();
}

public Collection<RailwayTracks> getTracks(){
return tracks.values();
}

public Collection<Road> getRoads(){
return roads.values();
}

public RailwayTracks getTrack(String name){
return tracks.get("Royal");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package edu.nd.sarec.railwaycrossing.model.infrastructure;

import java.awt.Point;

/**
* Railway Tracks (Entity Object)
* @author Jane Cleland-Huang
*
*/
public class RailwayTracks {

private int startX;
private int endX;
private int startY;
private int endY;

public RailwayTracks(){}

public RailwayTracks(Point startPoint, Point endPoint){
startX = startPoint.x;
startY = startPoint.y;
endX = endPoint.x;
endY = endPoint.y;
}

public int getStartX(){
return startX;
}

public int getEndX(){
return endX;
}

public int getStartY(){
return startY;
}

public int getEndY(){
return endY;
}

@Override
public String toString(){
return "Tracks from (" + startX + "," + startY + ") to (" + endX + "," + endY + ")";
}
}
86 changes: 86 additions & 0 deletions src/edu/nd/sarec/railwaycrossing/model/infrastructure/Road.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package edu.nd.sarec.railwaycrossing.model.infrastructure;

import java.awt.Point;
import java.util.Collection;
import java.util.Vector;

import edu.nd.sarec.railwaycrossing.model.infrastructure.gate.CrossingGate;
import edu.nd.sarec.railwaycrossing.model.vehicles.CarFactory;

/**
* Represents a single road
* @author jane
*
*/
public class Road {
private int startX;
private int endX;
private int startY;
private int endY;
private CarFactory carFactory;
Direction direction;
Collection<CrossingGate> gates;
boolean clearEnds = false;
int roadSize;

public Road(){}

public Road(Point start, Point end, Direction direction, boolean buildCarFactory, boolean clearEnds){
startX = start.x;
startY = start.y;
endX = end.x;
endY = end.y;
roadSize = 18;

this.direction = direction;
gates = new Vector<CrossingGate>();
this.clearEnds = clearEnds;

}

// Adds a gate to a road
// In case a new gate is added after the factory is assigned, we reassign factory
// The factory needs to know all gates on the road in order to register each car as an observer.
public void assignGate(CrossingGate gate){
gates.add(gate);
if (carFactory != null)
carFactory = new CarFactory(direction, new Point(startX-roadSize/2,startY), gates); // allows additional gates. Needs fixing
}

public void addCarFactory(){
if (carFactory == null) // We only allow one
carFactory = new CarFactory(direction, new Point(startX-roadSize/2,startY), gates);
}

public CarFactory getCarFactory(){
return carFactory;
}

public int getStartX(){
return startX;
}

public int getEndX(){
return endX;
}

public int getStartY(){
return startY;
}

public int getEndY(){
return endY;
}

public Direction getDirection(){
return direction;
}

public boolean getClearEnds(){
return clearEnds;
}

public int getRoadWidth(){
return roadSize;
}
}
Loading