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
.game
.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
;
26 * {@link ArrayMap} of {@link Button Buttons} of this menu screen
28 private ArrayMap
<String
, Button
> buttons
;
31 * @param width Viewport width
32 * @param height Viewport height
33 * @param buttonRenderer {@link ButtonRenderer} that will draw the buttons of this menu
35 Menu(float width
, float height
, ButtonRenderer buttonRenderer
) {
38 this.buttonRenderer
= buttonRenderer
;
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.
47 * @return empty HashMap if not overridden
49 protected HashMap
<String
, ButtonEventListener
> getButtonEventListeners() {
50 return new HashMap
<>();
54 * You can call this from {@link #initButtons()} to load buttons from json
56 * @param jsonFile A {@link FileHandle} to json file
58 void loadButtonsFromJson(FileHandle jsonFile
) {
59 if (buttons
== null) {
60 buttons
= new ArrayMap
<>();
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()) : () -> {
77 * Draws the menu with background, logo and it's buttons
79 * @param spriter {@link SpriteBatch} that will draw it. Should be already started.
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);
90 spriter
.draw(gamelogo
, width
/ 2 - (float) gamelogo
.getRegionWidth() / 2, 8);
92 float inputX
= Gdx
.input
.getX() * width
/ Gdx
.graphics
.getWidth();
93 float inputY
= Gdx
.input
.getY() * height
/ Gdx
.graphics
.getHeight();
94 for (Button button
: buttons
.values()) {
95 if (button
.getType() > 0) {
96 if (button
.getRect().contains(inputX
, inputY
) && (/*!CaveGame.TOUCH || */Gdx
.input
.isTouched())) {
102 button
.draw(buttonRenderer
);
106 public ArrayMap
<String
, Button
> getButtons() {
111 * This method is called from constructor and should initialize {@link #buttons} <br>
112 * You can run {@link #loadButtonsFromJson(FileHandle)} from it
114 protected abstract void initButtons();