【发布时间】:2016-05-25 05:14:03
【问题描述】:
我试图让我的游戏中的碰撞完全完美。我正在测试的是,如果你与玩家撞墙,你就会停下来。我只实现了当玩家撞到墙的左侧时(当墙在玩家的右侧时)的碰撞代码。这是代码。
if(entityOnRight){
if(player.getPositionCorner(SquareMapTuples.BOTTOM_RIGHT).x -
ent.getPositionCorner(SquareMapTuples.BOTTOM_LEFT).x > -.9f)
player.setMovementBooleans(false, false, false, false);
else
player.setMovementBooleans(true, false, false, false);
}
注意:如果我走得很慢,它会在我希望它停止的地方停止玩家,但如果走得快,它不会按照我想要的方式进行碰撞
本质上,代码说明如果墙在右侧,它将检查播放器矩形的右下角,减去墙的左下角,并检查两者之间的距离是否为0.001 . 0.001 几乎是一个不明显的距离,因此我使用该值。这是player.setMovementBooleans的代码
public void setMovementBooleans(boolean canMoveRight, boolean canMoveLeft, boolean canMoveUp, boolean canMoveDown){
this.canMoveRight = canMoveRight;
if(canMoveRight == false && moveRight)
vel.x = 0;
}
Player 类中的 canMoveRight 布尔值(不在参数中)是允许您移动的原因,moveRight 是您尝试向右移动的原因。下面是一些可以更好地解释这些布尔值如何交互的代码:
//If you clicked right arrow key and you're not going
//Faster then the max speed
if(moveRight && !(vel.x >= 3)){
vel.x += movementSpeed;
}else if(vel.x >= 0 && !moveRight){
vel.x -= movementSpeed * 1.5f;
System.out.println("stopping");
//Make sure it goes to rest
if(vel.x - movementSpeed * 1.5f < 0)
vel.x = 0;
}
和:
if(Gdx.input.isKeyPressed(Keys.D) && canMoveRight)
moveRight = true;
else
moveRight = false;
所以总结一下,如果你点击“D”键,它可以让你开始移动。但是,如果布尔值 canMoveRight 为假,它不会让你感动。这是一张显示发生了什么的图片(玩家是黄色的,墙是绿色的)
如您所见,播放器比我想要的要走得更远。它应该在这一点停止:
非常感谢任何有关如何完成此操作的帮助!
【问题讨论】: