检测后如何处理碰撞

时间:2013-05-14 11:36:59

标签: java collision rectangles 2d-games

过去几天我一直在尝试将简单的碰撞放入我的简单游戏中。我在互联网上看了很多地方,但我没有发现任何有用的东西。我只是在使用边界框,而我想让玩家框完成的任务就是从四边中的任意一侧击中挡块时停止(并且不会卡住或反弹到挡块上)。听起来不那么难,但我发现它非常困难。我真的只想知道我需要在if语句的括号中放入的代码,我已经阅读并听到了我可以采用的所有理论。如果可以,请帮忙。

if(bb_collide(player,block)){  //detection works just fine, 
                                      //just not sure what to do afterwards


    }
    else{
        player.setX((player.getX() + velx));
        player.setY((player.getY() - vely));
        player.set_coll(player.getX(),player.getY(),player.getWidth(),player.getHeight());
        block.set_coll(block.getX(),block.getY(),block.getWidth(),block.getHeight());

    }

我实际上想通了,我只是有几个糟糕的日子,对不起,如果我有一种不好的态度或者其他什么,但我得到它做我想要的。如果有人感兴趣的话,我会做什么,因为它对于一个移动物体(移动物)撞到另一个静止物体(保姆)非常有效。它找到了碰撞的两侧之间的距离,并将速度设置为该距离减去几个,因此它不会重叠。我有边界框渲染,所以我可以看到它们重叠。谢谢你的回复!

    public void Fix_Vel(Player mover, Terrain sitter){

    if(sitter.coll_box.contains(mover.getX() + mover.getHeight() + mover.getVelX(), mover.getY()) || 
            sitter.coll_box.contains(mover.getX() + mover.getHeight() + mover.getVelX(), mover.getY() + mover.getHeight()) ){        //mover top right and bottom right coords right collision testing

        mover.setVelX(sitter.getX() - (mover.getX() + mover.getWidth()) - 2);

    }

    if(sitter.coll_box.contains(mover.getX() + mover.getVelX(), mover.getY()) || 
            sitter.coll_box.contains(mover.getX() + mover.getVelX(), mover.getY() + mover.getHeight()) ){                               //mover top left + bottom left coords left collision testing

        mover.setVelX((sitter.getX() + sitter.getWidth()) - mover.getX() + 2);  

    }

    if(sitter.coll_box.contains(mover.getX(), mover.getY() + mover.getVelY()) || 
            sitter.coll_box.contains(mover.getX() + mover.getWidth(), mover.getY() + mover.getVelY())){                                 //mover top left + top right coords top collision testing

        mover.setVelY((sitter.getY() + sitter.getHeight()) - mover.getY() + 2);


    }

    if(sitter.coll_box.contains(mover.getX(), mover.getY() + mover.getHeight() + mover.getVelY()) ||                                //mover bottom left and bottom right coords bottom collision testing
            sitter.coll_box.contains(mover.getX() + mover.getWidth(), mover.getY() + mover.getHeight() + mover.getVelY())){

        mover.setVelY(sitter.getY() - (mover.getY() + mover.getHeight()) - 2);
        jumping = false;

        if(mover.getVelY() < 0)
            mover.setVelY(0);   

    }
}

2 个答案:

答案 0 :(得分:0)

你没有说每个盒子是如何被控制的,所以我不确定你想要什么。如果检测有效,只要它不会允许物体移动,如果它会导致碰撞。

PS:I really just wanna know the code that i need to put in the if statement's brackets, I've read and heard all the theory I can take.老实说,凭借这种态度,你不会走得太远而且你总是需要别人的帮助。游戏编程需要相当数量的数学直觉。三角学,微积分和线性代数是必不可少的。

答案 1 :(得分:0)

也许你想做这样的事情?

if(bb_collide(player,block)){
    velx = 0;
    vely = 0;
}
else{
    player.setX((player.getX() + velx));
    player.setY((player.getY() - vely));
    player.set_coll(player.getX(),player.getY(),player.getWidth(),player.getHeight());
    block.set_coll(block.getX(),block.getY(),block.getWidth(),block.getHeight());

}