进行适当的碰撞(防止通过对象进行gliching示例)

时间:2015-10-23 06:27:31

标签: java collision

花了一些时间,但最后我有一个适当的碰撞检测,我现在需要做的是使碰撞正常工作,我有点难以正确完成它,所以也许有人有提示或一个很好的建议,因为我现在已经尝试了几个小时..

在我的代码中,我将有一个布尔值,当检测到碰撞时它变为真,当发生这种情况时,我想我会反转我的相机的移动速度以使碰撞工作,但我知道事实上,这会导致一些问题:

int Up_Down = 0;
int Left_Right = 0;

    if(Input.GetKey(w_Key)) { Up_Down = 1; System.out.println("w = " + Up_Down); }          
    if(Input.GetKey(s_Key)) { Up_Down = 2; System.out.println("s = " + Up_Down); }

    if(Input.GetKeyDown(a_Key)) { Left_Right = 1; System.out.println("lastPressed = a"); }
    if(Input.GetKeyDown(d_Key)) { Left_Right = 2; System.out.println("lastPressed = d"); }

我在这里检查最后按下了什么键,以便在前一个标题的反方向上反转移动速度。

            if(collision == true) // true when collision detection is true
            {
            // See what key was pressed last and reverse direction by movAmt
                if(Up_Down == 1) {
                    Move(GetTransform().GetRot().GetForward(), -movAmt);
                }

                if(Up_Down == 2) {
                    Move(GetTransform().GetRot().GetForward(), movAmt);
                }

                if(Left_Right == 1) {
                    Move(GetTransform().GetRot().GetLeft(), -movAmt);
                }

                if(Left_Right == 2) {
                    Move(GetTransform().GetRot().GetRight(), -movAmt);
                }
            }

这是我发现的唯一可以防止任何可能在墙上出现问题的方法,如果你足够努力,所有其他想法最终都会出现问题。不过,还有一个问题:

当你给出足够多的不同输入时,相机将从墙上滑落而不是仅仅撞到它们并停止,例如:

如果我按下' w'并直接进入墙壁一切正常,但如果我例如按下' d'在某一点上再次直接进入墙壁,并且' w'我会向左滑动,因为整数' Left_Right = 2'现在,这会导致“反向运动”的反向运动。 (向左而不是向右),即使我只是直接走进某个东西......

  • 如何摆脱这种滑动效果?

到目前为止,我还没有解决这个问题而没有引起其他问题,我感谢任何帮助..如果您需要更多代码或信息,请告诉我。非常感谢!

更新:只是将速度设置为零不会起作用,因为那时我会被困在墙上,除非我从物体上退了一步,否则碰撞将永远是真的:

            if(collision == true)
            {
                if(Input.GetKey(w_Key))
                    Move(GetTransform().GetRot().GetForward(), 0);
                if(Input.GetKey(s_Key))
                    Move(GetTransform().GetRot().GetBack(), 0);
                if(Input.GetKey(a_Key))
                    Move(GetTransform().GetRot().GetLeft(), 0);
                if(Input.GetKey(d_Key))
                    Move(GetTransform().GetRot().GetRight(), 0);
            }

1 个答案:

答案 0 :(得分:0)

好的,我已经尝试了一些东西,最后让它发挥作用。现在,当你将拖车移到墙上时,你会完全停下来,当你松开钥匙时,你会从墙上移回一点 - 这让它看起来很漂亮'靠在墙上'的感觉:

            if(collision == true) {

                if(lastKey == 1) {
                    if(Input.GetKey(w_Key)) {
                        Move(GetTransform().GetRot().GetForward(), movAmt);
                    }
                    Move(GetTransform().GetRot().GetForward(), -movAmt);
                }

                if(lastKey == 2) {
                    if(Input.GetKey(s_Key)) {
                        Move(GetTransform().GetRot().GetBack(), movAmt);
                    }
                    Move(GetTransform().GetRot().GetBack(), -movAmt);   
                }

                if(lastKey == 3) {
                    if(Input.GetKey(a_Key)) {
                        Move(GetTransform().GetRot().GetLeft(), movAmt);
                    }
                    Move(GetTransform().GetRot().GetLeft(), -movAmt);   
                }

                if(lastKey == 4) {
                    if(Input.GetKey(d_Key)) {
                        Move(GetTransform().GetRot().GetRight(), movAmt);
                    }
                    Move(GetTransform().GetRot().GetRight(), -movAmt);  
                }

            } else

            if(collision == false) {

            if(Input.GetKeyDown(w_Key)) { lastKey = 1; System.out.println("w = "+lastKey); }
            if(Input.GetKeyDown(s_Key)) { lastKey = 2; System.out.println("s = "+lastKey); }    
            if(Input.GetKeyDown(a_Key)) { lastKey = 3; System.out.println("a = "+lastKey); }    
            if(Input.GetKeyDown(d_Key)) { lastKey = 4; System.out.println("d = "+lastKey); }    

            if(Input.GetKey(l_shift))
            {
                if(Input.GetKey(w_Key))
                    Move(GetTransform().GetRot().GetForward(), movAmt*4);
                if(Input.GetKey(s_Key))
                    Move(GetTransform().GetRot().GetBack(), movAmt*4);
                if(Input.GetKey(a_Key))
                    Move(GetTransform().GetRot().GetLeft(), movAmt*4);
                if(Input.GetKey(d_Key))
                    Move(GetTransform().GetRot().GetRight(), movAmt*4);
            } else {
            if(Input.GetKey(w_Key))
                Move(GetTransform().GetRot().GetForward(), movAmt);
            if(Input.GetKey(s_Key))
                Move(GetTransform().GetRot().GetBack(), movAmt);
            if(Input.GetKey(a_Key))
                Move(GetTransform().GetRot().GetLeft(), movAmt);
            if(Input.GetKey(d_Key))
                Move(GetTransform().GetRot().GetRight(), movAmt);
            }

希望这也可以帮助其他人!