diff options
| author | Zach Jordan <zxjordan5@gmail.com> | 2023-06-02 08:14:35 -0400 | 
|---|---|---|
| committer | Zach Jordan <zxjordan5@gmail.com> | 2023-06-02 08:14:35 -0400 | 
| commit | 408c42dc788a7d9c218071dea34843b4196fa7c8 (patch) | |
| tree | 6a24298db96c1bec42d9720cc52b85451f896aab | |
| parent | b3306178c75bec60e0842285d20a816b318dba66 (diff) | |
| parent | a0739dc019417f17e77f6c959ebc0989c873514c (diff) | |
| download | NPEhero-408c42dc788a7d9c218071dea34843b4196fa7c8.tar.gz NPEhero-408c42dc788a7d9c218071dea34843b4196fa7c8.tar.bz2 NPEhero-408c42dc788a7d9c218071dea34843b4196fa7c8.zip  | |
Merge branch 'main' of https://gitlab.sowgro.net/guitarheros/guitarhero
Diffstat (limited to '')
35 files changed, 508 insertions, 353 deletions
@@ -1,3 +1,4 @@  *.class  /bin/  /.vscode/ +/.settings/ diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/<project>=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index a58ebdc..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,15 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 diff --git a/levels/intoMyArms/Medium/leaderboard.json b/levels/intoMyArms/Medium/leaderboard.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/levels/intoMyArms/Medium/leaderboard.json @@ -0,0 +1 @@ +[]
\ No newline at end of file diff --git a/levels/intoMyArms/Medium/metadata.json b/levels/intoMyArms/Medium/metadata.json new file mode 100644 index 0000000..fe3e406 --- /dev/null +++ b/levels/intoMyArms/Medium/metadata.json @@ -0,0 +1 @@ +{"numBeats":0,"title":"Medium","bpm":175}
\ No newline at end of file diff --git a/levels/intoMyArms/Medium/notes.txt b/levels/intoMyArms/Medium/notes.txt new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/levels/intoMyArms/Medium/notes.txt diff --git a/levels/intoMyArms/metadata.json b/levels/intoMyArms/metadata.json new file mode 100644 index 0000000..e3f918a --- /dev/null +++ b/levels/intoMyArms/metadata.json @@ -0,0 +1 @@ +{"color1":"0xff0000ff","color2":"0x0000ffff","artist":"COIN","title":"Into My Arms","color5":"0xffff00ff","color3":"0x008000ff","desc":"No description","color4":"0x800080ff"}
\ No newline at end of file diff --git a/levels/testLevel/background.png b/levels/testLevel/background.png Binary files differindex 0113819..e2afd1b 100644 --- a/levels/testLevel/background.png +++ b/levels/testLevel/background.png diff --git a/levels/testLevel/hard/metadata.json b/levels/testLevel/hard/metadata.json index e69de29..6e081fc 100644 --- a/levels/testLevel/hard/metadata.json +++ b/levels/testLevel/hard/metadata.json @@ -0,0 +1 @@ +{"numBeats":0,"title":"Hard","bpm":0}
\ No newline at end of file diff --git a/levels/testLevel/medium/leaderboard.json b/levels/testLevel/medium/leaderboard.json index e69de29..0637a08 100644 --- a/levels/testLevel/medium/leaderboard.json +++ b/levels/testLevel/medium/leaderboard.json @@ -0,0 +1 @@ +[]
\ No newline at end of file diff --git a/levels/testLevel/medium/metadata.json b/levels/testLevel/medium/metadata.json index e69de29..530398b 100644 --- a/levels/testLevel/medium/metadata.json +++ b/levels/testLevel/medium/metadata.json @@ -0,0 +1 @@ +{"numBeats":0,"title":"Medium","bpm":0}
\ No newline at end of file diff --git a/levels/testLevel2/background.png b/levels/testLevel2/background.png Binary files differindex 0113819..e2afd1b 100644 --- a/levels/testLevel2/background.png +++ b/levels/testLevel2/background.png diff --git a/levels/testLevel2/easy/leaderboard.json b/levels/testLevel2/easy/leaderboard.json index e69de29..0637a08 100644 --- a/levels/testLevel2/easy/leaderboard.json +++ b/levels/testLevel2/easy/leaderboard.json @@ -0,0 +1 @@ +[]
\ No newline at end of file diff --git a/levels/testLevel2/easy/metadata.json b/levels/testLevel2/easy/metadata.json index e69de29..2d3f754 100644 --- a/levels/testLevel2/easy/metadata.json +++ b/levels/testLevel2/easy/metadata.json @@ -0,0 +1 @@ +{"numBeats":0,"title":"Easy","bpm":0}
\ No newline at end of file diff --git a/levels/testLevel2/hard/leaderboard.json b/levels/testLevel2/hard/leaderboard.json index e69de29..0637a08 100644 --- a/levels/testLevel2/hard/leaderboard.json +++ b/levels/testLevel2/hard/leaderboard.json @@ -0,0 +1 @@ +[]
\ No newline at end of file diff --git a/levels/testLevel2/hard/metadata.json b/levels/testLevel2/hard/metadata.json index e69de29..c16f6c2 100644 --- a/levels/testLevel2/hard/metadata.json +++ b/levels/testLevel2/hard/metadata.json @@ -0,0 +1 @@ +{"numBeats":0,"title":"Hard","bpm":50}
\ No newline at end of file diff --git a/levels/testLevel2/medium/leaderboard.json b/levels/testLevel2/medium/leaderboard.json index e69de29..0637a08 100644 --- a/levels/testLevel2/medium/leaderboard.json +++ b/levels/testLevel2/medium/leaderboard.json @@ -0,0 +1 @@ +[]
\ No newline at end of file diff --git a/levels/testLevel2/medium/metadata.json b/levels/testLevel2/medium/metadata.json index e69de29..530398b 100644 --- a/levels/testLevel2/medium/metadata.json +++ b/levels/testLevel2/medium/metadata.json @@ -0,0 +1 @@ +{"numBeats":0,"title":"Medium","bpm":0}
\ No newline at end of file diff --git a/src/devmenu/DebugMenu.java b/src/devmenu/DebugMenu.java index 9b68423..19fc8e1 100644 --- a/src/devmenu/DebugMenu.java +++ b/src/devmenu/DebugMenu.java @@ -3,7 +3,6 @@ package devmenu;  import gui.Driver;  import javafx.scene.Scene;  import javafx.scene.control.Button; -import javafx.scene.control.TextField;  import javafx.scene.layout.VBox;  import javafx.stage.Stage; @@ -19,10 +18,6 @@ public class DebugMenu      VBox primaryPane = new VBox();      public DebugMenu()      { -        Button levelCreator = new Button(); -        levelCreator.setText("LEVEL CREATOR"); -        levelCreator.setOnAction(e -> new LevelList()); -          Button wallpaperTest = new Button();          wallpaperTest.setText("wallpaper trees");          wallpaperTest.setOnAction(e -> Driver.setBackground("assets/trees.png")); @@ -39,7 +34,7 @@ public class DebugMenu          testVol.setText("print volumes");          testVol.setOnAction(e -> System.out.println("sfx:"+Driver.settingsController.effectsVol+" msc:"+Driver.settingsController.musicVol)); -        primaryPane.getChildren().addAll(levelCreator,wallpaperTest,wallpaperTest2,wallpaperTest3,testVol); +        primaryPane.getChildren().addAll(wallpaperTest,wallpaperTest2,wallpaperTest3,testVol);          Scene primaryScene = new Scene(primaryPane);          primaryStage.setScene(primaryScene); diff --git a/src/devmenu/DiffEditor.java b/src/devmenu/DiffEditor.java index 278e3de..e2ce5d8 100644 --- a/src/devmenu/DiffEditor.java +++ b/src/devmenu/DiffEditor.java @@ -1,5 +1,8 @@  package devmenu; +import java.io.FileNotFoundException; +import java.io.UnsupportedEncodingException; +  import javafx.scene.Scene;  import javafx.scene.control.Button;  import javafx.scene.control.TextField; @@ -10,10 +13,18 @@ import main.Difficulty;  public class DiffEditor  { +    /* +     * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes. +     * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature. +     * style classes are defined in the style.css file. +     */      public DiffEditor(Difficulty diff)      { +        Stage primaryStage = new Stage(); +          Text folderNameLabel = new Text("Folder name (ordered alphabetically)");          TextField folderName = new TextField(diff.thisDir.getName()); +        folderName.setDisable(true);          Text titleLabel = new Text("Title");          TextField title = new TextField(diff.title); @@ -25,26 +36,27 @@ public class DiffEditor          TextField numBeats = new TextField(diff.numBeats+"");          Button editNotes = new Button("Edit notes"); -        editNotes.setOnAction(e -> new NotesEditor(diff)); +        editNotes.setOnAction(e -> { +            try { +                new NotesEditor(diff); +            } catch (FileNotFoundException | UnsupportedEncodingException e1) { +                e1.printStackTrace(); +            } +        });          Button editScores = new Button("Edit leaderboard");          Button save = new Button("Save"); -        save.setOnAction(e -> { +        save.setOnAction(e -> { //assigns text feilds to values              diff.title = title.getText(); -            diff.bpm = Integer.parseInt(bpm.getText()); +            diff.bpm = Double.parseDouble(bpm.getText());              diff.numBeats = Integer.parseInt(numBeats.getText()); -            if(! diff.thisDir.getName().equals(folderName.getText())); -            { -                //will rename -            }              diff.writeMetadata();          });          VBox main = new VBox();          main.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,bpmLabel,bpm,numBeatsLabel,numBeats,editNotes,editScores,save);          Scene scene = new Scene(main); -        Stage primaryStage = new Stage();          primaryStage.setScene(scene);          primaryStage.show();      } diff --git a/src/devmenu/LevelEditor.java b/src/devmenu/LevelEditor.java index 00a21a3..94509ac 100644 --- a/src/devmenu/LevelEditor.java +++ b/src/devmenu/LevelEditor.java @@ -1,7 +1,6 @@  package devmenu; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; +import java.io.File;  import javafx.collections.FXCollections;  import javafx.collections.ObservableList;  import javafx.scene.Scene; @@ -12,16 +11,30 @@ import javafx.scene.control.TextField;  import javafx.scene.layout.HBox;  import javafx.scene.layout.VBox;  import javafx.scene.text.Text; +import javafx.stage.FileChooser;  import javafx.stage.Stage; +import javafx.stage.FileChooser.ExtensionFilter;  import main.Difficulty;  import main.Level;  public class LevelEditor -{ +{  +    private File selectedSong = null; +    private File selectedPreview = null; +    private File selectedBackground = null; + +    /* +     * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes. +     * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature. +     * style classes are defined in the style.css file. +     */      public LevelEditor(Level level)      { +        Stage primaryStage = new Stage(); +          Text folderNameLabel = new Text("Folder name");          TextField folderName = new TextField(level.thisDir.getName()); +        folderName.setDisable(true);          Text titleLabel = new Text("Title");          TextField title = new TextField(level.getTitle()); @@ -39,13 +52,45 @@ public class LevelEditor          ColorPicker c4 = new ColorPicker(level.colors[3]);          ColorPicker c5 = new ColorPicker(level.colors[4]); -        ObservableList diffList2 = FXCollections.observableArrayList(); +        Text filesLabel = new Text("Files"); + +        FileChooser backgroundChooser = new FileChooser(); +        backgroundChooser.getExtensionFilters().add(new ExtensionFilter("PNG", "*.png")); +        Button backgroundButton = new Button("Import background PNG"); +        backgroundButton.setOnAction(e -> {selectedBackground = backgroundChooser.showOpenDialog(primaryStage);}); + +        FileChooser previewChooser = new FileChooser(); +        previewChooser.getExtensionFilters().add(new ExtensionFilter("PNG", "*.png")); +        Button previewButton = new Button("Import preview PNG"); +        previewButton.setOnAction(e -> {selectedPreview = previewChooser.showOpenDialog(primaryStage);}); + +        FileChooser songChooser = new FileChooser(); +        songChooser.getExtensionFilters().add(new ExtensionFilter("WAV", "*.wav")); +        Button songButton = new Button("Import song WAV"); +        songButton.setOnAction(e -> selectedSong = songChooser.showOpenDialog(primaryStage)); + +        Text diffLabel = new Text("Difficulties"); + +        ObservableList<Difficulty> diffList2 = FXCollections.observableArrayList();          diffList2.addAll(level.getDiffList()); -        ListView<Difficulty> diffList = new ListView(); +        ListView<Difficulty> diffList = new ListView<Difficulty>();          diffList.setItems(diffList2); -        diffList.setOnMouseClicked(e -> new DiffEditor(diffList.getSelectionModel().getSelectedItem())); -        Text diffLabel = new Text("Difficulties"); +        Button edit = new Button("Edit"); +        edit.setOnAction(e -> new DiffEditor(diffList.getSelectionModel().getSelectedItem())); + +        Button remove = new Button("Delete"); +        remove.setOnAction(e -> level.removeDiff(diffList.getSelectionModel().getSelectedItem())); + +        Button refresh = new Button("Refresh"); +        refresh.setOnAction(e -> { +            diffList2.clear(); +            diffList2.addAll(level.getDiffList()); +            diffList.setItems(diffList2); +        }); + +        HBox buttons = new HBox(); +        buttons.getChildren().addAll(edit,remove,refresh);          TextField newDiff = new TextField("new");          Button newDiffButton = new Button("add"); @@ -54,7 +99,7 @@ public class LevelEditor          newDiffBox.getChildren().addAll(newDiff,newDiffButton);          Button save = new Button("Save"); -        save.setOnAction(e -> { +        save.setOnAction(e -> { //asigns feilds to values              level.setTitle(title.getText());              level.setArtist(artist.getText());              level.desc = desc.getText(); @@ -63,13 +108,25 @@ public class LevelEditor              level.colors[2] = c3.getValue();              level.colors[3] = c4.getValue();              level.colors[4] = c5.getValue(); +            if (selectedBackground != null && selectedBackground.exists()) +            { +                level.addFile(selectedBackground,"background.png"); +            }    +            if (selectedPreview != null && selectedPreview.exists()) +            { +                level.addFile(selectedPreview,"preview.png"); +            } +            if (selectedSong != null) +            { +                level.addFile(selectedSong,"song.wav"); +            }              level.writeMetadata();          });          VBox main = new VBox(); -        main.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,artistLabel,artist,descLabel,desc,colorsLabel,c1,c2,c3,c4,c5,diffLabel,diffList,newDiffBox,save); -         -        Stage primaryStage = new Stage(); +        main.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,artistLabel,artist,descLabel,desc,colorsLabel, +            c1,c2,c3,c4,c5,filesLabel,previewButton,backgroundButton,songButton,diffLabel,diffList,buttons,newDiffBox,save); +              Scene scene = new Scene(main);          primaryStage.setScene(scene);          primaryStage.show(); diff --git a/src/devmenu/LevelList.java b/src/devmenu/LevelList.java index e3dec7f..7eaca84 100644 --- a/src/devmenu/LevelList.java +++ b/src/devmenu/LevelList.java @@ -1,13 +1,6 @@  package devmenu; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.PrintWriter; -import java.io.UnsupportedEncodingException; -  import gui.Driver; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue;  import javafx.scene.Scene;  import javafx.scene.control.Button;  import javafx.scene.control.TableColumn; @@ -18,10 +11,17 @@ import javafx.scene.layout.HBox;  import javafx.scene.layout.VBox;  import javafx.stage.Stage;  import main.Level; +import main.LevelController;  public class LevelList   {      Stage primaryStage = new Stage(); + +    /* +     * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes. +     * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature. +     * style classes are defined in the style.css file. +     */      public LevelList()      {          //sets up table view: requires special getters, setters and constructors to work @@ -36,8 +36,19 @@ public class LevelList          titleCol.setCellValueFactory(new PropertyValueFactory<Level, String>("title"));          artistCol.setCellValueFactory(new PropertyValueFactory<Level, String>("artist")); -        levels.setItems(Driver.levelController.levelList); -        levels.setOnMouseClicked(e -> new LevelEditor(levels.getSelectionModel().getSelectedItem())); +        levels.setItems(LevelController.levelList); + +        Button edit = new Button("Edit"); +        edit.setOnAction(e -> new LevelEditor(levels.getSelectionModel().getSelectedItem())); + +        Button remove = new Button("Delete"); +        remove.setOnAction(e -> gui.Driver.levelController.removeLevel(levels.getSelectionModel().getSelectedItem())); + +        Button refresh = new Button("Refresh"); +        refresh.setOnAction(e -> levels.setItems(LevelController.levelList)); + +        HBox buttons = new HBox(); +        buttons.getChildren().addAll(edit,remove,refresh);          TextField newLevel = new TextField("new");          Button newLevelButton = new Button("add"); @@ -46,7 +57,7 @@ public class LevelList          newLevelBox.getChildren().addAll(newLevel,newLevelButton);          VBox main = new VBox(); -        main.getChildren().addAll(levels,newLevelBox); +        main.getChildren().addAll(levels,buttons,newLevelBox);          Scene scene = new Scene(main);          primaryStage.setScene(scene);          primaryStage.show(); diff --git a/src/devmenu/NotesEditor.java b/src/devmenu/NotesEditor.java index 5f26890..e94ff2e 100644 --- a/src/devmenu/NotesEditor.java +++ b/src/devmenu/NotesEditor.java @@ -1,11 +1,22 @@  package devmenu; +import java.io.BufferedWriter;  import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException;  import gameplay.Timer;  import javafx.scene.Scene;  import javafx.scene.control.Button; +import javafx.scene.input.KeyCode;  import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.media.Media; +import javafx.scene.media.MediaPlayer; +import javafx.scene.media.MediaView;  import javafx.scene.text.Text;  import javafx.stage.Stage;  import main.Difficulty; @@ -13,38 +24,78 @@ import sound.AudioFilePlayer;  public class NotesEditor  { +    Text help; +    String t1 = "Press Start to begin recording. Use the same keys."; +    String t2 = "Now recording. Press Stop or ESC to finish"; +    MediaPlayer mediaPlayer;      Difficulty diff;      AudioFilePlayer music;      Timer timer; -    public NotesEditor(Difficulty diff) +    PrintWriter writer; +    public NotesEditor(Difficulty diff) throws FileNotFoundException, UnsupportedEncodingException      {          this.diff = diff; -         -        Text timerDisplay = new Text("TIMER"); + +        help = new Text(t1);          Button start = new Button("Start");          start.setOnAction(e -> start()); -        Button stop = new Button("Stop"); +        Button stop = new Button("Pause");          stop.setOnAction(e -> stop()); -        HBox main = new HBox(); -        main.getChildren().addAll(timerDisplay,start,stop); +        Media song = new Media(diff.level.song.toURI().toString()); +        mediaPlayer = new MediaPlayer(song); +        new MediaView(mediaPlayer); + +        VBox main = new VBox(); +        main.getChildren().addAll(help,start,stop);          Scene scene = new Scene(main);          Stage primaryStage = new Stage();          primaryStage.setScene(scene);          primaryStage.show(); + +        writer = new PrintWriter(diff.notes, "UTF-8"); + +        scene.setOnKeyPressed(e -> { +			if (e.getCode() == KeyCode.D) { +				writer.println("d"+timer); +			} +			if (e.getCode() == KeyCode.F) { +				writer.println("f"+timer); +			} +			if (e.getCode() == KeyCode.SPACE) { +				writer.println("s"+timer); +			} +			if (e.getCode() == KeyCode.J) { +				writer.println("j"+timer); +			} +			if (e.getCode() == KeyCode.K) { +				writer.println("k"+timer); +			} +            if (e.getCode() == KeyCode.ESCAPE) +            { +                stop(); +            } +		}); + +        primaryStage.setOnCloseRequest(e -> stop());      }      private void start()      { -        music = new AudioFilePlayer(new File(diff.thisDir, "song.wav").toPath().toString()); +        mediaPlayer.play();          timer = new Timer(diff.bpm); +        help.setText(t2);      }      private void stop()      { - +        mediaPlayer.stop(); +        diff.numBeats = (int)timer.time(); +        timer = null; +        writer.close(); +        help.setText(t1);      }  }
\ No newline at end of file diff --git a/src/gameplay/SongPlayer.java b/src/gameplay/SongPlayer.java index 0f374d1..15dbf01 100644 --- a/src/gameplay/SongPlayer.java +++ b/src/gameplay/SongPlayer.java @@ -7,7 +7,6 @@ import java.util.ArrayList;  import java.util.LinkedList;  import java.util.Queue;  import java.util.Scanner; -import java.util.logging.Level;  import javax.sound.sampled.LineUnavailableException;  import javax.sound.sampled.UnsupportedAudioFileException; @@ -42,7 +41,7 @@ import sound.AudioFilePlayer;  public class SongPlayer extends Pane { -	private int bpm;		//initializes the bpm of the song, to be read in from a metadata file later +	private Double bpm;		//initializes the bpm of the song, to be read in from a metadata file later  	private int songLength; //initializes the length of the song in terms of the song's bpm, to be read in later  	AudioFilePlayer music; @@ -114,7 +113,7 @@ public class SongPlayer extends Pane {  		level = lvl;  		difficulty = d;  		pane = p; -		music = new AudioFilePlayer(difficulty.song.getPath()); +		music = new AudioFilePlayer(level.song.getPath());  		System.out.println(d.bpm + " " + d.numBeats); diff --git a/src/gameplay/Timer.java b/src/gameplay/Timer.java index 4ffb1fb..5ff3b16 100644 --- a/src/gameplay/Timer.java +++ b/src/gameplay/Timer.java @@ -21,4 +21,8 @@ public class Timer      public double time() {          return ((double)(System.currentTimeMillis()-timeStart))*(bpm/60000.0);      } + +    public String toString() { +        return ""+((double)(System.currentTimeMillis()-timeStart))*(bpm/60000.0); +    }  } diff --git a/src/gui/Driver.java b/src/gui/Driver.java index 7f44608..1813e96 100644 --- a/src/gui/Driver.java +++ b/src/gui/Driver.java @@ -1,16 +1,10 @@  package gui; -import javafx.util.Duration; -import javafx.animation.KeyFrame; -import javafx.animation.KeyValue; -import javafx.animation.Timeline;  import javafx.application.Application;  import javafx.application.Platform; -import javafx.beans.property.Property;  import javafx.geometry.Side;  import javafx.scene.Scene;  import javafx.scene.image.Image; -import javafx.scene.image.ImageView;  import javafx.scene.input.KeyCode;  import javafx.scene.input.KeyCombination;  import javafx.scene.input.KeyEvent; @@ -23,7 +17,13 @@ import javafx.scene.layout.Pane;  import javafx.stage.Stage;  import main.LevelController;  import main.SettingsController; -import org.json.simple.parser.ParseException; + +// import javafx.scene.image.ImageView; +// import javafx.beans.property.Property; +// import javafx.util.Duration; +// import javafx.animation.KeyFrame; +// import javafx.animation.KeyValue; +// import javafx.animation.Timeline;  import devmenu.DebugMenu; diff --git a/src/gui/LevelSelector.java b/src/gui/LevelSelector.java index 9a5c6df..07ace6e 100644 --- a/src/gui/LevelSelector.java +++ b/src/gui/LevelSelector.java @@ -11,6 +11,7 @@ import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane;  import javafx.scene.layout.VBox;  import main.Level; +import main.LevelController;  public class LevelSelector extends Pane  {    @@ -33,7 +34,7 @@ public class LevelSelector extends Pane          titleCol.setCellValueFactory(new PropertyValueFactory<Level, String>("title"));          artistCol.setCellValueFactory(new PropertyValueFactory<Level, String>("artist")); -        levels.setItems(Driver.levelController.levelList); +        levels.setItems(LevelController.levelList);          levels.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.25));           levels.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75)); diff --git a/src/gui/LevelSurround.java b/src/gui/LevelSurround.java index 3f10925..d5dcd33 100644 --- a/src/gui/LevelSurround.java +++ b/src/gui/LevelSurround.java @@ -18,7 +18,6 @@ import javafx.scene.text.Text;  import main.Difficulty;  import main.Level;  import main.ScoreController; -import sound.AudioFilePlayer;  public class LevelSurround extends Pane  {    diff --git a/src/gui/Settings.java b/src/gui/Settings.java index 0d757f5..056c71e 100644 --- a/src/gui/Settings.java +++ b/src/gui/Settings.java @@ -4,6 +4,7 @@ import javafx.geometry.Insets;  import javafx.geometry.Pos;  import javafx.scene.control.Button;  import javafx.scene.control.Slider; +import javafx.scene.control.ToggleButton;  import javafx.scene.layout.BorderPane;  import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane; @@ -65,23 +66,42 @@ public class Settings extends Pane          fullBox.setPadding(new Insets(10)); +        Text devLabel = new Text("Advanced"); +        devLabel.getStyleClass().add("t3"); +         +        Button levelEdit = new Button("Level Utility"); +        levelEdit.setOnAction(e -> new devmenu.LevelList()); +          Button devMenu = new Button();          devMenu.setText("Debug Menu");          devMenu.setOnAction(e -> Driver.debug.show()); +        VBox devBox = new VBox(); +        devBox.getStyleClass().add("box"); +        devBox.getChildren().addAll(devLabel,levelEdit,devMenu); +        devBox.setVisible(false); +        devBox.setManaged(false); +        devBox.setPadding(new Insets(10)); + +        ToggleButton advanced = new ToggleButton("Advanced"); +        advanced.getStyleClass().remove("toggle-button"); +        advanced.getStyleClass().add("button"); +        advanced.selectedProperty().bindBidirectional(devBox.managedProperty()); +        advanced.selectedProperty().bindBidirectional(devBox.visibleProperty()); +          Button exit = new Button();          exit.setText("Back");          exit.setOnAction(e -> Driver.setMenu(new MainMenu()));          BorderPane buttonBox = new BorderPane();          buttonBox.setLeft(exit); -        buttonBox.setRight(devMenu); +        buttonBox.setRight(advanced);          VBox options = new VBox();          options.setSpacing(10);          options.setAlignment(Pos.CENTER); -        options.getChildren().addAll(musicBox,SFXBox,fullBox,buttonBox); +        options.getChildren().addAll(musicBox,SFXBox,fullBox,devBox,buttonBox);          options.maxWidthProperty().bind(super.prefWidthProperty().multiply(0.25));           options.setMinWidth(400);          options.prefHeightProperty().bind(super.prefHeightProperty()); diff --git a/src/main/Difficulty.java b/src/main/Difficulty.java index 2c74956..abb12f4 100644 --- a/src/main/Difficulty.java +++ b/src/main/Difficulty.java @@ -1,62 +1,64 @@  package main;  import java.io.File; -import java.io.FileNotFoundException;  import java.io.FileReader;  import java.io.FileWriter;  import java.io.IOException;  import java.time.LocalDate; -  import org.json.simple.JSONArray;  import org.json.simple.JSONObject;  import org.json.simple.parser.JSONParser; -  import javafx.collections.FXCollections;  import javafx.collections.ObservableList;  public class Difficulty   {      public File thisDir; -    public String title; +    public String title = "Unnamed";      private ObservableList<LeaderboardEntry> leaderboard = FXCollections.observableArrayList();      public File notes; -    public int bpm; -    public File song; +    public Double bpm = 0.0;      public int numBeats; -    private File leaderboardFile; +    public Level level; -    public Difficulty(File file) +    /** +     * Creates a new Difficulty and gives it a file path +     * @param newDir: The file path of the Difficulty +     */ +    public Difficulty(File newDir, Level level)      { -        thisDir = file; -        readData(); +        thisDir = newDir; +        this.level = level;      } +    /** +     * Checks for files in the difficulty folder and runs cooresponding actions +     */      public void readData()      {          for(File cur: thisDir.listFiles()) //iterates through all files/folders in src/assets/levels/LEVEL/DIFFICULTY          {              if (cur.getName().equals("metadata.json"))              { -                parseMetadata(cur); +                parseMetadata();              }              if (cur.getName().equals("leaderboard.json"))              { -                parseLeaderboard(cur); +                parseLeaderboard();              }              if (cur.getName().equals("notes.txt"))              {                  notes = cur;              } -            if (cur.getName().equals("song.wav")) -            { -                song = cur; -            }          }      } - -    public void parseMetadata(File file) +    /** +     * Reads in json metadata and assigns values to variables +     */ +    public void parseMetadata()      { +        File file = new File(thisDir, "metadata.json");          JSONParser jsonParser = new JSONParser(); //parser to read the file  		try(FileReader reader = new FileReader(file)) @@ -65,20 +67,44 @@ public class Difficulty  			JSONObject diffStuff = (JSONObject)(obj); //converts read object to a JSONObject              title = (String) diffStuff.get("title"); -            bpm = (int)(diffStuff.get("bpm"));            -            numBeats = (int)(diffStuff.get("numBeats"));   -             +            bpm = Double.parseDouble(diffStuff.get("bpm")+""); +            numBeats = Integer.parseInt(diffStuff.get("numBeats")+"");  		}  		catch (Exception e)          { -            System.out.println("Error in json file "+file); -            //e.printStackTrace(); +            e.printStackTrace(); +        } +    } + +    /** +     * Writes metadata to json file +     */ +    public void writeMetadata()  +    { +        FileWriter fileWriter; +        try  +        { +            File file = new File(thisDir, "metadata.json"); +            fileWriter = new FileWriter(file); +            JSONObject obj = new JSONObject(); +            obj.put("title", title); +            obj.put("bpm", bpm); +            obj.put("numBeats", numBeats); +            obj.writeJSONString(fileWriter); +            fileWriter.flush(); +        }  +        catch (IOException e)  +        { +            e.printStackTrace();          }      } -    public void parseLeaderboard(File file) +    /** +     * Reads in json leaderboard and assigns populates list with leaderboardEntries +     */ +    public void parseLeaderboard()      { -        leaderboardFile = file; +        File file = new File(thisDir, "leaderboard.json");          JSONParser jsonParser = new JSONParser(); //parser to read the file  		try(FileReader reader = new FileReader(file)) @@ -99,17 +125,20 @@ public class Difficulty  		}  		catch (Exception e)          { -            System.out.println("Error in json file "+leaderboardFile); -            //e.printStackTrace(); +            e.printStackTrace();          }      } -    public void addToLeaderboard(String name, int score)  +    /** +     * Writes leaderboard to json file +     */ +    public void writeLeaderboard()      { -        leaderboard.add(new LeaderboardEntry(name, score, ""+LocalDate.now())); //do not delete this tho its not a placeholder -         -        try (FileWriter fileWriter = new FileWriter(leaderboardFile))  +        FileWriter fileWriter; +        try  		{ +            File file = new File(thisDir, "leaderboard.json"); +            fileWriter = new FileWriter(file);              //write the settings JSONObject instance to the file               JSONArray jsonArray = new JSONArray();              for (LeaderboardEntry cur: leaderboard) @@ -129,6 +158,17 @@ public class Difficulty          }      } +    /** +     * Adds new leaderboardEntry to list and updates json file +     * @param name: the players name +     * @param score the players score +     */ +    public void addToLeaderboard(String name, int score)  +    { +        leaderboard.add(new LeaderboardEntry(name, score, ""+LocalDate.now())); //do not delete this tho its not a placeholder +        writeLeaderboard(); +    } +      public ObservableList<LeaderboardEntry> getLeaderboard()       {          return leaderboard; @@ -138,8 +178,4 @@ public class Difficulty      {          return title;      } - -    public void writeMetadata() { -         -    }  } diff --git a/src/main/Level.java b/src/main/Level.java index 95d6b5d..cb16489 100644 --- a/src/main/Level.java +++ b/src/main/Level.java @@ -2,36 +2,43 @@ package main;  import java.io.File;  import java.util.ArrayList; +import java.util.Comparator;  import javafx.scene.image.Image;  import javafx.scene.paint.Color;  import java.io.FileWriter; -import java.io.FileNotFoundException;  import java.io.FileReader;  import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption;  import org.json.simple.JSONObject;  import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; - -import gui.Driver;  public class Level   {      public File thisDir; -    private String title; -    private String artist; +    private String title = "Unnamed"; +    private String artist = "Unknown";      private ArrayList<Difficulty> diffList;      public Image preview; //optional -    public String desc; +    public String desc = "No description";      public Image background; //optional -    public Color[] colors;//optional, have default colors - -    public Level(File dir) +    public Color[] colors = {Color.RED,Color.BLUE,Color.GREEN,Color.PURPLE,Color.YELLOW};//optional, have default colors +    public File song; + +    /** +     * Creates a new level and gives it a file path +     * @param newDir: The path of the Level +     */ +    public Level(File newDir)      { -        thisDir = dir; -        readData(); +        thisDir = newDir;      } +    /** +     * Checks for files in the level folder and runs cooresponding actions +     */      public void readData()      {          diffList = new ArrayList<Difficulty>(); @@ -39,27 +46,32 @@ public class Level          {              if (cur.isDirectory()) //all subfolders within a level folder are difficulties              { -                Difficulty diff = new Difficulty(cur); +                Difficulty diff = new Difficulty(cur,this); +                diff.readData();                  diffList.add(diff);              } - -            if (cur.getName().equals("preview.png")) -            { -                preview = new Image(cur.toURI().toString()); -            } -              if (cur.getName().equals("metadata.json"))              {                  parseMetadata();              } - +            if (cur.getName().equals("preview.png")) +            { +                preview = new Image(cur.toURI().toString()); +            }              if (cur.getName().equals("background.png"))              {                  background = new Image(cur.toURI().toString());              } +            if (cur.getName().equals("song.wav")) +            { +                song = cur; +            }          }      } +    /** +     * Reads in json metadata and assigns values to variables +     */      public void parseMetadata()       {          JSONParser jsonParser = new JSONParser(); //parser to read the file @@ -95,6 +107,9 @@ public class Level  		}       } +    /** +     * Writes metadata to json file +     */      public void writeMetadata()      {          FileWriter fileWriter; @@ -105,44 +120,81 @@ public class Level              obj.put("title", title);              obj.put("artist", artist);              obj.put("desc", desc); -            obj.put("color1",colors[0]); -            obj.put("color2",colors[1]); -            obj.put("color3",colors[2]); -            obj.put("color4",colors[3]); -            obj.put("color5",colors[4]); +            obj.put("color1",colors[0].toString()); +            obj.put("color2",colors[1].toString()); +            obj.put("color3",colors[2].toString()); +            obj.put("color4",colors[3].toString()); +            obj.put("color5",colors[4].toString());              obj.writeJSONString(fileWriter); +            fileWriter.flush();          }           catch (IOException e) {              e.printStackTrace();          }      } -    public ArrayList<Difficulty> getDiffList() -    { -        return diffList; -    } - +    /** +     * Adds a difficulty by creating a directory and required files +     * @param text: the name of the directory and default title +     */      public void addDiff(String text)       {          File diffDir = new File(thisDir, text);          diffDir.mkdirs();          File metadataDir = new File(diffDir, "metadata.json"); +        File leaderboardDir = new File(diffDir, "leaderboard.json"); +        File notesDir = new File(diffDir, "notes.txt");          try {              metadataDir.createNewFile(); +            leaderboardDir.createNewFile(); +            notesDir.createNewFile();          } catch (IOException e) {              e.printStackTrace();          } +        Difficulty temp = new Difficulty(diffDir,this); +        temp.title = text; +        temp.writeMetadata(); +        temp.writeLeaderboard();          readData();      } -    public void removeDiff(Difficulty diff)  +    /** +     * Removes the difficaulty from the filesystem then reloads the level +     * @param diff: the difficulty to be removed +     */ +    public void removeDiff(Difficulty diff) +    { +        File hold = diff.thisDir; +        diffList.remove(diff); + +        try { +            Files.walk(hold.toPath()) +            .sorted(Comparator.reverseOrder()) +            .map(Path::toFile) +            .forEach(File::delete); +        } catch (IOException e) { +            e.printStackTrace(); +        } +    } + +    /** +     * Copies a file into the level directory +     * @param newFile: the file to be copied +     * @param name: the new file name +     */ +    public void addFile(File newFile, String name)      { -        //soon +        try { +            Files.copy(newFile.toPath(), new File(thisDir, name).toPath(), StandardCopyOption.REPLACE_EXISTING); +        } catch (IOException e) { +            e.printStackTrace(); +        } +        readData();      } -    public void renameDiff(Difficulty diff, String newName) +    public ArrayList<Difficulty> getDiffList()      { -        //soon +        return diffList;      }      public String getTitle()  diff --git a/src/main/LevelController.java b/src/main/LevelController.java index eff512d..78d638a 100644 --- a/src/main/LevelController.java +++ b/src/main/LevelController.java @@ -2,6 +2,9 @@ package main;  import java.io.File;  import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator;  import javafx.collections.FXCollections;  import javafx.collections.ObservableList; @@ -11,21 +14,32 @@ public class LevelController      File thisDir = new File("levels");      public static ObservableList<Level> levelList; +    /** +     * Creates a levelController, which holds all the levels +     */      public LevelController()      {          readData();      } +    /** +     * Reads contents of folder and creates cooresponding levels +     */      public void readData()      {          levelList = FXCollections.observableArrayList();          for (File cur: thisDir.listFiles()) //iterates through all files/folders in levels          {              Level level = new Level(cur); +            level.readData();              levelList.add(level);          }      } +    /** +     * Adds a level to the list by creating a directory and required files +     * @param text: the name of the directory and default title +     */      public void addLevel(String text)       {          File levelDir = new File(thisDir,text); @@ -39,16 +53,28 @@ public class LevelController          {              e.printStackTrace();          } +        Level temp = new Level(levelDir); +        temp.setTitle(text); +        temp.writeMetadata();          readData();      } +    /** +     * Removes level from the filesystem then reloads this levelController +     * @param level: the level to be removed +     */      public void removeLevel(Level level)      { -        //soon -    } +        File hold = level.thisDir; +        levelList.remove(level); -    public void renameLevel(Level level, String newName) -    { -        //soon +        try { +            Files.walk(hold.toPath()) +            .sorted(Comparator.reverseOrder()) +            .map(Path::toFile) +            .forEach(File::delete); +        } catch (IOException e) { +            e.printStackTrace(); +        }      }  }
\ No newline at end of file diff --git a/src/main/SettingsController.java b/src/main/SettingsController.java index f3bd671..4bd2b24 100644 --- a/src/main/SettingsController.java +++ b/src/main/SettingsController.java @@ -15,26 +15,9 @@ public class SettingsController  {
  	public SimpleIntegerProperty effectsVol = new SimpleIntegerProperty(0);
  	public SimpleIntegerProperty musicVol = new SimpleIntegerProperty(0);
 -	private boolean fullscreen;
  	private JSONObject settings;
 -	public void saveAndWrite(int newEffVol, int newMusVol)
 -	{
 -		settings.put("musicVol", newMusVol);
 -		settings.put("effectsVol", newEffVol);
 -		try (FileWriter file = new FileWriter("settings.json")) 
 -		{
 -            //write the settings JSONObject instance to the file
 -            file.write(settings.toJSONString()); 
 -            file.flush();
 - 
 -        } 
 -		catch (IOException e) {
 -            e.printStackTrace();
 -        }
 -	}
 -	
 -	public void readFile() throws ParseException
 +	public void read() throws ParseException
  	{
  		JSONParser jsonParser = new JSONParser(); //parser to read the file
 @@ -57,5 +40,20 @@ public class SettingsController  		}
  	}
 -	
 +
 +	public void write(int newEffVol, int newMusVol)
 +	{
 +		settings.put("musicVol", newMusVol);
 +		settings.put("effectsVol", newEffVol);
 +		try (FileWriter file = new FileWriter("settings.json")) 
 +		{
 +            //write the settings JSONObject instance to the file
 +            file.write(settings.toJSONString()); 
 +            file.flush();
 + 
 +        } 
 +		catch (IOException e) {
 +            e.printStackTrace();
 +        }
 +	}
  }
 diff --git a/src/sound/AudioFilePlayer.java b/src/sound/AudioFilePlayer.java index 9fc1afc..9425881 100644 --- a/src/sound/AudioFilePlayer.java +++ b/src/sound/AudioFilePlayer.java @@ -1,22 +1,15 @@ -/*Name:	 - *Date: - *Period: - *Teacher: - *Description: - */  package sound; -//Java program to play audio files. imports file scanning and various  -//methods from the java audio class in order to do so. +  import java.io.File;  import java.io.IOException; -import java.util.Scanner; -    import javax.sound.sampled.AudioInputStream;  import javax.sound.sampled.AudioSystem;  import javax.sound.sampled.Clip;  import javax.sound.sampled.LineUnavailableException;  import javax.sound.sampled.UnsupportedAudioFileException; +//Java program to play audio files. imports file scanning and various  +//methods from the java audio class in order to do so.  public class AudioFilePlayer   { @@ -38,101 +31,36 @@ public class AudioFilePlayer          audioFile = new File(filePath);          // create AudioInputStream object          try { -            audioInputStream =  -                    AudioSystem.getAudioInputStream(new File(filePath).getAbsoluteFile()); -        } catch (UnsupportedAudioFileException e) { -            // TODO Auto-generated catch block +            audioInputStream = AudioSystem.getAudioInputStream(new File(filePath).getAbsoluteFile()); +        }  +        catch (UnsupportedAudioFileException e) {              e.printStackTrace(); -        } catch (IOException e) { -            // TODO Auto-generated catch block +        }  +        catch (IOException e) {              e.printStackTrace();          }          // create clip reference          try {              clip = AudioSystem.getClip(); -        } catch (LineUnavailableException e) { -            // TODO Auto-generated catch block +        }  +        catch (LineUnavailableException e) {              e.printStackTrace();          }          // open audioInputStream to the clip          try {              clip.open(audioInputStream); -        } catch (LineUnavailableException e) { -            // TODO Auto-generated catch block +        }  +        catch (LineUnavailableException e) {              e.printStackTrace(); -        } catch (IOException e) { -            // TODO Auto-generated catch block +        }  +        catch (IOException e) {              e.printStackTrace();          }      } -   -    // public static void main(String[] args)  -    // { -    //     try  -    //     { -    //         filePath = "src/assets/BookBetrayal.wav3"; -    //         AudioFilePlayer audioPlayer = new AudioFilePlayer(); -               -    //         audioPlayer.play(); -    //         Scanner sc = new Scanner(System.in); -               -    //         while (true) //until the thread closes, ask the user what they want to do with the audio file -    //         { -    //             System.out.println("1. pause"); -    //             System.out.println("2. resume"); -    //             System.out.println("3. restart"); -    //             System.out.println("4. stop"); -    //             System.out.println("5. Jump to specific time"); -    //             int c = sc.nextInt(); -    //             audioPlayer.gotoChoice(c); -    //             if (c == 4) -    //             break; -    //         } -    //         sc.close(); -    //     }  -           -    //     catch (Exception ex)  -    //     { -    //         System.out.println("Error with playing sound."); -    //         ex.printStackTrace(); -           -    //       } -    // } -       -    // Work as the user enters his choice - -    public void gotoChoice(int c)throws IOException, LineUnavailableException, UnsupportedAudioFileException  -    { -        //reads the users input and chooses what to do based on said input -        switch (c)  -        { -            case 1: -                pause(); -                break; -            case 2: -                resumeAudio(); -                break; -            case 3: -                restart(); -                break; -            case 4: -                stop(); -                break; -            case 5: -                System.out.println("Enter time (" + 0 +  -                ", " + clip.getMicrosecondLength() + ")"); -                Scanner sc = new Scanner(System.in); -                long c1 = sc.nextLong(); -                jump(c1); -                break; -       -        } -       -    }      // Method to play the audio      public void play()  diff --git a/src/sound/ShortAudioPlayer.java b/src/sound/ShortAudioPlayer.java index e81c4ee..77fb52c 100644 --- a/src/sound/ShortAudioPlayer.java +++ b/src/sound/ShortAudioPlayer.java @@ -1,103 +1,73 @@ -/*Name:	 - *Date: - *Period: - *Teacher: - *Description: - */  package sound; -  //Java program to play audio files. imports file scanning and various  -  //methods from the java audio class in order to do so. -  import java.io.File; -  import java.io.IOException; -    -  import javax.sound.sampled.AudioFormat; -  import javax.sound.sampled.AudioInputStream; -  import javax.sound.sampled.AudioSystem; -  import javax.sound.sampled.Clip; -  import javax.sound.sampled.DataLine; -  import javax.sound.sampled.LineEvent; -  import javax.sound.sampled.LineListener; -  import javax.sound.sampled.LineUnavailableException; -  import javax.sound.sampled.UnsupportedAudioFileException; +import java.io.File; +import java.io.IOException; -  public class ShortAudioPlayer implements LineListener -  { -      //indicates whether the playback completes or not -      boolean playCompleted; -      Clip audioClip; -       -      public void play(String audioFilePath) -      { -          File audioFile = new File(audioFilePath); -           -          try -          { -              //creates an audioInput object using the file we -              //declared earlier -              AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile); -               -              //gets the format of the audioStream object -              AudioFormat format = audioStream.getFormat(); -               -              DataLine.Info info = new DataLine.Info(Clip.class, format); -               -              audioClip = (Clip) AudioSystem.getLine(info); -    -              audioClip.addLineListener(this); -    -              audioClip.open(audioStream); -                -              audioClip.start(); -                -            //   while (!playCompleted)  -            //   { -            //       // wait for the playback to complete -            //       try  -            //       { -            //           Thread.sleep(1000); -            //       }  -            //       catch (InterruptedException ex)  -            //       { -            //           ex.printStackTrace(); -            //       } -            //   }     -            //  audioClip.close(); //stops the audio clip   -          } -          catch (UnsupportedAudioFileException ex)  -          { -              System.out.println("The specified audio file is not supported."); -              ex.printStackTrace(); -          } -          catch (LineUnavailableException ex)  -          { -              System.out.println("Audio line for playing back is unavailable."); -              ex.printStackTrace(); -          }  -          catch (IOException ex)  -          { -              System.out.println("Error playing the audio file."); -              ex.printStackTrace(); -          } -      } -       -       -      /** -       * Listens to the START and STOP events of the audio line. -       */ -      @Override -      public void update(LineEvent event)  -      { -          LineEvent.Type type = event.getType(); -            -        //   if (type == LineEvent.Type.START)  -        //   { -        //       System.out.println("Playback started.");         -        //   }  -        //   else if (type == LineEvent.Type.STOP)  -        //   { -        //       playCompleted = true; -        //       System.out.println("Playback completed."); -        //   } -      }    -  } +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.UnsupportedAudioFileException; + +//Java program to play audio files. imports file scanning and various  +//methods from the java audio class in order to do so. +public class ShortAudioPlayer implements LineListener +{ +    //indicates whether the playback completes or not +    boolean playCompleted; +    Clip audioClip; +     +    public void play(String audioFilePath) +    { +        File audioFile = new File(audioFilePath); +         +        try +        { +            //creates an audioInput object using the file we +            //declared earlier +            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile); +             +            //gets the format of the audioStream object +            AudioFormat format = audioStream.getFormat(); +             +            DataLine.Info info = new DataLine.Info(Clip.class, format); +             +            audioClip = (Clip) AudioSystem.getLine(info); + +            audioClip.addLineListener(this); + +            audioClip.open(audioStream); +             +            audioClip.start(); +        } +        catch (UnsupportedAudioFileException ex)  +        { +            System.out.println("The specified audio file is not supported."); +            ex.printStackTrace(); +        } +        catch (LineUnavailableException ex)  +        { +            System.out.println("Audio line for playing back is unavailable."); +            ex.printStackTrace(); +        }  +        catch (IOException ex)  +        { +            System.out.println("Error playing the audio file."); +            ex.printStackTrace(); +        } +    } +     +     +    /** +     * Listens to the START and STOP events of the audio line. +     */ +    @Override +    public void update(LineEvent event) +    { +        //something should prolly go here +    }    +}  | 
