现在的位置: 首页 > 综合 > 正文

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

2018年05月17日 ⁄ 综合 ⁄ 共 2967字 ⁄ 字号 评论关闭

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

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

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

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

抱歉!评论已关闭.