一行代码省却十数行代码

本文详细探讨了在制作乌鸦飞行效果时遇到的头重脚轻问题,并提出通过调整乌鸦身体的密度分布来解决此问题的方法。通过在身体上部和下部设置不同密度的碰撞体,确保乌鸦飞行时不会出现头下脚上的尴尬姿势。此外,还介绍了如何使用 SetFixtureRotation 方法防止乌鸦旋转,提高了动画效果的稳定性和美观性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想做一个乌鸦飞的效果,却发现一群乌鸦碰在一起老是会出现头上脚下的情况,感觉很是不好

于是想到了一个办法:

乌鸦的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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值