diff options
-rwxr-xr-x | README.md | 13 | ||||
-rw-r--r-- | controls.json | 1 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/Driver.java | 3 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/devmenu/DebugMenu.java | 41 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java | 20 | ||||
-rw-r--r-- | src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java | 51 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java | 38 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gameplay/Target.java | 4 | ||||
-rw-r--r-- | src/main/java/net/sowgro/npehero/gui/ControlEditor.java | 117 | ||||
-rwxr-xr-x | src/main/java/net/sowgro/npehero/gui/Settings.java | 32 | ||||
-rw-r--r-- | src/main/java/net/sowgro/npehero/main/Control.java | 108 | ||||
-rw-r--r-- | src/main/java/net/sowgro/npehero/main/Notes.java | 4 |
12 files changed, 318 insertions, 114 deletions
@@ -3,12 +3,17 @@ One-year anniversary update! Goals: - [x] New integrated level editor -- [ ] Custom keybindings -- [ ] Installer / Linux package +- [X] Custom keybindings +- [ ] UI improvements - [ ] Code cleanup +- [ ] Installer / Linux package -### Notes: -TEMOPORARY: USE G KEY INSTEAD OF SPACE KEY +Notes: +- Level creation flow is incomplete + - no way to set lastbeat + - notes editor does not write to file + - no validation +- Everything else in this readme is outdated # Installation 1. Install Java 17 or newer diff --git a/controls.json b/controls.json new file mode 100644 index 0000000..4f5ab8f --- /dev/null +++ b/controls.json @@ -0,0 +1 @@ +{"LEGACY_STOP":"ESCAPE","LANE4":"K","LANE1":"F","LANE0":"D","LANE3":"J","LANE2":"SPACE","DELETE_NOTE":"DELETE","SCROLL_LOCK":"L","NOTE_DOWN":"DOWN","LEGACY_PRINT":"Q","PLAY_PAUSE":"P","SELECT_ALL":"S","CLEAR_SELECTION":"ESCAPE","NOTE_UP":"UP"}
\ No newline at end of file diff --git a/src/main/java/net/sowgro/npehero/Driver.java b/src/main/java/net/sowgro/npehero/Driver.java index 6d23390..2a1bdc3 100755 --- a/src/main/java/net/sowgro/npehero/Driver.java +++ b/src/main/java/net/sowgro/npehero/Driver.java @@ -1,7 +1,6 @@ package net.sowgro.npehero; import javafx.application.Application; -import javafx.application.Platform; import javafx.geometry.Side; import javafx.scene.Scene; import javafx.scene.control.ScrollPane; @@ -16,6 +15,7 @@ import javafx.scene.layout.BackgroundRepeat; import javafx.scene.layout.BackgroundSize; import javafx.scene.layout.Pane; import javafx.stage.Stage; +import net.sowgro.npehero.main.Control; import net.sowgro.npehero.gui.MainMenu; import net.sowgro.npehero.main.LevelController; import net.sowgro.npehero.main.SettingsController; @@ -46,6 +46,7 @@ public class Driver extends Application { SettingsController.read(); LevelController.readData(); + Control.readFromFile(); primaryStage = newPrimaryStage; diff --git a/src/main/java/net/sowgro/npehero/devmenu/DebugMenu.java b/src/main/java/net/sowgro/npehero/devmenu/DebugMenu.java deleted file mode 100755 index aecd438..0000000 --- a/src/main/java/net/sowgro/npehero/devmenu/DebugMenu.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.sowgro.npehero.devmenu; - -import net.sowgro.npehero.Driver; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.layout.VBox; -import javafx.stage.Stage; - -public class DebugMenu -{ - public 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. - */ - VBox primaryPane = new VBox(); - public DebugMenu() - { - Button testVol = new Button(); - testVol.setText("print volumes"); - testVol.setOnAction(e -> System.out.println("setc:"+Driver.settingsController.effectsVol+" sndc:"+Driver.soundController.songMediaPlayer.getVolume())); - - primaryPane.getChildren().addAll(testVol); - - Scene primaryScene = new Scene(primaryPane); - primaryStage.setScene(primaryScene); - primaryStage.setTitle("debug"); - } - - public void show() - { - primaryStage.show(); - } - - public void addButton(Button b) - { - primaryPane.getChildren().add(b); - } -} diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java index 7e78701..985b2d0 100755 --- a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java +++ b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java @@ -5,6 +5,7 @@ import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import javafx.geometry.Pos; +import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.media.Media; @@ -12,9 +13,9 @@ import net.sowgro.npehero.gameplay.Timer; import net.sowgro.npehero.Driver; import javafx.scene.Scene; import javafx.scene.control.Button; -import javafx.scene.input.KeyCode; import javafx.scene.layout.VBox; import javafx.scene.text.Text; +import net.sowgro.npehero.main.Control; import net.sowgro.npehero.main.Difficulty; import net.sowgro.npehero.main.SoundController; @@ -22,7 +23,7 @@ public class NotesEditor extends Pane { Text help; String t1 = "Press Start to begin recording. Use the same keys. Note: existing notes will be overwritten."; - String t2 = "Now recording. Press Stop or ESC to finish"; + String t2 = "Now recording. Press Stop or " + Control.LEGACY_STOP.getKey().toString() + " to finish"; Difficulty diff; Timer timer; PrintWriter writer; @@ -68,31 +69,32 @@ public class NotesEditor extends Pane writer = new PrintWriter(diff.notes.getFile(), "UTF-8"); Scene scene = Driver.primaryStage.getScene(); - scene.setOnKeyPressed(e -> { - if (e.getCode() == KeyCode.D) { + scene.addEventFilter(KeyEvent.KEY_PRESSED, e -> { + if (e.getCode() == Control.LANE0.getKey()) { writer.println("d"+timer); cur.setText("d"+timer); } - if (e.getCode() == KeyCode.F) { + if (e.getCode() == Control.LANE1.getKey()) { writer.println("f"+timer); cur.setText("f"+timer); } - if (e.getCode() == KeyCode.SPACE) { + if (e.getCode() == Control.LANE2.getKey()) { writer.println("s"+timer); cur.setText("s"+timer); } - if (e.getCode() == KeyCode.J) { + if (e.getCode() == Control.LANE3.getKey()) { writer.println("j"+timer); cur.setText("j"+timer); } - if (e.getCode() == KeyCode.K) { + if (e.getCode() == Control.LANE4.getKey()) { writer.println("k"+timer); cur.setText("k"+timer); } - if (e.getCode() == KeyCode.ESCAPE) + if (e.getCode() == Control.LEGACY_STOP.getKey()) { stop(); } + e.consume(); }); Driver.primaryStage.setOnCloseRequest(e -> stop()); diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java index 99aacec..cd76801 100644 --- a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java +++ b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java @@ -8,6 +8,8 @@ import javafx.collections.ListChangeListener; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; @@ -24,6 +26,7 @@ import net.sowgro.npehero.gameplay.Target; import net.sowgro.npehero.main.Difficulty; import net.sowgro.npehero.main.Note; import net.sowgro.npehero.main.SoundController; +import net.sowgro.npehero.main.Control; import java.util.concurrent.atomic.AtomicInteger; @@ -146,6 +149,7 @@ public class NotesEditor2 extends Pane { save.setText("Done"); save.setOnAction(_ -> { diff.notes.list = noteList; + diff.notes.writeFile(); m.stop(); SoundController.playSfx(SoundController.BACKWARD); Driver.setMenu(new DiffEditor(diff, prev.prev)); @@ -192,18 +196,21 @@ public class NotesEditor2 extends Pane { rootBox.setAlignment(Pos.CENTER); // write notes on key press - rootBox.setOnKeyPressed(e -> { - switch (e.getCode()) { - case D -> WriteNote(0); - case F -> WriteNote(1); - case G -> WriteNote(2); // Problem with space to select - case J -> WriteNote(3); - case K -> WriteNote(4); - case EQUALS -> activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() - 0.01)); - case MINUS -> activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() + 0.01)); - case DELETE -> delNote.fire(); - case ESCAPE -> clearSelect.fire(); - }; + rootBox.addEventFilter(KeyEvent.KEY_PRESSED, e -> { + KeyCode k = e.getCode(); + if (k == Control.LANE0.getKey()) WriteNote(0); + if (k == Control.LANE1.getKey()) WriteNote(1); + if (k == Control.LANE2.getKey()) WriteNote(2); + if (k == Control.LANE3.getKey()) WriteNote(3); + if (k == Control.LANE4.getKey()) WriteNote(4); + if (k == Control.NOTE_DOWN.getKey()) MoveNoteDown(); + if (k == Control.NOTE_UP.getKey()) MoveNoteUp(); + if (k == Control.DELETE_NOTE.getKey()) delNote.fire(); + if (k == Control.CLEAR_SELECTION.getKey()) clearSelect.fire(); + if (k == Control.SCROLL_LOCK.getKey()) scrollLock.fire(); + if (k == Control.PLAY_PAUSE.getKey()) play.fire(); + if (k == Control.SELECT_ALL.getKey()) selectAll.fire(); + e.consume(); }); m.currentTimeProperty().addListener(_ -> { @@ -343,14 +350,22 @@ public class NotesEditor2 extends Pane { noteList.add(tmp); } + private void MoveNoteUp() { + activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() + 0.01)); + } + + private void MoveNoteDown() { + activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() - 0.01)); + } + private Pane addHelp() { Label l1 = new Label("Use the following keys"); HBox hb = new HBox( - new Target(diff.level.colors[0], 40, 40, 10, 'd'), - new Target(diff.level.colors[1], 40, 40, 10, 'f'), - new Target(diff.level.colors[2], 40, 40, 10, 'g'), - new Target(diff.level.colors[3], 40, 40, 10, 'j'), - new Target(diff.level.colors[4], 40, 40, 10, 'k') + new Target(diff.level.colors[0], 40, 40, 10, Control.LANE0.targetString()), + new Target(diff.level.colors[1], 40, 40, 10, Control.LANE1.targetString()), + new Target(diff.level.colors[2], 40, 40, 10, Control.LANE2.targetString()), + new Target(diff.level.colors[3], 40, 40, 10, Control.LANE3.targetString()), + new Target(diff.level.colors[4], 40, 40, 10, Control.LANE4.targetString()) ); hb.setSpacing(10); hb.setAlignment(Pos.CENTER_LEFT); @@ -364,7 +379,7 @@ public class NotesEditor2 extends Pane { private Pane moveHelp() { Label l1 = new Label("Use the"); - HBox hb = new HBox(new Target(Color.BLACK, 40, 40, 10, '+'), new Label("and"), new Target(Color.BLACK, 40, 40, 10, '-'), new Label("keys")); + HBox hb = new HBox(new Target(Color.BLACK, 40, 40, 10, Control.NOTE_UP.targetString()), new Label("and"), new Target(Color.BLACK, 40, 40, 10, Control.NOTE_DOWN.targetString()), new Label("keys")); hb.setSpacing(10); hb.setAlignment(Pos.CENTER_LEFT); Label l2 = new Label("to move the selected \nnote(s) up and down."); diff --git a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java index d4fbbbf..dc74b30 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java +++ b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java @@ -10,12 +10,13 @@ import java.util.Queue; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; +import javafx.scene.input.KeyEvent; import javafx.scene.media.Media; import net.sowgro.npehero.Driver; +import net.sowgro.npehero.main.Control; import net.sowgro.npehero.gui.GameOver; import javafx.geometry.Pos; import javafx.scene.CacheHint; -import javafx.scene.input.KeyCode; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; @@ -62,23 +63,23 @@ public class SongPlayer extends Pane { HBox buttonBox = new HBox(); //used to align the buttons horizontally VBox place = new VBox(); //used to place the buttons within the frame - Target dButton = new Target(Color.RED, 50, 50, 5, 'd'); //Initializes the button, each parameter is a placeholder that is changed later + Target dButton = new Target(Color.RED, 50, 50, 5, Control.LANE0.targetString()); //Initializes the button, each parameter is a placeholder that is changed later Queue<NoteInfo> dSends = new LinkedList<NoteInfo>(); //Queue that dictates when to send the notes ArrayList<Block> dLane = new ArrayList<Block>(); //Array list containing all the notes currently on the field for that lane //process is repeated for the following four buttons - Target fButton = new Target(Color.BLUE, 50, 50, 5, 'f'); + Target fButton = new Target(Color.BLUE, 50, 50, 5, Control.LANE1.targetString()); Queue<NoteInfo> fSends = new LinkedList<NoteInfo>(); ArrayList<Block> fLane = new ArrayList<Block>(); - Target sButton = new Target(Color.GREEN, 50, 50, 5, '_'); + Target sButton = new Target(Color.GREEN, 50, 50, 5, Control.LANE2.targetString()); Queue<NoteInfo> spaceSends = new LinkedList<NoteInfo>(); ArrayList<Block> spaceLane = new ArrayList<Block>(); - Target jButton = new Target(Color.PURPLE, 50, 50, 5, 'j'); + Target jButton = new Target(Color.PURPLE, 50, 50, 5, Control.LANE3.targetString()); Queue<NoteInfo> jSends = new LinkedList<NoteInfo>(); ArrayList<Block> jLane = new ArrayList<Block>(); - Target kButton = new Target(Color.YELLOW, 50, 50, 5, 'k'); + Target kButton = new Target(Color.YELLOW, 50, 50, 5, Control.LANE4.targetString()); Queue<NoteInfo> kSends = new LinkedList<NoteInfo>(); ArrayList<Block> kLane = new ArrayList<Block>(); @@ -132,34 +133,35 @@ public class SongPlayer extends Pane { genButton(sButton); genButton(jButton); genButton(kButton); - - Driver.primaryStage.getScene().setOnKeyPressed(e -> { + + Driver.primaryStage.addEventFilter(KeyEvent.KEY_PRESSED, e -> { /** * The keyboard detection for the game: when a key is pressed it * calls the checkNote() method for the corresponding lane */ - //System.out.println(timer.time()); - if (super.isVisible()) - { - if (e.getCode() == KeyCode.D) { + System.out.println(e.getCode()); +// if (super.isVisible()) +// { + if (e.getCode() == Control.LANE0.getKey()) { checkNote(dLane, dButton); } - if (e.getCode() == KeyCode.F) { + if (e.getCode() == Control.LANE1.getKey()) { checkNote(fLane, fButton); } - if (e.getCode() == KeyCode.G) { + if (e.getCode() == Control.LANE2.getKey()) { checkNote(spaceLane, sButton); } - if (e.getCode() == KeyCode.J) { + if (e.getCode() == Control.LANE3.getKey()) { checkNote(jLane, jButton); } - if (e.getCode() == KeyCode.K) { + if (e.getCode() == Control.LANE4.getKey()) { checkNote(kLane, kButton); } - if (e.getCode() == KeyCode.Q) { + if (e.getCode() == Control.LEGACY_PRINT.getKey()) { System.out.println("" + timer.time()); } - } +// } + e.consume(); //prints the user's current score and combo, for debugging purposes //System.out.println("Score: " + scoreCounter.getScore() + "\nCombo: " + scoreCounter.getCombo() + "\n"); }); diff --git a/src/main/java/net/sowgro/npehero/gameplay/Target.java b/src/main/java/net/sowgro/npehero/gameplay/Target.java index 3dc8564..229abcb 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/Target.java +++ b/src/main/java/net/sowgro/npehero/gameplay/Target.java @@ -13,9 +13,9 @@ public class Target extends StackPane private Color fill; private Text label; public Rectangle rect = new Rectangle(); - public Target(Color c, double a, double b, int r, char key) + public Target(Color c, double a, double b, int r, String key) { - label = new Text(key+""); + label = new Text(key); label.getStyleClass().add("t3"); label.scaleXProperty().bind(super.widthProperty().divide(50)); label.scaleYProperty().bind(label.scaleXProperty()); diff --git a/src/main/java/net/sowgro/npehero/gui/ControlEditor.java b/src/main/java/net/sowgro/npehero/gui/ControlEditor.java new file mode 100644 index 0000000..637a9d8 --- /dev/null +++ b/src/main/java/net/sowgro/npehero/gui/ControlEditor.java @@ -0,0 +1,117 @@ +package net.sowgro.npehero.gui; + +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.event.EventHandler; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; +import net.sowgro.npehero.Driver; +import net.sowgro.npehero.main.Control; +import net.sowgro.npehero.main.SoundController; +import org.w3c.dom.events.Event; + +public class ControlEditor extends Pane { + public ControlEditor() { + + GridPane controls = new GridPane(); + ScrollPane scrollPane = new ScrollPane(controls); + scrollPane.getStyleClass().remove("scroll-pane"); + scrollPane.getStyleClass().add("box"); + scrollPane.setPadding(new Insets(10)); + controls.setPadding(new Insets(10)); + controls.setHgap(40); + controls.setVgap(20); + + + scrollPane.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35)); + scrollPane.setMinWidth(400); + scrollPane.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75)); + + Button exit = new Button(); + exit.setText("Back"); + exit.setOnAction(e -> { + SoundController.playSfx(SoundController.BACKWARD); + Driver.setMenu(new Settings()); + }); + + VBox centerBox = new VBox(); + centerBox.setAlignment(Pos.CENTER); + centerBox.setSpacing(10); + centerBox.getChildren().addAll(scrollPane,exit); + centerBox.setMinWidth(400); + + HBox rootBox = new HBox(); + rootBox.prefWidthProperty().bind(super.prefWidthProperty()); + rootBox.prefHeightProperty().bind(super.prefHeightProperty()); + rootBox.getChildren().add(centerBox); + rootBox.setAlignment(Pos.CENTER); + + ToggleGroup tg = new ToggleGroup(); + for (int i = 0; i < Control.values().length; i++) { + Control control = Control.values()[i]; + + + // label + Label label = new Label(control.label); + controls.add(label, 0, i); + + // control button + ToggleButton controlButton = new ToggleButton("<err>"); + controlButton.setText(keyToString(control.keyProperty.get())); + control.keyProperty.addListener(_ -> { + System.out.println(control.label + " set to " + control.keyProperty.get()); + System.out.println(controlButton.getText()); + controlButton.setText(keyToString(control.keyProperty.get())); + net.sowgro.npehero.main.Control.writeToFile(); + }); + controlButton.setOnMouseClicked(_ -> { + EventHandler<KeyEvent> keyListener = new EventHandler<>() { + @Override + public void handle(KeyEvent k) { + control.keyProperty.set(k.getCode()); + rootBox.removeEventFilter(KeyEvent.KEY_PRESSED, this); + controlButton.setSelected(false); + k.consume(); + } + }; + if (controlButton.isSelected()) { + System.out.println("Event registered"); + rootBox.addEventFilter(KeyEvent.KEY_PRESSED, keyListener); + } + else { + System.out.println("Event un-registered"); + rootBox.removeEventFilter(KeyEvent.KEY_PRESSED, keyListener); + } + }); + tg.getToggles().add(controlButton); + controls.add(controlButton, 1, i); + + // label button + Button resetButton = new Button("Reset"); + resetButton.setOnMouseClicked(_ -> { + control.keyProperty.set(control.defaultKey); + }); + controls.add(resetButton, 2, i); + + } + + super.getChildren().add(rootBox); + } + + public String keyToString(KeyCode key) { + if (key == null) { + return "<unset>"; + } + else { + return key.toString(); + } + } +} diff --git a/src/main/java/net/sowgro/npehero/gui/Settings.java b/src/main/java/net/sowgro/npehero/gui/Settings.java index 8d345a0..cc6815c 100755 --- a/src/main/java/net/sowgro/npehero/gui/Settings.java +++ b/src/main/java/net/sowgro/npehero/gui/Settings.java @@ -4,7 +4,6 @@ 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; @@ -70,26 +69,20 @@ public class Settings extends Pane fullBox.setPadding(new Insets(10)); - Text devLabel = new Text("Advanced"); - devLabel.getStyleClass().add("t3"); + Text controlsLabel = new Text("Key Bindings"); + controlsLabel.getStyleClass().add("t3"); - Button devMenu = new Button(); - devMenu.setText("Debug Menu"); - devMenu.setOnAction(e -> { + Button controlsButton = new Button(); + controlsButton.setText("Edit"); + controlsButton.setOnAction(_ -> { SoundController.playSfx(SoundController.FORWARD); -// Driver.debug.show(); + Driver.setMenu(new ControlEditor()); }); - VBox devBox = new VBox(); - devBox.getStyleClass().add("box"); - devBox.getChildren().addAll(devLabel,devMenu); - devBox.setVisible(false); - devBox.setManaged(false); - devBox.setPadding(new Insets(10)); - - ToggleButton advanced = new ToggleButton("Advanced"); - advanced.selectedProperty().bindBidirectional(devBox.managedProperty()); - advanced.selectedProperty().bindBidirectional(devBox.visibleProperty()); + VBox controlsBox = new VBox(); + controlsBox.getStyleClass().add("box"); + controlsBox.getChildren().addAll(controlsLabel, controlsButton); + controlsBox.setPadding(new Insets(10)); Button exit = new Button(); exit.setText("Back"); @@ -101,13 +94,11 @@ public class Settings extends Pane BorderPane buttonBox = new BorderPane(); buttonBox.setLeft(exit); - buttonBox.setRight(advanced); - VBox options = new VBox(); options.setSpacing(10); options.setAlignment(Pos.CENTER); - options.getChildren().addAll(musicBox,SFXBox,fullBox,devBox,buttonBox); + options.getChildren().addAll(musicBox,SFXBox,fullBox,controlsBox,buttonBox); options.maxWidthProperty().bind(super.prefWidthProperty().multiply(0.25)); options.setMinWidth(400); options.prefHeightProperty().bind(super.prefHeightProperty()); @@ -120,3 +111,4 @@ public class Settings extends Pane super.getChildren().add(rootBox); } } + diff --git a/src/main/java/net/sowgro/npehero/main/Control.java b/src/main/java/net/sowgro/npehero/main/Control.java new file mode 100644 index 0000000..7bbcfb1 --- /dev/null +++ b/src/main/java/net/sowgro/npehero/main/Control.java @@ -0,0 +1,108 @@ +package net.sowgro.npehero.main; + +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.input.KeyCode; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +import java.io.*; + +public enum Control { + + LANE0 ("Lane 0", KeyCode.D), + LANE1 ("Lane 1", KeyCode.F), + LANE2 ("Lane 2", KeyCode.SPACE), + LANE3 ("Lane 3", KeyCode.J), + LANE4 ("Lane 4", KeyCode.K), + DELETE_NOTE ("Delete note", KeyCode.DELETE), + NOTE_UP ("Move note up", KeyCode.EQUALS), + NOTE_DOWN ("Move note down", KeyCode.MINUS), + SCROLL_LOCK ("Scroll lock", KeyCode.L), + PLAY_PAUSE ("Play / Pause", KeyCode.P), + CLEAR_SELECTION ("Clear selection", KeyCode.ESCAPE), + SELECT_ALL ("Select All", KeyCode.S), + LEGACY_PRINT ("Print time (Legacy)", KeyCode.Q), + LEGACY_STOP ("Stop edit (Legacy)", KeyCode.ESCAPE); + + public final String label; + public final KeyCode defaultKey; + public final ObjectProperty<KeyCode> keyProperty = new SimpleObjectProperty<>(); + + private static final String fileName = "controls.json"; + + Control(String label, KeyCode key) { + this.label = label; + this.defaultKey = key; + this.keyProperty.set(key); + } + + public KeyCode getKey() { + return keyProperty.get(); + } + + public void setKey(KeyCode key) { + keyProperty.set(key); + } + + /** + * The key KeyCode represented as 2 or fewer characters for use in a block target. + * @return the resulting string + */ + public String targetString() { + KeyCode key = getKey(); + return switch (key) { + case UP -> "↑"; + case DOWN -> "↓"; + case LEFT -> "←"; + case RIGHT -> "→"; + case SPACE -> "_"; + case null -> " "; + default -> { + String s = key.toString(); + if (s.length() > 2) { + yield s.charAt(0) + "."; + } + else { + yield s; + } + } + }; + } + + public static void writeToFile() { + try { + File file = new File("controls.json"); + FileWriter fileWriter = new FileWriter(file); + JSONObject jsonObject = new JSONObject(); + for (Control control : Control.values()) { + jsonObject.put(control.toString(), control.getKey().toString()); + } + jsonObject.writeJSONString(fileWriter); + fileWriter.flush(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + public static void readFromFile() { + File file = new File("controls.json"); + JSONParser jsonParser = new JSONParser(); + + try { + FileReader reader = new FileReader(file); + Object obj = jsonParser.parse(reader); + JSONObject jsonObject = (JSONObject)(obj); + for (Control control : Control.values()) { + if (jsonObject.containsKey(control.toString())) { + control.setKey(KeyCode.valueOf((String) jsonObject.get(control.toString()))); + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/net/sowgro/npehero/main/Notes.java b/src/main/java/net/sowgro/npehero/main/Notes.java index 04524c3..b0979de 100644 --- a/src/main/java/net/sowgro/npehero/main/Notes.java +++ b/src/main/java/net/sowgro/npehero/main/Notes.java @@ -72,7 +72,9 @@ public class Notes { } writer.println(lane + note.time.get()); - + writer.flush(); + writer.close(); + // still not working } } catch (IOException e) { |