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

来源:互联网 发布:电气原理图仿真软件 编辑:程序博客网 时间:2024/05/29 19:24

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

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

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

想直接删了又害怕出现意外——项目一大了之后,做出的改动都有可能引发一些比较难发现的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;}