diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java index 76e1ab25..f5a090d2 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java @@ -72,6 +72,7 @@ public class RaceViewController extends Controller { private int heartbeatDelay = 1000; private long heartbeatTime = 0; private GPSConverter gpsConverter; + private ArrayList fireParticleList = new ArrayList<>(); /** @@ -239,18 +240,13 @@ public class RaceViewController extends Controller { initialiseView3D(this.visualiserRace); initialiseHealthPane(); initialiseRaceClock(); - //initialiseFireEffect(); raceTimer(); // start the timer new Sparkline(this.raceState, this.sparklineChart); timeZone.setText(this.raceState.getRaceClock().getTimeZone()); arrowController.setWindProperty(this.raceState.windProperty()); } - private void initialiseFireEffect(){ - Image fire = new Image(getClass().getClassLoader().getResourceAsStream("images/fire.gif")); - imageView.setImage(fire); - //imageView.setVisible(false); - } + private void initialiseHealthPane() { InputStream tomato = this.getClass().getClassLoader().getResourceAsStream("visualiser/images/tomato.png"); @@ -354,24 +350,15 @@ public class RaceViewController extends Controller { //Create first fire - FireParticle fire = new FireParticle(); + FireParticle fire = new FireParticle(boat.getSourceID(), System.currentTimeMillis()); viewSubjects.add(fire); - fire.rotateView((double) -90, fire.getPosition().getX(), fire.getPosition().getY(), fire.getPosition().getZ(), Rotate.X_AXIS); + //fire.setVisible(false); + fireParticleList.add(fire); - //Create second fire - FireParticle fireSecond = new FireParticle(); - viewSubjects.add(fireSecond); - fireSecond.rotateView((double) -90, fireSecond.getPosition().getX(), fireSecond.getPosition().getY(), fireSecond.getPosition().getZ(), Rotate.X_AXIS); - fireSecond.rotateView((double) 60, fireSecond.getPosition().getX(), fireSecond.getPosition().getY(), fireSecond.getPosition().getZ(), Rotate.Y_AXIS); + //fire.rotateView((double) 90, fire.getPosition().getX(), fire.getPosition().getY(), fire.getPosition().getZ(), Rotate.X_AXIS); - //Create third fire - FireParticle fireThird = new FireParticle(); - viewSubjects.add(fireThird); - fireThird.rotateView((double) -90, fireThird.getPosition().getX(), fireThird.getPosition().getY(), fireThird.getPosition().getZ(), Rotate.X_AXIS); - fireThird.rotateView((double) 120, fireThird.getPosition().getX(), fireThird.getPosition().getY(), fireThird.getPosition().getZ(), Rotate.Y_AXIS); - // Track this boat's movement with the new subject AnimationTimer trackBoat = new AnimationTimer() { @@ -380,21 +367,13 @@ public class RaceViewController extends Controller { boatModel.setHeading(boat.getBearing().degrees()); boatModel.setX(gpsConverter.convertGPS(boat.getPosition()).getX()); boatModel.setZ(gpsConverter.convertGPS(boat.getPosition()).getY()); + boatModel.getMesh().toFront(); //Fire follows boat fire.setHeading(boat.getBearing().degrees()); fire.setX(gpsConverter.convertGPS(boat.getPosition()).getX()); fire.setZ(gpsConverter.convertGPS(boat.getPosition()).getY()); - - fireSecond.setHeading(boat.getBearing().degrees()); - fireSecond.setX(gpsConverter.convertGPS(boat.getPosition()).getX()); - fireSecond.setZ(gpsConverter.convertGPS(boat.getPosition()).getY()); - - fireThird.setHeading(boat.getBearing().degrees()); - fireThird.setX(gpsConverter.convertGPS(boat.getPosition()).getX()); - fireThird.setZ(gpsConverter.convertGPS(boat.getPosition()).getY()); - - + fire.setY(0); } }; @@ -718,6 +697,19 @@ public class RaceViewController extends Controller { if (raceState.getRaceStatusEnum() == RaceStatusEnum.FINISHED) { stop(); // stop the timer } else { + for(VisualiserBoat boat : raceState.getBoats()){ + for (FireParticle fp : fireParticleList){ + if(fp.getSourceID()==boat.getSourceID()){ + if(boat.getHealth()<=20) { + //fp.setVisible(true); + fp.flash(System.currentTimeMillis(), 200); + } else { + fp.setVisible(false); + } + break; + } + } + } try { if(raceState.getBoat(raceState.getPlayerBoatID()).getHealth()<=20){ heartbeatDelay = 500; @@ -725,13 +717,6 @@ public class RaceViewController extends Controller { heartbeatDelay = 1000; } if(raceState.getBoat(raceState.getPlayerBoatID()).getHealth()<=40){ - imageView.setVisible(true); - - imageView.setX(gpsConverter.convertGPS(raceState.getBoat(raceState.getPlayerBoatID()).getPosition()).getX()); - imageView.setY(gpsConverter.convertGPS(raceState.getBoat(raceState.getPlayerBoatID()).getPosition()).getY()); - System.out.println("Boat:" + gpsConverter.convertGPS(raceState.getBoat(raceState.getPlayerBoatID()).getPosition()).getX()); - System.out.println("Image:" + imageView.getX()); - //imageView.translateXProperty().setValue(raceState.getBoat(raceState.getPlayerBoatID()).getPosition().getLongitude()); if(System.currentTimeMillis() > heartbeatTime+heartbeatDelay) { diff --git a/racevisionGame/src/main/java/visualiser/layout/FireParticle.java b/racevisionGame/src/main/java/visualiser/layout/FireParticle.java index 9b0a9172..35fd39a1 100644 --- a/racevisionGame/src/main/java/visualiser/layout/FireParticle.java +++ b/racevisionGame/src/main/java/visualiser/layout/FireParticle.java @@ -5,8 +5,7 @@ import javafx.scene.image.Image; import javafx.scene.paint.Color; import javafx.scene.paint.Material; import javafx.scene.paint.PhongMaterial; -import javafx.scene.shape.MeshView; -import javafx.scene.shape.Shape3D; +import javafx.scene.shape.*; import javafx.scene.transform.Rotate; import javafx.scene.transform.Translate; @@ -15,14 +14,21 @@ import javafx.scene.transform.Translate; */ public class FireParticle extends Subject3D { - public FireParticle(){ - super(createFire(), 0); + private int sourceID; + private long currentTime; + private long flashInterval; + public FireParticle(int sourceID, long currentTime){ + super(createFire(), 0); + this.sourceID = sourceID; + this.currentTime = currentTime; } private static Shape3D createFire(){ - Image fire = new Image(FireParticle.class.getClassLoader().getResourceAsStream("images/fire.gif")); + Image fire = new Image(FireParticle.class.getClassLoader().getResourceAsStream("images/warning.png")); + + Plane3D plane = new Plane3D(20, 20, 10, 10); @@ -31,17 +37,12 @@ public class FireParticle extends Subject3D { material.setSpecularColor(Color.web("#000000")); material.setDiffuseMap(fire); - - //material.setDiffuseMap(fire); - MeshView fireSurface = new MeshView(plane); - fireSurface.setTranslateZ(15); - fireSurface.setTranslateY(10); + fireSurface.setMaterial(material); fireSurface.setMouseTransparent(true); - fireSurface.toFront(); - + //fireSurface.toFront(); this.flashInterval = flashInterval; return fireSurface; } @@ -54,5 +55,24 @@ public class FireParticle extends Subject3D { this.getMesh().getTransforms().add(rotate); } + public void setVisible(boolean bool){ + this.getMesh().setVisible(bool); + } + + + public int getSourceID(){ + return sourceID; + } + + public void flash(long checkTime, long flashInterval){ + if(checkTime >= (currentTime+flashInterval)){ + this.currentTime = checkTime; + if(this.getMesh().isVisible()){ + this.setVisible(false); + } else { + this.setVisible(true); + } + } + } } diff --git a/racevisionGame/src/main/resources/images/fire.gif b/racevisionGame/src/main/resources/images/fire.gif deleted file mode 100644 index ba0a9ebd..00000000 Binary files a/racevisionGame/src/main/resources/images/fire.gif and /dev/null differ diff --git a/racevisionGame/src/main/resources/images/warning.png b/racevisionGame/src/main/resources/images/warning.png new file mode 100644 index 00000000..fb640948 Binary files /dev/null and b/racevisionGame/src/main/resources/images/warning.png differ