Wednesday, June 28, 2017

java - Gravity stops when side-collision detected



Please, look at this GIF:


enter image description here


The label on the animation says "Move button is pressed, then released". And you can see when it's pressed (and player's getCenterY() is above wall getCenterY()), gravity doesn't work. I'm trying to fix it since yesterday, but I can't. All methods are called from game loop.


public void move() {
if (left) {
switch (game.currentLevel()) {

case 1:
for (int i = 0; i < game.lvl1.getX().length; i++)
game.lvl1.getX()[i] += game.physic.xVel;
break;

}
} else if (right) {
switch (game.currentLevel()) {
case 1:
for (int i = 0; i < game.lvl1.getX().length; i++)

game.lvl1.getX()[i] -= game.physic.xVel;
break;
}
}
}

int manCenterX, manCenterY, boxCenterX, boxCenterY;
//gravity stop
public void checkCollision() {
for (int i = 0; i < game.lvl1.getX().length; i++) {

manCenterX = (int) game.man.getBounds().getCenterX();
manCenterY = (int) game.man.getBounds().getCenterY();
if (game.man.getBounds().intersects(game.lvl1.getBounds(i))) {
boxCenterX = (int) game.lvl1.getBounds(i).getCenterX();
boxCenterY = (int) game.lvl1.getBounds(i).getCenterY();
if (manCenterY - boxCenterY > 0 || manCenterY - boxCenterY < 0) {
game.man.setyPos(-2f);
game.man.isFalling = false;
}
}

}
}
//left side of walls
public void colliLeft() {
for (int i = 0; i < game.lvl1.getX().length; i++) {
if (game.man.getBounds().intersects(game.lvl1.getBounds(i))) {
if (manCenterX - boxCenterX < 0) {
for (int i1 = 0; i1 < game.lvl1.getX().length; i1++) {



game.lvl1.getX()[i1] += game.physic.xVel;
game.man.isFalling = true;

}
}
}
}
}
//right side of walls
public void colliRight() {

for (int i = 0; i < game.lvl1.getX().length; i++) {
if (game.man.getBounds().intersects(game.lvl1.getBounds(i))) {
if (manCenterX - boxCenterX > 0) {
for (int i1 = 0; i1 < game.lvl1.getX().length; i1++) {

game.lvl1.getX()[i1] += -game.physic.xVel;
game.man.isFalling = true;
}
}
}

}
}
public void gravity() {
game.man.setyPos(yVel);
}

//not called from gameloop: public void setyPos(float yPos) {
this.yPos += yPos;

}


Answer



Change the code that removes falling if he is on top of the block:


if (manCenterY - boxCenterY > 0 || manCenterY - boxCenterY < 0) 
{
game.man.setyPos(-2f);
game.man.isFalling = false;
}

To code that removes falling if he is on top of the block:


if (manAboveBlock && (manCenterY - boxCenterY > 0 || manCenterY - boxCenterY < 0)) 

{
game.man.setyPos(-2f);
game.man.isFalling = false;
}

This is treating the symptom and not the problem however. The problem is probably that when the right key is pressed next to a wall, for a split second the player moves inside of that wall and then is corrected by moving back outside the wall. While the player is clipping into the wall his isFalling value is set to false.


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...