1 package ru
.deadsoftware
.cavedroid
.game
;
3 import com
.badlogic
.gdx
.math
.Intersector
;
4 import com
.badlogic
.gdx
.math
.MathUtils
;
5 import com
.badlogic
.gdx
.math
.Rectangle
;
6 import com
.badlogic
.gdx
.math
.Vector2
;
7 import ru
.deadsoftware
.cavedroid
.MainConfig
;
8 import ru
.deadsoftware
.cavedroid
.game
.mobs
.Mob
;
9 import ru
.deadsoftware
.cavedroid
.game
.mobs
.MobsController
;
10 import ru
.deadsoftware
.cavedroid
.game
.mobs
.Player
;
11 import ru
.deadsoftware
.cavedroid
.game
.objects
.Drop
;
12 import ru
.deadsoftware
.cavedroid
.game
.objects
.DropController
;
14 import javax
.inject
.Inject
;
15 import java
.util
.Iterator
;
21 static final int PL_SPEED
= 2;
23 private final Vector2 gravity
= new Vector2(0, .9f);
25 private final GameWorld mGameWorld
;
26 private final MainConfig mMainConfig
;
27 private final MobsController mMobsController
;
28 private final DropController mDropController
;
31 public GamePhysics(GameWorld gameWorld
,
32 MainConfig mainConfig
,
33 MobsController mobsController
,
34 DropController dropController
) {
35 mGameWorld
= gameWorld
;
36 mMainConfig
= mainConfig
;
37 mMobsController
= mobsController
;
38 mDropController
= dropController
;
42 * Checks if mob should jump
44 * @return true if mob should jump
46 private boolean checkJump(Mob mob
) {
47 int dir
= mob
.looksLeft() ?
0 : 1;
48 int blX
= (int) (mob
.getX() + mob
.getWidth() * dir
- 8 + 16 * dir
);
49 int blY
= (int) (mob
.getY() + mob
.getHeight() - 8);
50 int block
= mGameWorld
.getForeMap(blX
/ 16, blY
/ 16);
52 if (checkColl(new Rectangle(blX
, mob
.getY() - 18, mob
.getWidth(), mob
.getHeight()))) {
56 return (block
> 0 && GameItems
.getBlock(block
).toJump() &&
57 (mob
.getY() + mob
.getHeight()) - GameItems
.getBlock(block
).getRectangle(blX
/ 16, blY
/ 16).y
> 8);
60 private boolean checkColl(Rectangle rect
) {
61 int minX
= (int) ((rect
.x
+ rect
.width
/ 2) / 16) - 4;
62 int minY
= (int) ((rect
.y
+ rect
.height
/ 2) / 16) - 4;
63 int maxX
= (int) ((rect
.x
+ rect
.width
/ 2) / 16) + 4;
64 int maxY
= (int) ((rect
.y
+ rect
.height
/ 2) / 16) + 4;
70 if (maxY
> mGameWorld
.getHeight()) {
71 maxY
= mGameWorld
.getHeight();
75 for (int y
= minY
; y
< maxY
; y
++) {
76 for (int x
= minX
; x
< maxX
; x
++) {
77 block
= mGameWorld
.getForeMap(x
, y
);
78 if (block
> 0 && GameItems
.getBlock(block
).hasCollision()) {
79 if (Intersector
.overlaps(rect
, GameItems
.getBlock(block
).getRectangle(x
, y
))) {
89 private int getBlock(Rectangle rect
) {
90 return mGameWorld
.getForeMap((int) (rect
.x
+ rect
.width
/ 2) / 16,
91 (int) (rect
.y
+ rect
.height
/ 8 * 7) / 16);
94 private void dropPhy(Drop drop
) {
95 int dropToPlayer
= drop
.closeToPlayer(mGameWorld
, mMobsController
.getPlayer());
96 if (dropToPlayer
> 0) {
97 drop
.moveToPlayer(mGameWorld
, mMobsController
.getPlayer(), dropToPlayer
);
99 if (drop
.getMove().x
>= .5f) {
100 drop
.getMove().x
-= .5f;
101 } else if (drop
.getMove().x
<= -.5f) {
102 drop
.getMove().x
+= .5f;
104 drop
.getMove().x
= 0;
106 if (drop
.getMove().y
< 9) {
107 drop
.getMove().y
+= gravity
.y
/ 4;
113 if (checkColl(drop
)) {
114 drop
.getMove().set(0, -1);
117 } while (checkColl(drop
));
118 drop
.getMove().setZero();
122 private void mobXColl(Mob mob
) {
123 if (checkColl(mob
)) {
124 if (mob
.canJump() && !mob
.isFlyMode()) {
128 if (checkColl(mob
)) {
129 if (mob
.canJump() && !mob
.isFlyMode()) {
135 if (mob
.getMove().x
< 0) {
137 } else if (mob
.getMove().x
> 0) {
141 mob
.x
= MathUtils
.round(mob
.getX());
143 while (checkColl(mob
)) {
153 mob
.checkWorldBounds(mGameWorld
);
156 private void mobYColl(Mob mob
) {
157 if (checkColl(mob
)) {
160 if (mob
.getMove().y
< 0) {
165 mob
.setCanJump(true);
166 mob
.setFlyMode(false);
169 mob
.y
= MathUtils
.round(mob
.getY());
171 while (checkColl(mob
)) {
178 mob
.setCanJump(false);
181 if (mob
.getY() > mGameWorld
.getHeightPx()) {
186 private void playerPhy(Player player
) {
187 player
.y
+= player
.getMove().y
;
190 if (player
.isDead()) {
194 if (GameItems
.isFluid(getBlock(player
))) {
195 if (mMainConfig
.isTouch() && player
.getMove().x
!= 0 && !player
.swim
&& !player
.isFlyMode()) {
199 if (!player
.isFlyMode() && player
.getMove().y
< 4.5f) {
200 player
.getMove().add(gravity
.x
/ 4, gravity
.y
/ 4);
202 if (!player
.isFlyMode() && player
.getMove().y
> 4.5f) {
203 player
.getMove().add(0, -1f);
206 player
.getMove().add(0, -.5f);
207 if (player
.getMove().y
< -3) {
208 player
.getMove().y
= -3;
212 if (!player
.isFlyMode() && player
.getMove().y
< 18) {
213 player
.getMove().add(gravity
);
217 player
.x
+= player
.getMove().x
* (player
.isFlyMode() ?
1.5f : 1) *
218 (GameItems
.isFluid(getBlock(player
)) && !player
.isFlyMode() ?
.8f : 1);
222 if (mMainConfig
.isTouch() && !player
.isFlyMode() && player
.canJump() && player
.getMove().x
!= 0 && checkJump(player
)) {
223 player
.getMove().add(0, -8);
224 player
.setCanJump(false);
228 private void mobPhy(Mob mob
) {
229 if (mob
.getType() == Mob
.Type
.MOB
&& GameItems
.isFluid(getBlock(mob
))) {
230 if (mob
.getMove().y
> 9) {
231 mob
.getMove().add(0, -.9f);
234 mob
.getMove().add(0, -.5f);
236 if (mob
.getMove().y
< -3) {
237 mob
.getMove().y
= -3;
239 } else if (!mob
.isFlyMode() && mob
.getMove().y
< 18) {
240 mob
.getMove().add(gravity
);
243 mob
.y
+= mob
.getMove().y
;
250 mob
.x
+= mob
.getMove().x
;
253 if (mob
.canJump() && mob
.getMove().x
!= 0 && checkJump(mob
)) {
254 mob
.getMove().add(0, -8);
255 mob
.setCanJump(false);
260 Player player
= mMobsController
.getPlayer();
262 for (Iterator
<Drop
> it
= mDropController
.getIterator(); it
.hasNext(); ) {
263 Drop drop
= it
.next();
265 if (Intersector
.overlaps(drop
, player
)) {
266 drop
.pickUpDrop(player
);
268 if (drop
.isPickedUp()) {
273 for (Iterator
<Mob
> it
= mMobsController
.getIterator(); it
.hasNext(); ) {
283 if (player
.isDead()) {
284 player
.respawn(mGameWorld
);