1 package ru
.deadsoftware
.cavecraft
.game
;
3 import com
.badlogic
.gdx
.Gdx
;
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
.cavecraft
.game
.objects
.Player
;
9 public class GamePhysics
{
11 public static final int PL_SPEED
= 2;
13 private GameProc gameProc
;
15 private Vector2 gravity
;
17 public GamePhysics(GameProc gameProc
) {
18 this.gameProc
= gameProc
;
19 gravity
= new Vector2(0,1);
22 private boolean checkColl(Rectangle rect
) {
23 int[] bl
= new int [6];
24 bl
[0] = gameProc
.world
.getForeMap(((int)(rect
.x
+2)/16), ((int)rect
.y
/16));
25 bl
[1] = gameProc
.world
.getForeMap(((int)(rect
.x
+rect
.width
-2)/16), ((int)rect
.y
/16));
26 bl
[2] = gameProc
.world
.getForeMap(((int)(rect
.x
+2)/16), ((int)(rect
.y
+rect
.height
/2)/16));
27 bl
[3] = gameProc
.world
.getForeMap(((int)(rect
.x
+rect
.width
-2)/16), ((int)(rect
.y
+rect
.height
/2)/16));
28 bl
[4] = gameProc
.world
.getForeMap(((int)(rect
.x
+2)/16), ((int)(rect
.y
+rect
.height
-1)/16));
29 bl
[5] = gameProc
.world
.getForeMap(((int)(rect
.x
+rect
.width
-2)/16), ((int)(rect
.y
+(rect
.height
-1))/16));
30 for (int b
: bl
) if (b
>0) {
36 private void movePlayer(Player pl
) {
37 pl
.position
.add(pl
.moveY
);
38 if (checkColl(pl
.getRect())) {
41 if (pl
.moveY
.y
<0) d
=1; else if (pl
.moveY
.y
>0) d
=-1;
42 pl
.position
.y
= MathUtils
.round(pl
.position
.y
);
43 while (checkColl(pl
.getRect())) pl
.position
.y
+=d
;
48 pl
.moveY
.add(gravity
);
49 pl
.position
.add(pl
.moveX
);
50 if (pl
.position
.x
<0 ||
51 pl
.position
.x
+pl
.width
>gameProc
.world
.getWidth()*16)
52 pl
.position
.sub(pl
.moveX
);
53 if (checkColl(pl
.getRect())) {
55 if (pl
.moveX
.x
<0) d
=1; else if (pl
.moveX
.x
>0) d
=-1;
56 pl
.position
.x
= MathUtils
.round(pl
.position
.x
);
57 while (checkColl(pl
.getRect())) pl
.position
.x
+=d
;
61 gameProc
.renderer
.camTargetPos
.x
= pl
.position
.x
-gameProc
.renderer
.camera
.viewportWidth
+100;
64 gameProc
.renderer
.camTargetPos
.x
= pl
.position
.x
-100;
67 if (gameProc
.renderer
.camTargetPos
.x
< 0) gameProc
.renderer
.camTargetPos
.x
= 0;
68 if (gameProc
.renderer
.camTargetPos
.x
+ gameProc
.renderer
.camera
.viewportWidth
>
69 gameProc
.world
.getWidth()*16)
70 gameProc
.renderer
.camTargetPos
.x
= gameProc
.world
.getWidth()*16-gameProc
.renderer
.camera
.viewportWidth
;
73 public void update(float delta
) {
74 movePlayer(gameProc
.player
);
75 if (gameProc
.renderer
.camera
.position
.x
- gameProc
.renderer
.camTargetPos
.x
<= 8 &&
76 gameProc
.renderer
.camera
.position
.x
- gameProc
.renderer
.camTargetPos
.x
>= -8) {
77 gameProc
.renderer
.camera
.position
.x
= gameProc
.renderer
.camTargetPos
.x
;
79 if (gameProc
.renderer
.camera
.position
.x
> gameProc
.renderer
.camTargetPos
.x
) {
80 gameProc
.renderer
.camera
.position
.sub(16,0,0);
82 if (gameProc
.renderer
.camera
.position
.x
< gameProc
.renderer
.camTargetPos
.x
) {
83 gameProc
.renderer
.camera
.position
.add(16,0,0);
85 gameProc
.renderer
.camera
.position
.y
= gameProc
.player
.position
.y
+gameProc
.player
.height
/2
86 -gameProc
.renderer
.camera
.viewportHeight
/2;