Hello, I'm new here.
I'm coding platform game. I had been stuck on collision detection for 3 days, finally I've solved it.
But now I have to pull player down when he doesn't intersect anything. I did it this way:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| Runnable gravity = new Runnable() { public void run() { while (true) { player.y += yspeed; collide.gravity(); repaint(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } };
public void gravity() { for (int i = 0; i < box.getX().length; i++) if (player.getBounds().intersects(box.getBounds(i)) && game.yspeed != 0) { game.yspeed = 0; break; } else { game.yspeed = 1; } } |
And it works well, player is going down and stops when collides. But there's one glitch caused by right-left collision. Player can't move.
check() method:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public void check() { for (int i = 0; i < box.getX().length; i++) { if (player.getBounds().intersects(box.getBounds(i)) && player.xspeed > 0) { setLeft(true); } else if (!player.getBounds().intersects(box.getBounds(i)) && player.xspeed < 0) { setLeft(false); } if (player.getBounds().intersects(box.getBounds(i)) && player.xspeed < 0) { setRight(true); } else if (!player.getBounds().intersects(box.getBounds(i)) && player.xspeed > -1) { setRight(false); } } } |
And methods responsible for movement:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch (key) { case KeyEvent.VK_LEFT: left = true; game.collide.check(); move(); break; case KeyEvent.VK_RIGHT: right = true; game.collide.check(); move(); break; case KeyEvent.VK_UP: y -= 3; game.repaint(); break; case KeyEvent.VK_DOWN: y += 3; game.repaint(); break; default: break; } }
private void move() { if (left) { leftSpeed = 1; xspeed = 1; scroll(); } else if (right) { leftSpeed = 1; xspeed = -1; scroll(); } }
public boolean dudeLeftCollision() { return game.collide.left; }
public boolean dudeRightCollision() { return game.collide.right; }
private void scroll() { if (dudeLeftCollision() && !dudeRightCollision()) { leftSpeed = 0; rightSpeed = -1; for (int i = 0; i < game.box.getX().length; i++) { game.box.getX()[i] = game.box.getX()[i]; } } if (!dudeLeftCollision() && dudeRightCollision()) { leftSpeed = 0; rightSpeed = 1; for (int i = 0; i < game.box.getX().length; i++) { game.box.getX()[i] = game.box.getX()[i]; } } if (!dudeLeftCollision() && !dudeRightCollision()) { for (int i = 0; i < game.box.getX().length; i++) { game.box.getX()[i] += xspeed; } } game.repaint(); } |
It's my story. I have to figure out how to code collision-detection gravity-right-left without any glitches.
Hope you help me,
Thank you,
Szinek
[size=5pt]I wonder if my english is very bad.[/size]
Oops, wrong board? I should write this in "Game Mechanics"?