Java 正方形之间的2D碰撞检测,简单但比布尔+更具体;对大空间跳跃免疫

Java 正方形之间的2D碰撞检测,简单但比布尔+更具体;对大空间跳跃免疫,java,collision-detection,Java,Collision Detection,想知道玩家从哪个方向打地形图(只需简单的上/下、左/右)。我发现的一切要么太简单,要么就复杂得多,似乎太多了,无法满足我的需要,比如AABB(尽管很难说,但我的大脑很难消化相当长的方程式)。到目前为止,我所得到的是今天花大部分时间阅读和实验的结果: public int move(double toX, double toY) { int col = COLLISION_NONE; //these are bit flags, in case I collide with a bloc

想知道玩家从哪个方向打地形图(只需简单的上/下、左/右)。我发现的一切要么太简单,要么就复杂得多,似乎太多了,无法满足我的需要,比如AABB(尽管很难说,但我的大脑很难消化相当长的方程式)。到目前为止,我所得到的是今天花大部分时间阅读和实验的结果:

public int move(double toX, double toY) {

    int col = COLLISION_NONE; //these are bit flags, in case I collide with a block to my right as well as below me

    double nextX = mX+(toX*main.getDelta()); //delta regulates speed
    double nextY = mY+(toY*main.getDelta());

    if(mTerrainCollision){

        int w = GameView.GameLoop.TILE_WIDTH;
        int h = GameView.GameLoop.TILE_HEIGHT;

        for(int i = -2; i <= 2; i++) //broad tile picking will be optimized later, better trace around players path
            for(int j = -2; j <= 2; j++) {
                GameTerrain.Block block = main.mTerrain.get(((int)Math.round(mX)/w)+i,((int)Math.round(mY)/h)+j);
                if(block.type != GameTerrain.BLOCK_TYPE_NONE) {

                    if(nextX+w >= block.x() && mX+w <= block.x()){ //COLLISION ON THE RIGHT?
                        if(mY+h > block.y() && mY < block.y()+h) { //<THIS is a problem line, see below
                            nextX = block.x() - w;
                            xMomentum = 0;

                            col |= COLLISION_RIGHT;
                        }
                    }

                    else if(nextX < block.x()+w && mX >= block.x()+w){ //COLLISION ON THE LEFT?
                        if(mY+h > block.y() && mY < block.y()+h) { //same as above, make sure were on the same plane
                            nextX = block.x() + w;
                            xMomentum = 0;

                            col |= COLLISION_LEFT;
                        }
                    }


                    if(nextY+h >= block.y() && mY+h <= block.y()){ //COLLISION ON THE BOTTOM?
                        if(mX+w > block.x() && mX < block.x()+w) { //make sure were on the same plane
                            nextY = block.y() - h;
                            yMomentum = 0;

                            col |= COLLISION_DOWN;
                        }
                    }

                    else if(nextY < block.y()+h && mY >= block.y()+h){ //COLLISION ON THE TOP?
                        if(mX+w > block.x() && mX < block.x()+w) { //make sure were on the same plane
                            nextY = block.y() + h;
                            yMomentum = 0;

                            col |= COLLISION_UP;
                        }
                    }
                }
            }
    }

    mX = nextX;
    mY = nextY; 

    return col;

}
public int move(双倍toX,双倍玩具){
int col=COLLISION_NONE;//这些是位标志,以防我与右侧和下方的块碰撞
double-nextX=mX+(toX*main.getDelta());//delta调节速度
double nextY=mY+(toY*main.getDelta());
if(mTerrainCollision){
int w=GameView.GameLoop.TILE\u宽度;
int h=GameView.GameLoop.TILE\u高度;
对于(inti=-2;i block.y()&&mY=block.y()&&mY+h block.x()&&mX=block.y()+h){//顶部发生碰撞?
如果(mX+w>block.x()&&mX

它是有效的。。。主要地即使在长时间的睡眠后,玩家也不会分阶段通过障碍物,这使得三角洲火箭飞涨。除非玩家的前一个位置(mX/mY)与我们正在检查的块不在同一平面上,否则碰撞检测本身就可以工作(请参见带有“THIS…”的注释行)。假设我们和一个方块呈完美的对角线,并向它直线移动,玩家将快速通过。我绞尽脑汁想弄清楚如何着手解决最后一个问题已经有一段时间了,最好是不要对所有事情都进行重大修改,但如果必须这样做的话,哦,好吧!我只对一些简单的碰撞数据感兴趣,比如“我在这帧中触到地板了吗?好的,我可以跳”,“我现在触到墙了吗?好的,我可以跳墙,但如果我也触到地板了就不会跳墙”,等等。

将墙的AABB按对象的AABB的大小增长(保持墙的AABB中心固定),从对象的前后位置构造线段(使用对象的AABB中心),然后执行。

将墙的AABB按对象的AABB大小增长(保持墙的AABB中心固定),从对象的前后位置构造线段(使用对象的AABB中心),然后做一个测试