转载自:http://www.oasku.com/?question/view/78.html
iphone上如何用box2d实现爆炸效果?
1.先取得爆炸这点point,然后根据这个点构建一个矩形,保证此点为矩形的中心。(矩形用来模拟爆炸的影响范围)
2.遍历所以的body,如果body在中心点在矩形之内,则:
3.根据爆炸点和body的中心点求出一个角度。
4.根据两点距离设置所给冲量的大小。
5.根据角度和距离对body一个冲量。
这样就模拟出爆炸的效果了
-网上找的,能说明详细点怎么做吗?
//大概是这样的
b2Vec2 d1;
d1.Set(-0.55f, -0.55f);
b2Vec2 d2;
d2.Set(0.55f, 0.55f);
//检测矩形的左下角和右上角两个点
b2AABB aabb;
aabb.lowerBound= body_box2d->GetPosition()+d1;
aabb.upperBound= body_box2d->GetPosition()+d2;
//遍历世界里的所有对象
QueryCallback callback(body_box2d->GetPosition());
body_box2d->GetWorld()->QueryAABB(&callback, aabb);
if (callback.m_fixture){
//取得和矩形有交点的对象
b2Body* body = callback.m_fixture->GetBody();
b2Vec2 vec = body->GetPosition();
//...
}
//其中QueryCallback是这样的:
class QueryCallback : public b2QueryCallback{
public:QueryCallback(const b2Vec2& point){
m_point = point;
m_fixture = NULL;
}
/// Called for each fixture found in the query AABB.
/// @return false to terminate the query.
bool ReportFixture(b2Fixture* fixture){
b2Body* body = fixture->GetBody();
b2Vec2 vec = body->GetPosition();
//检测框AABB里面有,不算
if(vec.x==m_point.x&&vec.y==m_point.y){
m_fixture = NULL;return TRUE;
}
m_fixture = fixture;
// We are done, terminate the query.
return false;
}
b2Vec2 m_point;
b2Fixture* m_fixture;
};