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

主题:遍历 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

引用: 配置完成之后,点击下面的ERASE准备,然后点击START开始,如果下面有进度条,则等待进度条完成,如果没有则点击ESP8266的USB接口处有个复位,再来一遍(确保bin文件是1024kb的8位的文件),串口号也要与你的ESP8266一致 完成后及可以复位,ESP8266则烧录固件成功,可以进行下一步了。引用: ESP8266默认波特率为115200,使用XCOM串口助手,选择对应的串口号COM10:USB-SERIAL CH340(不插单片机则剩下的那个就是ESP8266的串口),波特率改为115200 如果你选择好后,发送AT指令有回复OK,则不需要烧录固件,如果没有回复的话,看看选项是否选择正确,实在不行就烧录固件吧。引用: 在波特率问题上走了一大圈弯路,差点让我从入门直接到放弃。一开始对单片机串口通讯初始化参数不明白,抄了别人代码,人家是设置波特率4800的,我不会调,就想着直接调8266的波特率吧,还方便些,就把8266波特率调到了4800,我以为单片机和8266只要波特率一致就可以通讯了,实则不然。我排除了各种可能存在的问题,把AT命令和波特率计算彻底搞明白,确认无误后,发现手机和8266还是连不上,在几乎要放弃挣扎时,发现8266后面印了一排小字:use 9600 baud rate.我试着把8266和单片机的波特率都设为9600,当看到手机屏上显示的连接成功时,一阵狂喜。 根据引用中的内容,配置51和ESP8266之间的通讯需要进行以下步骤: 1. 确保bin文件是1024kb的8位的文件。 2. 点击ERASE准备,然后点击START开始。 3. 如果出现进度条,等待进度条完成;如果没有进度条,则点击ESP8266的USB接口处的复位按钮,然后重新开始配置。 4. 串口号要与你的ESP8266一致。 5. 配置完成后可以复位,表示ESP8266的固件已经烧录成功。 关于ESP8266的波特率设置,可以使用XCOM串口助手进行配置: 1. 打开XCOM串口助手。 2. 选择对应的串口号COM10:USB-SERIAL CH340(如果没有插入单片机,那么剩下的那个就是ESP8266的串口)。 3. 将波特率改为115200。 4. 如果发送AT指令后收到回复OK,则无需烧录固件;如果没有回复,则检查选项是否正确配置,如果仍然无法通信,则需要烧录固件。 根据引用的经验教训,需要注意单片机和ESP8266的波特率要一致才能进行通讯。在引用中,作者遇到了波特率设置错误的问题,最终将单片机和ESP8266的波特率都设为9600解决了连接问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值