0

我需要帮助检查我正在创建的游戏中的交叉点:当角色与屏幕上的单个障碍物发生碰撞时,一切都会按预期工作,但是当屏幕上添加多个障碍物时,角色只能跳出最后一个障碍物正在检查碰撞。角色仍然可以正确地与其他障碍物发生碰撞(不会跌落,无法通过),但无法跳下它们。Obs 是障碍物的数组列表。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);
        }
4

1 回答 1

0

您的错误最可能的原因是后续调用checkIntersect()覆盖ground. 这导致ground仅反映对 的最后一次调用的值checkIntersect()。要修复此错误,您应该ground在调用. 然后,修改该方法,使其只能设置为非默认值。什么时候应该是默认值,不需要设置。truefalsecheckIntersect()checkIntersect()groundground

做这样的事情。我使用的是默认值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;
        }
于 2013-06-09T00:22:35.490 回答