当前位置: 代码迷 >> java >> 播放器与图块之间的碰撞检测几乎可以正常工作
  详细解决方案

播放器与图块之间的碰撞检测几乎可以正常工作

热度:46   发布时间:2023-07-31 11:42:57.0

我一直坚持在游戏中进行一些碰撞检测(有点像 ),但是我编写了这段代码,而且……行得通。 如果碰撞在播放器的上方或左侧,则有效,但如果碰撞在播放器的右侧或下方,而不是反弹,播放器将加速穿过积木,直到有可用空间。 这是我制作的代码:

private void checkCollision() {
    for(int x = (int) (xpos-1); x <= xpos+1; x++){
        if(x < 0 || x > main.mw-1) continue;

        for(int y = (int) (ypos-2); y <= ypos+1; y++){
            if(y < 0 || y > main.mh-1) continue;

            if(main.map[x][y] == null) continue;
            if(!main.map[x][y].solid) continue;
            if(main.map[x][y].blocktype == -1) continue;

            double distance = Math.sqrt((xpos-x)*(xpos-x) + (ypos-y)*(ypos-y));

            if(distance > 1.0){
                continue;
            }else{

                double x_overlap = Math.max(0, Math.min(xpos + 16, x + 16) - Math.max(xpos, x));
                double y_overlap = Math.max(0, Math.min(ypos + 32, y + 16) - Math.max(ypos, y));
                double overlapArea = x_overlap * y_overlap;

                if(overlapArea > 0){

                    if(x_overlap > y_overlap){
                        yblock += y_overlap/2;
                    }
                    if(x_overlap < y_overlap){
                        xblock += x_overlap/2;
                    }

                    //guessing i need to do something here to make player 
                      go other way if block is on other side
                }
            }
        }
    }
}

因此,如果与他发生碰撞的方块位于右侧或下方,我将如何使玩家反弹。 另外,还有什么方法可以使我更顺滑-现在玩家在各处弹跳。 谢谢! :)

您要做的就是跟踪玩家的位置,如果移动后的位置超出范围,则可以将玩家的位置重置为位于限制的边缘。

这就是我处理碰撞检测的方式,尽管有些人决定拒绝回答,但我回答了另一个与此问题类似的问题。