1 package ru
.deadsoftware
.cavedroid
.game
;
3 import com
.badlogic
.gdx
.Gdx
;
4 import com
.badlogic
.gdx
.graphics
.GL20
;
5 import com
.badlogic
.gdx
.math
.Rectangle
;
6 import com
.badlogic
.gdx
.utils
.ObjectMap
;
7 import ru
.deadsoftware
.cavedroid
.MainConfig
;
8 import ru
.deadsoftware
.cavedroid
.game
.input
.IGameInputHandler
;
9 import ru
.deadsoftware
.cavedroid
.game
.input
.action
.KeyboardInputAction
;
10 import ru
.deadsoftware
.cavedroid
.game
.input
.action
.MouseInputAction
;
11 import ru
.deadsoftware
.cavedroid
.game
.input
.action
.keys
.MouseInputActionKey
;
12 import ru
.deadsoftware
.cavedroid
.game
.input
.handler
.mouse
.CursorMouseInputHandler
;
13 import ru
.deadsoftware
.cavedroid
.game
.input
.mapper
.KeyboardInputActionMapper
;
14 import ru
.deadsoftware
.cavedroid
.game
.input
.mapper
.MouseInputActionMapper
;
15 import ru
.deadsoftware
.cavedroid
.game
.mobs
.MobsController
;
16 import ru
.deadsoftware
.cavedroid
.game
.mobs
.Player
;
17 import ru
.deadsoftware
.cavedroid
.game
.objects
.TouchButton
;
18 import ru
.deadsoftware
.cavedroid
.game
.render
.IGameRenderer
;
19 import ru
.deadsoftware
.cavedroid
.misc
.Assets
;
20 import ru
.deadsoftware
.cavedroid
.misc
.Renderer
;
22 import javax
.annotation
.CheckForNull
;
23 import javax
.inject
.Inject
;
24 import java
.util
.ArrayList
;
25 import java
.util
.Comparator
;
26 import java
.util
.List
;
30 public class GameRenderer
extends Renderer
{
32 private final MainConfig mMainConfig
;
33 private final MobsController mMobsController
;
34 private final List
<IGameRenderer
> mRenderers
;
35 private final CursorMouseInputHandler mCursorMouseInputHandler
;
36 private final MouseInputActionMapper mMouseInputActionMapper
;
37 private final KeyboardInputActionMapper mKeyboardInputActionMapper
;
38 private final Set
<IGameInputHandler
<MouseInputAction
>> mMouseInputHandlers
;
39 private final Set
<IGameInputHandler
<KeyboardInputAction
>> mKeyboardInputHandlers
;
42 GameRenderer(MainConfig mainConfig
,
43 MobsController mobsController
,
44 Set
<IGameRenderer
> renderers
,
45 CursorMouseInputHandler cursorMouseInputHandler
,
46 MouseInputActionMapper mouseInputActionMapper
,
47 KeyboardInputActionMapper keyboardInputActionMapper
,
48 Set
<IGameInputHandler
<MouseInputAction
>> mouseInputHandlers
,
49 Set
<IGameInputHandler
<KeyboardInputAction
>> keyboardInputHandlers
) {
50 super(mainConfig
.getWidth(), mainConfig
.getHeight());
52 mMainConfig
= mainConfig
;
53 mMobsController
= mobsController
;
54 mRenderers
= new ArrayList
<>(renderers
);
55 mRenderers
.sort(Comparator
.comparingInt(IGameRenderer
::getRenderLayer
));
56 mCursorMouseInputHandler
= cursorMouseInputHandler
;
57 mMouseInputActionMapper
= mouseInputActionMapper
;
58 mKeyboardInputActionMapper
= keyboardInputActionMapper
;
59 mMouseInputHandlers
= mouseInputHandlers
;
60 mKeyboardInputHandlers
= keyboardInputHandlers
;
62 Gdx
.gl
.glClearColor(0f, .6f, .6f, 1f);
65 private float mTouchDownX
, mTouchDownY
;
67 private void updateCameraPosition() {
68 Player player
= mMobsController
.getPlayer();
69 setCamPos(player
.getX() + player
.getWidth() / 2 - getWidth() / 2,
70 player
.getY() + player
.getHeight() / 2 - getHeight() / 2);
73 private float transformScreenX(int screenX
) {
74 return getWidth() / Gdx
.graphics
.getWidth() * screenX
;
77 private float transformScreenY(int screenY
) {
78 return getHeight() / Gdx
.graphics
.getHeight() * screenY
;
81 private void handleMousePosition() {
82 final Rectangle viewport
= getCameraViewport();
83 final MouseInputAction action
= new MouseInputAction(
84 Gdx
.input
.getX() * (viewport
.width
/ Gdx
.graphics
.getWidth()),
85 Gdx
.input
.getY() * (viewport
.height
/ Gdx
.graphics
.getHeight()),
86 MouseInputActionKey
.None
.INSTANCE
,
89 mCursorMouseInputHandler
.handle(action
);
92 private boolean handleMouseAction(@CheckForNull MouseInputAction action
) {
97 boolean anyProcessed
= false;
99 for (IGameInputHandler
<MouseInputAction
> handler
: mMouseInputHandlers
) {
100 final boolean conditions
= handler
.checkConditions(action
);
103 handler
.handle(action
);
106 // anyProcessed = anyProcessed || conditions;
111 private boolean onMouseActionEvent(int mouseX
, int mouseY
, int button
, boolean touchUp
) {
112 @CheckForNull MouseInputAction action
= mMouseInputActionMapper
113 .map((float) mouseX
, (float) mouseY
, getCameraViewport(), button
, touchUp
);
114 return handleMouseAction(action
);
118 public boolean touchUp(int screenX
, int screenY
, int pointer
, int button
) {
119 float touchX
= transformScreenX(screenX
);
120 float touchY
= transformScreenY(screenY
);
122 if (mMainConfig
.isTouch()) {
123 @CheckForNull TouchButton touchedKey
= getTouchedKey(touchX
, touchY
);
124 if (touchedKey
!= null && touchedKey
.isMouse()) {
125 return onMouseActionEvent(screenX
, screenY
, touchedKey
.getCode(), true);
126 } else if (touchedKey
!= null) {
127 return keyUp(touchedKey
.getCode());
131 return onMouseActionEvent(screenX
, screenY
, button
, true);
135 private TouchButton
getTouchedKey(float touchX
, float touchY
) {
136 for (ObjectMap
.Entry
<String
, TouchButton
> entry
: Assets
.guiMap
) {
137 TouchButton button
= entry
.value
;
138 if (button
.getRect().contains(touchX
, touchY
)) {
146 public boolean touchDown(int screenX
, int screenY
, int pointer
, int button
) {
147 float touchX
= transformScreenX(screenX
);
148 float touchY
= transformScreenY(screenY
);
150 mTouchDownX
= touchX
;
151 mTouchDownY
= touchY
;
153 if (mMainConfig
.isTouch()) {
154 @CheckForNull TouchButton touchedKey
= getTouchedKey(touchX
, touchY
);
155 if (touchedKey
!= null && touchedKey
.isMouse()) {
156 return onMouseActionEvent(screenX
, screenY
, touchedKey
.getCode(), false);
157 } else if (touchedKey
!= null) {
158 return keyDown(touchedKey
.getCode());
162 return onMouseActionEvent(screenX
, screenY
, button
, false);
166 public boolean touchDragged(int screenX
, int screenY
, int pointer
) {
167 float touchX
= transformScreenX(screenX
);
168 float touchY
= transformScreenY(screenY
);
170 if (Math
.abs(touchX
- mTouchDownX
) < 16 && Math
.abs(touchY
- mTouchDownY
) < 16) {
174 @CheckForNull MouseInputAction action
=
175 mMouseInputActionMapper
.mapDragged(screenX
, screenY
, getCameraViewport());
176 return handleMouseAction(action
);
180 public boolean scrolled(float amountX
, float amountY
) {
181 @CheckForNull MouseInputAction action
= mMouseInputActionMapper
182 .mapScrolled(Gdx
.input
.getX(), Gdx
.input
.getY(), amountX
, amountY
, getCameraViewport());
183 return handleMouseAction(action
);
186 private boolean handleKeyboardAction(int keycode
, boolean isKeyDown
) {
187 @CheckForNull final KeyboardInputAction action
= mKeyboardInputActionMapper
188 .map(keycode
, isKeyDown
);
190 if (action
== null) {
194 boolean anyProcessed
= false;
196 for (IGameInputHandler
<KeyboardInputAction
> handler
: mKeyboardInputHandlers
) {
197 final boolean conditions
= handler
.checkConditions(action
);
200 handler
.handle(action
);
209 public boolean keyDown(int keycode
) {
210 return handleKeyboardAction(keycode
, true);
214 public boolean keyUp(int keycode
) {
215 return handleKeyboardAction(keycode
, false);
219 public void render(float delta
) {
220 updateCameraPosition();
221 handleMousePosition();
222 // mGameInput.moveCursor(this);
224 Gdx
.gl
.glClear(GL20
.GL_COLOR_BUFFER_BIT
);
227 mRenderers
.forEach(iGameRenderer
-> iGameRenderer
.draw(spriter
, shaper
, getCameraViewport(), delta
));