Java游戏:检查交叉点和跳跃

时间:2013-06-08 23:18:48

标签: java game-physics

我需要帮助检查我正在创建的游戏中的交叉点:当角色与屏幕上的单个障碍物碰撞时,一切都按预期工作,但是当屏幕上添加了多个障碍物时,角色只能跳出正在检查碰撞的最后一个障碍。角色仍然与其他障碍物正确碰撞(不会通过,不能穿过),但不能跳出它们。 Obs是一个障碍的arraylist。 Ground是布尔值,用于确定是否允许角色跳跃。

public void checkIntersect(ArrayList<Obstacle> obs){
    for(Obstacle a: obs){


        if(a.getLeft().intersects(this.getRight())){
            if(getDx()>0){
                sidecollision=true;
                setDx(0);
                this.x-=1.5f;
            }
        } if (a.getRight().intersects(this.getLeft())){
                sidecollision = true;
                setDx(0);
                this.x+=1.5f;
        } if((a.getTop()).intersects(this.getBottom())){
            ground=true;
            setDy(0);
            this.y-=.10f;
        } else if(!(a.getTop()).intersects(this.getBottom())){ 
                ground = false;

                //return ground;        
        } if(a.getBottom().intersects(this.getTop())){
            ground=false;
            setDy(0);

            this.y+=.1f;
        }

    }
} 

以及如何在游戏组件上检查碰撞:

bg.update(quote);
        win.fill(clear);
        bg.drawBG(win);
        for(Obstacle o: obs){
            o.draw(win);
            o.update(bg);
        }
        if(quote.isVisible()){

                quote.movedrawProtag(win, keys);
                quote.checkIntersect(obs);
        }

1 个答案:

答案 0 :(得分:0)

导致错误的最可能原因是后续调用checkIntersect()会覆盖ground的值。这导致ground的值仅反映最后一次调用checkIntersect()。要解决此错误,您应在ground之前将true设置为falsecheckIntersect()的默认值。然后,修改checkIntersect()方法,使其只能将ground设置为非默认值。当ground应该是默认值时,不需要设置它。

做这样的事情。我使用的默认值为false

public void checkIntersect(ArrayList<Obstacle> obs){
    for(Obstacle a: obs){


        if(a.getLeft().intersects(this.getRight())){
            if(getDx()>0){
                sidecollision=true;
                setDx(0);
                this.x-=1.5f;
            }
        } if (a.getRight().intersects(this.getLeft())){
                sidecollision = true;
                setDx(0);
                this.x+=1.5f;
        } if((a.getTop()).intersects(this.getBottom())){
            ground=true;
            setDy(0);
            this.y-=.10f;
        } else if(!(a.getTop()).intersects(this.getBottom())){ 
                // ground = false;

                //return ground;        
        } if(a.getBottom().intersects(this.getTop())){
            // ground=false;
            // setDy(0);

            // this.y+=.1f;
        }

    }
} 

检查碰撞时:

bg.update(quote);
        win.fill(clear);
        bg.drawBG(win);
        for(Obstacle o: obs){
            o.draw(win);
            o.update(bg);
        }

        // Set ground to its default value
        quote.ground = false;  

        if(quote.isVisible()){

                quote.movedrawProtag(win, keys);
                quote.checkIntersect(obs);
        }

        // If ground has not been set to true, do the default action
        if (quote.ground == false) {
            setDy(0);
            quote.y += .1f;
        }