DEADSOFTWARE

423469372609e4c3f53321bf2b00d0f37974519a
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / GameRenderer.java
1 package ru.deadsoftware.cavedroid.game;
3 import com.badlogic.gdx.Gdx;
4 import com.badlogic.gdx.Input;
5 import com.badlogic.gdx.graphics.Color;
6 import com.badlogic.gdx.graphics.GL20;
7 import com.badlogic.gdx.math.Rectangle;
8 import com.badlogic.gdx.scenes.scene2d.ui.Label;
9 import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
10 import com.badlogic.gdx.utils.ObjectMap;
11 import ru.deadsoftware.cavedroid.MainConfig;
12 import ru.deadsoftware.cavedroid.game.input.IGameInputHandler;
13 import ru.deadsoftware.cavedroid.game.input.Joystick;
14 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction;
15 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction;
16 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey;
17 import ru.deadsoftware.cavedroid.game.input.handler.mouse.CursorMouseInputHandler;
18 import ru.deadsoftware.cavedroid.game.input.mapper.KeyboardInputActionMapper;
19 import ru.deadsoftware.cavedroid.game.input.mapper.MouseInputActionMapper;
20 import ru.deadsoftware.cavedroid.game.mobs.MobsController;
21 import ru.deadsoftware.cavedroid.game.mobs.player.Player;
22 import ru.deadsoftware.cavedroid.game.objects.TouchButton;
23 import ru.deadsoftware.cavedroid.game.render.IGameRenderer;
24 import ru.deadsoftware.cavedroid.game.ui.TooltipManager;
25 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager;
26 import ru.deadsoftware.cavedroid.misc.Assets;
27 import ru.deadsoftware.cavedroid.misc.Renderer;
28 import ru.deadsoftware.cavedroid.misc.utils.RenderingUtilsKt;
29 import ru.deadsoftware.cavedroid.misc.utils.SpriteUtilsKt;
31 import javax.annotation.CheckForNull;
32 import javax.inject.Inject;
33 import java.util.ArrayList;
34 import java.util.Comparator;
35 import java.util.List;
36 import java.util.Set;
38 @GameScope
39 public class GameRenderer extends Renderer {
41 private static final float DRAG_THRESHOLD = 1f;
42 private static final TouchButton nullButton = new TouchButton(null, -1, true);
44 private final MainConfig mMainConfig;
45 private final MobsController mMobsController;
46 private final List<IGameRenderer> mRenderers;
47 private final CursorMouseInputHandler mCursorMouseInputHandler;
48 private final MouseInputActionMapper mMouseInputActionMapper;
49 private final KeyboardInputActionMapper mKeyboardInputActionMapper;
50 private final Set<IGameInputHandler<MouseInputAction>> mMouseInputHandlers;
51 private final Set<IGameInputHandler<KeyboardInputAction>> mKeyboardInputHandlers;
52 private final GameWindowsManager mGameWindowsManager;
53 private final TooltipManager mTooltipManager;
55 private final TouchButton mouseLeftTouchButton, mouseRightTouchButton;
57 @Inject
58 GameRenderer(MainConfig mainConfig,
59 MobsController mobsController,
60 Set<IGameRenderer> renderers,
61 CursorMouseInputHandler cursorMouseInputHandler,
62 MouseInputActionMapper mouseInputActionMapper,
63 KeyboardInputActionMapper keyboardInputActionMapper,
64 Set<IGameInputHandler<MouseInputAction>> mouseInputHandlers,
65 Set<IGameInputHandler<KeyboardInputAction>> keyboardInputHandlers,
66 GameWindowsManager gameWindowsManager,
67 TooltipManager tooltipManager) {
68 super(mainConfig.getWidth(), mainConfig.getHeight());
70 mMainConfig = mainConfig;
71 mMobsController = mobsController;
72 mRenderers = new ArrayList<>(renderers);
73 mRenderers.sort(Comparator.comparingInt(IGameRenderer::getRenderLayer));
74 mCursorMouseInputHandler = cursorMouseInputHandler;
75 mMouseInputActionMapper = mouseInputActionMapper;
76 mKeyboardInputActionMapper = keyboardInputActionMapper;
77 mMouseInputHandlers = mouseInputHandlers;
78 mKeyboardInputHandlers = keyboardInputHandlers;
79 mGameWindowsManager = gameWindowsManager;
80 mTooltipManager = tooltipManager;
82 mouseLeftTouchButton = new TouchButton(new Rectangle(getWidth() / 2, 0f, getWidth() / 2, getHeight() / 2), Input.Buttons.LEFT, true);
83 mouseRightTouchButton = new TouchButton(new Rectangle(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2), Input.Buttons.RIGHT, true);
85 mMainConfig.setJoystick(new Joystick(mMobsController.getPlayer().getSpeed()));
87 Gdx.gl.glClearColor(0f, .6f, .6f, 1f);
88 }
90 private float mTouchDownX, mTouchDownY;
92 private void updateCameraPosition() {
93 Player player = mMobsController.getPlayer();
94 setCamPos(player.getX() + player.getWidth() / 2 - getWidth() / 2,
95 player.getY() + player.getHeight() / 2 - getHeight() / 2);
96 }
98 private float transformScreenX(int screenX) {
99 return getWidth() / Gdx.graphics.getWidth() * screenX;
102 private float transformScreenY(int screenY) {
103 return getHeight() / Gdx.graphics.getHeight() * screenY;
106 private void handleMousePosition() {
107 final Rectangle viewport = getCameraViewport();
109 final float screenX = transformScreenX(Gdx.input.getX());
110 final float screenY = transformScreenY(Gdx.input.getY());
112 final MouseInputAction action = new MouseInputAction(
113 screenX,
114 screenY,
115 MouseInputActionKey.None.INSTANCE,
116 viewport);
118 mCursorMouseInputHandler.handle(action);
120 if (!mTooltipManager.getCurrentMouseTooltip().isEmpty()) {
121 RenderingUtilsKt.drawString(spriter, mTooltipManager.getCurrentMouseTooltip(), screenX + 1, screenY + 1, Color.BLACK);
122 RenderingUtilsKt.drawString(spriter, mTooltipManager.getCurrentMouseTooltip(), screenX, screenY, Color.WHITE);
126 private boolean handleMouseAction(@CheckForNull MouseInputAction action) {
127 if (action == null) {
128 return false;
131 boolean anyProcessed = false;
133 for (IGameInputHandler<MouseInputAction> handler : mMouseInputHandlers) {
134 final boolean conditions = handler.checkConditions(action);
135 if (conditions) {
136 anyProcessed = true;
137 handler.handle(action);
138 break;
140 // anyProcessed = anyProcessed || conditions;
142 return anyProcessed;
145 private boolean onMouseActionEvent(int mouseX, int mouseY, int button, boolean touchUp, int pointer) {
146 @CheckForNull MouseInputAction action = mMouseInputActionMapper
147 .map((float) mouseX, (float) mouseY, getCameraViewport(), button, touchUp, pointer);
148 return handleMouseAction(action);
151 @Override
152 public boolean touchUp(int screenX, int screenY, int pointer, int button) {
153 float touchX = transformScreenX(screenX);
154 float touchY = transformScreenY(screenY);
156 if (mMainConfig.isTouch()) {
157 TouchButton touchedKey = getTouchedKey(touchX, touchY);
158 if (touchedKey.isMouse()) {
159 return onMouseActionEvent(screenX, screenY, touchedKey.getCode(), true, pointer);
160 } else {
161 return keyUp(touchedKey.getCode());
165 return onMouseActionEvent(screenX, screenY, button, true, pointer);
168 private TouchButton getTouchedKey(float touchX, float touchY) {
169 if (mGameWindowsManager.getCurrentWindowType() != GameUiWindow.NONE) {
170 return nullButton;
172 for (ObjectMap.Entry<String, TouchButton> entry : Assets.guiMap) {
173 TouchButton button = entry.value;
174 if (button.getRect().contains(touchX, touchY)) {
175 return button;
179 if (mouseLeftTouchButton.getRect().contains(touchX, touchY)) {
180 return mouseLeftTouchButton;
183 if (mouseRightTouchButton.getRect().contains(touchX, touchY)) {
184 return mouseRightTouchButton;
187 return nullButton;
190 @Override
191 public boolean touchDown(int screenX, int screenY, int pointer, int button) {
192 float touchX = transformScreenX(screenX);
193 float touchY = transformScreenY(screenY);
195 mTouchDownX = touchX;
196 mTouchDownY = touchY;
198 if (mMainConfig.isTouch()) {
199 TouchButton touchedKey = getTouchedKey(touchX, touchY);
200 if (touchedKey.isMouse()) {
201 return onMouseActionEvent(screenX, screenY, touchedKey.getCode(), false, pointer);
202 } else {
203 return keyDown(touchedKey.getCode());
207 return onMouseActionEvent(screenX, screenY, button, false, pointer);
210 @Override
211 public boolean touchDragged(int screenX, int screenY, int pointer) {
212 float touchX = transformScreenX(screenX);
213 float touchY = transformScreenY(screenY);
215 if (Math.abs(touchX - mTouchDownX) < 16 && Math.abs(touchY - mTouchDownY) < DRAG_THRESHOLD) {
216 return false;
219 @CheckForNull MouseInputAction action =
220 mMouseInputActionMapper.mapDragged(screenX, screenY, getCameraViewport(), pointer);
221 return handleMouseAction(action);
224 @Override
225 public boolean scrolled(float amountX, float amountY) {
226 @CheckForNull MouseInputAction action = mMouseInputActionMapper
227 .mapScrolled(Gdx.input.getX(), Gdx.input.getY(), amountX, amountY, getCameraViewport());
228 return handleMouseAction(action);
231 private boolean handleKeyboardAction(int keycode, boolean isKeyDown) {
232 @CheckForNull final KeyboardInputAction action = mKeyboardInputActionMapper
233 .map(keycode, isKeyDown);
235 if (action == null) {
236 return false;
239 boolean anyProcessed = false;
241 for (IGameInputHandler<KeyboardInputAction> handler : mKeyboardInputHandlers) {
242 final boolean conditions = handler.checkConditions(action);
243 if (conditions) {
244 anyProcessed = true;
245 handler.handle(action);
246 break;
250 return anyProcessed;
253 @Override
254 public boolean keyDown(int keycode) {
255 return handleKeyboardAction(keycode, true);
258 @Override
259 public boolean keyUp(int keycode) {
260 return handleKeyboardAction(keycode, false);
263 @Override
264 public void render(float delta) {
265 updateCameraPosition();
267 if (mMainConfig.getJoystick() != null && mMainConfig.getJoystick().getActive()) {
268 mMainConfig.getJoystick().updateState(
269 transformScreenX(Gdx.input.getX(mMainConfig.getJoystick().getPointer())),
270 transformScreenY(Gdx.input.getY(mMainConfig.getJoystick().getPointer()))
271 );
274 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
276 spriter.begin();
277 mRenderers.forEach(iGameRenderer -> iGameRenderer.draw(spriter, shaper, getCameraViewport(), delta));
278 handleMousePosition();
279 spriter.end();