DEADSOFTWARE

Add mobs damage and initial spawn
[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.MainConfig;
10 import ru.deadsoftware.cavedroid.menu.MenuProc;
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;
15 import ru.deadsoftware.cavedroid.misc.utils.AssetLoader;
17 import java.util.HashMap;
19 public abstract class Menu {
21 protected final MainConfig mMainConfig;
22 protected final MenuProc.Input mMenuInput;
23 protected final AssetLoader mAssetLoader;
25 private final ButtonRenderer mButtonRenderer;
27 private final float mWidth;
28 private final float mHeight;
30 /**
31 * {@link ArrayMap} of {@link Button Buttons} of this menu screen
32 */
33 private ArrayMap<String, Button> buttons;
35 /**
36 * @param width Viewport width
37 * @param height Viewport height
38 * @param buttonRenderer {@link ButtonRenderer} that will draw the buttons of this menu
39 */
40 Menu(float width,
41 float height,
42 ButtonRenderer buttonRenderer,
43 MainConfig mainConfig,
44 MenuProc.Input menuInput,
45 AssetLoader assetLoader) {
46 mWidth = width;
47 mHeight = height;
48 mButtonRenderer = buttonRenderer;
49 mMainConfig = mainConfig;
50 mMenuInput = menuInput;
51 mAssetLoader = assetLoader;
52 initButtons();
53 }
55 /**
56 * If you are loading buttons from json,
57 * override this method and create a HashMap with buttons' keys from json as keys
58 * and {@link ButtonEventListener ButtonEventListeners} as values.
59 *
60 * @return empty HashMap if not overridden
61 */
62 protected HashMap<String, ButtonEventListener> getButtonEventListeners() {
63 return new HashMap<>();
64 }
66 /**
67 * You can call this from {@link #initButtons()} to load buttons from json
68 *
69 * @param jsonFile A {@link FileHandle} to json file
70 */
71 void loadButtonsFromJson(FileHandle jsonFile) {
72 if (buttons == null) {
73 buttons = new ArrayMap<>();
74 }
75 HashMap<String, ButtonEventListener> eventListeners = getButtonEventListeners();
76 JsonValue json = Assets.jsonReader.parse(jsonFile);
77 int y = (int) mHeight / 4;
78 for (JsonValue key = json.child(); key != null; key = key.next(), y += Button.HEIGHT + 10) {
79 buttons.put(key.name(),
80 new Button(Assets.getStringFromJson(key, "label", ""),
81 (int) mWidth / 2 - Button.WIDTH / 2,
82 Assets.getIntFromJson(key, "y", y),
83 Assets.getIntFromJson(key, "type", Button.NORMAL),
84 eventListeners.containsKey(key.name()) ? eventListeners.get(key.name()) : () -> {
85 }));
86 }
87 }
89 /**
90 * Draws the menu with background, logo and it's buttons
91 *
92 * @param spriter {@link SpriteBatch} that will draw it. Should be already started.
93 */
94 public void draw(SpriteBatch spriter) {
95 TextureRegion background = Assets.textureRegions.get("background");
96 TextureRegion gamelogo = Assets.textureRegions.get("gamelogo");
98 for (int x = 0; x <= mWidth / 16; x++) {
99 for (int y = 0; y <= mHeight / 16; y++) {
100 spriter.draw(background, x * 16, y * 16);
103 spriter.draw(gamelogo, mWidth / 2 - (float) gamelogo.getRegionWidth() / 2, 8);
105 float inputX = Gdx.input.getX() * mWidth / Gdx.graphics.getWidth();
106 float inputY = Gdx.input.getY() * mHeight / Gdx.graphics.getHeight();
107 for (Button button : buttons.values()) {
108 if (button.getType() > 0) {
109 if (button.getRect().contains(inputX, inputY) && (/*!CaveGame.TOUCH || */Gdx.input.isTouched())) {
110 button.setType(2);
111 } else {
112 button.setType(1);
115 button.draw(mButtonRenderer);
119 public ArrayMap<String, Button> getButtons() {
120 return buttons;
123 /**
124 * This method is called from constructor and should initialize {@link #buttons} <br>
125 * You can run {@link #loadButtonsFromJson(FileHandle)} from it
126 */
127 protected abstract void initButtons();