问题描述
||
如果我将播放器的“ 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;
}
}
}
}
碰撞代码是否有问题?
另一个问题是,当我碰到块的底部时,它会出现一些故障。
他应该马上反弹,但确实会反弹,但是如果他在移动,他会发抖,然后撞到方块的底部。
解决方法
好的,这里有很多事情:
1)魔术数字过多。不确定+ 2,+ 1等的真实含义。我想将它们视为常量。另外,我对操作顺序抱有偏执,所以我将所有内容都括在括号中,以防万一:)
2)不确定您的var是什么类型。假设有浮点数,但它们感觉像是整数。
3)更大的问题是,您设计的代码无法正确处理“大”速度。不能可靠地检测到比可碰撞区域的宽度/高度快的物体。使用这种类型的冲突代码也不容易。这是您已经看到的一种副作用,我的猜测是软糖会增加您对其余部分的贡献。
考虑改为使用基于矢量的碰撞系统。将盒子的每个边缘视为线向量。然后,您可以执行非常简单的数学运算来确定某个点是否从直线的一侧开始并在另一侧结束(叉积的符号),而点的符号将表明该点是否在线段内。而且,它允许您的碰撞对象为任何形状,甚至可以使数学轻松扩展到3D。这种系统也更易于并行处理。