zoukankan      html  css  js  c++  java
  • 代码片段辑录——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;
    }



  • 相关阅读:
    [转]document对象execCommand的命令参数介绍
    Windows蓝屏说明
    PHP手册下载
    编写简单的代码生成工具
    EXCEL中标记两列中都存在的数据,过滤B列中存在A列中不存在的数据[原创]
    SC Create 添加服务不成功(总弹帮助信息)的原因[转]
    Excel中删除两列中重复的数据[原创]
    禁止更改桌面背景及活动桌面的批处理_最终版[原创]
    EXCEL中自动检测当前单元格或上一单元格在列A中是否存在相同数据[原创]
    EXCEL中避免同一列及相邻列中出现重复数据[原创]
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212299.html
Copyright © 2011-2022 走看看