DEADSOFTWARE

49c59ee2e8eaae923627e7b81367d63e84778dcb
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / mobs / Player.java
1 package ru.deadsoftware.cavedroid.game.mobs;
3 import com.badlogic.gdx.graphics.g2d.Sprite;
4 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
5 import com.badlogic.gdx.math.MathUtils;
6 import com.badlogic.gdx.math.Vector2;
7 import ru.deadsoftware.cavedroid.game.GameItems;
8 import ru.deadsoftware.cavedroid.game.objects.Drop;
9 import ru.deadsoftware.cavedroid.game.objects.Item;
10 import ru.deadsoftware.cavedroid.game.world.GameWorld;
11 import ru.deadsoftware.cavedroid.misc.Assets;
12 import ru.deadsoftware.cavedroid.misc.utils.SpriteOrigin;
13 import ru.deadsoftware.cavedroid.misc.utils.SpriteUtilsKt;
15 import javax.annotation.CheckForNull;
17 public class Player extends Mob {
19 private static final float SPEED = 69.072f;
20 private static final float JUMP_VELOCITY = -133.332f;
21 private static final int MAX_HEALTH = 20;
23 private boolean hitting = false;
24 private float hitAnim = 0f;
25 private float hitAnimDelta = ANIMATION_SPEED;
27 public final int[] inventory;
28 public int slot;
29 public int gameMode;
30 public boolean swim;
31 public float headRotation = 0f;
33 public Player() {
34 super(0, 0, 4, 30, randomDir(), Type.MOB, MAX_HEALTH);
35 inventory = new int[9];
36 swim = false;
37 }
39 public void respawn(GameWorld gameWorld) {
40 Vector2 pos = getSpawnPoint(gameWorld);
41 this.x = pos.x;
42 this.y = pos.y;
43 mVelocity.setZero();
44 mDead = false;
45 heal(MAX_HEALTH);
46 }
48 public void pickUpDrop(Drop drop) {
49 for (int i = 0; i < inventory.length; i++) {
50 if (inventory[i] == 0 || inventory[i] == drop.getId()) {
51 inventory[i] = drop.getId();
52 drop.setPickedUp(true);
53 break;
54 }
55 }
56 }
58 private Vector2 getSpawnPoint(GameWorld gameWorld) {
59 int y;
60 for (y = 0; y < gameWorld.getHeight(); y++) {
61 if (y == gameWorld.getHeight() - 1) {
62 y = 60;
63 gameWorld.setForeMap(0, y, 1);
64 break;
65 }
66 if (gameWorld.hasForeAt(0, y) && gameWorld.getForeMapBlock(0, y).hasCollision()) {
67 break;
68 }
69 }
70 return new Vector2(8 - getWidth() / 2, (float) y * 16 - getHeight());
71 }
73 public void setDir(Direction dir) {
74 if (dir != getDirection()) {
75 switchDir();
76 }
77 }
79 @Override
80 public float getSpeed() {
81 return SPEED;
82 }
84 @Override
85 public void jump() {
86 mVelocity.y = JUMP_VELOCITY;
87 }
89 @Override
90 public void ai(GameWorld gameWorld, float delta) {
91 }
93 @Override
94 public void changeDir() {
95 }
97 @Override
98 public void damage(int damage) {
99 if (gameMode == 1) {
100 return;
102 super.damage(damage);
105 @Override
106 public void heal(int heal) {
107 if (gameMode == 1) {
108 return;
110 super.heal(heal);
113 private void drawItem(SpriteBatch spriteBatch, float x, float y, float anim) {
114 final int itemId = inventory[slot];
115 final Item item = GameItems.getItem(itemId);
117 @CheckForNull final Sprite sprite = item.isBlock()
118 ? item.toBlock().getTexture()
119 : item.getSprite();
121 if (sprite == null) {
122 return;
125 if (!item.isTool()) {
126 sprite.setSize(Drop.DROP_SIZE, Drop.DROP_SIZE);
129 final float handLength = Assets.playerSprite[0][2].getHeight();
131 final SpriteOrigin spriteOrigin = item.getDefaultOrigin();
132 final int handMultiplier = -getDirection().getBasis();
133 final float xOffset = (-1 + getDirection().getIndex()) * sprite.getWidth() + 4 + handMultiplier * (sprite.getWidth() * spriteOrigin.getX());
134 final float yOffset = item.isTool() ? -sprite.getHeight() / 2 : 0;
136 float rotate = anim + 30;
138 final float itemX = x + handLength * MathUtils.sin(handMultiplier * anim * MathUtils.degRad) + xOffset;
139 final float itemY = y + handLength * MathUtils.cos(handMultiplier * anim * MathUtils.degRad) + yOffset;
141 if (looksLeft()) {
142 sprite.setFlip(true, sprite.isFlipY());
143 SpriteUtilsKt.applyOrigin(sprite, spriteOrigin.getFlipped(true, false));
144 } else {
145 sprite.setFlip(false, sprite.isFlipY());
146 SpriteUtilsKt.applyOrigin(sprite, spriteOrigin);
149 SpriteUtilsKt.drawSprite(spriteBatch, sprite, itemX, itemY, -handMultiplier * rotate);
151 // dont forget to reset
152 sprite.setFlip(false, sprite.isFlipY());
153 sprite.setRotation(0);
154 sprite.setOriginCenter();
157 public void startHitting() {
158 if (hitting) {
159 return;
162 hitting = true;
163 hitAnim = 90f;
164 hitAnimDelta = ANIMATION_SPEED;
167 public void stopHitting() {
168 hitting = false;
171 private float getRightHandAnim(float delta) {
172 hitAnim -= hitAnimDelta * delta;
174 if (hitAnim < 30f || hitAnim > 90f) {
175 if (hitting) {
176 hitAnim = MathUtils.clamp(hitAnim, 30f, 90f);
177 hitAnimDelta = -hitAnimDelta;
178 } else {
179 hitAnimDelta = ANIMATION_SPEED;
183 if (!hitting) {
184 if (hitAnim < hitAnimDelta * delta) {
185 hitAnim = 0;
186 hitAnimDelta = 0;
187 return -mAnim;
191 return hitAnim;
194 @Override
195 public void draw(SpriteBatch spriteBatch, float x, float y, float delta) {
196 updateAnimation(delta);
198 final Sprite backHand = Assets.playerSprite[1][2];
199 final Sprite backLeg = Assets.playerSprite[1][3];
200 final Sprite frontLeg = Assets.playerSprite[0][3];
201 final Sprite head = Assets.playerSprite[getDirection().getIndex()][0];
202 final Sprite body = Assets.playerSprite[getDirection().getIndex()][1];
203 final Sprite frontHand = Assets.playerSprite[0][2];
205 float backHandAnim, frontHandAnim;
207 final float rightHandAnim = getRightHandAnim(delta);
209 if (looksLeft()) {
210 backHandAnim = rightHandAnim;
211 frontHandAnim = mAnim;
212 } else {
213 backHandAnim = -mAnim;
214 frontHandAnim = -rightHandAnim;
217 SpriteUtilsKt.drawSprite(spriteBatch, backHand, x + 2, y + 8, backHandAnim);
219 if (looksLeft()) {
220 drawItem(spriteBatch, x, y, -backHandAnim);
223 SpriteUtilsKt.drawSprite(spriteBatch, backLeg, x + 2, y + 20, mAnim);
224 SpriteUtilsKt.drawSprite(spriteBatch, frontLeg, x + 2, y + 20, -mAnim);
225 SpriteUtilsKt.drawSprite(spriteBatch, head, x, y, headRotation);
226 SpriteUtilsKt.drawSprite(spriteBatch, body, x + 2, y + 8);
228 if (looksRight()) {
229 drawItem(spriteBatch, x, y, frontHandAnim);
232 SpriteUtilsKt.drawSprite(spriteBatch, frontHand, x + 2, y + 8, frontHandAnim);