代码片段辑录——myDestroyBody,byDestroyBody,resortBodiesOnBoat

清理代码的时候发现,某些方法的名称起地太随意了,

交给别人来看肯定是一头雾水,这样不是很好。

另外,也发现一些方法里面有大片重复的代码,其实完全可以提出来,作为一个功能单元来使用。

想直接删了又害怕出现意外——项目一大了之后,做出的改动都有可能引发一些比较难发现的bug。

对于我这个被bug骚扰过无数回的人,多少要采取一些防范措施。

虽说用SVN来管理项目版本,但个人觉得还是放在博客里面合理一些。

博客翻动的次数多一点。一般情况下,项目如果不出太大问题,我是懒得去翻SVN的。

再个就是,resortBodiesOnBoat 方法的解题思路很好的满足了我的需求,

放到博客里面以志纪念,也算是为今后类似问题的解决方案提供样板经验。

myDestroyBody

+(void) myDestroyBody:(b2Body*)body ropes:(NSMutableArray*)ropes { // 1.切断将销毁 body 与相关绳子对象的联系~ NSMutableArray *temp = [[NSMutableArray alloc] init]; for(BYRope* rope in ropes) { if(rope.b1 == body || rope.b2 == body) { [rope release]; [temp addObject:rope]; } } if([temp count] != 0) { [ropes removeObjectsInArray:temp]; } [temp release]; // 2.销毁该 body~ CCSprite *actor = (CCSprite*)body->GetUserData(); [actor removeFromParentAndCleanup:YES]; // for(b2Fixture* f = body->GetFixtureList(); f; f = f->GetNext()) { // body->DestroyFixture(f); // 麻痹的,再别这么写了~ // } // b2ContactManager cm = [BYSingle getInstance].gameSceneWorld->GetContactManager(); // for(b2Contact* contact = cm.m_contactList; contact; contact = contact->GetNext()) { // if() // } [BYSingle getInstance].gameSceneWorld->DestroyBody(body); }byDestroyBody

+(void) byDestroyBody:(b2Body*)body ropes:(NSMutableArray*)ropes { /** * added by Bruce Yang on 2012.04.18.17.40~ * bug fix! 修正绳联体越界的时候出错的 bug~ * 方案:先干掉与待销毁 body 相关联的绳子对象~ */ NSMutableArray *temp = [[NSMutableArray alloc] init]; for(BYRope* rope in ropes) { if(rope.b1 == body || rope.b2 == body) { [rope release]; [temp addObject:rope]; } } if([temp count] != 0) { [ropes removeObjectsInArray:temp]; } [temp release]; /** * added by Bruce Yang on 2012.03.07.16.09~ * 直接使用 world 来干掉 body 会导致惹人心烦的莫名其妙的 bug~ * 逃避之,做一个位置变换并将其转换为 静态 body~ */ body->SetUserData(NULL); // 设置一个合理的位置储存这些用处已经不大的 body 们~ body->SetTransform(b2Vec2(-30.0f, -20.0f), 0.0f); body->SetType(b2_staticBody); // for(b2Fixture* f = body->GetFixtureList(); f; f = f->GetNext()) { // body->DestroyFixture(f); // 这样是不行的,一边遍历一边删除,各种蛋疼~ // } // [BYSingle getInstance].gameSceneWorld->DestroyBody(body); // body->GetWorld()->DestroyBody(body); }resortBodiesOnBoat

// 产生新的要求,冰块儿定义的时候不可重叠,否则计算面积时会出现误差,实际表现就是某冰块儿特小但是就是敲不碎~ +(void) resortBodiesOnBoat { BYSingle *single = [BYSingle getInstance]; list<BYItem*>* tempList = new list<BYItem*>(); list<b2Body*>::iterator iterBegin = single.bodiesOnBoat->begin(); list<b2Body*>::iterator iterEnd = single.bodiesOnBoat->end(); for(list<b2Body*>::iterator iter = iterBegin; iter != iterEnd; ++ iter) { b2Body* body = *iter; ushort tag = 0; for(b2Fixture* f = body->GetFixtureList(); f; f = f->GetNext()) { if(f->m_isPirate) { tag += 1; } } float area = body->GetMass() - PIRATE_MASS * tag; // 密度为1 => 面积等于质量~ // 敲碎的冰块儿的体积不能大于 2.6 * 2.6 = 6.76 if(area <= 6.76f) { tag += 10000; } BYItem *item = new BYItem(body, tag); tempList->push_back(item); } // 重排,将 “销毁优先级别” 较高的元素放置到链表的头部~ tempList->sort(myCompare); single.bodiesOnBoat->clear(); // NSLog(@"begin!"); // NSLog(@"_bodiesOnBoat->size() = %lu", single.bodiesOnBoat->size()); for(list<BYItem*>::iterator iter = tempList->begin(); iter != tempList->end(); ++ iter) { BYItem *item = *iter; // NSLog(@" -- _tag = %d", item->_tag); single.bodiesOnBoat->push_back(item->_body); delete item; } // NSLog(@"_bodiesOnBoat->size() = %lu", single.bodiesOnBoat->size()); // NSLog(@"end!"); tempList->clear(); delete tempList; }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值