首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要有关Breakout游戏碰撞错误的帮助

需要有关Breakout游戏碰撞错误的帮助
EN

Stack Overflow用户
提问于 2013-02-25 11:58:18
回答 1查看 480关注 0票数 0

这是一个12年级的OPP作业。

目前我有一个问题,那就是球偶尔会进入拦网,而不是反射。

下面是我的代码:

main如何检查球是否正在命中一个区块:

代码语言:javascript
复制
public void theBall(){
    //System.out.println(blocks.size());
    if(!started){
        balls.get(0).withPaddle(paddle.returnX());
    }
    if(started){
        for(int i=0;i<balls.size();i++){
            if(balls.get(i).returnX()>=0 && balls.get(i).returnX()<=800 && balls.get(i).returnY()>=0){
                balls.get(i).move();
            }
            if(balls.get(i).returnX()+balls.get(i).returnDx()<= 0){
                balls.get(i).collide(1);//collide with left wall
            }
            if(balls.get(i).returnX()+10+balls.get(i).returnDx() >= 800){
                balls.get(i).collide(2);//collide with right wall
            }
            if(balls.get(i).returnY()-balls.get(i).returnDy() <= 0){
                balls.get(i).collide(3);//collide with up wall
            }

            if(paddle.returnX() < balls.get(i).returnX() && balls.get(i).returnX()< paddle.returnX()+paddle.returnSize() && balls.get(i).returnY()-balls.get(i).returnDy() >= 545){//fix this && balls.get(i).returnY()-balls.get(i).returnDy() <= 560
                balls.get(i).collidePaddle(balls.get(i).returnX()-paddle.returnX());//collide with paddle
                //System.out.println(ball.returnDy());
            }
            for(int j=0;j<blocks.size();j++){
                //blocks.get(j).getHit(balls.get(i));
                if(balls.get(i).returnX()+10+balls.get(i).returnDx() >= blocks.get(j).returnX() && balls.get(i).returnX()+10+balls.get(i).returnDx() <= blocks.get(j).returnX()+5 && balls.get(i).returnY() >= blocks.get(j).returnY() && balls.get(i).returnY() < blocks.get(j).returnY()+50){
                    if(!blocks.get(j).returnHit()){
                        balls.get(i).collide(2);//collide with right wall (block's left)
                        blocks.get(j).getHit(balls.get(i));
                        System.out.println("boiboiboiboibo1");
                    }
                }

                if(balls.get(i).returnX()+balls.get(i).returnDx() <= blocks.get(j).returnX()+50 && balls.get(i).returnX()+balls.get(i).returnDx() >= blocks.get(j).returnX()+45 && balls.get(i).returnY() >= blocks.get(j).returnY() && balls.get(i).returnY() < blocks.get(j).returnY()+50){
                    if(!blocks.get(j).returnHit()){
                        balls.get(i).collide(1);//collide with left wall (block's right)
                        blocks.get(j).getHit(balls.get(i));
                        System.out.println("boiboiboiboibo2");
                    }
                }

                if(balls.get(i).returnX() >= blocks.get(j).returnX() && balls.get(i).returnX() < blocks.get(j).returnX()+50 && balls.get(i).returnY()-balls.get(i).returnDy() <= blocks.get(j).returnY()+50 && balls.get(i).returnY()-balls.get(i).returnDy() >= blocks.get(j).returnY()+45){
                    if(!blocks.get(j).returnHit()){
                        balls.get(i).collide(3);//collide with up wall (block's bottom)
                        blocks.get(j).getHit(balls.get(i));
                        System.out.println("boiboiboiboibo3");
                    }
                }
                if(balls.get(i).returnX() >= blocks.get(j).returnX() && balls.get(i).returnX() < blocks.get(j).returnX()+50 && balls.get(i).returnY()+10-balls.get(i).returnDy() >= blocks.get(j).returnY() && balls.get(i).returnY()+10-balls.get(i).returnDy() <= blocks.get(j).returnY()+5){
                    if(!blocks.get(j).returnHit()){
                        balls.get(i).collide(4);//collide with down wall (block's top)
                        blocks.get(j).getHit(balls.get(i));
                        System.out.println("boiboiboiboibo4");
                    }
                }
            }
            for(int j=0;j<specialBlocks.size();j++){
                if(balls.get(i).returnX()>=specialBlocks.get(j).returnX() && balls.get(i).returnX()<=specialBlocks.get(j).returnX()+100 && balls.get(i).returnY()>=specialBlocks.get(j).returnY() && balls.get(i).returnY()<=specialBlocks.get(j).returnY()+100){
                    oneAndThreeBalls(i, j);
                    balls.get(i).changeType(j);
                }
            }
        }
    }
}

球如何反射:

代码语言:javascript
复制
public void collide(int collideWith){
    if(collideWith==1){//collide with left wall
        if(90<direction && direction<180){
            direction = 180-direction;
        }
        if(180<direction && direction<270){
            direction = 540-direction;
        }
    }
    if(collideWith==2){//collide with right wall
        if(0<direction && direction<90){
            direction = 180-direction;
        }
        if(270<direction && direction<360){
            direction = 540-direction;
        }
    }
    if(collideWith==3){//collide with up wall
        direction = 360-direction;
    }
    if(collideWith==4){//collide with down wall
        direction = 360-direction;

    }
}

我很清楚这个bug是由于对边界的双重检查造成的。当球在一个区块的角落时,它就会发生。但这是我能想到的唯一方法来检查球的位置来反映。有什么办法可以修复这个bug吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-02-25 12:03:39

为什么不这样做呢:

1)弹跳后,您停止检查该球的碰撞,直到游戏的下一个滴答声。这样一来,一个球在一个滴答声中只能反弹一次。

2)在与区块碰撞和反弹后,忽略该特定区块与球之间的碰撞,直到球不与区块重叠为止。这样一来,一个球就不能在同一次撞击中从一块木块上错误地反弹两次。

顺便说一句,你有很多复制和粘贴的代码,只是在数字等方面做了一些细微的改变。如果你找到了一种方法,用你不断调用的方法来重述它,你的代码会变得更整洁,问题的基本对称性也会更明显。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15059856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档