如题,我想在刚体点击的时候,它的一定范围内,有爆破力的效果,就像爆炸一样,在此范围内的物体都会被弹开。
有想法的朋友不吝赐教啊!谢谢!
— Begin quote from ____
bailu_1901 发表于 2012-8-25 00:33 url
这个很好实现,我的方法是给这些物体一个冲量,方向是你给定点到该物体质心的向量,冲量大小自己定 …
— End quote
你也是用射线吗?我上面的问题能帮忙回答一下吗?
这个很好实现,我的方法是给这些物体一个冲量,方向是你给定点到该物体质心的向量,冲量大小自己定
— Begin quote from ____
jetion 发表于 2012-8-26 00:10 url
你也是用射线吗?我上面的问题能帮忙回答一下吗?
— End quote
不是射线,射线的方法比较土,用的是aabb query,你给aabb,可以在world里查询这个aabb内body,然后给每个body一个方向为你给定点到该body质心 一个冲量就行了,推荐你看看他源码自带的testbed的事例代码,里面什么都有,这种问题没问题问别人。
为什么问关于Box2D的问题都没人回答?
用光线投射!
不能沉啊,自己顶起
同求,帮顶:)
— Begin quote from ____
super_user_zyc 发表于 2012-8-22 08:12 url
用光线投射!
— End quote
能具体点吗?或者给个代码
这个问题本人目前已有一个解决方法:遍历世界中所有body,算出爆破点和body之间的距离,若距离小于自己设定的爆破半径,则视该body在爆破范围内,根据距离和爆破半径的比例,给于相应大小的冲量,这里我遇到的一个问题就是,我applyForce的时候总是失败,我只能选择使用applyLinearImpulse,蛋疼的菜鸟。。。
— Begin quote from ____
super_user_zyc 发表于 2012-8-23 09:10 url
const float radius = 3.5f;
const float power = 5.0f;
— End quote
太犀利了。弥补了我之前那个方法的一个缺陷:当前面有物品挡住时,按道理应该是不受力的!
几个问题想再请教一下你:
- BodyNode 是你自己封装的节点吗?我用CCSprite代替了,不知道你类里面还有没有实现什么。
- (callback.m_point.x - center.x)* power / dist * (radius - dist)2.0f; 其中(callback.m_point.x - center.x) / dist 是求出余弦值 ,然后power ,当然,还有受距离比例的影响,越远的受力越小,相乘,就得到速度在x轴方向的分量了,但是按我的分析,如果要这么实现的话。代码应该是这样:
v.x = ((callback.m_point.x - center.x) / dist) * ((radius - dist) / radius) * power;
v.y = ((callback.m_point.y - center.y) / dist) * ((radius - dist) / radius) * power;
所以只要又请教你上面的算法是为了实现什么的?
3.SetLinearVelocity和ApplyLinearImpulse有什么区别,我用SetLinearVelocity发现了一个现在,好像速度不过质心,也就是说,当受力物体在爆炸物体的正上方是,它并没有像想象中的那样往上飞,而是抛物线的飞出去了,,,不知道我测试的准不准,求指教!
const float radius = 3.5f;
const float power = 5.0f;
RayCastClosestCallback callback;
b2Vec2 center = GetBody()->GetPosition();
b2Vec2 point2;
for(float angle = 0; angle < b2_pi*2; angle += 0.5f){
point2.x = radius*cosf(angle) + center.x;
point2.y = radius*sinf(angle) + center.y;
callback.m_hit = false;
GetBody()->GetWorld()->RayCast(&callback, center, point2);
if(callback.m_hit){
BodyNode* bodynode = (BodyNode*)(callback.body->GetUserData());
if(bodynode != NULL){
float dist = b2Distance(center, callback.m_point);
b2Vec2 v;
if(radius - dist > 0){
v.x = (callback.m_point.x - center.x)* power / dist * (radius - dist)*2.0f;
v.y = (callback.m_point.y - center.y)* power / dist * (radius - dist)*2.0f;
callback.body->SetLinearVelocity(v);
}
}
}
}
class RayCastClosestCallback : public b2RayCastCallback
{
public:
RayCastClosestCallback()
{
m_hit = false;
}
float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point,
const b2Vec2& normal, float32 fraction)
{
m_point = point;
body = fixture->GetBody();
m_hit = true;
return fraction;
}
bool m_hit;
b2Vec2 m_point;
b2Body* body;
};