diff --git a/core/src/ru/deadsoftware/cavedroid/game/mobs/Mob.java b/core/src/ru/deadsoftware/cavedroid/game/mobs/Mob.java
index 698ebef8c847ba3f5c2a802d0ba1c045cfacd6a4..fc9d61bbe778e37f1c1186fa1387f0be207fb8d6 100644 (file)
package ru.deadsoftware.cavedroid.game.mobs;
package ru.deadsoftware.cavedroid.game.mobs;
+import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
+import ru.deadsoftware.cavedroid.game.GameItemsHolder;
+import ru.deadsoftware.cavedroid.game.world.GameWorld;
import java.io.Serializable;
import java.io.Serializable;
-import static ru.deadsoftware.cavedroid.GameScreen.GP;
-
/**
* Mob class.
*/
public abstract class Mob extends Rectangle implements Serializable {
/**
* Mob class.
*/
public abstract class Mob extends Rectangle implements Serializable {
- protected Vector2 move;
- protected Type type;
- protected int animDelta = 6;
- protected int anim;
- private Direction dir;
- private boolean dead;
- private boolean canJump, flyMode;
+ protected static int ANIMATION_SPEED = 360;
+
+ public enum Type {
+ MOB,
+ SAND,
+ GRAVEL
+ }
+
+ public enum Direction {
+
+ LEFT(0, -1),
+ RIGHT(1, 1);
+
+ private final int index;
+ private final int basis;
+
+ /**
+ * Index for this direction (left = 0, right = 1)
+ */
+ public final int getIndex() {
+ return index;
+ }
+
+ /**
+ * Basis for this direction (left = -1, right = 1)
+ */
+ public final int getBasis() {
+ return basis;
+ }
+
+ Direction(int index, int basis) {
+ this.index = index;
+ this.basis = basis;
+ }
+ }
+
+ protected Vector2 mVelocity;
+ protected Type mType;
+ protected int mAnimDelta = ANIMATION_SPEED;
+ protected float mAnim;
+
+ private Direction mDirection;
+ protected boolean mDead;
+ private boolean mCanJump;
+ private boolean mFlyMode;
+
+ private final int mMaxHealth;
+ private int mHealth;
/**
/**
- * @param x in pixels
- * @param y in pixels
- * @param width in pixels
- * @param height in pixels
- * @param dir Direction in which mob is looking
+ * @param x in pixels
+ * @param y in pixels
+ * @param width in pixels
+ * @param height in pixels
+ * @param mDirection Direction in which mob is looking
*/
*/
- protected Mob(float x, float y, float width, float height, Direction dir, Type type) {
+ protected Mob(float x, float y, float width, float height, Direction mDirection, Type type, int maxHealth) {
super(x, y, width, height);
super(x, y, width, height);
- move = new Vector2(0, 0);
- canJump = false;
- dead = false;
- this.dir = dir;
- this.type = type;
+ mVelocity = new Vector2(0, 0);
+ mCanJump = false;
+ mDead = false;
+ this.mDirection = mDirection;
+ this.mType = type;
+ this.mMaxHealth = maxHealth;
+ this.mHealth = mMaxHealth;
}
protected static Direction randomDir() {
return MathUtils.randomBoolean(.5f) ? Direction.LEFT : Direction.RIGHT;
}
}
protected static Direction randomDir() {
return MathUtils.randomBoolean(.5f) ? Direction.LEFT : Direction.RIGHT;
}
+ private boolean isAnimationIncreasing() {
+ return mAnim > 0 && mAnimDelta > 0 || mAnim < 0 && mAnimDelta < 0;
+ }
+
+ private void checkHealth() {
+ mHealth = MathUtils.clamp(mHealth, 0, mMaxHealth);
+
+ if (mHealth <= 0) {
+ kill();
+ }
+ }
+
+ protected final void updateAnimation(float delta) {
+ final float velocityMultiplier = (Math.abs(getVelocity().x) / getSpeed());
+ final float animMultiplier = (velocityMultiplier == 0f ? 1f : velocityMultiplier) * delta;
+ final float maxAnim = 60f * (velocityMultiplier == 0f ? 1f : velocityMultiplier);
+
+ if (mVelocity.x != 0f || Math.abs(mAnim) > mAnimDelta * animMultiplier) {
+ mAnim += mAnimDelta * animMultiplier;
+ } else {
+ mAnim = 0;
+ }
+
+ if (mAnim > maxAnim) {
+ mAnim = maxAnim;
+ mAnimDelta = -ANIMATION_SPEED;
+ } else if (mAnim < -maxAnim) {
+ mAnim = -maxAnim;
+ mAnimDelta = ANIMATION_SPEED;
+ }
+
+ if (mVelocity.x == 0f && isAnimationIncreasing()) {
+ mAnimDelta = -mAnimDelta;
+ }
+ }
+
/**
* @return The X coordinate of a mob in blocks
*/
/**
* @return The X coordinate of a mob in blocks
*/
* @return Integer representing a direction in which mob is looking, where 0 is left and 1 is right
*/
public final Direction getDirection() {
* @return Integer representing a direction in which mob is looking, where 0 is left and 1 is right
*/
public final Direction getDirection() {
- return dir;
+ return mDirection;
}
public final boolean looksLeft() {
}
public final boolean looksLeft() {
- return dir == Direction.LEFT;
+ return mDirection == Direction.LEFT;
}
public final boolean looksRight() {
}
public final boolean looksRight() {
- return dir == Direction.RIGHT;
+ return mDirection == Direction.RIGHT;
}
/**
* Switches direction in which mob is looking
*/
protected final void switchDir() {
}
/**
* Switches direction in which mob is looking
*/
protected final void switchDir() {
- dir = looksLeft() ? Direction.RIGHT : Direction.LEFT;
- }
-
- protected final int dirMultiplier() {
- return looksLeft() ? 0 : 1;
+ mDirection = looksLeft() ? Direction.RIGHT : Direction.LEFT;
}
public final boolean isDead() {
}
public final boolean isDead() {
- return dead;
+ return mDead;
}
}
- public final int getAnim() {
- return anim;
+ public final float getAnim() {
+ return mAnim;
}
/**
* Set's mob's dead variable to true and nothing else. It doesn't delete the
*/
public final void kill() {
}
/**
* Set's mob's dead variable to true and nothing else. It doesn't delete the
*/
public final void kill() {
- dead = true;
+ mDead = true;
+ }
+
+ public final void move(float delta) {
+ x += mVelocity.x * delta;
+ y += mVelocity.y * delta;
}
}
- public final void move() {
- x += move.x;
- y += move.y;
+ public final Vector2 getVelocity() {
+ return mVelocity;
}
}
- public final Vector2 getMove() {
- return move;
+ protected final void setVelocity(Vector2 velocity) {
+ mVelocity = velocity;
}
public final boolean canJump() {
}
public final boolean canJump() {
- return canJump;
+ return mCanJump;
}
public final void setCanJump(boolean canJump) {
}
public final void setCanJump(boolean canJump) {
- this.canJump = canJump;
+ this.mCanJump = canJump;
}
public final boolean isFlyMode() {
}
public final boolean isFlyMode() {
- return flyMode;
+ return mFlyMode;
}
public final void setFlyMode(boolean flyMode) {
}
public final void setFlyMode(boolean flyMode) {
- this.flyMode = flyMode;
+ this.mFlyMode = flyMode;
}
public final Type getType() {
}
public final Type getType() {
- return type;
+ return mType;
}
}
- public void checkWorldBounds() {
+ public final void checkWorldBounds(GameWorld gameWorld) {
if (x + width / 2 < 0) {
if (x + width / 2 < 0) {
- x += GP.world.getWidthPx();
+ x += gameWorld.getWidthPx();
}
}
- if (x + width / 2 > GP.world.getWidthPx()) {
- x -= GP.world.getWidthPx();
+ if (x + width / 2 > gameWorld.getWidthPx()) {
+ x -= gameWorld.getWidthPx();
}
}
}
}
- public abstract void draw(SpriteBatch spriteBatch, float x, float y);
+ public final int getHealth() {
+ return mHealth;
+ }
- public abstract void ai();
+ public final void attachToController(MobsController controller) {
+ controller.addMob(this);
+ }
- public abstract void changeDir();
+ public void damage(int damage) {
+ if (damage == 0) {
+ return;
+ }
- public enum Type {
- MOB,
- SAND,
- GRAVEL
+ if (damage < 0) {
+ Gdx.app.error(this.getClass().getSimpleName(), "Damage cant be negative!");
+ return;
+ }
+
+ if (mHealth <= Integer.MIN_VALUE + damage) {
+ mHealth = Integer.MIN_VALUE + damage;
+ }
+
+ mHealth -= damage;
+ checkHealth();
}
}
- public enum Direction {
- LEFT,
- RIGHT
+ public void heal(int heal) {
+ if (heal < 0) {
+ Gdx.app.error(this.getClass().getSimpleName(), "Heal cant be negative!");
+ return;
+ }
+
+ if (mHealth >= Integer.MAX_VALUE - heal) {
+ mHealth = Integer.MAX_VALUE - heal;
+ }
+
+ mHealth += heal;
+ checkHealth();
}
}
+
+ public abstract void draw(SpriteBatch spriteBatch, float x, float y, float delta);
+
+ public abstract void ai(GameWorld gameWorld, GameItemsHolder gameItemsHolder, float delta);
+
+ public abstract void changeDir();
+
+ public abstract float getSpeed();
+
+ public abstract void jump();
}
}