ITKeyword,专注技术干货聚合推荐

注册 | 登录

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

yang3wei 分享于 2011-10-04

2018阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=gh9qh5ki&utm_source=gh9qh5ki

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

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

数组可以以下标[0]的形式来操作,STL vector可以用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遍~

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

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

主题:遍历 compound b2Body FixtureList 的正确写法 必须注意的一点是 b2Body 的成员变量 m_fixtureList是链表而非数组!!! 数组可以以下标[0]的形式来操作,STL vector可以用at(0)以及Iterator
在线网页数据采集器

相关阅读排行


用户评论

游客

在线网页数据采集器

相关内容推荐

vivo京东自营官方旗舰店

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。