我正在用Java创建一个2d平台游戏,出于某种原因,当玩家跳向平台时,它有时会卡住。这是问题的图像:
如你所见,我正在跳到平台的顶部,但它被卡住了。
这是我的坠落/跳跃的碰撞代码:
if (guy.getJumpState() == false) {
if (canExecuteMovement(0, 8)) {
...
onGround = false;
if (guy.getY() > this.getParent().getHeight() / 2 - 100) {
// if you are in the middle, move the platforms.
for (int i = 0; i < platformCount; i++) {
if (platform[i].getVisibility() == true) {
platform[i].setY(platform[i].getY() - 8);
}
}
} else {
// or just move the guy if not.
guy.moveY(8);
}
} else {
onGround = true;
}
} else {
if (canExecuteMovement(0, -12)) {
if (guy.getY() < this.getParent().getHeight() / 2 - 100) {
// if you are in the middle, move the platforms.
for (int i = 0; i < platformCount; i++) {
if (platform[i].getVisibility() == true) {
platform[i].setY(platform[i].getY() + 12);
}
}
} else {
// or just move the guy if not.
guy.moveY(-12);
}
jumpCount++;
if (jumpCount >= 20) {
jumpCount = 0;
guy.setJumpState(false);
}
} else {
jumpCount = 0;
guy.setJumpState(false);
}
}
左右移动代码:
if (guy.getDirection() == "left") {
if (canExecuteMovement(-4, 0)) {
if (guy.getX() < this.getParent().getWidth() / 2) {
// if you are in the middle, move the platforms.
for (int i = 0; i < platformCount; i++) {
if (platform[i].getVisibility() == true) {
platform[i].setX(platform[i].getX() + 4);
}
}
} else {
// or just move the guy if not.
guy.moveX(-4);
}
}
} else if (guy.getDirection() == "right") {
if (canExecuteMovement(4, 0)) {
if (guy.getX() > this.getParent().getWidth() / 2) {
// if you are in the middle, move the platforms.
for (int i = 0; i < platformCount; i++) {
if (platform[i].getVisibility() == true) {
platform[i].setX(platform[i].getX() - 4);
}
}
} else {
// or just move the guy if not.
guy.moveX(4);
}
}
}
这里是canExecuteMovement函数:
private boolean canExecuteMovement(int xChange, int yChange) {
int projectedX = guy.getX() + xChange;
int projectedY = guy.getY() + yChange;
Rectangle projectedBounds = new Rectangle(projectedX, projectedY, guy.getWidth(), guy.getHeight());
for (int i = 0; i < platformCount; i++) {
if (projectedBounds.intersects(platform[i].getBounds()) && platform[i].getVisibility() == true) {
return false;
}
}
return true;
}
我真的不知道如何解决这个问题,希望我能得到一些启示。
答案 0 :(得分:5)
您需要分别跟踪x
和y
的允许/拒绝移动代码。发生的事情是,如果用户不能再向前移动,则代码完全阻止他。但是,他仍然应该能够上下移动。
考虑在代码中拆分条件,以便在分配新的移动向量时,它分别设置x
和y
,检查是否能够移入x
和y
个别。