在libgdx java

时间:2015-09-14 19:52:27

标签: java libgdx

我在我的游戏中使用基于网格的碰撞检测,除了一件事情之外,一切都正常工作,当玩家在瓷砖上并向左移动时,他会穿过瓷砖。发生这种情况是因为当向左移动然后向右移动时网格点更新速度更快,因为玩家网格位置基于坐标移动。例如:如果玩家是100,他不会更新直到他达到150,单元格范围是100 - 150(单元格大小是50)但是如果你向左移动你将是99,这包括在50-100个细胞区域。这是一张真正有助于更好地解释的图片

注意:红色表示玩家网格位置,粉红色矩形表示玩家动画将被播放的位置,因此粉红色不能通过图块。

Example

这是我的玩家更新了下降

    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时,它并没有得到让我们说的信息&#34; updateMoveRight&#34;

我已经尝试检查右侧是否为真,而实际位置是假的,但是除非你挖了2个斑点,否则你不能摔倒,这不是我想要的。我希望玩家能够紧身(1瓦宽)游戏中的所有内容都是1瓦宽。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

如果您使用幅度距离更改条件,则应该可以向左或向右检查:

而不是:

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)) {

更改为:

if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
        (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
                Math.abs(entity.getGridPosition().x - entity.getPosition().x) < 1 ) {

如果对象每帧移动超过2个像素,则可以将数字1更改为更大。

如果你输入一个较大的值,你可以随时将实体移动到正确的位置,这样它就不会因为像这样设置一个位置的设置器而偏移几个像素:

    if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
        (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
                Math.abs(entity.getGridPosition().x - entity.getPosition().x) < 10 ) {
        entity.setPositionX(entity.getGridPosition().x);

也是为什么:

(mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y]

在那里两次?

答案 1 :(得分:0)

你在逻辑上描述的是,只有当粉红色矩形的两边都在孔的网格位置上时,你才会掉落。因此,您必须在$search_keywords = $_POST['search_keywords']; $terms = $search_keywords; $items = explode(' ',$terms); $types = array(); foreach ($items as $item) { $types[] = "`title` LIKE '%{$item}%'"; $types[] = "`exterior_colour` LIKE '%{$item}%'"; } $sql = "SELECT * FROM list_CAR WHERE "; $sql .= implode(" || ", $types) . ""; $result = mysqli_query($link, getPagingQuery($sql, $rowsPerPage)) or die(mysqli_error($link)); 方法中检查两个单独的网格位置,而不仅仅是一个。