DEADSOFTWARE

Remove unnecessary arguments
[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.ButtonDrawer;
13 import ru.deadsoftware.cavedroid.menu.objects.ButtonEventListener;
14 import ru.deadsoftware.cavedroid.misc.Assets;
16 import java.util.HashMap;
18 public abstract class Menu {
20 private ButtonDrawer buttonDrawer;
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 buttonDrawer {@link ButtonDrawer} that will draw the buttons of this menu
34 */
35 Menu(float width, float height, ButtonDrawer buttonDrawer) {
36 this.width = width;
37 this.height = height;
38 this.buttonDrawer = buttonDrawer;
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) buttons = new ArrayMap<>();
60 HashMap<String, ButtonEventListener> eventListeners = getButtonEventListeners();
61 JsonValue json = Assets.jsonReader.parse(jsonFile);
62 int y = (int) height / 4;
63 for (JsonValue key = json.child(); key != null; key = key.next(), y += Button.HEIGHT + 10) {
64 buttons.put(key.name(),
65 new Button(Assets.getStringFromJson(key, "label", ""),
66 (int) width / 2 - Button.WIDTH / 2,
67 Assets.getIntFromJson(key, "y", y), Assets.getIntFromJson(key, "type", Button.NORMAL),
68 eventListeners.containsKey(key.name()) ? eventListeners.get(key.name()) : () -> {
69 }));
70 }
71 }
73 /**
74 * Draws the menu with background, logo and it's buttons
75 *
76 * @param spriter {@link SpriteBatch} that will draw it. Should be already started.
77 */
78 public void draw(SpriteBatch spriter) {
79 TextureRegion background = Assets.textureRegions.get("background");
80 TextureRegion gamelogo = Assets.textureRegions.get("gamelogo");
82 for (int x = 0; x <= width / 16; x++) {
83 for (int y = 0; y <= height / 16; y++) {
84 spriter.draw(background, x * 16, y * 16);
85 }
86 }
87 spriter.draw(gamelogo, width / 2 - (float) gamelogo.getRegionWidth() / 2, 8);
89 float inputX = Gdx.input.getX() * width / GameScreen.getWidth();
90 float inputY = Gdx.input.getY() * height / GameScreen.getHeight();
91 for (Button button : buttons.values()) {
92 if (button.getType() > 0) {
93 if (button.getRect().contains(inputX, inputY) && (!CaveGame.TOUCH || Gdx.input.isTouched())) {
94 button.setType(2);
95 } else {
96 button.setType(1);
97 }
98 }
99 button.draw(buttonDrawer);
103 public ArrayMap<String, Button> getButtons() {
104 return buttons;
107 /**
108 * This method is called from constructor and should initialize {@link #buttons} <br>
109 * You can run {@link #loadButtonsFromJson(FileHandle)} from it
110 */
111 protected abstract void initButtons();