如果我将播放器的“hspeed”变量(水平速度)设置为足够慢的速度, 然后,当他超过16x16区块的差距时,他将按计划跌倒。 但是,如果我将“hspeed”变量设置得足够高,他就会走得太快,以至于他将它悬停在它上面。 虽然它在我将它设置为慢速时有效,但它太慢。
这是一个例子: http://img199.imageshack.us/img199/2685/demondj.png
这是我的碰撞代码(遍历块列表):
for(unsigned int i = 0; i<blocks.size(); i++){
Block &b = blocks.at(i);
if(!b.passable){
//Check if we are on the sides
if(y + height + vspeed >= b.worldY+2 && y + vspeed <= b.worldY+b.height)
{
//Right side
if(x + hspeed <= b.worldX+b.width+1 && x + hspeed > b.worldX+b.width + hspeed-1)
{
x = b.worldX + b.width; hspeed = 0;
}
//Left side
if(x + width + hspeed >= b.worldX +1 && x + width + hspeed <= b.worldX + hspeed + 1)
{
x = b.worldX - width; hspeed = 0;
}
}
//Check if we are on the top or the bottom
if(x + width + hspeed >= b.worldX+1 && x + hspeed <= b.worldX+b.width-1)
{
if(y + height + vspeed >= b.worldY && y + height + vspeed <= b.worldY + vspeed + 1 && jumpstate=="falling")
{
y = b.worldY - height; jumpstate.assign("ground"); vspeed = 0;
}
if(y + vspeed <= b.worldY + b.height && y + vspeed >= b.worldY + b.height + vspeed + 1 && jumpstate=="jumping")
{
y = b.worldY + b.height; jumpstate.assign("falling"); vspeed = 0;
}
}
}
}
我的碰撞代码有问题吗? 另一个问题是,当我触及一个块的底部时,它有点毛病。 他应该立即反弹,但他确实如此,但是如果他正在移动并且他击中了一个区块的底部,他会感到紧张。
答案 0 :(得分:2)
好的,这里有很多东西:
1)魔法数太多了。不确定+2,+ 1等究竟是什么意思。我想把它们视为常数。另外,我对操作的顺序很偏执,所以我会用括号括起来,以防万一:)
2)不确定你的vars是什么类型。假设漂浮,但他们感觉像是整理。
3)更大的问题是,你设计的代码不能很好地正确处理“大”速度。行进速度比可碰撞区域的宽度/高度快的东西将无法被可靠地检测到。你也不能轻易使用这种类型的碰撞代码。这是你已经看到的一个副作用,我的猜测是你为其余部分做出贡献的软糖因素。
考虑使用基于矢量的碰撞系统。将框的每个边缘视为线矢量。然后,您可以进行非常简单的数学运算,以确定一个点是从一条线的一侧开始到另一条点结束(十字产品的符号),并且点的符号将告诉该点是否在线段内。此外,它允许您的碰撞对象成为任何形状,甚至使数学可以很容易地扩展到3D。这种系统也是更友好的并行处理。