簡體   English   中英

方塊之間的2D碰撞檢測,簡單但比布爾值更具體+不受大型空間跳躍的影響

[英]2D Collision Detection between squares, simple but more specific than boolean + immune to large spacial jumps

想知道玩家從哪個方向擊打地形圖塊(只需簡單地向上/向下,向左/向右)。 我發現的一切都太簡單了,或者太復雜了,似乎對於我所需的東西來說太多了,比如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;

}

大多數情況下都有效。 即使長時間睡眠使增量飆升,玩家也不會逐步穿越障礙。 除非玩家的先前位置(mX / mY)與我們要檢查的塊不在同一平面上,否則碰撞檢測本身將起作用(請參見帶有“ THIS ...”的注釋行)。 假設我們與街區完美對角,然后直線移動,播放器將向右滑動。 我已經摸索了一段時間,試圖找出解決最后一個問題的方法,最好是不進行任何大修,但是如果必須解決的話,哦,好! 我只對簡單的碰撞數據感興趣,例如“我在這個框架上碰過地板嗎?可以跳嗎?”,“我現在在碰壁嗎?可以跳牆,但是如果我也碰過地板就不感興趣”等

由對象的AABB的大小(保持壁的AABB的固定的中心)生長的壁的AABB,構造從對象的之前和位置(使用對象的AABB的中心) 的線段,然后做一個分段AABB相交測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM