DEADSOFTWARE

Update README
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / menu / submenus / Menu.java
1 package ru.deadsoftware.cavedroid.menu.submenus;
3 import com.badlogic.gdx.Application;
4 import com.badlogic.gdx.Gdx;
5 import com.badlogic.gdx.files.FileHandle;
6 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
7 import com.badlogic.gdx.graphics.g2d.TextureRegion;
8 import com.badlogic.gdx.utils.ArrayMap;
9 import com.badlogic.gdx.utils.JsonValue;
10 import kotlin.text.StringsKt;
11 import ru.deadsoftware.cavedroid.MainConfig;
12 import ru.deadsoftware.cavedroid.menu.MenuProc;
13 import ru.deadsoftware.cavedroid.menu.objects.BooleanOptionButton;
14 import ru.deadsoftware.cavedroid.menu.objects.Button;
15 import ru.deadsoftware.cavedroid.menu.objects.ButtonEventListener;
16 import ru.deadsoftware.cavedroid.menu.objects.ButtonRenderer;
17 import ru.deadsoftware.cavedroid.misc.Assets;
18 import ru.deadsoftware.cavedroid.misc.utils.AssetLoader;
20 import java.util.HashMap;
22 public abstract class Menu {
24 protected final MainConfig mMainConfig;
25 protected final MenuProc.Input mMenuInput;
26 protected final AssetLoader mAssetLoader;
28 private final ButtonRenderer mButtonRenderer;
30 private final float mWidth;
31 private final float mHeight;
33 /**
34 * {@link ArrayMap} of {@link Button Buttons} of this menu screen
35 */
36 private ArrayMap<String, Button> buttons;
38 /**
39 * @param width Viewport width
40 * @param height Viewport height
41 * @param buttonRenderer {@link ButtonRenderer} that will draw the buttons of this menu
42 */
43 Menu(float width,
44 float height,
45 ButtonRenderer buttonRenderer,
46 MainConfig mainConfig,
47 MenuProc.Input menuInput,
48 AssetLoader assetLoader) {
49 mWidth = width;
50 mHeight = height;
51 mButtonRenderer = buttonRenderer;
52 mMainConfig = mainConfig;
53 mMenuInput = menuInput;
54 mAssetLoader = assetLoader;
55 initButtons();
56 }
58 /**
59 * If you are loading buttons from json,
60 * override this method and create a HashMap with buttons' keys from json as keys
61 * and {@link ButtonEventListener ButtonEventListeners} as values.
62 *
63 * @return empty HashMap if not overridden
64 */
65 protected HashMap<String, ButtonEventListener> getButtonEventListeners() {
66 return new HashMap<>();
67 }
69 /**
70 * You can call this from {@link #initButtons()} to load buttons from json
71 *
72 * @param jsonFile A {@link FileHandle} to json file
73 */
74 void loadButtonsFromJson(FileHandle jsonFile) {
75 if (buttons == null) {
76 buttons = new ArrayMap<>();
77 }
78 HashMap<String, ButtonEventListener> eventListeners = getButtonEventListeners();
79 JsonValue json = Assets.jsonReader.parse(jsonFile);
80 int y = (int) mHeight / 4;
81 for (JsonValue key = json.child(); key != null; key = key.next(), y += Button.HEIGHT + 10) {
83 if (Gdx.app.getType() == Application.ApplicationType.Android &&
84 !Assets.getBooleanFromJson(key, "visible_on_android", true)) {
85 continue;
86 }
88 String optionType = Assets.getStringFromJson(key, "option_type", "");
89 String label = Assets.getStringFromJson(key, "label", "");
90 int x = (int) mWidth / 2 - Button.WIDTH / 2;
91 int type = Assets.getIntFromJson(key, "type", Button.NORMAL);
92 String defaultValue = Assets.getStringFromJson(key, "default_value", "");
95 Button button = switch (optionType) {
96 case "boolean" ->
97 new BooleanOptionButton(mMainConfig, key.name(), Boolean.parseBoolean(defaultValue), label, x, y, type);
98 default ->
99 new Button(label, x, y, type, eventListeners.containsKey(key.name()) ? eventListeners.get(key.name()) : () -> {});
100 };
102 buttons.put(key.name(), button);
106 /**
107 * Draws the menu with background, logo and it's buttons
109 * @param spriter {@link SpriteBatch} that will draw it. Should be already started.
110 */
111 public void draw(SpriteBatch spriter) {
112 TextureRegion background = Assets.textureRegions.get("background");
113 TextureRegion gamelogo = Assets.textureRegions.get("gamelogo");
115 for (int x = 0; x <= mWidth / 16; x++) {
116 for (int y = 0; y <= mHeight / 16; y++) {
117 spriter.draw(background, x * 16, y * 16);
120 spriter.draw(gamelogo, mWidth / 2 - (float) gamelogo.getRegionWidth() / 2, 8);
122 float inputX = Gdx.input.getX() * mWidth / Gdx.graphics.getWidth();
123 float inputY = Gdx.input.getY() * mHeight / Gdx.graphics.getHeight();
124 for (Button button : buttons.values()) {
125 if (button.getType() > 0) {
126 if (button.getRect().contains(inputX, inputY) && (/*!CaveGame.TOUCH || */Gdx.input.isTouched())) {
127 button.setType(2);
128 } else {
129 button.setType(1);
132 button.draw(mButtonRenderer);
136 public ArrayMap<String, Button> getButtons() {
137 return buttons;
140 /**
141 * This method is called from constructor and should initialize {@link #buttons} <br>
142 * You can run {@link #loadButtonsFromJson(FileHandle)} from it
143 */
144 protected abstract void initButtons();