DEADSOFTWARE

Refactor physics
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / objects / Drop.java
1 package ru.deadsoftware.cavedroid.game.objects;
3 import com.badlogic.gdx.math.Intersector;
4 import com.badlogic.gdx.math.MathUtils;
5 import com.badlogic.gdx.math.Rectangle;
6 import com.badlogic.gdx.math.Vector2;
7 import ru.deadsoftware.cavedroid.game.mobs.Player;
9 import java.io.Serializable;
11 import static ru.deadsoftware.cavedroid.GameScreen.GP;
13 public class Drop extends Rectangle implements Serializable {
15 private final int id;
16 private final Vector2 move;
17 private boolean pickedUp = false;
19 public Drop(float x, float y, int id) {
20 super(x, y, 8, 8);
21 this.id = id;
22 this.move = new Vector2(0, -1);
23 }
25 public Vector2 getMove() {
26 return move;
27 }
29 public int closeToPlayer() {
30 boolean[] c = new boolean[3];
32 c[0] = Intersector.overlaps(new Rectangle(GP.player.getX() - 16,
33 GP.player.getY() - 16, GP.player.getWidth() + 32, GP.player.getHeight() + 32), this);
34 c[1] = Intersector.overlaps(new Rectangle((GP.player.getX() + GP.world.getWidthPx()) - 16,
35 GP.player.getY() - 16, GP.player.getWidth() + 32, GP.player.getHeight() + 32), this);
36 c[2] = Intersector.overlaps(new Rectangle((GP.player.getX() - GP.world.getWidthPx()) - 16,
37 GP.player.getY() - 16, GP.player.getWidth() + 32, GP.player.getHeight() + 32), this);
39 for (int i = 0; i < 3; i++) {
40 if (c[i]) {
41 return i + 1;
42 }
43 }
45 return 0;
46 }
48 public void moveToPlayer() {
49 int ctp = closeToPlayer();
50 if (ctp > 0) {
51 float px = GP.player.getX();
52 float py = GP.player.getY();
54 switch (ctp) {
55 case 2:
56 px += GP.world.getWidthPx();
57 break;
58 case 3:
59 px -= GP.world.getWidthPx();
60 break;
61 }
63 float dx = 0, dy = 0;
65 if (px + GP.player.getWidth() < x + 4) {
66 dx = -.5f;
67 } else if (px > x + 4) {
68 dx = .5f;
69 }
71 if (py + GP.player.getHeight() < y + 4) {
72 dy = -.5f;
73 } else if (py > y + 4) {
74 dy = .5f;
75 }
77 move.add(dx, dy);
79 if (move.x > 2) {
80 move.x = 1;
81 } else if (move.x < -2) {
82 move.x = -1;
83 }
85 if (move.y > 2) {
86 move.y = 1;
87 } else if (move.y < -2) {
88 move.y = -1;
89 }
90 }
91 }
93 public void pickUpDrop(Player pl) {
94 for (int i = 0; i < pl.inventory.length; i++) {
95 if (pl.inventory[i] == 0 || pl.inventory[i] == id) {
96 pl.inventory[i] = id;
97 pickedUp = true;
98 break;
99 }
103 private void checkWorldBounds() {
104 if (x + 8 > GP.world.getWidthPx()) {
105 x -= GP.world.getWidthPx();
106 } else if (x < 0) {
107 x += GP.world.getWidthPx();
111 public void move() {
112 x += move.x;
113 y += move.y;
114 checkWorldBounds();
115 y = MathUtils.round(y);
118 public int getId() {
119 return id;
122 public boolean isPickedUp() {
123 return pickedUp;
126 public void setPickedUp(boolean pickedUp) {
127 this.pickedUp = pickedUp;