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
;
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
;
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);
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);
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(
115 MouseInputActionKey
.None
.INSTANCE
,
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) {
131 boolean anyProcessed
= false;
133 for (IGameInputHandler
<MouseInputAction
> handler
: mMouseInputHandlers
) {
134 final boolean conditions
= handler
.checkConditions(action
);
137 handler
.handle(action
);
140 // anyProcessed = anyProcessed || conditions;
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
);
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
);
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
) {
172 for (ObjectMap
.Entry
<String
, TouchButton
> entry
: Assets
.guiMap
) {
173 TouchButton button
= entry
.value
;
174 if (button
.getRect().contains(touchX
, touchY
)) {
179 if (mouseLeftTouchButton
.getRect().contains(touchX
, touchY
)) {
180 return mouseLeftTouchButton
;
183 if (mouseRightTouchButton
.getRect().contains(touchX
, touchY
)) {
184 return mouseRightTouchButton
;
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
);
203 return keyDown(touchedKey
.getCode());
207 return onMouseActionEvent(screenX
, screenY
, button
, false, pointer
);
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
) {
219 @CheckForNull MouseInputAction action
=
220 mMouseInputActionMapper
.mapDragged(screenX
, screenY
, getCameraViewport(), pointer
);
221 return handleMouseAction(action
);
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) {
239 boolean anyProcessed
= false;
241 for (IGameInputHandler
<KeyboardInputAction
> handler
: mKeyboardInputHandlers
) {
242 final boolean conditions
= handler
.checkConditions(action
);
245 handler
.handle(action
);
254 public boolean keyDown(int keycode
) {
255 return handleKeyboardAction(keycode
, true);
259 public boolean keyUp(int keycode
) {
260 return handleKeyboardAction(keycode
, false);
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()))
274 Gdx
.gl
.glClear(GL20
.GL_COLOR_BUFFER_BIT
);
277 mRenderers
.forEach(iGameRenderer
-> iGameRenderer
.draw(spriter
, shaper
, getCameraViewport(), delta
));
278 handleMousePosition();