想做一个乌鸦飞的效果,却发现一群乌鸦碰在一起老是会出现头上脚下的情况,感觉很是不好
于是想到了一个办法:
乌鸦的body 包含两个 fixture,一个在上,一个在下,上面的 fixture 密度设置的远远小于下面的fixture的密度,
这样的话,脚重头轻,便不会再出现头下脚上的情况了。
可事实总是让人无比蛋疼,即使将下面的密度设置为了上面密度的一百倍,问题还是没有得到解决~
思考了一下,或许是因为下面的fxiture面积太小,而上面的太大,还有可能就是施力点,或者是惯性什么的原因~
懒得去多想了,回想其以前还想看到过 body 包含 一个 SetFixtureRotation的方法
将该方法的值设置为 true,这个body便再也不会不听话的转来转去了
相关代码如下:
/** 生成乌鸦 body~ */
+(b2Body*) createCrow:(NSString*)firstFrameName
frames:(NSMutableArray*)frames
delay:(float)delay
batch:(CCSpriteBatchNode*)batch
position:(b2Vec2)position {
BYSingle *single = [BYSingle getInstance];
GCfg *gCfg = [GCfg getInstance];
// 1.创建 sprite~
CrowSprite *cSprite = [CrowSprite crow:firstFrameName
frames:frames
delay:delay
batch:batch];
// 2.创建 body~
b2BodyDef pirateBodyDef;
pirateBodyDef.type =b2_dynamicBody;
pirateBodyDef.position.Set(position.x, position.y);
b2Body *aCrow = single.gameSceneWorld->CreateBody(&pirateBodyDef);
aCrow->m_isCuttable =false;
aCrow->m_iceType =crow;
aCrow->SetUserData(cSprite);
// aCrow->SetFixedRotation(YES);
// 3.创建 fixture~
b2PolygonShape shape;
NodeStrParser *nsp = [[[NodeStrParseralloc] init] autorelease];
NSString *crowShapeStr = [gCfg.cfgDic objectForKey:@"crowVertices"];
NSArray *two = [crowShapeStr componentsSeparatedByString:@"z"];
// 翅膀部分密度小
vector<b2Vec2> *upper = [nsp parseNailStr:[two objectAtIndex:1]];
b2Vec2 *upperVertices = &(upper->at(0));
int upperSize = upper->size();
shape.Set(upperVertices, upperSize);
b2Fixture *upperFixture = aCrow->CreateFixture(&shape,0.0f);
upperFixture->SetFriction(0.2f);
upperFixture->SetRestitution(0.5f);
upperFixture->m_isPirate =true; // 有何意义?忘了~
upper->clear();
upper = NULL;
//身子部分密度大(使乌鸦不至于倒着飞)~
vector<b2Vec2> *lower = [nsp parseNailStr:[two objectAtIndex:0]];
b2Vec2 *lowerVertices = &(lower->at(0));
int lowerSize = lower->size();
shape.Set(lowerVertices, lowerSize);
b2Fixture *lowerFixture = aCrow->CreateFixture(&shape,3.0f);
lowerFixture->SetFriction(0.2f);
lowerFixture->SetRestitution(0.5f);
lowerFixture->m_isPirate =true;
lower->clear();
lower = NULL;
return aCrow;
}