Java-冲突检测(小故障)

Java-冲突检测(小故障),java,collision-detection,Java,Collision Detection,我正在为HS的最后一年项目制作一个平台游戏。 然而。。。我使用的碰撞检测系统基本上是关于检查角色的特定部分是否与另一个块相交 碰撞似乎工作正常,但它会导致一些错误,例如球员从侧面击球时卡住或减速,或者在同时使用上键和键时被抛出 我的问题是;如何改进碰撞代码以避免此类故障和“滑”碰撞? 这就是我试图实现的碰撞效果: () () 下面是边界外观的预览 下面是它在游戏中实际外观的预览 () 我用于碰撞检测的代码: (tempObject是玩家与之相交的块) 以下是绑定方法: public Re

我正在为HS的最后一年项目制作一个平台游戏。 然而。。。我使用的碰撞检测系统基本上是关于检查角色的特定部分是否与另一个块相交

碰撞似乎工作正常,但它会导致一些错误,例如球员从侧面击球时卡住或减速,或者在同时使用上键和<或>键时被抛出

我的问题是;如何改进碰撞代码以避免此类故障和“滑”碰撞?

这就是我试图实现的碰撞效果:
()

()

下面是边界外观的预览


下面是它在游戏中实际外观的预览 ()
我用于碰撞检测的代码: (tempObject是玩家与之相交的块)

以下是绑定方法:

public Rectangle getBounds() { return new Rectangle( (int)x, (int)y, (int)width, (int)height ); }

    public Rectangle getBoundsTop() {
        return new Rectangle(
                (int)x, 
                (int)y, 
                (int)(width-(width*0.01f)), 
                (int)(height/2)
        );
    }
    public Rectangle getBoundsBottom() {
        return new Rectangle(
                (int)x,
                (int)(y+(height/2)),
                (int)(width-(width*0.01f)),
                (int)(height/2)
        );
    }

    public Rectangle getBoundsLeft() {
        return new Rectangle(
                (int)x,
                (int)y, 
                (int)((int)width*0.15f), 
                (int)height
        );
    }

    public Rectangle getBoundsRight() {
        return new Rectangle(
                (int) 
                ((int)x+(width-(width*0.15f))), 
                (int)y, 
                (int) ((int)width*0.15f), 
                (int)height
        );
    }
编辑:我使用恒定的加速度设置速度

acc = 2.5f;
MAX_SPEED = 10;


if(Game.keyDownMap.containsKey(KeyEvent.VK_A)){

    setVelX(getVelX() - acc);
    if(getVelX() < -MAX_SPEED)
        setVelX(-MAX_SPEED);

} else if(Game.keyDownMap.containsKey(KeyEvent.VK_D)){

    setVelX(getVelX() + acc);
    if(getVelX() > MAX_SPEED)
        setVelX(MAX_SPEED);

}
acc=2.5f;
最大转速=10;
if(Game.keyDownMap.containsKey(KeyEvent.VK_A)){
setVelX(getVelX()-acc);
如果(getVelX()<-最大速度)
setVelX(-MAX_速度);
}else if(Game.keyDownMap.containsKey(KeyEvent.VK_D)){
setVelX(getVelX()+acc);
如果(getVelX()>最大速度)
设置速度(最大速度);
}

当发生侧向碰撞时,您希望将侧向速度设置为零。这样就只能有一个垂直速度,我假设它是setVelY()

此外,如果没有碰撞状态处于活动状态,则需要按“向下键”进行检查。您可能需要创建一个方法来设置当前是否与您每次更新的gametick相交

if(Game.keyDownMap.containsKey(KeyEvent.VK_A) && !isIntersectingLeft()){

    setVelX(getVelX() - acc);
    if(getVelX() < -MAX_SPEED)
        setVelX(-MAX_SPEED);

} else if(Game.keyDownMap.containsKey(KeyEvent.VK_D) && !isIntersectingRight()){

    setVelX(getVelX() + acc);
    if(getVelX() > MAX_SPEED)
        setVelX(MAX_SPEED);

}

问得好!(+1):您提供了一个关于站点上的图像/动画以及详细且格式良好的代码示例的解释良好的问题。在写新问题时,这应该被用作参考模板,IMHO。首先,你要定义当与墙发生碰撞时,你希望发生什么。你想像马里奥/波斯王子那样跳墙吗?你要急剧下降吗?你想从墙上滑下来吗?你想在侧面碰撞时发生什么?看动画,我看到当块与对象碰撞时,它会一直移动。在这些情况下,您可能希望在其碰撞后停止其沿给定方向移动,但不重置位置。尝试并调整检查碰撞的位置以及更改字符位置的位置。此外,如果您想要更平滑的运动,可以添加加速度,而不是直接更改速度。这将使动作更加流畅,但您需要调整它以适应您的目的。@Tschallacka我现在更新了问题。:)你用什么来表示速度?你能发布这部分代码吗?似乎比以前工作得更好:D我想我将不得不玩边线游戏,以避免玩家在用角球击中方块时被扔掉。你能做的是使用多个边界框。你有一个大的包围盒,包围着所有较小的bb。如果大的一个发生了碰撞,那么你在大的边界框中迭代较小的bb集合,看看是否有“真实”的碰撞。这样,您就可以不使用圆形和三角形特征。是的。如果玩家与绿色框碰撞,则迭代红色框以选中碰撞,然后迭代黄色框以迭代碰撞。不过,你不需要中间的点击框,你只需要最外围的点击框。
if(getBoundsRight().intersects(tempObject.getBoundsLeft())){
    x = tempObject.getX() - this.width;
    setVelX(0);
}


if(getBoundsLeft().intersects(tempObject.getBoundsRight())){
    x = tempObject.getX() + this.width;
    setVelX(0);
}
if(Game.keyDownMap.containsKey(KeyEvent.VK_A) && !isIntersectingLeft()){

    setVelX(getVelX() - acc);
    if(getVelX() < -MAX_SPEED)
        setVelX(-MAX_SPEED);

} else if(Game.keyDownMap.containsKey(KeyEvent.VK_D) && !isIntersectingRight()){

    setVelX(getVelX() + acc);
    if(getVelX() > MAX_SPEED)
        setVelX(MAX_SPEED);

}
if(getBoundsRight().intersects(tempObject.getBoundsLeft())){
    x = tempObject.getX() - this.width;
    if(this.getVelX() > 0) {
        setVelX(10);
    }
}


if(getBoundsLeft().intersects(tempObject.getBoundsRight())){
    x = tempObject.getX() + this.width;
    if(this.getVelX() > 0) {
       setVelX(-10);
    }
}