在过去的几天里,我一直在尝试将简单的碰撞放入我的简单游戏中。我已经在互联网上查看了很多地方,但我没有发现任何有用的东西。我只是使用边界框,我想要玩家框做的就是在它从四个侧面中的任何一个击中块时停止(并且不会卡住或反弹到块上)。听起来并不难,但我发现它非常困难。我真的只是想知道我需要放在 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);
}
}