if(!projectiles.empty()){
sort(projectiles.rbegin(), projectiles.rend()); //Occasionally I get bad sort error. No idea why.
}
射弹是一种充满抛射物结构的std :: vector。如果执行“fire”命令,则在每个帧中添加这些,如果超时,则自动删除每个帧。
在射弹中:
bool operator < (const projectile& proj) const
{
return (D3DXVec3Dot(&pos, p_camera.GetWorldAhead()) < D3DXVec3Dot(&proj.pos, p_camera.GetWorldAhead()));
}
... pos是一个D3DXVECTOR3,它具有射弹在3D空间中的位置 - 可以工作(分类用于在alpha混合时进行深度检查)。对于那些想知道的人,D3DXVec3Dot返回一个浮点数。但有时候,特别是屏幕上有很多射弹,它会抛出:
Debug Assertion失败!
程序:C:\ Windows \ system32 \ MSVCP110D.dll文件: e:\ applications \ vc \ include \ algorithm行:3566
表达式:无效的运算符&lt;
有关程序如何导致断言失败的信息, 请参阅关于断言的Visual C ++文档。
不确定原因。任何帮助深表感谢。
答案 0 :(得分:1)
我知道,这不是一个正确的答案,但评论的时间太长了。
错误消息表明比较不一致 - sort
函数希望每次都以相同的方式保持相同的值。如果它检测到两个相同值的比较产生相反的结果,则会抛出此错误。我怀疑你的比较是错误的,或者内部计算在不同时间给出不同的结果(例如,射弹被移动)。
鉴于您有时只获得它,它表示竞争条件或导致结果不稳定的小计算错误。
并确认在排序时,相机或射弹没有移动 - 如果其中一个或两个在排序过程中移动,您将永远无法解决此问题。
答案 1 :(得分:0)
我通过在帧开始时将每个结构的距离保存在自己的变量中一次,然后比较那些 - 这样就没有出现竞争条件的机会,从而解决了这个问题。谢谢提醒伙计。 :)
答案 2 :(得分:0)
您还可以在调用sort
之前添加简单检查您的矢量是否已经排序。在我的情况下,它帮助了我。