SHOW:
|
|
- or go back to the newest paste.
1 | package br.player; | |
2 | ||
3 | import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; | |
4 | import com.badlogic.gdx.math.Vector2; | |
5 | ||
6 | /** | |
7 | * | |
8 | * @author Andrรฉ Vinรญcius Lopes | |
9 | */ | |
10 | public class PlayerMovement { | |
11 | ||
12 | private Player player; | |
13 | private final int default_x_width = 30; | |
14 | private final int default_y_height = 40; | |
15 | private final String BLOCKED = "blocked"; | |
16 | private final String SLOPED = "slope"; | |
17 | private float oldY, veryOldY; | |
18 | ||
19 | //For very private use of this class | |
20 | private TiledMapTileLayer.Cell cell, cell1; | |
21 | ||
22 | public PlayerMovement(Player p) { | |
23 | player = p; | |
24 | ||
25 | } | |
26 | ||
27 | public void updateMovement(TiledMapTileLayer collisionLayer, Vector2 velocity, float gravity, float delta, float speed, float jump) { | |
28 | ||
29 | // apply gravity | |
30 | velocity.y -= gravity * delta; | |
31 | ||
32 | // clamp velocity | |
33 | if (velocity.y > jump) { | |
34 | velocity.y = jump; | |
35 | } else if (velocity.y < -gravity) { | |
36 | velocity.y = -gravity; | |
37 | } | |
38 | ||
39 | // save old position | |
40 | double oldX = player.getX(); | |
41 | double oldY = player.getY(); | |
42 | ||
43 | double tileWidth = collisionLayer.getTileWidth(); | |
44 | double tileHeight = collisionLayer.getTileHeight(); | |
45 | ||
46 | boolean collisionX = false; | |
47 | boolean collisionY = false; | |
48 | boolean slopeY = false; | |
49 | boolean slopeX = false; | |
50 | ||
51 | // move on y | |
52 | player.setY(player.getY() + velocity.y * delta); | |
53 | ||
54 | if (velocity.y < 0) { // going down | |
55 | // bottom left | |
56 | cell = collisionLayer.getCell((int) (player.getX() / tileWidth), (int) (player.getY() / tileHeight)); | |
57 | if (cell != null) { | |
58 | collisionY = cell.getTile().getProperties().containsKey(BLOCKED); | |
59 | slopeY = cell.getTile().getProperties().containsKey(SLOPED); | |
60 | } | |
61 | // bottom middle | |
62 | if (!collisionY) { | |
63 | cell1 = collisionLayer.getCell((int) ((player.getX() + default_x_width / 2) / tileWidth), (int) (player.getY() / tileHeight)); | |
64 | if (cell1 != null) { | |
65 | collisionY = cell1.getTile().getProperties().containsKey(BLOCKED); | |
66 | slopeY = cell1.getTile().getProperties().containsKey(SLOPED); | |
67 | } | |
68 | } | |
69 | ||
70 | // bottom right | |
71 | if (!collisionY) { | |
72 | cell1 = collisionLayer.getCell((int) ((player.getX() + default_x_width) / tileWidth), (int) (player.getY() / tileHeight)); | |
73 | if (cell1 != null) { | |
74 | collisionY = cell1.getTile().getProperties().containsKey(BLOCKED); | |
75 | slopeY = cell1.getTile().getProperties().containsKey(SLOPED); | |
76 | } | |
77 | } | |
78 | ||
79 | //player.canJump = collisionY; | |
80 | } else if (velocity.y > 0) { // going up | |
81 | // top left | |
82 | cell = collisionLayer.getCell((int) (player.getX() / tileWidth), (int) ((player.getY() + default_y_height) / tileHeight)); | |
83 | if (cell != null) { | |
84 | collisionY = cell.getTile().getProperties().containsKey(BLOCKED); | |
85 | slopeY = cell.getTile().getProperties().containsKey(SLOPED); | |
86 | } | |
87 | ||
88 | // top middle | |
89 | if (!collisionY) { | |
90 | cell1 = collisionLayer.getCell((int) ((player.getX() + default_x_width / 2) / tileWidth), (int) ((player.getY() + default_y_height) / tileHeight)); | |
91 | if (cell1 != null) { | |
92 | collisionY = cell1.getTile().getProperties().containsKey(BLOCKED); | |
93 | slopeY = cell1.getTile().getProperties().containsKey(SLOPED); | |
94 | } | |
95 | } | |
96 | ||
97 | // top right | |
98 | if (!collisionY) { | |
99 | cell1 = collisionLayer.getCell((int) ((player.getX() + default_x_width) / tileWidth), (int) ((player.getY() + default_y_height) / tileHeight)); | |
100 | if (cell1 != null) { | |
101 | collisionY = cell1.getTile().getProperties().containsKey(BLOCKED); | |
102 | slopeY = cell1.getTile().getProperties().containsKey(SLOPED); | |
103 | } | |
104 | } | |
105 | } | |
106 | ||
107 | // react to y collision | |
108 | if (collisionY && !slopeY) { | |
109 | player.setY((float) oldY); | |
110 | velocity.y = 0; | |
111 | } | |
112 | ||
113 | if (slopeY) { | |
114 | ||
115 | if (!player.pressingLeft && !player.pressingRight) { | |
116 | ||
117 | player.setY((float) oldY); // Because its senofTheta | |
118 | velocity.y = 0; | |
119 | ||
120 | } else { | |
121 | //player.setY(oldY + (0.8f * 2)); // Because its senofTheta | |
122 | player.setY((float) oldY + (0.8f * 4)); // Because its senofTheta | |
123 | velocity.y = 0; | |
124 | } | |
125 | } | |
126 | ||
127 | //Can Jump | |
128 | if (collisionY || slopeY) { | |
129 | player.canJump = true; | |
130 | } else { | |
131 | player.canJump = false; | |
132 | } | |
133 | ||
134 | // move on x | |
135 | player.setX(player.getX() + velocity.x * delta); | |
136 | ||
137 | if (velocity.x < 0) { // going left | |
138 | // top left | |
139 | cell = collisionLayer.getCell((int) (player.getX() / tileWidth), (int) ((player.getY() + default_y_height) / tileHeight)); | |
140 | if (cell != null) { | |
141 | slopeX = cell.getTile().getProperties().containsKey(SLOPED); | |
142 | collisionX = cell.getTile().getProperties().containsKey(BLOCKED); | |
143 | } | |
144 | ||
145 | // middle left | |
146 | if (!collisionX) { | |
147 | cell1 = collisionLayer.getCell((int) (player.getX() / tileWidth), (int) ((player.getY() + default_y_height / 2) / tileHeight)); | |
148 | if (cell1 != null) { | |
149 | slopeX = cell1.getTile().getProperties().containsKey(SLOPED); | |
150 | collisionX = cell1.getTile().getProperties().containsKey(BLOCKED); | |
151 | } | |
152 | } | |
153 | ||
154 | // bottom left | |
155 | if (!collisionX) { | |
156 | cell1 = collisionLayer.getCell((int) (player.getX() / tileWidth), (int) (player.getY() / tileHeight)); | |
157 | if (cell1 != null) { | |
158 | slopeX = cell1.getTile().getProperties().containsKey(SLOPED); | |
159 | collisionX = cell1.getTile().getProperties().containsKey(BLOCKED); | |
160 | } | |
161 | } | |
162 | } else if (velocity.x > 0) { // going right | |
163 | // top right | |
164 | cell = collisionLayer.getCell((int) ((player.getX() + default_x_width) / tileWidth), (int) ((player.getY() + default_y_height) / tileHeight)); | |
165 | if (cell != null) { | |
166 | slopeX = cell.getTile().getProperties().containsKey(SLOPED); | |
167 | collisionX = cell.getTile().getProperties().containsKey(BLOCKED); | |
168 | } | |
169 | // middle right | |
170 | if (!collisionX) { | |
171 | cell1 = collisionLayer.getCell((int) ((player.getX() + default_x_width) / tileWidth), (int) ((player.getY() + default_y_height / 2) / tileHeight)); | |
172 | if (cell1 != null) { | |
173 | slopeX = cell1.getTile().getProperties().containsKey(SLOPED); | |
174 | collisionX = cell1.getTile().getProperties().containsKey(BLOCKED); | |
175 | } | |
176 | } | |
177 | ||
178 | // bottom right | |
179 | if (!collisionX) { | |
180 | cell1 = collisionLayer.getCell((int) ((player.getX() + default_x_width) / tileWidth), (int) (player.getY() / tileHeight)); | |
181 | if (cell1 != null) { | |
182 | slopeX = cell1.getTile().getProperties().containsKey(SLOPED); | |
183 | collisionX = cell1.getTile().getProperties().containsKey(BLOCKED); | |
184 | } | |
185 | } | |
186 | } | |
187 | ||
188 | /* | |
189 | System.out.println("NanoTime" + System.nanoTime()); | |
190 | System.out.println("Player Collision X" + collisionX); | |
191 | System.out.println("Player Collision Y" + collisionY); | |
192 | System.out.println("Player Slope X" + slopeX); | |
193 | System.out.println("Player Slope Y" + slopeY); | |
194 | System.out.println("Player Can Jump" + player.canJump); | |
195 | System.out.println("\n"); | |
196 | */ | |
197 | // react to x collision | |
198 | if (collisionX && !slopeX) { | |
199 | player.setX((float) oldX); | |
200 | velocity.x = 0; | |
201 | } | |
202 | if (slopeX && velocity.x != 0) { | |
203 | if (slopeX && velocity.x > 0) { | |
204 | player.setX((float) oldX + 1.5f); | |
205 | } | |
206 | ||
207 | if (slopeX && velocity.x < 0) { | |
208 | player.setX((float) oldX - 1.5f); | |
209 | } | |
210 | ||
211 | if (slopeX && velocity.x == 0) { | |
212 | //????? | |
213 | } | |
214 | } | |
215 | ||
216 | } | |
217 | ||
218 | public void updateMovement2(TiledMapTileLayer collisionLayer, Vector2 velocity, float gravity, float delta, float speed, float jump) { | |
219 | ||
220 | // apply gravity | |
221 | velocity.y -= gravity * delta; | |
222 | ||
223 | player.setY(player.getY() + velocity.y * delta); | |
224 | ||
225 | // clamp velocity | |
226 | if (velocity.y > jump) { | |
227 | velocity.y = jump; | |
228 | } else if (velocity.y < -gravity) { | |
229 | velocity.y = -gravity; | |
230 | } | |
231 | ||
232 | // save old position | |
233 | double oldX = player.getX(); | |
234 | double oldY = player.getY(); | |
235 | ||
236 | int tw = 1; | |
237 | int th = 1; | |
238 | int px = (int) (player.getX() / 16); | |
239 | int py = (int) (player.getY() / 16); | |
240 | int spriteHeight = 46 / 16; | |
241 | int spriteWeight = player.getRegionWidth() / 16; | |
242 | ||
243 | boolean collisionY = false; | |
244 | boolean collisionX = false; | |
245 | ||
246 | player.setY(player.getY() + velocity.y * delta); | |
247 | ||
248 | System.out.println(""); | |
249 | //Analyze Y Below Sprite | |
250 | if (!collisionY) { | |
251 | //Check Block 04 | |
252 | TiledMapTileLayer.Cell cell04 = collisionLayer.getCell(px, (py)); | |
253 | if (cell04 != null) { | |
254 | collisionY = cell04.getTile().getProperties().containsKey("blocked"); | |
255 | System.out.println("Block 04"); | |
256 | } | |
257 | } | |
258 | if (!collisionY) { | |
259 | //Check Block 05 | |
260 | TiledMapTileLayer.Cell cell05 = collisionLayer.getCell(px + tw, (py)); | |
261 | if (cell05 != null) { | |
262 | collisionY = cell05.getTile().getProperties().containsKey("blocked"); | |
263 | System.out.println("Block 05"); | |
264 | } | |
265 | } | |
266 | ||
267 | if (!collisionY) { | |
268 | //Check Block 06 | |
269 | TiledMapTileLayer.Cell cell06 = collisionLayer.getCell(px + 2 * tw, (py)); | |
270 | if (cell06 != null) { | |
271 | collisionY = cell06.getTile().getProperties().containsKey("blocked"); | |
272 | System.out.println("Block 06"); | |
273 | ||
274 | } | |
275 | } | |
276 | ||
277 | // react to y collision | |
278 | if (collisionY) { | |
279 | player.setY((float) oldY); | |
280 | //velocity.y = 0; | |
281 | player.canJump = true; | |
282 | } | |
283 | ||
284 | //End of Analyzing | |
285 | //Analyze going left | |
286 | if (velocity.x < 0) { | |
287 | if (!collisionX) { | |
288 | //Check Block 0 | |
289 | TiledMapTileLayer.Cell cell0 = collisionLayer.getCell(px - tw, py + 2 * th); | |
290 | if (cell0 != null) { | |
291 | collisionX = cell0.getTile().getProperties().containsKey("blocked"); | |
292 | System.out.println("Block 0"); | |
293 | } | |
294 | } | |
295 | ||
296 | if (!collisionX) { | |
297 | //Check Block 1 | |
298 | TiledMapTileLayer.Cell cell1 = collisionLayer.getCell(px - tw, (py + th)); | |
299 | if (cell1 != null) { | |
300 | collisionX = cell1.getTile().getProperties().containsKey("blocked"); | |
301 | System.out.println("Block 1"); | |
302 | ||
303 | } | |
304 | } | |
305 | ||
306 | if (!collisionX) { | |
307 | //Check Block 2 | |
308 | TiledMapTileLayer.Cell cell2 = collisionLayer.getCell(px - tw, (py)); | |
309 | if (cell2 != null) { | |
310 | //collisionX = cell2.getTile().getProperties().containsKey("blocked"); | |
311 | System.out.println("Block 2"); | |
312 | } | |
313 | } | |
314 | ||
315 | //End of Analyzing Going left | |
316 | } | |
317 | ||
318 | if (velocity.x > 0) { | |
319 | //Analyzing Going RIght | |
320 | //Check Block 7 | |
321 | if (!collisionX) { | |
322 | TiledMapTileLayer.Cell cell7 = collisionLayer.getCell((px + (3 * tw)), (py)); | |
323 | if (cell7 != null) { | |
324 | //collisionX = cell7.getTile().getProperties().containsKey("blocked"); | |
325 | System.out.println("Block 7"); | |
326 | ||
327 | } | |
328 | } | |
329 | ||
330 | if (!collisionX) { | |
331 | //Check Block 8 | |
332 | TiledMapTileLayer.Cell cell8 = collisionLayer.getCell(px + 3 * tw, (py + th)); | |
333 | if (cell8 != null) { | |
334 | collisionX = cell8.getTile().getProperties().containsKey("blocked"); | |
335 | System.out.println("Block 8"); | |
336 | ||
337 | } | |
338 | } | |
339 | ||
340 | if (!collisionX) { | |
341 | //Check Block 9 | |
342 | TiledMapTileLayer.Cell cell9 = collisionLayer.getCell(px + 3 * tw, (py + 2 * th)); | |
343 | if (cell9 != null) { | |
344 | collisionX = cell9.getTile().getProperties().containsKey("blocked"); | |
345 | System.out.println("Block 9"); | |
346 | ||
347 | } | |
348 | } | |
349 | } | |
350 | ||
351 | player.setX(player.getX() + velocity.x * delta); | |
352 | ||
353 | if (collisionX) { | |
354 | player.setX((float) oldX); | |
355 | velocity.x = 0; | |
356 | } | |
357 | ||
358 | } | |
359 | ||
360 | } |