当前位置: 首页 > 知识库问答 >
问题:

LibGdx-Java中的近完美碰撞

农存
2023-03-14

我试图让我的游戏中的碰撞完全完美。我测试的是,如果你和玩家撞墙,你就会停下来。我只实现了当玩家撞墙左侧时(当墙在玩家右侧时)的碰撞代码。这是代码。

    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为假,它不会移动您。这是一张显示发生了什么的图像(播放器是黄色的,墙壁是绿色的)

正如你所看到的,球员比我希望的要远得多。此时应停止:

非常感谢您为我们提供的帮助!

共有2个答案

董权
2023-03-14

处理这些碰撞的最好方法是使用像Box2D这样的物理引擎,它已经包含了Libgdx。当Box2D中发生碰撞时,会触发一个事件,您可以轻松处理该事件。所以您可能应该看看这里。

在没有物理的情况下实现这一点的另一种替代方法是使用表示播放器和墙的逻辑矩形(也可以是多段线),并使用libgdx的Intersector类。在这里。

金阳曜
2023-03-14

也许你尝试的方式有点太复杂了:-)。我建议从头开始用一种更简单的方法:将地图和播放器制作成com。错误逻辑。gdx。数学矩形实例。现在,在代码的以下部分中,您进行检查,移动后玩家是否仍在地图内,如果是,则允许移动,如果不是,则不允许:

if(Gdx.input.isKeyPressed(Keys.D){
    float requestedX, requestedY;
    //calculate the requested coordinates
    Rectangle newPlayerPositionRectangle = new Rectangle(requestedX, requestedY, player.getWidth(), player.getHeight());
    if (newPlayerPositionRectangle.overlaps(map) {
        //move the player
    } else {
        //move the player only to the edge of the map and stop there
    }
}
 类似资料:
  • 我有一个带有3D模型实例的3D场景;我想做冲突检测。我目前正在遵循本教程(http://blog.xoppa.com/using-the-libgdx-3d-physics-bullet-wrapper-part1/)。然而,我想要的有点复杂。 有一个角色(一个knight.g3db模型,是Libgdx基本3d模型类的示例代码的一部分),它可以用剑攻击。我还有另一个模型实例,我想用剑“攻击”它。

  • 我的问题主要与它背后的理论有关。我为一个项目制作了一个2D游戏,通过使用Rectangle类中的.overlapps方法检测碰撞,碰撞处理得很好。首先,被认为是连续或离散碰撞技术。当我读到这个理论时,我说它是离散的,但我在网上的文章中读到离散的主要缺点是它在实际发生碰撞后检测到碰撞。所以,我的问题是:它实际上是离散的吗?如果是这样的话,我看不出它有什么缺点吗?谢谢

  • 我试图在Cocos2d-x中移植像素完美冲突检测,原始版本是为Cocos2D制作的,可以在这里找到:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/ 这是我的Cocos2d-x版本代码 如果我将“pp”参数发送为false,则我的代码工作正常。也就是说

  • 问题内容: 我找到了像素完美碰撞检查的代码,并在我的代码中使用了它: 它运行完美,从来没有任何问题。直到我使用以下代码将图像设置为Config_Alpha_8为止(由于ram问题): 为什么什么都不会发生,它确实被CollisioDetected装入了,我已经检查了日志!但是它不会检测到冲突。有人可以使用config_alpha_8提供工作功能来检查位图的像素完美冲突吗? 问题答案: 在具有ALP

  • 我目前正在尝试使用java和libgdx制作一个突破性的克隆。我现在很难让球以合适的角度从挡块上弹起。简而言之,我遇到的问题是,球每帧移动12个像素,并不总是与砖的边缘对齐。如果有人对更好的移动球的方法或其他检查碰撞的方法有任何建议,我们将不胜感激! 主要游戏类 Ball类 砖块代码以防万一

  • 问题内容: 好的,我正在研究Android上的游戏。我需要实现像素完美碰撞检测。我已经在每个图像周围设置了边界框,每个边界框都进行了转换以匹配图像的当前旋转。一切都很好。我还将每个位图的像素数据存储在数组中。有人可以帮我找出检测像素是否重叠的最有效方法吗?在此先感谢您的帮助! 问题答案: 基本思想是为每个对象创建一个位掩码,您可以在每个像素中指示该对象是否实际存在。然后,比较两个对象的位掩码的每个