DEADSOFTWARE

Fix codestyle
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / menu / submenus / Menu.java
1 package ru.deadsoftware.cavedroid.menu.submenus;
3 import com.badlogic.gdx.Gdx;
4 import com.badlogic.gdx.files.FileHandle;
5 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
6 import com.badlogic.gdx.graphics.g2d.TextureRegion;
7 import com.badlogic.gdx.utils.ArrayMap;
8 import com.badlogic.gdx.utils.JsonValue;
9 import ru.deadsoftware.cavedroid.CaveGame;
10 import ru.deadsoftware.cavedroid.GameScreen;
11 import ru.deadsoftware.cavedroid.menu.objects.Button;
12 import ru.deadsoftware.cavedroid.menu.objects.ButtonEventListener;
13 import ru.deadsoftware.cavedroid.menu.objects.ButtonRenderer;
14 import ru.deadsoftware.cavedroid.misc.Assets;
16 import java.util.HashMap;
18 public abstract class Menu {
20 private ButtonRenderer buttonRenderer;
22 private float width;
23 private float height;
25 /**
26 * {@link ArrayMap} of {@link Button Buttons} of this menu screen
27 */
28 private ArrayMap<String, Button> buttons;
30 /**
31 * @param width Viewport width
32 * @param height Viewport height
33 * @param buttonRenderer {@link ButtonRenderer} that will draw the buttons of this menu
34 */
35 Menu(float width, float height, ButtonRenderer buttonRenderer) {
36 this.width = width;
37 this.height = height;
38 this.buttonRenderer = buttonRenderer;
39 initButtons();
40 }
42 /**
43 * If you are loading buttons from json,
44 * override this method and create a HashMap with buttons' keys from json as keys
45 * and {@link ButtonEventListener ButtonEventListeners} as values.
46 *
47 * @return empty HashMap if not overridden
48 */
49 protected HashMap<String, ButtonEventListener> getButtonEventListeners() {
50 return new HashMap<>();
51 }
53 /**
54 * You can call this from {@link #initButtons()} to load buttons from json
55 *
56 * @param jsonFile A {@link FileHandle} to json file
57 */
58 void loadButtonsFromJson(FileHandle jsonFile) {
59 if (buttons == null) {
60 buttons = new ArrayMap<>();
61 }
62 HashMap<String, ButtonEventListener> eventListeners = getButtonEventListeners();
63 JsonValue json = Assets.jsonReader.parse(jsonFile);
64 int y = (int) height / 4;
65 for (JsonValue key = json.child(); key != null; key = key.next(), y += Button.HEIGHT + 10) {
66 buttons.put(key.name(),
67 new Button(Assets.getStringFromJson(key, "label", ""),
68 (int) width / 2 - Button.WIDTH / 2,
69 Assets.getIntFromJson(key, "y", y),
70 Assets.getIntFromJson(key, "type", Button.NORMAL),
71 eventListeners.containsKey(key.name()) ? eventListeners.get(key.name()) : () -> {
72 }));
73 }
74 }
76 /**
77 * Draws the menu with background, logo and it's buttons
78 *
79 * @param spriter {@link SpriteBatch} that will draw it. Should be already started.
80 */
81 public void draw(SpriteBatch spriter) {
82 TextureRegion background = Assets.textureRegions.get("background");
83 TextureRegion gamelogo = Assets.textureRegions.get("gamelogo");
85 for (int x = 0; x <= width / 16; x++) {
86 for (int y = 0; y <= height / 16; y++) {
87 spriter.draw(background, x * 16, y * 16);
88 }
89 }
90 spriter.draw(gamelogo, width / 2 - (float) gamelogo.getRegionWidth() / 2, 8);
92 float inputX = Gdx.input.getX() * width / GameScreen.getWidth();
93 float inputY = Gdx.input.getY() * height / GameScreen.getHeight();
94 for (Button button : buttons.values()) {
95 if (button.getType() > 0) {
96 if (button.getRect().contains(inputX, inputY) && (!CaveGame.TOUCH || Gdx.input.isTouched())) {
97 button.setType(2);
98 } else {
99 button.setType(1);
102 button.draw(buttonRenderer);
106 public ArrayMap<String, Button> getButtons() {
107 return buttons;
110 /**
111 * This method is called from constructor and should initialize {@link #buttons} <br>
112 * You can run {@link #loadButtonsFromJson(FileHandle)} from it
113 */
114 protected abstract void initButtons();