Skip to content

Commit 29edd36

Browse files
committed
Add settings menu with resolution options
1 parent 5f73079 commit 29edd36

File tree

11 files changed

+124
-52
lines changed

11 files changed

+124
-52
lines changed

assets/Settings.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ public class Settings {
1313
private static void init() {
1414
settings = new JSONObject();
1515
settings.put("resolution", 0);
16-
settings.put("fps", 60);
17-
settings.put("vsync", false);
18-
settings.put("auto_save", true);
16+
settings.put("vsync", true);
17+
settings.put("autosave", true);
18+
settings.put("fullscreen", false);
1919
}
2020

2121
public static void load() {
@@ -44,4 +44,8 @@ public static int getInt(String key) {
4444
return Integer.parseInt(settings.get(key)+"");
4545
}
4646

47+
public static boolean getBoolean(String key) {
48+
return Boolean.parseBoolean(settings.get(key)+"");
49+
}
50+
4751
}

assets/gui/icons/checked.png

196 Bytes
Loading

gui/elements/Checkbox.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package gui.elements;
2+
3+
import assets.Assets;
4+
import gui.GUIAnchor;
5+
import org.newdawn.slick.Color;
6+
7+
import javax.xml.soap.Text;
8+
9+
public class Checkbox extends Button {
10+
11+
private TextLabel label;
12+
13+
public Checkbox(String label) {
14+
super(null, 8, 8, null, true);
15+
this.label = new TextLabel(label, 5, Color.white, true, false);
16+
addChild(this.label, 0, 0, GUIAnchor.RIGHT_MIDDLE);
17+
}
18+
19+
@Override
20+
public int[] getDimensions() {
21+
return new int[]{8 + label.getDimensions()[0] + 2, 8};
22+
}
23+
24+
@Override
25+
public void onClick(int button) {
26+
setToggled(!isToggled());
27+
}
28+
29+
}

gui/elements/Picker.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
package gui.elements;
22

3-
import assets.Assets;
43
import gui.GUIAnchor;
54
import gui.GUIElement;
65
import org.newdawn.slick.Color;
76
import org.newdawn.slick.Graphics;
87

98
public class Picker extends GUIElement {
109

11-
private int value;
10+
private int value, minWidth;
1211

1312
private Button left, right;
1413
private TextLabel label;
1514

1615
private String[] labels;
1716

18-
public Picker(int min, int max, int interval, String labels[]) {
17+
public Picker(int min, int max, int interval, int minWidth, String[] labels) {
18+
this.labels = labels;
19+
this.minWidth = minWidth;
1920
this.left = new Button(null, 8, 8, "icons/arrow_left.png", true) {
2021
@Override
2122
public void onClick(int button) {
@@ -34,7 +35,7 @@ public void onClick(int button) {
3435
refresh();
3536
}
3637
};
37-
this.label = new TextLabel("", 5, Color.white, true, false);
38+
this.label = new TextLabel(labels != null && labels.length > 0 ? labels[value] : "", 5, Color.white, true, false);
3839
addChild(label, 0, 0, GUIAnchor.CENTER);
3940
addChild(left, 0, 0, GUIAnchor.LEFT_MIDDLE);
4041
addChild(right, 0, 0, GUIAnchor.RIGHT_MIDDLE);
@@ -52,13 +53,16 @@ public int getValue() {
5253
}
5354

5455
public void setValue(int value) {
55-
if (this.value != value) onValueChange();
56+
if (this.value != value) {
57+
refresh();
58+
onValueChange();
59+
}
5660
this.value = value;
5761
}
5862

5963
@Override
6064
public int[] getDimensions() {
61-
return new int[]{Math.max(label.getDimensions()[0], 8) + 20, left.getDimensions()[1]};
65+
return new int[]{Math.max(label.getDimensions()[0], minWidth) + 20, left.getDimensions()[1]};
6266
}
6367

6468
@Override

gui/menus/SpellcraftingMenu.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void onClick(int button) {
7171

7272
addChild(nameField, 8, 12, GUIAnchor.TOP_LEFT);
7373

74-
iconChooser = new Picker(0, 14, 1, null) {
74+
iconChooser = new Picker(0, 14, 1, 8, null) {
7575
@Override
7676
public void onValueChange() {
7777
icon.setImage(Assets.getImage("assets/gui/icons/spells/"+this.getValue()+".png"));

gui/states/GameState.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,7 @@ public void keyReleased(int key, char c) {
6464
if (key == getInput().KEY_F2) Window.takeScreenshot();
6565

6666
if (key == getInput().KEY_F11) {
67-
try {
68-
Window.toggleFullScreen();
69-
} catch (SlickException e) {
70-
e.printStackTrace();
71-
}
67+
Window.toggleFullScreen();
7268
}
7369

7470
getGUI().onKeyUp(key);

gui/states/MainMenuScreen.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import gui.menus.PopupMenu;
1010
import gui.sound.SoundManager;
1111
import main.GameManager;
12+
import misc.Window;
1213
import net.lingala.zip4j.ZipFile;
1314
import net.lingala.zip4j.exception.ZipException;
1415
import org.newdawn.slick.*;
@@ -66,6 +67,7 @@ public void addGUIElements(GUI gui) {
6667
Button deleteSave = new Button("Open root directory", 52, 8, null, true) {
6768
@Override
6869
public void onClick(int button) {
70+
Window.setFullscreen(false);
6971
try {
7072
Desktop.getDesktop().open(new File(Assets.ROOT_DIRECTORY));
7173
} catch (IOException e) {
@@ -126,6 +128,7 @@ public void onClick(int button) {
126128
gui.addElement(new Button("Visit the website", 48, 8, null, true) {
127129
@Override
128130
public void onClick(int button) {
131+
Window.setFullscreen(false);
129132
String url_open ="https://computerology.itch.io/spellbound";
130133
try {
131134
java.awt.Desktop.getDesktop().browse(java.net.URI.create(url_open));

gui/states/SettingsScreen.java

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,27 @@
11
package gui.states;
22

3-
import assets.Assets;
3+
import assets.Settings;
44
import gui.GUI;
55
import gui.GUIAnchor;
66
import gui.elements.Button;
7-
import gui.elements.IconLabel;
7+
import gui.elements.Checkbox;
8+
import gui.elements.Picker;
89
import gui.elements.TextLabel;
9-
import gui.menus.PlayerCustomizationMenu;
10-
import gui.menus.PopupMenu;
11-
import gui.sound.SoundManager;
1210
import main.GameManager;
1311
import misc.Window;
14-
import net.lingala.zip4j.ZipFile;
15-
import net.lingala.zip4j.exception.ZipException;
16-
import org.lwjgl.LWJGLException;
17-
import org.lwjgl.opengl.Display;
1812
import org.lwjgl.opengl.DisplayMode;
1913
import org.newdawn.slick.Color;
20-
import world.World;
2114

22-
import java.io.File;
23-
import java.io.IOException;
24-
import java.util.ArrayList;
25-
import java.util.Arrays;
2615
import java.util.List;
27-
import java.util.Random;
2816
import java.util.stream.Collectors;
2917

3018
public class SettingsScreen extends GameState {
3119

20+
private Picker picker;
21+
private Checkbox vsyncToggle, autosaveToggle, fullscreenToggle;
22+
23+
private boolean changedResolution;
24+
3225
public SettingsScreen() {
3326
super("assets/gui/title_bg.png");
3427
}
@@ -40,27 +33,65 @@ public int getID() {
4033

4134
@Override
4235
public void addGUIElements(GUI gui) {
43-
gui.addElement(new TextLabel("Settings", 5, Color.white, true, false), 0, 8, GUIAnchor.TOP_MIDDLE);
36+
gui.addElement(new TextLabel("Settings", 6, Color.white, true, false), 0, 8, GUIAnchor.TOP_MIDDLE);
37+
38+
39+
List<DisplayMode> modes = Window.getAllDisplayModes();
40+
gui.addElement(new TextLabel("Fullscreen Resolution", 5, Color.white, true, false), 0, 32, GUIAnchor.TOP_MIDDLE);
41+
picker = new Picker(0, modes.size()-1, 1, 64, modes.stream().map(m -> m.toString()).collect(Collectors.toList()).toArray(new String[]{})) {
42+
@Override
43+
public void onValueChange() {
44+
changedResolution = true;
45+
}
46+
};
47+
gui.addElement(picker, 0, 40, GUIAnchor.TOP_MIDDLE);
48+
49+
gui.addElement(new TextLabel("(press F11 to toggle fullscreen)", 4, Color.white, true, false), 0, 52, GUIAnchor.TOP_MIDDLE);
50+
51+
fullscreenToggle = new Checkbox("Fullscreen on launch");
52+
gui.addElement(fullscreenToggle, 0, 72, GUIAnchor.TOP_MIDDLE);
53+
54+
vsyncToggle = new Checkbox("Use VSync");
55+
fullscreenToggle.addChild(vsyncToggle, 0, 16, GUIAnchor.TOP_LEFT);
56+
57+
autosaveToggle = new Checkbox("Auto Save");
58+
fullscreenToggle.addChild(autosaveToggle, 0, 32, GUIAnchor.TOP_LEFT);
59+
4460
gui.addElement(new Button("Cancel", 48, 8, null, true) {
4561
@Override
4662
public void onClick(int button) {
4763
GameManager.switchTo(GameState.MAIN_MENU, false);
4864
}
49-
}, -4, -8, GUIAnchor.BOTTOM_MIDDLE);
65+
}, -36, -8, GUIAnchor.BOTTOM_MIDDLE);
5066

51-
List<DisplayMode> modes = Window.getAllDisplayModes();
52-
for (int i = 0; i < modes.size(); i++) {
53-
DisplayMode mode = modes.get(i);
54-
gui.addElement(
55-
new TextLabel(mode.toString()+(mode.isFullscreenCapable() ? " (FS)" : ""),
56-
4, Color.white, true, false),
57-
0, 16 + (6 * i), GUIAnchor.TOP_MIDDLE);
58-
}
67+
gui.addElement(new Button("Done", 48, 8, null, true) {
68+
@Override
69+
public void onClick(int button) {
70+
Settings.set("resolution", picker.getValue());
71+
Settings.set("fullscreen", fullscreenToggle.isToggled());
72+
Settings.set("vsync", vsyncToggle.isToggled());
73+
Settings.set("autosave", autosaveToggle.isToggled());
74+
Settings.save();
75+
76+
Window.WINDOW_INSTANCE.setVSync(Settings.getBoolean("vsync"));
77+
if (Window.isFullScreen() && changedResolution) {
78+
Window.toggleFullScreen();
79+
Window.toggleFullScreen();
80+
}
81+
82+
GameManager.switchTo(GameState.MAIN_MENU, false);
83+
}
84+
}, 36, -8, GUIAnchor.BOTTOM_MIDDLE);
5985
}
6086

6187
@Override
6288
public void onEnter() {
6389
//load and apply settings to elements
90+
changedResolution = false;
91+
picker.setValue(Settings.getInt("resolution"));
92+
autosaveToggle.setToggled(Settings.getBoolean("autosave"));
93+
vsyncToggle.setToggled(Settings.getBoolean("vsync"));
94+
fullscreenToggle.setToggled(Settings.getBoolean("fullscreen"));
6495
}
6596

6697
}

main/GameManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public static void main(String args[]) throws IOException {
6464
"assets/gui/icons/favicon/icon_112x112.png",
6565
"assets/gui/icons/favicon/icon_128x128.png"
6666
});
67-
Window.toggleFullScreen();
67+
if (Settings.getBoolean("fullscreen")) Window.toggleFullScreen();
6868
Window.WINDOW_INSTANCE.start();
6969

7070
} catch (SlickException e) {

misc/Window.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,25 @@ public class Window {
2828

2929
private static int last_width = 0, last_height = 0;
3030

31-
public static void toggleFullScreen() throws SlickException {
32-
if (WINDOW_INSTANCE.isFullscreen()) {
33-
WINDOW_INSTANCE.setFullscreen(false);
34-
WINDOW_INSTANCE.setDisplayMode((int)(getScreenWidth() * 0.75), (int)(getScreenHeight() * 0.75), false);
35-
} else {
36-
DisplayMode fs = Window.getAllDisplayModes().get(Settings.getInt("resolution"));
37-
WINDOW_INSTANCE.setDisplayMode(fs.getWidth(), fs.getHeight(), false);
38-
try {
31+
public static void toggleFullScreen() {
32+
try {
33+
if (WINDOW_INSTANCE.isFullscreen()) {
34+
WINDOW_INSTANCE.setFullscreen(false);
35+
WINDOW_INSTANCE.setDisplayMode((int) (getScreenWidth() * 0.75), (int) (getScreenHeight() * 0.75), false);
36+
} else {
37+
DisplayMode fs = Window.getAllDisplayModes().get(Settings.getInt("resolution"));
38+
WINDOW_INSTANCE.setDisplayMode(fs.getWidth(), fs.getHeight(), false);
3939
Display.setDisplayModeAndFullscreen(fs);
40-
} catch (LWJGLException e) {
41-
e.printStackTrace();
4240
}
41+
} catch (SlickException | LWJGLException e) {
42+
e.printStackTrace();
4343
}
4444
}
4545

46+
public static void setFullscreen(boolean fs) {
47+
if (fs != Window.isFullScreen()) toggleFullScreen();
48+
}
49+
4650
public static List<DisplayMode> getAllDisplayModes() {
4751
List<DisplayMode> modes = null;
4852
try {

0 commit comments

Comments
 (0)