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
.GameItemsHolder
;
8 import ru
.deadsoftware
.cavedroid
.game
.model
.item
.Item
;
9 import ru
.deadsoftware
.cavedroid
.game
.objects
.Drop
;
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 public class Player
extends Mob
{
17 private static final float SPEED
= 69.072f;
18 private static final float JUMP_VELOCITY
= -133.332f;
19 private static final int MAX_HEALTH
= 20;
21 private boolean hitting
= false;
22 private float hitAnim
= 0f;
23 private float hitAnimDelta
= ANIMATION_SPEED
;
25 public final Item
[] inventory
;
29 public float headRotation
= 0f;
31 public Player(GameItemsHolder gameItemsHolder
) {
32 super(0, 0, 4, 30, randomDir(), Type
.MOB
, MAX_HEALTH
);
33 inventory
= new Item
[9];
34 for (int i
= 0; i
< 9; i
++) {
35 inventory
[i
] = gameItemsHolder
.getFallbackItem();
40 public void respawn(GameWorld gameWorld
, GameItemsHolder itemsHolder
) {
41 Vector2 pos
= getSpawnPoint(gameWorld
, itemsHolder
);
49 public void pickUpDrop(Drop drop
) {
50 for (int i
= 0; i
< inventory
.length
; i
++) {
51 if (inventory
[i
] == null || inventory
[i
].getParams().getKey().equals(GameItemsHolder
.FALLBACK_ITEM_KEY
) || inventory
[i
] == drop
.getItem()) {
52 inventory
[i
] = drop
.getItem();
53 drop
.setPickedUp(true);
59 private Vector2
getSpawnPoint(GameWorld gameWorld
, GameItemsHolder itemsHolder
) {
61 for (y
= 0; y
< gameWorld
.getHeight(); y
++) {
62 if (y
== gameWorld
.getHeight() - 1) {
64 gameWorld
.setForeMap(0, y
, itemsHolder
.getBlock("grass"));
67 if (gameWorld
.hasForeAt(0, y
) && gameWorld
.getForeMap(0, y
).hasCollision()) {
71 return new Vector2(8 - getWidth() / 2, (float) y
* 16 - getHeight());
74 public void setDir(Direction dir
) {
75 if (dir
!= getDirection()) {
80 public void setCurrentInventorySlotItem(Item item
) {
81 inventory
[slot
] = item
;
85 public float getSpeed() {
91 mVelocity
.y
= JUMP_VELOCITY
;
95 public void ai(GameWorld gameWorld
, GameItemsHolder gameItemsHolder
, float delta
) {
99 public void changeDir() {
103 public void damage(int damage
) {
107 super.damage(damage
);
111 public void heal(int heal
) {
118 private void drawItem(SpriteBatch spriteBatch
, float x
, float y
, float anim
) {
119 final Item item
= inventory
[slot
];
121 if (item
== null || item
.getParams().getKey().equals(GameItemsHolder
.FALLBACK_ITEM_KEY
)) {
125 final Sprite sprite
= item
.getSprite();
127 if (!item
.isTool()) {
128 sprite
.setSize(Drop
.DROP_SIZE
, Drop
.DROP_SIZE
);
131 final float handLength
= Assets
.playerSprite
[0][2].getHeight();
133 final SpriteOrigin spriteOrigin
= item
.getParams().getInHandSpriteOrigin();
134 final int handMultiplier
= -getDirection().getBasis();
135 final float xOffset
= (-1 + getDirection().getIndex()) * sprite
.getWidth() + 4 + handMultiplier
* (sprite
.getWidth() * spriteOrigin
.getX());
136 final float yOffset
= item
.isTool() ?
-sprite
.getHeight() / 2 : 0;
138 float rotate
= anim
+ 30;
140 final float itemX
= x
+ handLength
* MathUtils
.sin(handMultiplier
* anim
* MathUtils
.degRad
) + xOffset
;
141 final float itemY
= y
+ handLength
* MathUtils
.cos(handMultiplier
* anim
* MathUtils
.degRad
) + yOffset
;
144 sprite
.setFlip(true, sprite
.isFlipY());
145 SpriteUtilsKt
.applyOrigin(sprite
, spriteOrigin
.getFlipped(true, false));
147 sprite
.setFlip(false, sprite
.isFlipY());
148 SpriteUtilsKt
.applyOrigin(sprite
, spriteOrigin
);
151 SpriteUtilsKt
.drawSprite(spriteBatch
, sprite
, itemX
, itemY
, -handMultiplier
* rotate
);
153 // dont forget to reset
154 sprite
.setFlip(false, sprite
.isFlipY());
155 sprite
.setRotation(0);
156 sprite
.setOriginCenter();
159 public void startHitting() {
166 hitAnimDelta
= ANIMATION_SPEED
;
169 public void stopHitting() {
173 private float getRightHandAnim(float delta
) {
174 hitAnim
-= hitAnimDelta
* delta
;
176 if (hitAnim
< 30f || hitAnim
> 90f) {
178 hitAnim
= MathUtils
.clamp(hitAnim
, 30f, 90f);
179 hitAnimDelta
= -hitAnimDelta
;
181 hitAnimDelta
= ANIMATION_SPEED
;
186 if (hitAnim
< hitAnimDelta
* delta
) {
197 public void draw(SpriteBatch spriteBatch
, float x
, float y
, float delta
) {
198 updateAnimation(delta
);
200 final Sprite backHand
= Assets
.playerSprite
[1][2];
201 final Sprite backLeg
= Assets
.playerSprite
[1][3];
202 final Sprite frontLeg
= Assets
.playerSprite
[0][3];
203 final Sprite head
= Assets
.playerSprite
[getDirection().getIndex()][0];
204 final Sprite body
= Assets
.playerSprite
[getDirection().getIndex()][1];
205 final Sprite frontHand
= Assets
.playerSprite
[0][2];
207 float backHandAnim
, frontHandAnim
;
209 final float rightHandAnim
= getRightHandAnim(delta
);
212 backHandAnim
= rightHandAnim
;
213 frontHandAnim
= mAnim
;
215 backHandAnim
= -mAnim
;
216 frontHandAnim
= -rightHandAnim
;
219 SpriteUtilsKt
.drawSprite(spriteBatch
, backHand
, x
+ 2, y
+ 8, backHandAnim
);
222 drawItem(spriteBatch
, x
, y
, -backHandAnim
);
225 SpriteUtilsKt
.drawSprite(spriteBatch
, backLeg
, x
+ 2, y
+ 20, mAnim
);
226 SpriteUtilsKt
.drawSprite(spriteBatch
, frontLeg
, x
+ 2, y
+ 20, -mAnim
);
227 SpriteUtilsKt
.drawSprite(spriteBatch
, head
, x
, y
, headRotation
);
228 SpriteUtilsKt
.drawSprite(spriteBatch
, body
, x
+ 2, y
+ 8);
231 drawItem(spriteBatch
, x
, y
, frontHandAnim
);
234 SpriteUtilsKt
.drawSprite(spriteBatch
, frontHand
, x
+ 2, y
+ 8, frontHandAnim
);