【发布时间】:2015-09-14 19:52:26
【问题描述】:
我在我的游戏中使用了基于网格的碰撞检测,除了一件事之外,一切都正常工作,当玩家在瓷砖上并向左移动时,他从瓷砖上掉了下来。发生这种情况是因为当玩家向左然后向右移动时,网格点的更新速度更快,因为玩家的网格位置会根据坐标发生变化。例如:如果玩家是 100,他不会更新,直到他达到 150,单元格范围是 100 - 150(单元格大小为 50),但如果你向左移动,你将是 99,它包含在 50 - 100 个细胞区域。这是一张真正有助于更好地解释的图片
注意:红色代表玩家网格位置,粉色矩形是播放玩家动画的位置,所以粉色应该不能穿过瓷砖。
这是我的玩家在坠落时的更新
public void checkFall(Vector3 positionToCheck) {
if (positionToCheck != null) {
if (this.position.y <= positionToCheck.y + MapGrid.CELL_SIZE && positionToCheck.z == -1)
canFall = false;
}else
canFall = true;
}
这是坠落的碰撞检测
public Vector3 updateFall() {
/* ================================== */
/* ====*Exclusively for falling*===== */
/* ================================== */
if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
(mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
entity.getPosition().x + 1 >= entity.getGridPosition().x)) {
p.x = (int) ((entity.getGridPosition().x) * MapGrid.CELL_SIZE);
p.y = (int) ((entity.getGridPosition().y) * MapGrid.CELL_SIZE);
p.z = -1;
return p;
}
return null;
}
这是它如何检查以防你好奇
player.checkFall(collisionHandler.updateFall());
vector3 的 z 方面是这样的,当它返回 p 时,它不会得到让我们说“updateMoveRight”的信息
我尝试检查右侧是否为真,而实际位置为假,但除非你挖了 2 个点,否则你不能跌倒,这不是我想要的。我希望玩家能够紧密贴合(1 格宽)游戏中的所有内容都是 1 格宽。
非常感谢任何帮助!
【问题讨论】: