X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2FGamePhysics.java;h=1ff603c26148f9a473cd9705bfc29ae665e1690a;hb=5646018e364d9a708e985f04ab510bf88692082b;hp=6b69faada2470f556265259c5df8f5aa6cda74b7;hpb=59ff9326fad76d34cbadd3fa3e4b4984892238a4;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/GamePhysics.java b/core/src/ru/deadsoftware/cavedroid/game/GamePhysics.java index 6b69faa..1ff603c 100644 --- a/core/src/ru/deadsoftware/cavedroid/game/GamePhysics.java +++ b/core/src/ru/deadsoftware/cavedroid/game/GamePhysics.java @@ -12,6 +12,7 @@ import ru.deadsoftware.cavedroid.game.objects.Drop; import ru.deadsoftware.cavedroid.game.objects.DropController; import ru.deadsoftware.cavedroid.game.world.GameWorld; +import javax.annotation.CheckForNull; import javax.inject.Inject; import java.util.Iterator; @@ -19,7 +20,6 @@ import java.util.Iterator; @GameScope public class GamePhysics { - public static final float PL_SPEED = 69.072f; public static final float PL_JUMP_VELOCITY = -133.332f; public static final float PL_TERMINAL_VELOCITY = 1254.4f; @@ -94,31 +94,72 @@ public class GamePhysics { (int) (rect.y + rect.height / 8 * 7) / 16); } + private Rectangle getShiftedPlayerRect(float shift) { + final Player player = mMobsController.getPlayer(); + return new Rectangle(player.x + shift, player.y, player.width, player.height); + } + + /** + * @return Rectangle representing magneting target for this drop + */ + @CheckForNull + private Rectangle getShiftedMagnetingPlayerRect(Drop drop) { + final Player player = mMobsController.getPlayer(); + + if (drop.canMagnetTo(player)) { + return getShiftedPlayerRect(0); + } + + final Rectangle shiftedLeft = getShiftedPlayerRect(-mGameWorld.getWidthPx()); + if (drop.canMagnetTo(shiftedLeft)) { + return shiftedLeft; + } + + final Rectangle shiftedRight = getShiftedPlayerRect(mGameWorld.getWidthPx()); + if (drop.canMagnetTo(shiftedRight)) { + return shiftedRight; + } + + return null; + } + + private void pickUpDropIfPossible(Rectangle shiftedPlayerTarget, Drop drop) { + final Player player = mMobsController.getPlayer(); + + if (Intersector.overlaps(shiftedPlayerTarget, drop)) { + player.pickUpDrop(drop); + } + } + private void dropPhy(Drop drop, float delta) { - int dropToPlayer = drop.closeToPlayer(mGameWorld, mMobsController.getPlayer()); - if (dropToPlayer > 0) { - drop.moveToPlayer(mGameWorld, mMobsController.getPlayer(), dropToPlayer); + final Rectangle playerMagnetTarget = getShiftedMagnetingPlayerRect(drop); + final Vector2 dropVelocity = drop.getVelocity(); + + + if (playerMagnetTarget != null) { + final Vector2 magnetVector = new Vector2(playerMagnetTarget.x - drop.x, + playerMagnetTarget.y - drop.y); + magnetVector.nor().scl(Drop.MAGNET_VELOCITY * delta); + dropVelocity.add(magnetVector); } else { - if (drop.getVelocity().x >= .5f) { - drop.getVelocity().x -= .5f; - } else if (drop.getVelocity().x <= -.5f) { - drop.getVelocity().x += .5f; - } else { - drop.getVelocity().x = 0; - } - if (drop.getVelocity().y < 9) { - drop.getVelocity().y += gravity.y / 4; - } + dropVelocity.y += gravity.y * delta; } - drop.move(delta); + dropVelocity.x = MathUtils.clamp(dropVelocity.x, -Drop.MAGNET_VELOCITY, Drop.MAGNET_VELOCITY); + dropVelocity.y = MathUtils.clamp(dropVelocity.y, -Drop.MAGNET_VELOCITY, Drop.MAGNET_VELOCITY); + + drop.x += dropVelocity.x * delta; + drop.y += dropVelocity.y * delta; if (checkColl(drop)) { - drop.getVelocity().set(0, -1); + dropVelocity.setZero(); do { - drop.move(delta); + drop.y--; } while (checkColl(drop)); - drop.getVelocity().setZero(); + } + + if (playerMagnetTarget != null) { + pickUpDropIfPossible(playerMagnetTarget, drop); } } @@ -167,6 +208,11 @@ public class GamePhysics { if (d == -1) { mob.setCanJump(true); mob.setFlyMode(false); + + int dmg = ((int)Math.max(0f, (((mob.getVelocity().y * mob.getVelocity().y) / (2 * gravity.y)) - 48f) / 16f)); + if (dmg > 0) { + mob.damage(dmg); + } } mob.y = MathUtils.round(mob.getY()); @@ -177,14 +223,6 @@ public class GamePhysics { mob.getVelocity().y = 0; - - - //todo fall damage - // h = (v^2) / 2g - // dmg = max(0, (h - 48) / 32) - half of blocks fallen starting from 3 blocks height - // int dmg = ((int)Math.max(0f, (((mob.getVelocity().y * mob.getVelocity().y) / (2 * gravity.y)) - 48f) / 16f)); - // if (dmg > 0) System.out.println("Damage: " + dmg); - } else { mob.y += 1; mob.setCanJump(checkColl(mob)); @@ -214,8 +252,8 @@ public class GamePhysics { } } else { player.getVelocity().y += PL_JUMP_VELOCITY * delta; - if (player.getVelocity().y < -PL_SPEED) { - player.getVelocity().y = -PL_SPEED; + if (player.getVelocity().y < -player.getSpeed()) { + player.getVelocity().y = -player.getSpeed(); } } } else { @@ -233,7 +271,7 @@ public class GamePhysics { mobXColl(player); if (mMainConfig.isTouch() && !player.isFlyMode() && player.canJump() && player.getVelocity().x != 0 && checkJump(player)) { - player.getVelocity().y = PL_JUMP_VELOCITY; + player.jump(); player.setCanJump(false); } } @@ -246,8 +284,8 @@ public class GamePhysics { mob.getVelocity().y += PL_JUMP_VELOCITY * delta; - if (mob.getVelocity().y < -PL_SPEED) { - mob.getVelocity().y = -PL_SPEED; + if (mob.getVelocity().y < -mob.getSpeed()) { + mob.getVelocity().y = -mob.getSpeed(); } } else if (!mob.isFlyMode() && mob.getVelocity().y < PL_TERMINAL_VELOCITY) { mob.getVelocity().y += gravity.y * delta; @@ -264,7 +302,7 @@ public class GamePhysics { mobXColl(mob); if (mob.canJump() && mob.getVelocity().x != 0 && checkJump(mob)) { - mob.getVelocity().y = PL_JUMP_VELOCITY; + mob.jump(); mob.setCanJump(false); } } @@ -275,15 +313,12 @@ public class GamePhysics { for (Iterator it = mDropController.getIterator(); it.hasNext(); ) { Drop drop = it.next(); dropPhy(drop, delta); - if (Intersector.overlaps(drop, player)) { - drop.pickUpDrop(player); - } - if (drop.isPickedUp()) { + if (drop.getPickedUp()) { it.remove(); } } - for (Iterator it = mMobsController.getIterator(); it.hasNext(); ) { + for (Iterator it = mMobsController.getMobs().iterator(); it.hasNext(); ) { Mob mob = it.next(); mob.ai(mGameWorld, delta); mobPhy(mob, delta);