From e53d7d894ba1aab635b76930e51948df7c86db7e Mon Sep 17 00:00:00 2001 From: zwu18 Date: Tue, 26 Sep 2017 16:03:35 +1300 Subject: [PATCH] Warning sound added. Sound synced with visual display. #story[1292] --- .../Controllers/RaceViewController.java | 52 ++++++++++-------- .../{FireParticle.java => HealthEffect.java} | 43 +++++++++------ .../resources/visualiser/sounds/warning.mp3 | Bin 0 -> 13460 bytes 3 files changed, 55 insertions(+), 40 deletions(-) rename racevisionGame/src/main/java/visualiser/layout/{FireParticle.java => HealthEffect.java} (54%) create mode 100644 racevisionGame/src/main/resources/visualiser/sounds/warning.mp3 diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java index f5a090d2..20976cba 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java @@ -25,7 +25,6 @@ import javafx.scene.paint.Material; import javafx.scene.paint.PhongMaterial; import javafx.scene.shape.MeshView; import javafx.scene.shape.Shape3D; -import javafx.scene.transform.Rotate; import javafx.scene.transform.Translate; import javafx.util.Callback; import network.Messages.Enums.RaceStatusEnum; @@ -72,7 +71,7 @@ public class RaceViewController extends Controller { private int heartbeatDelay = 1000; private long heartbeatTime = 0; private GPSConverter gpsConverter; - private ArrayList fireParticleList = new ArrayList<>(); + private ArrayList healthEffectList = new ArrayList<>(); /** @@ -350,10 +349,10 @@ public class RaceViewController extends Controller { //Create first fire - FireParticle fire = new FireParticle(boat.getSourceID(), System.currentTimeMillis()); + HealthEffect fire = new HealthEffect(boat.getSourceID(), System.currentTimeMillis()); viewSubjects.add(fire); //fire.setVisible(false); - fireParticleList.add(fire); + healthEffectList.add(fire); //fire.rotateView((double) 90, fire.getPosition().getX(), fire.getPosition().getY(), fire.getPosition().getZ(), Rotate.X_AXIS); @@ -698,11 +697,15 @@ public class RaceViewController extends Controller { stop(); // stop the timer } else { for(VisualiserBoat boat : raceState.getBoats()){ - for (FireParticle fp : fireParticleList){ + for (HealthEffect fp : healthEffectList){ if(fp.getSourceID()==boat.getSourceID()){ + if(boat.getHealth()<=10){ + fp.flash(System.currentTimeMillis(), 300, boat.getSourceID()==raceState.getPlayerBoatID()); + } + else if(boat.getHealth()<=20) { //fp.setVisible(true); - fp.flash(System.currentTimeMillis(), 200); + fp.flash(System.currentTimeMillis(), 500, boat.getSourceID()==raceState.getPlayerBoatID()); } else { fp.setVisible(false); } @@ -710,24 +713,25 @@ public class RaceViewController extends Controller { } } } - try { - if(raceState.getBoat(raceState.getPlayerBoatID()).getHealth()<=20){ - heartbeatDelay = 500; - } else if (raceState.getBoat(raceState.getPlayerBoatID()).getHealth()<=40){ - heartbeatDelay = 1000; - } - if(raceState.getBoat(raceState.getPlayerBoatID()).getHealth()<=40){ - - //imageView.translateXProperty().setValue(raceState.getBoat(raceState.getPlayerBoatID()).getPosition().getLongitude()); - if(System.currentTimeMillis() > heartbeatTime+heartbeatDelay) { - AudioClip sound = new AudioClip(this.getClass().getResource("/visualiser/sounds/heartbeat.mp3").toExternalForm()); - sound.play(); - heartbeatTime = System.currentTimeMillis() + heartbeatDelay; - } - } - } catch (BoatNotFoundException e) { - e.printStackTrace(); - } +// try { +// if(raceState.getBoat(raceState.getPlayerBoatID()).getHealth()<=10){ +// heartbeatDelay = 300; +// } else if (raceState.getBoat(raceState.getPlayerBoatID()).getHealth()<=20){ +// heartbeatDelay = 500; +// } +// if(raceState.getBoat(raceState.getPlayerBoatID()).getHealth()<=20){ +// +// //imageView.translateXProperty().setValue(raceState.getBoat(raceState.getPlayerBoatID()).getPosition().getLongitude()); +// if(System.currentTimeMillis() > heartbeatTime+heartbeatDelay) { +// AudioClip sound = new AudioClip(this.getClass().getResource("/visualiser/sounds/warning.mp3").toExternalForm()); +// sound.setVolume(0.3); +// sound.play(); +// heartbeatTime = System.currentTimeMillis() + heartbeatDelay; +// } +// } +// } catch (BoatNotFoundException e) { +// e.printStackTrace(); +// } } } }.start(); diff --git a/racevisionGame/src/main/java/visualiser/layout/FireParticle.java b/racevisionGame/src/main/java/visualiser/layout/HealthEffect.java similarity index 54% rename from racevisionGame/src/main/java/visualiser/layout/FireParticle.java rename to racevisionGame/src/main/java/visualiser/layout/HealthEffect.java index 35fd39a1..6b61d5e1 100644 --- a/racevisionGame/src/main/java/visualiser/layout/FireParticle.java +++ b/racevisionGame/src/main/java/visualiser/layout/HealthEffect.java @@ -2,49 +2,51 @@ package visualiser.layout; import javafx.geometry.Point3D; import javafx.scene.image.Image; +import javafx.scene.media.AudioClip; import javafx.scene.paint.Color; -import javafx.scene.paint.Material; import javafx.scene.paint.PhongMaterial; import javafx.scene.shape.*; import javafx.scene.transform.Rotate; -import javafx.scene.transform.Translate; /** * Created by zwu18 on 24/09/17. */ -public class FireParticle extends Subject3D { +public class HealthEffect extends Subject3D { private int sourceID; private long currentTime; private long flashInterval; + private AudioClip sound = new AudioClip(this.getClass().getResource("/visualiser/sounds/warning.mp3").toExternalForm()); - public FireParticle(int sourceID, long currentTime){ - super(createFire(), 0); + public HealthEffect(int sourceID, long currentTime){ + super(createEffect(), 0); this.sourceID = sourceID; this.currentTime = currentTime; } - private static Shape3D createFire(){ - - Image fire = new Image(FireParticle.class.getClassLoader().getResourceAsStream("images/warning.png")); - + /** + * Initialise the mesh view with image + * @return Mesh view + */ + private static Shape3D createEffect(){ + Image image = new Image(HealthEffect.class.getClassLoader().getResourceAsStream("images/warning.png")); Plane3D plane = new Plane3D(20, 20, 10, 10); PhongMaterial material = new PhongMaterial(); material.setDiffuseColor(Color.web("#FFFFFF")); material.setSpecularColor(Color.web("#000000")); - material.setDiffuseMap(fire); + material.setDiffuseMap(image); - MeshView fireSurface = new MeshView(plane); + MeshView imageSurface = new MeshView(plane); - fireSurface.setMaterial(material); - fireSurface.setMouseTransparent(true); - //fireSurface.toFront(); this.flashInterval = flashInterval; + imageSurface.setMaterial(material); + imageSurface.setMouseTransparent(true); + //imageSurface.toFront(); this.flashInterval = flashInterval; - return fireSurface; + return imageSurface; } public void rotateView(Double angle, Double pivotX, Double pivotY, Double pivotZ, Point3D axis){ @@ -64,12 +66,21 @@ public class FireParticle extends Subject3D { return sourceID; } - public void flash(long checkTime, long flashInterval){ + /** + * Flash the mesh view at a certain interval + * @param checkTime The current time of flash + * @param flashInterval Desired flash interval + */ + public void flash(long checkTime, long flashInterval, boolean playerBoat){ if(checkTime >= (currentTime+flashInterval)){ this.currentTime = checkTime; if(this.getMesh().isVisible()){ this.setVisible(false); } else { + if(playerBoat) { + sound.setVolume(0.1); + sound.play(); + } this.setVisible(true); } } diff --git a/racevisionGame/src/main/resources/visualiser/sounds/warning.mp3 b/racevisionGame/src/main/resources/visualiser/sounds/warning.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..dd5ab00e32c41fd044dd2da61b9aae9c681870ac GIT binary patch literal 13460 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