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
.CaveGame
;
8 import ru
.deadsoftware
.cavedroid
.game
.mobs
.Mob
;
9 import ru
.deadsoftware
.cavedroid
.game
.mobs
.Player
;
10 import ru
.deadsoftware
.cavedroid
.game
.objects
.Drop
;
12 import java
.util
.Iterator
;
14 import static ru
.deadsoftware
.cavedroid
.GameScreen
.GP
;
18 static final int PL_SPEED
= 2;
20 private final Vector2 gravity
= new Vector2(0, .9f);
23 * Checks if mob should jump
25 * @return true if mob should jump
27 private boolean checkJump(Mob mob
) {
28 int dir
= mob
.looksLeft() ?
0 : 1;
29 int blX
= (int) (mob
.getX() + mob
.getWidth() * dir
- 8 + 16 * dir
);
30 int blY
= (int) (mob
.getY() + mob
.getHeight() - 8);
31 int block
= GP
.world
.getForeMap(blX
/ 16, blY
/ 16);
33 if (checkColl(new Rectangle(blX
, mob
.getY() - 18, mob
.getWidth(), mob
.getHeight()))) {
37 return (block
> 0 && GameItems
.getBlock(block
).toJump() &&
38 (mob
.getY() + mob
.getHeight()) - GameItems
.getBlock(block
).getRect(blX
/ 16, blY
/ 16).y
> 8);
41 private boolean checkColl(Rectangle rect
) {
42 int minX
= (int) ((rect
.x
+ rect
.width
/ 2) / 16) - 4;
43 int minY
= (int) ((rect
.y
+ rect
.height
/ 2) / 16) - 4;
44 int maxX
= (int) ((rect
.x
+ rect
.width
/ 2) / 16) + 4;
45 int maxY
= (int) ((rect
.y
+ rect
.height
/ 2) / 16) + 4;
51 if (maxY
> GP
.world
.getHeight()) {
52 maxY
= GP
.world
.getHeight();
56 for (int y
= minY
; y
< maxY
; y
++) {
57 for (int x
= minX
; x
< maxX
; x
++) {
58 block
= GP
.world
.getForeMap(x
, y
);
59 if (block
> 0 && GameItems
.getBlock(block
).hasCollision()) {
60 if (Intersector
.overlaps(rect
, GameItems
.getBlock(block
).getRect(x
, y
))) {
70 private int getBlock(Rectangle rect
) {
71 return GP
.world
.getForeMap((int) (rect
.x
+ rect
.width
/ 2) / 16,
72 (int) (rect
.y
+ rect
.height
/ 8 * 7) / 16);
75 private void dropPhy(Drop drop
) {
76 if (drop
.closeToPlayer() > 0) {
79 if (drop
.getMove().x
>= .5f) {
80 drop
.getMove().x
-= .5f;
81 } else if (drop
.getMove().x
<= -.5f) {
82 drop
.getMove().x
+= .5f;
86 if (drop
.getMove().y
< 9) {
87 drop
.getMove().y
+= gravity
.y
/ 4;
93 if (checkColl(drop
)) {
94 drop
.getMove().set(0, -1);
97 } while (checkColl(drop
));
98 drop
.getMove().setZero();
102 private void mobXColl(Mob mob
) {
103 if (checkColl(mob
)) {
104 if (mob
.canJump() && !mob
.isFlyMode()) {
108 if (checkColl(mob
)) {
109 if (mob
.canJump() && !mob
.isFlyMode()) {
115 if (mob
.getMove().x
< 0) {
117 } else if (mob
.getMove().x
> 0) {
121 mob
.x
= MathUtils
.round(mob
.getX());
123 while (checkColl(mob
)) {
133 mob
.checkWorldBounds();
136 private void mobYColl(Mob mob
) {
137 if (checkColl(mob
)) {
140 if (mob
.getMove().y
< 0) {
145 mob
.setCanJump(true);
146 mob
.setFlyMode(false);
149 mob
.y
= MathUtils
.round(mob
.getY());
151 while (checkColl(mob
)) {
158 mob
.setCanJump(false);
161 if (mob
.getY() > GP
.world
.getHeightPx()) {
166 private void playerPhy(Player player
) {
167 player
.y
+= player
.getMove().y
;
170 if (player
.isDead()) {
174 if (GameItems
.isFluid(getBlock(player
))) {
175 if (CaveGame
.TOUCH
&& player
.getMove().x
!= 0 && !player
.swim
&& !player
.isFlyMode()) {
179 if (!player
.isFlyMode() && player
.getMove().y
< 4.5f) {
180 player
.getMove().add(gravity
.x
/ 4, gravity
.y
/ 4);
182 if (!player
.isFlyMode() && player
.getMove().y
> 4.5f) {
183 player
.getMove().add(0, -1f);
186 player
.getMove().add(0, -.5f);
187 if (player
.getMove().y
< -3) {
188 player
.getMove().y
= -3;
192 if (!player
.isFlyMode() && player
.getMove().y
< 18) {
193 player
.getMove().add(gravity
);
197 player
.x
+= player
.getMove().x
* (player
.isFlyMode() ?
1.5f : 1) *
198 (GameItems
.isFluid(getBlock(player
)) && !player
.isFlyMode() ?
.8f : 1);
202 if (CaveGame
.TOUCH
&& !player
.isFlyMode() && player
.canJump() && player
.getMove().x
!= 0 && checkJump(player
)) {
203 player
.getMove().add(0, -8);
204 player
.setCanJump(false);
208 private void mobPhy(Mob mob
) {
209 if (mob
.getType() == Mob
.Type
.MOB
&& GameItems
.isFluid(getBlock(mob
))) {
210 if (mob
.getMove().y
> 9) {
211 mob
.getMove().add(0, -.9f);
214 mob
.getMove().add(0, -.5f);
216 if (mob
.getMove().y
< -3) {
217 mob
.getMove().y
= -3;
219 } else if (!mob
.isFlyMode() && mob
.getMove().y
< 18) {
220 mob
.getMove().add(gravity
);
223 mob
.y
+= mob
.getMove().y
;
230 mob
.x
+= mob
.getMove().x
;
233 if (mob
.canJump() && mob
.getMove().x
!= 0 && checkJump(mob
)) {
234 mob
.getMove().add(0, -8);
235 mob
.setCanJump(false);
240 for (Iterator
<Drop
> it
= GP
.drops
.iterator(); it
.hasNext(); ) {
241 Drop drop
= it
.next();
243 if (Intersector
.overlaps(drop
, GP
.player
)) {
244 drop
.pickUpDrop(GP
.player
);
246 if (drop
.isPickedUp()) {
251 for (Iterator
<Mob
> it
= GP
.mobs
.iterator(); it
.hasNext(); ) {
260 playerPhy(GP
.player
);
261 if (GP
.player
.isDead()) {
265 GP
.renderer
.setCamPos(GP
.player
.getX() + GP
.player
.getWidth() / 2 - GP
.renderer
.getWidth() / 2,
266 GP
.player
.getY() + GP
.player
.getHeight() / 2 - GP
.renderer
.getHeight() / 2);