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
;
34 * {@link ArrayMap} of {@link Button Buttons} of this menu screen
36 private ArrayMap
<String
, Button
> buttons
;
39 * @param width Viewport width
40 * @param height Viewport height
41 * @param buttonRenderer {@link ButtonRenderer} that will draw the buttons of this menu
45 ButtonRenderer buttonRenderer
,
46 MainConfig mainConfig
,
47 MenuProc
.Input menuInput
,
48 AssetLoader assetLoader
) {
51 mButtonRenderer
= buttonRenderer
;
52 mMainConfig
= mainConfig
;
53 mMenuInput
= menuInput
;
54 mAssetLoader
= assetLoader
;
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.
63 * @return empty HashMap if not overridden
65 protected HashMap
<String
, ButtonEventListener
> getButtonEventListeners() {
66 return new HashMap
<>();
70 * You can call this from {@link #initButtons()} to load buttons from json
72 * @param jsonFile A {@link FileHandle} to json file
74 void loadButtonsFromJson(FileHandle jsonFile
) {
75 if (buttons
== null) {
76 buttons
= new ArrayMap
<>();
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)) {
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
) {
97 new BooleanOptionButton(mMainConfig
, key
.name(), Boolean
.parseBoolean(defaultValue
), label
, x
, y
, type
);
99 new Button(label
, x
, y
, type
, eventListeners
.containsKey(key
.name()) ? eventListeners
.get(key
.name()) : () -> {});
102 buttons
.put(key
.name(), button
);
107 * Draws the menu with background, logo and it's buttons
109 * @param spriter {@link SpriteBatch} that will draw it. Should be already started.
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())) {
132 button
.draw(mButtonRenderer
);
136 public ArrayMap
<String
, Button
> getButtons() {
141 * This method is called from constructor and should initialize {@link #buttons} <br>
142 * You can run {@link #loadButtonsFromJson(FileHandle)} from it
144 protected abstract void initButtons();