From 48bfed142f7175809a43037fb695b6fcdc4146b1 Mon Sep 17 00:00:00 2001 From: sowgro Date: Thu, 1 Jun 2023 11:38:04 -0400 Subject: finish gui level editor --- src/devmenu/DiffEditor.java | 1 + src/devmenu/LevelEditor.java | 10 +++++++++- src/devmenu/LevelList.java | 5 ++++- src/main/Difficulty.java | 28 ++++++++++++++++++++++------ src/main/Level.java | 35 +++++++++++++++-------------------- src/main/LevelController.java | 14 ++++---------- 6 files changed, 55 insertions(+), 38 deletions(-) (limited to 'src') diff --git a/src/devmenu/DiffEditor.java b/src/devmenu/DiffEditor.java index 278e3de..fbc0d8a 100644 --- a/src/devmenu/DiffEditor.java +++ b/src/devmenu/DiffEditor.java @@ -14,6 +14,7 @@ public class DiffEditor { 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); diff --git a/src/devmenu/LevelEditor.java b/src/devmenu/LevelEditor.java index 00a21a3..5e9a818 100644 --- a/src/devmenu/LevelEditor.java +++ b/src/devmenu/LevelEditor.java @@ -22,6 +22,7 @@ public class LevelEditor { 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()); @@ -47,6 +48,13 @@ public class LevelEditor Text diffLabel = new Text("Difficulties"); + Button refresh = new Button("Refresh"); + refresh.setOnAction(e -> { + diffList2.clear(); + diffList2.addAll(level.getDiffList()); + diffList.setItems(diffList2); + }); + TextField newDiff = new TextField("new"); Button newDiffButton = new Button("add"); newDiffButton.setOnAction(e -> level.addDiff(newDiff.getText())); @@ -67,7 +75,7 @@ public class LevelEditor }); 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); + main.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,artistLabel,artist,descLabel,desc,colorsLabel,c1,c2,c3,c4,c5,diffLabel,diffList,refresh,newDiffBox,save); Stage primaryStage = new Stage(); Scene scene = new Scene(main); diff --git a/src/devmenu/LevelList.java b/src/devmenu/LevelList.java index e3dec7f..66ff797 100644 --- a/src/devmenu/LevelList.java +++ b/src/devmenu/LevelList.java @@ -39,6 +39,9 @@ public class LevelList levels.setItems(Driver.levelController.levelList); levels.setOnMouseClicked(e -> new LevelEditor(levels.getSelectionModel().getSelectedItem())); + Button refresh = new Button("Refresh"); + refresh.setOnAction(e -> levels.setItems(Driver.levelController.levelList)); + TextField newLevel = new TextField("new"); Button newLevelButton = new Button("add"); newLevelButton.setOnAction(e -> Driver.levelController.addLevel(newLevel.getText())); @@ -46,7 +49,7 @@ public class LevelList newLevelBox.getChildren().addAll(newLevel,newLevelButton); VBox main = new VBox(); - main.getChildren().addAll(levels,newLevelBox); + main.getChildren().addAll(levels,refresh,newLevelBox); Scene scene = new Scene(main); primaryStage.setScene(scene); primaryStage.show(); diff --git a/src/main/Difficulty.java b/src/main/Difficulty.java index 2c74956..c5dfca3 100644 --- a/src/main/Difficulty.java +++ b/src/main/Difficulty.java @@ -17,7 +17,7 @@ import javafx.collections.ObservableList; public class Difficulty { public File thisDir; - public String title; + public String title = "Unnamed"; private ObservableList leaderboard = FXCollections.observableArrayList(); public File notes; public int bpm; @@ -28,7 +28,6 @@ public class Difficulty public Difficulty(File file) { thisDir = file; - readData(); } public void readData() @@ -37,7 +36,7 @@ public class Difficulty { if (cur.getName().equals("metadata.json")) { - parseMetadata(cur); + parseMetadata(); } if (cur.getName().equals("leaderboard.json")) { @@ -55,8 +54,9 @@ public class Difficulty } - public void parseMetadata(File file) + 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)) @@ -139,7 +139,23 @@ public class Difficulty return title; } - public void writeMetadata() { - + 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(); + } } } diff --git a/src/main/Level.java b/src/main/Level.java index 95d6b5d..56433f3 100644 --- a/src/main/Level.java +++ b/src/main/Level.java @@ -12,24 +12,24 @@ import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; +import devmenu.LevelList; 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 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 Color[] colors = {Color.RED,Color.BLUE,Color.GREEN,Color.PURPLE,Color.YELLOW};//optional, have default colors public Level(File dir) { thisDir = dir; - readData(); } public void readData() @@ -40,6 +40,7 @@ public class Level if (cur.isDirectory()) //all subfolders within a level folder are difficulties { Difficulty diff = new Difficulty(cur); + diff.readData(); diffList.add(diff); } @@ -105,12 +106,13 @@ 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(); @@ -132,19 +134,12 @@ public class Level } catch (IOException e) { e.printStackTrace(); } + Difficulty temp = new Difficulty(diffDir); + temp.title = text; + temp.writeMetadata(); readData(); } - public void removeDiff(Difficulty diff) - { - //soon - } - - public void renameDiff(Difficulty diff, String newName) - { - //soon - } - public String getTitle() { return title; diff --git a/src/main/LevelController.java b/src/main/LevelController.java index eff512d..9a94838 100644 --- a/src/main/LevelController.java +++ b/src/main/LevelController.java @@ -22,6 +22,7 @@ public class LevelController for (File cur: thisDir.listFiles()) //iterates through all files/folders in levels { Level level = new Level(cur); + level.readData(); levelList.add(level); } } @@ -39,16 +40,9 @@ public class LevelController { e.printStackTrace(); } + Level temp = new Level(levelDir); + temp.setTitle(text); + temp.writeMetadata(); readData(); } - - public void removeLevel(Level level) - { - //soon - } - - public void renameLevel(Level level, String newName) - { - //soon - } } \ No newline at end of file -- cgit v1.2.3 From 4e43d6f020d908ccd9b8a6b77803cac943da00ed Mon Sep 17 00:00:00 2001 From: sowgro Date: Fri, 2 Jun 2023 00:48:13 -0400 Subject: Finish levelUtility and project cleanup --- src/devmenu/DebugMenu.java | 7 +- src/devmenu/DiffEditor.java | 14 ++-- src/devmenu/LevelEditor.java | 71 +++++++++++++--- src/devmenu/LevelList.java | 30 ++++--- src/devmenu/NotesEditor.java | 1 - src/gameplay/SongPlayer.java | 3 +- src/gui/Driver.java | 14 ++-- src/gui/LevelSelector.java | 3 +- src/gui/LevelSurround.java | 1 - src/gui/Settings.java | 24 +++++- src/main/Difficulty.java | 110 ++++++++++++++----------- src/main/Level.java | 95 +++++++++++++++++----- src/main/LevelController.java | 32 ++++++++ src/main/SettingsController.java | 36 ++++----- src/sound/AudioFilePlayer.java | 100 ++++------------------- src/sound/ShortAudioPlayer.java | 170 ++++++++++++++++----------------------- 16 files changed, 393 insertions(+), 318 deletions(-) (limited to 'src') 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 fbc0d8a..6bcbd28 100644 --- a/src/devmenu/DiffEditor.java +++ b/src/devmenu/DiffEditor.java @@ -10,8 +10,15 @@ 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); @@ -31,21 +38,16 @@ public class DiffEditor 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.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 5e9a818..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,14 +11,27 @@ 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); @@ -40,13 +52,35 @@ 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 diffList2 = FXCollections.observableArrayList(); diffList2.addAll(level.getDiffList()); - ListView diffList = new ListView(); + ListView diffList = new ListView(); 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 -> { @@ -55,6 +89,9 @@ public class LevelEditor diffList.setItems(diffList2); }); + HBox buttons = new HBox(); + buttons.getChildren().addAll(edit,remove,refresh); + TextField newDiff = new TextField("new"); Button newDiffButton = new Button("add"); newDiffButton.setOnAction(e -> level.addDiff(newDiff.getText())); @@ -62,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(); @@ -71,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,refresh,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 66ff797..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,11 +36,19 @@ public class LevelList titleCol.setCellValueFactory(new PropertyValueFactory("title")); artistCol.setCellValueFactory(new PropertyValueFactory("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(Driver.levelController.levelList)); + 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"); @@ -49,7 +57,7 @@ public class LevelList newLevelBox.getChildren().addAll(newLevel,newLevelButton); VBox main = new VBox(); - main.getChildren().addAll(levels,refresh,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..400d547 100644 --- a/src/devmenu/NotesEditor.java +++ b/src/devmenu/NotesEditor.java @@ -1,7 +1,6 @@ package devmenu; import java.io.File; - import gameplay.Timer; import javafx.scene.Scene; import javafx.scene.control.Button; diff --git a/src/gameplay/SongPlayer.java b/src/gameplay/SongPlayer.java index f76f5e3..8745727 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; @@ -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/gui/Driver.java b/src/gui/Driver.java index fdfe323..9e4fb37 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("title")); artistCol.setCellValueFactory(new PropertyValueFactory("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 c5dfca3..18dabb3 100644 --- a/src/main/Difficulty.java +++ b/src/main/Difficulty.java @@ -1,16 +1,13 @@ 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; @@ -21,15 +18,20 @@ public class Difficulty private ObservableList leaderboard = FXCollections.observableArrayList(); public File notes; public int bpm; - public File song; public int numBeats; - private File leaderboardFile; - 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) { - thisDir = file; + thisDir = newDir; } + /** + * 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 @@ -40,20 +42,18 @@ public class Difficulty } 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; - } } } - + /** + * Reads in json metadata and assigns values to variables + */ public void parseMetadata() { File file = new File(thisDir, "metadata.json"); @@ -65,20 +65,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 = Integer.parseInt(diffStuff.get("bpm")+""); + numBeats = Integer.parseInt(diffStuff.get("numBeats")+""); } catch (Exception e) { - System.out.println("Error in json file "+file); - //e.printStackTrace(); + e.printStackTrace(); } } - public void parseLeaderboard(File file) + /** + * Writes metadata to json file + */ + public void writeMetadata() { - leaderboardFile = file; + 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(); + } + } + + /** + * Reads in json leaderboard and assigns populates list with leaderboardEntries + */ + public void parseLeaderboard() + { + File file = new File(thisDir, "leaderboard.json"); JSONParser jsonParser = new JSONParser(); //parser to read the file try(FileReader reader = new FileReader(file)) @@ -99,17 +123,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 +156,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 getLeaderboard() { return leaderboard; @@ -138,24 +176,4 @@ public class Difficulty { return title; } - - 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(); - } - } } diff --git a/src/main/Level.java b/src/main/Level.java index 56433f3..591bd9a 100644 --- a/src/main/Level.java +++ b/src/main/Level.java @@ -2,18 +2,17 @@ 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 devmenu.LevelList; -import gui.Driver; public class Level { @@ -26,12 +25,20 @@ public class Level public String desc = "No description"; public Image background; //optional public Color[] colors = {Color.RED,Color.BLUE,Color.GREEN,Color.PURPLE,Color.YELLOW};//optional, have default colors + public File song; - public Level(File dir) + /** + * Creates a new level and gives it a file path + * @param newDir: The path of the Level + */ + public Level(File newDir) { - thisDir = dir; + thisDir = newDir; } + /** + * Checks for files in the level folder and runs cooresponding actions + */ public void readData() { diffList = new ArrayList(); @@ -43,24 +50,28 @@ public class Level 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 @@ -96,6 +107,9 @@ public class Level } } + /** + * Writes metadata to json file + */ public void writeMetadata() { FileWriter fileWriter; @@ -119,27 +133,70 @@ public class Level } } - public ArrayList 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); temp.title = text; temp.writeMetadata(); + temp.writeLeaderboard(); + readData(); + } + + /** + * 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) + { + try { + Files.copy(newFile.toPath(), new File(thisDir, name).toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + e.printStackTrace(); + } readData(); } + public ArrayList getDiffList() + { + return diffList; + } + public String getTitle() { return title; diff --git a/src/main/LevelController.java b/src/main/LevelController.java index 9a94838..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,11 +14,17 @@ public class LevelController File thisDir = new File("levels"); public static ObservableList 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(); @@ -27,6 +36,10 @@ public class LevelController } } + /** + * 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); @@ -45,4 +58,23 @@ public class LevelController temp.writeMetadata(); readData(); } + + /** + * Removes level from the filesystem then reloads this levelController + * @param level: the level to be removed + */ + public void removeLevel(Level level) + { + File hold = level.thisDir; + levelList.remove(level); + + 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,100 +31,35 @@ 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 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 + } +} -- cgit v1.2.3 From 0b7f45fcb05814870733613dcff233451948c967 Mon Sep 17 00:00:00 2001 From: sowgro Date: Fri, 2 Jun 2023 01:31:49 -0400 Subject: start note editor, new test level --- src/devmenu/NotesEditor.java | 25 ++++++++++++++++++------- src/main/Difficulty.java | 4 +++- src/main/Level.java | 4 ++-- 3 files changed, 23 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/devmenu/NotesEditor.java b/src/devmenu/NotesEditor.java index 400d547..41bc1c3 100644 --- a/src/devmenu/NotesEditor.java +++ b/src/devmenu/NotesEditor.java @@ -5,6 +5,10 @@ import gameplay.Timer; import javafx.scene.Scene; import javafx.scene.control.Button; 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; @@ -12,23 +16,29 @@ import sound.AudioFilePlayer; public class NotesEditor { + MediaPlayer mediaPlayer; Difficulty diff; AudioFilePlayer music; Timer timer; public NotesEditor(Difficulty diff) { this.diff = diff; - - Text timerDisplay = new Text("TIMER"); 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); + Button print = new Button("print"); + print.setOnAction(e -> System.out.println(timer.time())); + + Media song = new Media(diff.level.song.toURI().toString()); + mediaPlayer = new MediaPlayer(song); + new MediaView(mediaPlayer); + + VBox main = new VBox(); + main.getChildren().addAll(start,stop,print); Scene scene = new Scene(main); Stage primaryStage = new Stage(); @@ -38,12 +48,13 @@ public class NotesEditor private void start() { - music = new AudioFilePlayer(new File(diff.thisDir, "song.wav").toPath().toString()); + mediaPlayer.play(); + timer = new Timer(diff.bpm); } private void stop() { - + mediaPlayer.pause(); } } \ No newline at end of file diff --git a/src/main/Difficulty.java b/src/main/Difficulty.java index 18dabb3..c7a289a 100644 --- a/src/main/Difficulty.java +++ b/src/main/Difficulty.java @@ -19,14 +19,16 @@ public class Difficulty public File notes; public int bpm; public int numBeats; + public Level level; /** * Creates a new Difficulty and gives it a file path * @param newDir: The file path of the Difficulty */ - public Difficulty(File newDir) + public Difficulty(File newDir, Level level) { thisDir = newDir; + this.level = level; } /** diff --git a/src/main/Level.java b/src/main/Level.java index 591bd9a..cb16489 100644 --- a/src/main/Level.java +++ b/src/main/Level.java @@ -46,7 +46,7 @@ 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); } @@ -151,7 +151,7 @@ public class Level } catch (IOException e) { e.printStackTrace(); } - Difficulty temp = new Difficulty(diffDir); + Difficulty temp = new Difficulty(diffDir,this); temp.title = text; temp.writeMetadata(); temp.writeLeaderboard(); -- cgit v1.2.3 From 571bab88c599571ee5bd9c6f5f8af2f3016fb19d Mon Sep 17 00:00:00 2001 From: sowgro Date: Fri, 2 Jun 2023 01:36:34 -0400 Subject: bpm is now a double --- src/devmenu/DiffEditor.java | 2 +- src/gameplay/SongPlayer.java | 2 +- src/main/Difficulty.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/devmenu/DiffEditor.java b/src/devmenu/DiffEditor.java index 6bcbd28..d53505d 100644 --- a/src/devmenu/DiffEditor.java +++ b/src/devmenu/DiffEditor.java @@ -40,7 +40,7 @@ public class DiffEditor Button save = new Button("Save"); 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()); diff.writeMetadata(); }); diff --git a/src/gameplay/SongPlayer.java b/src/gameplay/SongPlayer.java index 8745727..78d3a9f 100644 --- a/src/gameplay/SongPlayer.java +++ b/src/gameplay/SongPlayer.java @@ -41,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; diff --git a/src/main/Difficulty.java b/src/main/Difficulty.java index c7a289a..0691675 100644 --- a/src/main/Difficulty.java +++ b/src/main/Difficulty.java @@ -17,7 +17,7 @@ public class Difficulty public String title = "Unnamed"; private ObservableList leaderboard = FXCollections.observableArrayList(); public File notes; - public int bpm; + public Double bpm; public int numBeats; public Level level; @@ -67,7 +67,7 @@ public class Difficulty JSONObject diffStuff = (JSONObject)(obj); //converts read object to a JSONObject title = (String) diffStuff.get("title"); - bpm = Integer.parseInt(diffStuff.get("bpm")+""); + bpm = Double.parseDouble(diffStuff.get("bpm")+""); numBeats = Integer.parseInt(diffStuff.get("numBeats")+""); } catch (Exception e) -- cgit v1.2.3 From a0739dc019417f17e77f6c959ebc0989c873514c Mon Sep 17 00:00:00 2001 From: sowgro Date: Fri, 2 Jun 2023 02:31:20 -0400 Subject: kinda working note writer --- src/devmenu/DiffEditor.java | 11 ++++++++- src/devmenu/NotesEditor.java | 55 ++++++++++++++++++++++++++++++++++++++------ src/gameplay/Timer.java | 4 ++++ src/main/Difficulty.java | 2 +- 4 files changed, 63 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/devmenu/DiffEditor.java b/src/devmenu/DiffEditor.java index d53505d..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; @@ -33,7 +36,13 @@ 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"); diff --git a/src/devmenu/NotesEditor.java b/src/devmenu/NotesEditor.java index 41bc1c3..e94ff2e 100644 --- a/src/devmenu/NotesEditor.java +++ b/src/devmenu/NotesEditor.java @@ -1,9 +1,17 @@ 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; @@ -16,45 +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; + help = new Text(t1); + Button start = new Button("Start"); start.setOnAction(e -> start()); Button stop = new Button("Pause"); stop.setOnAction(e -> stop()); - Button print = new Button("print"); - print.setOnAction(e -> System.out.println(timer.time())); - Media song = new Media(diff.level.song.toURI().toString()); mediaPlayer = new MediaPlayer(song); new MediaView(mediaPlayer); VBox main = new VBox(); - main.getChildren().addAll(start,stop,print); + 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() { mediaPlayer.play(); - timer = new Timer(diff.bpm); + help.setText(t2); } private void stop() { - mediaPlayer.pause(); + 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/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/main/Difficulty.java b/src/main/Difficulty.java index 0691675..abb12f4 100644 --- a/src/main/Difficulty.java +++ b/src/main/Difficulty.java @@ -17,7 +17,7 @@ public class Difficulty public String title = "Unnamed"; private ObservableList leaderboard = FXCollections.observableArrayList(); public File notes; - public Double bpm; + public Double bpm = 0.0; public int numBeats; public Level level; -- cgit v1.2.3