aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2024-07-16 01:23:01 -0400
committersowgro <tpoke.ferrari@gmail.com>2024-07-16 01:23:01 -0400
commitd8b8d88e97cfd732ea0e81847762e93412377dd9 (patch)
tree018b4a1c8636b7d49af2e69d8b943680de21831d
parent2d42d77c883453e4f03ca0a47068f9d1f6c61aa6 (diff)
downloadNPEhero-d8b8d88e97cfd732ea0e81847762e93412377dd9.tar.gz
NPEhero-d8b8d88e97cfd732ea0e81847762e93412377dd9.tar.bz2
NPEhero-d8b8d88e97cfd732ea0e81847762e93412377dd9.zip
Add customizable keybindings
-rwxr-xr-xREADME.md13
-rw-r--r--controls.json1
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/Driver.java3
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/DebugMenu.java41
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/NotesEditor.java20
-rw-r--r--src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java51
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gameplay/SongPlayer.java38
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gameplay/Target.java4
-rw-r--r--src/main/java/net/sowgro/npehero/gui/ControlEditor.java117
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/gui/Settings.java32
-rw-r--r--src/main/java/net/sowgro/npehero/main/Control.java108
-rw-r--r--src/main/java/net/sowgro/npehero/main/Notes.java4
12 files changed, 318 insertions, 114 deletions
diff --git a/README.md b/README.md
index 97eefe2..feb0465 100755
--- a/README.md
+++ b/README.md
@@ -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) {