愁得我几天饭吃不香觉睡不好的问题终于解决了!!!狂喜!!!

主题:遍历 compound b2Body FixtureList 的正确写法

必须注意的一点是 b2Body 的成员变量 m_fixtureList是链表而非数组!!!

数组可以以下标[0]的形式来操作,STLvector可以用at(0)以及Iterator的方式来操作,但是Box2D m_fixtureList链表的话,还是乖乖地用作者所推荐的写法!!!


主要会犯这个错误就在于自己是用Java起步的,说白了就是对编程语言的特性认识还不够深度

这次是真的体验到指针的灵活性所带来的弊端了:

一个指向自定义链表结构的指针我把它当做数组首地址来使用了,

虽然实际运行效果和我所预期的效果相差了十万八千里,

但是却在编译整个项目的时候顺利通过运行程序时也能在大部分情况下都运行成功

难道这不能算作指针的灵活性所带来的弊端?


用Java的时候,容器用的比较多的有ArrayListLinkedList

因为Java毕竟不同于C++,我一般直接就用一个for循环来遍历了

就像下面这样:

for(int i = 0; i < list.size(); i ++) {}

后面学C++的时候听别人说 i++ 写成 ++i 性能会强一点,于是就写成:

for(int i = 0; i < list.size(); ++ i) {}

而且ArrayList 和LinkedList 是有不同的使用情形的

如果插入删除的操作比较多,LinkedList 比较实用

如果插入之后的元素不怎么变动,则用ArrayList 效率比较高!!

但是,遍历容器的方法不仅仅只是限于 for 循环!!!

就像C++的 Standard Template Library,Iterator的遍历也是被广泛使用的~

而且不仅仅是STL,连Java里面也是一样,Iterator和For循环是可以自己任意选用的

但是哪个效率更高我就不知道了

在Java里面因为我老喜欢使用到下标序号,因此一般情况我都用for循环

也可能是出于这样的原因,我根本就未体会到Iterator遍历这种方式的优秀之处

所以写着写着我就只会用for循环来遍历容器了,以至于iterator的用法我都忘了,不会用了~

实际上Iterator还是相当有用的,在不强调顺序的容器类里面,唯有用Iterator来遍历其中的条目

当然,Java里面的HashMap肯定是不在此列的~


Box2D 中 b2Body b2Fixture的遍历写法必须是这样的!!

for (b2Fixture* fixt = body->GetFixtureList();fixt;fixt = fixt->GetNext()) {}

绝对不能写成下面这样:

(本身是链表的,我却把它拿过来都数组用了,但令人称奇的是程序大部分情况下却能够顺利运行):

int fixtureListCount = body->GetFixtureListCount();

b2Fxiture *fixtureArray = body->GetFixtureList();

for(int i = 0; i < fixtureListCount; ++ i) {

b2Fixture *fixture = fixtureArray[i];

b2PolygonShape *polyShape = (b2PolygonShape*)fixture->GetShape();

...

}

实际上Box2d源码并不提供GetFixtureListCount()这个方法,是我自己根据需要加入的

但是我万万没有想到的就是,正因为其他需要添加的这个方法到头来确砸了自己的脚

让我很心痛的是,这个不经意间粗心所导致的问题竟然浪费了我好几天的时间

让我吃也吃不香,睡也睡不好,本来都开发游戏是抱着很大的热情的,

结果硬是让我产生了一种打开XCode就恶心的负面情绪,这代价确实是有点儿大!!


其实这次花费了那么长的时间,消磨掉自己那么多热情,还是在于自己太钻牛角尖了

干嘛不早点在网上查一查呢?早点查一查套用一下网上的常规写法

说不定这个问题就能早很多时间解决掉

害的我一遍又一遍的检查程序,不停的NSLog暴力调试,500行左右的一个回调类我一行一行的看了N遍~

总之,饭是一口一口吃的,路是一步一步走的,能够圆满解决这个问题,我还是感到很开心的!!

参考资料链接:http://www.box2d.org/forum/viewtopic.php?f=4&t=3888

你可能感兴趣的:(问题)