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

冲突处理程序未按指定的 libgdx 爪哇工作

傅朗
2023-03-14

下面是冲突处理程序代码

    float distanceY, furthestLeft;
public void update() {

    for (int i = 0; i < stageObjects.size(); i++) {
        iPos = stageObjects.get(i).getPosition();
        iDim = stageObjects.get(i).getDimensions();
        for(int k = 0; k < stageObjects.size(); k++){
            kPos = stageObjects.get(k).getPosition();
            kDim = stageObjects.get(k).getDimensions();
            if(k == i){
                continue;
            }
                distanceY = assignDy();
                furthestLeft = assignDx();
             //DistanceY is the subtraction of one objects y coordinate and 
            // if it equals 0 then they are colliding and the furthest left 
            // is the bottom right x coord of the furthest left objects x 
            //coord so it should check if this x is contained within an
            // objects left x coord to right x coord
            if(distanceY <= 1 && distanceY >= 0 && furthestLeft >= iPos.x && furthestLeft <= iPos.x + iDim.x){
                stageObjects.get(i).react(Tuples.HIT_BOTTOM);
                stageObjects.get(k).react(Tuples.HIT_FROM_TOP);
                System.out.println("Collision: " + stageObjects.get(i).toString() + " with " + 
                stageObjects.get(k).toString());
            }

        }
    }

}


}


public float assignDy(){
    if(kPos.y > iPos.y){
        return Math.abs(kPos.y - (iPos.y + iDim.y));
    }else
        return Math.abs(iPos.y - (kPos.y + kDim.y));
}

public float assignDx(){
    if(kPos.x > iPos.x){
        return kPos.x + kDim.x;
    }else
        return iPos.x + iDim.x;
}

这里有错误,这里是反应方法

    public void react(int occurence){
    if(occurence == Tuples.HIT_BOTTOM){
        velocity.y = 0;
    }
}

但是,如果它们相距较远,则代码可以完美地工作。

我还注意到,如果这个矩形在另一个矩形的左边,它可能会穿过其他矩形,但是如果它再靠右一点,它就会像落在那个矩形上一样被挂起来。上图有效的唯一原因是因为最右边的先掉落,如果落在左边的矩形之后,另一个矩形左边的任何东西也会被挂起来

我只是不知道我到底做错了什么,非常感谢你的帮助!

共有1个答案

鲜于意
2023-03-14

将条件中的iPos改为更一般的形式,指定一个变量,如assignDx和dy,以检查Ipos或kpo是否是您需要检查的,如下所示

    public void assignOx(Vector2 ox){
    if(kPos.x > iPos.x){
        ox.x = iPos.x;
        ox.y = iPos.x + iDim.x;
    }else{
        ox.x = kPos.x;
        ox.y = kPos.x + kDim.x;
    }
}
 类似资料:
  • 我正在使用libGdx,创建一个简单的平台游戏。我正在使用Tiled创建映射和LibGdx tiledMap呈现器。它的设置与SuperKoalio libgdx示例类似。 我现在的碰撞检测,它只是确定玩家是撞到了它的右边,上面还是下面的一个瓷砖。当它检测到右侧碰撞时,它将玩家状态设置为Standing。对播放机的控制是通过InputHandler完成的。当D键被按下时,它将玩家的状态设置为行走,

  • 一个能够让程序猿快速开发的炒鸡脚手架,核心技术Spring、JPA、Shiro。 基础环境 JDK1.8、Maven、Mysql、Redis、IntelliJ IDEA、minio、fastdfs 相关组件 - ok-admin - vue - iView - echarts - clipboard - cropperjs - lightbox - nprogress - webuploader

  • 主要内容:执行 master 分支变更,出现冲突,解决冲突假设要在分支中执行更改,修改分支中的代码。添加一个计算长度的函数:,代码变化如下 - 假设验证代码后,没有问题就提交这些更改。 执行 master 分支变更 同时在分支中,另外一个开发人员()还会更改了内容,并将其更改推送到分支。 验证差异后,现在就提交更新内容。 在分支上,我们已经实现了一个函数。假设经过测试后,提交并将其更改推送到分支。 出现冲突 假设另外一个开发人员()想看看我们在分支上做了

  • 对于很多人来说,合并时出现冲突是非常可怕的事,这就好像一不小心格式化了自己的硬盘一样。在这一章节里我将为你消除这种恐惧。 你不会把事情搞砸 首先你应该记住,你总是可以撤销一个合并操作,并且返回到冲突发生之前的状态。也就是说,你永远有机会放弃并重新开始。 如果你已经掌握了一些关于其它的版本控制系统的使用经验,例如 Subversion ,你可能会很难过。因为在 Subversion 中处理冲突是被大

  • 我正在尝试使用LibGDX为Android制作一个小游戏,并且很难进行碰撞检测。所以,我有两个形状:第一个是矩形(播放器): 第二种是下面的笼子: 我的问题是: 如何检测这两个物体之间的碰撞?我知道的,如何检测冲突的唯一方法是使用Recectgle类中的相交方法,但我想制作比矩形更复杂的形状。 谢谢你的帮助!

  • 问题内容: 我有这个Java代码段。我是Java的菜鸟。 错误: 码: 问题答案: 是的,这是问题所在: 在课程的最高级别,您只能拥有: 实例初始化程序块() 静态初始值设定块() 变量声明 构造函数声明 方法声明 嵌套类型声明 终结器声明 这些都不是。如果你 的意思 来声明一个变量,你应该这样做: 如果这 不是 您想要的,则应解释您的意图。 编辑:修复此问题后,此编译器错误似乎很明显: Conf