diff --git a/core/src/ru/deadsoftware/cavedroid/game/GamePhysics.java b/core/src/ru/deadsoftware/cavedroid/game/GamePhysics.java
index 9edffe4a9f3c41e128b1cfb30ee5e2561a6db5f1..cb5b37e35a5d5a0c157c225cfac938e4154dbdfc 100644 (file)
import ru.deadsoftware.cavedroid.MainConfig;
import ru.deadsoftware.cavedroid.game.mobs.Mob;
import ru.deadsoftware.cavedroid.game.mobs.MobsController;
-import ru.deadsoftware.cavedroid.game.mobs.Player;
+import ru.deadsoftware.cavedroid.game.mobs.player.Player;
import ru.deadsoftware.cavedroid.game.model.block.Block;
-import ru.deadsoftware.cavedroid.game.objects.Drop;
-import ru.deadsoftware.cavedroid.game.objects.DropController;
+import ru.deadsoftware.cavedroid.game.objects.drop.Drop;
+import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
import ru.deadsoftware.cavedroid.game.world.GameWorld;
import javax.annotation.CheckForNull;
int blY = (int) (mob.getY() + mob.getHeight() - 8);
Block block = mGameWorld.getForeMap(blX / 16, blY / 16);
- if (checkColl(new Rectangle(blX, mob.getY() - 18, mob.getWidth(), mob.getHeight()))) {
+ if (checkColl(new Rectangle(blX, mob.getY() - 18, mob.getWidth(), mob.getHeight())) != null) {
return false;
}
(mob.getY() + mob.getHeight()) - block.getRectangle(blX / 16, blY / 16).y > 8);
}
- private boolean checkColl(Rectangle rect) {
+ /**
+ * @return colliding rect or null if no collision
+ */
+ @CheckForNull
+ private Rectangle checkColl(Rectangle rect) {
int minX = (int) ((rect.x + rect.width / 2) / 16) - 4;
int minY = (int) ((rect.y + rect.height / 2) / 16) - 4;
int maxX = (int) ((rect.x + rect.width / 2) / 16) + 4;
}
block = mGameWorld.getForeMap(x, y);
if (block.hasCollision()) {
- if (Intersector.overlaps(rect, block.getRectangle(x, y))) {
- return true;
+ final Rectangle blockRect = block.getRectangle(x, y);
+ if (Intersector.overlaps(rect, blockRect)) {
+ return blockRect;
}
}
}
}
- return false;
+ return null;
}
private Block getBlock(Rectangle rect) {
private Rectangle getShiftedMagnetingPlayerRect(Drop drop) {
final Player player = mMobsController.getPlayer();
+ if (!player.inventory.canPickItem(drop)) {
+ return null;
+ }
+
if (drop.canMagnetTo(player)) {
return getShiftedPlayerRect(0);
}
final Player player = mMobsController.getPlayer();
if (Intersector.overlaps(shiftedPlayerTarget, drop)) {
- player.pickUpDrop(drop);
+ player.inventory.pickDrop(drop);
}
}
drop.x += dropVelocity.x * delta;
drop.y += dropVelocity.y * delta;
- if (checkColl(drop)) {
+ if (checkColl(drop) != null) {
dropVelocity.setZero();
do {
drop.y--;
- } while (checkColl(drop));
+ } while (checkColl(drop) != null);
}
if (playerMagnetTarget != null) {
}
private void mobXColl(Mob mob) {
- if (checkColl(mob)) {
- if (mob.canJump() && !mob.isFlyMode()) {
- mob.y -= 8;
+ if (mob.getVelocity().x == 0f) {
+ return;
+ }
+
+ @CheckForNull Rectangle collidingRect = checkColl(mob);
+
+ if (collidingRect != null) {
+ if (mob.canJump() && !mob.isFlyMode() && collidingRect.y >= mob.y + mob.height - 8) {
+ mob.y = collidingRect.y - mob.height;
+ return;
}
- if (checkColl(mob)) {
- if (mob.canJump() && !mob.isFlyMode()) {
- mob.y += 8;
- }
+ collidingRect = checkColl(mob);
+ if (collidingRect != null) {
int d = 0;
if (mob.getVelocity().x < 0) {
d = -1;
}
- mob.x = MathUtils.round(mob.getX());
-
- while (checkColl(mob)) {
- mob.x += d;
+ if (d < 0) {
+ mob.x = collidingRect.x - mob.width;
+ } else {
+ mob.x = collidingRect.x + collidingRect.width;
}
+// mob.x = MathUtils.round(mob.getX());
+// while (checkColl(mob) != null) {
+// mob.x += d;
+// }
+
if (mob.canJump()) {
mob.changeDir();
}
}
private void mobYColl(Mob mob) {
- if (checkColl(mob)) {
+ @CheckForNull final Rectangle collidingRect = checkColl(mob);
+ if (collidingRect != null) {
int d = -1;
if (mob.getVelocity().y < 0) {
}
}
- mob.y = MathUtils.round(mob.getY());
-
- while (checkColl(mob)) {
- mob.y += d;
+ if (d < 0) {
+ mob.y = collidingRect.y - mob.height;
+ } else {
+ mob.y = collidingRect.y + collidingRect.height;
}
+
+// mob.y = MathUtils.round(mob.getY());
+//
+// while (checkColl(mob)) {
+// mob.y += d;
+// }
+
mob.getVelocity().y = 0;
} else {
mob.y += 1;
- mob.setCanJump(checkColl(mob));
+ mob.setCanJump(checkColl(mob) != null);
mob.y -= 1;
}
for (Iterator<Mob> it = mMobsController.getMobs().iterator(); it.hasNext(); ) {
Mob mob = it.next();
- mob.ai(mGameWorld, mGameItemsHolder, delta);
+ mob.ai(mGameWorld, mGameItemsHolder, mMobsController, delta);
mobPhy(mob, delta);
if (mob.isDead()) {
it.remove();
}
playerPhy(player, delta);
+ player.ai(mGameWorld, mGameItemsHolder, mMobsController, delta);
if (player.isDead()) {
player.respawn(mGameWorld, mGameItemsHolder);
}