清理代码的时候发现,某些方法的名称起地太随意了,
交给别人来看肯定是一头雾水,这样不是很好。
另外,也发现一些方法里面有大片重复的代码,其实完全可以提出来,作为一个功能单元来使用。
想直接删了又害怕出现意外——项目一大了之后,做出的改动都有可能引发一些比较难发现的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;
}