球到矩形的碰撞

g6ll5ycj  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(376)

你好,我在做一个java游戏,需要从一个球到一个长方形的碰撞。
位置x=球的x值
位置y=球的y值
vel.x=球的x速度
vel.y=球的y速度
sh=球的高度
sw=钢球宽度
w=矩形宽度
h=矩形高度
到目前为止,我已经:

boolean insideRect = pos.x >= X && pos.x <= X+W && pos.y >= Y && pos.y <= Y+H;

  if(insideRect){

    if(pos.y + sh/2 >= H){
       vel.y = (-1*vel.y)*gravity;
       vel.x *= .6;
       if(pos.y < Y+H/2){
         pos.y = Y;
       } else{
         pos.y = Y+H;
       }
    }
    if(pos.x + sw/2 > W){
       vel.x = -1*vel.x;
    }       
  }

然而,这只是说如果它击中了矩形的左侧或右侧,如果它击中了顶部或底部。
因此,如果在if语句下打印,则输出为:(left,up),(right,down),(left,down),(right,up)
所以问题是,要让它工作,我只能有一个,左,右,上,或下。
如果我有两个,那么它认为它都击中了天花板和右边的墙,并且有两个视觉输出。
我怎样才能解决这个问题?

abithluo

abithluo1#

/**
     * checks to see if the obstacles and balls collide.
     * Utilizes bounding boxes for obstacles and coordinates for ball:
     * + = Obstacle
     *            ballTop
     *             : :
     *          :      :
     *ballLeft :        : ballRight
     *          :      :
     *            : :
     *         ballBottom
     *
     *          ____
     *          |+++|
     *          |+++|
     *          |+++|
     *          ----
     * @param ball
     * @param rect
     * @return boolean
     */

    public boolean intersects(Ball ball, Obstacle rect){
        double r = ball.getRadius();

        double rectTop = rect.y;
        double rectLeft = rect.x;
        double rectRight = rect.x + rect.width;
        double rectBottom = rect.y + rect.height;

        double ballTop = ball.y - r;
        double ballLeft = ball.x - r;
        double ballRight = ball.x + r;
        double ballBottom = ball.y + r;

        //NO COLLISIONS PRESENT
        if(ballRight < rectLeft){
            return false;
        }
        if(ballTop > rectBottom){
            return false;
        }
        if(ballBottom < rectTop){
            return false;
        }
        if(ballLeft > rectRight){
            return false;
        }

        //HAS TO BE A COLLISION
        return true;
    }

//In Logic File
private void collideBallObstacles(Ball ball,Obstacle rect){
        if(rect.intersects(ball, rect)){
            ball.velX *= -1;
            ball.velY *= -1;
            if (ball == player){
                flashGreen();
                obstaclesevaded--;
            }
            obstacles.remove(rect);
        }
    }

您还必须呈现此代码,并更改变量或创建适合此代码的变量。
只是好奇这个游戏的名字会是什么?

相关问题