必须注意的一点是 b2Body 的成员变量 m_fixtureList是链表而非数组!!!
数组可以以下标[0]的形式来操作,STLvector可以用at(0)以及Iterator的方式来操作,但是Box2D m_fixtureList链表的话,还是乖乖地用作者所推荐的写法!!!
主要会犯这个错误就在于自己是用Java起步的,说白了就是对编程语言的特性认识还不够深度
这次是真的体验到指针的灵活性所带来的弊端了:
一个指向自定义链表结构的指针我把它当做数组首地址来使用了,
虽然实际运行效果和我所预期的效果相差了十万八千里,
但是却在编译整个项目的时候顺利通过,运行程序时也能在大部分情况下都运行成功,
难道这不能算作指针的灵活性所带来的弊端?
用Java的时候,容器用的比较多的有ArrayList 和LinkedList
因为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遍~
总之,饭是一口一口吃的,路是一步一步走的,能够圆满解决这个问题,我还是感到很开心的!!