LuckyHu Blog

首页 产品 工作室

box2d差点让我放弃

23 May 2014

最近一段时间,自己用业余时间研究了一下各种游戏库,最终决定用libgdx做一个小游戏试试,做游戏一直算是我从儿时以来的梦想。

做了3年程序员,在软件开发方面也算是有些积累,很快就熟悉了游戏库相关的东西(选择libgdx是因为他跨平台而且使用java开发,囧),花了两周时间把整个游戏的大架子弄好了,接下来就是写关卡,改改bug,本来预计总共花费一个月的时间就可以让游戏上架,但没想到遇到box2d方面的一个问题,搞得我毫无头绪,足足卡了我一个多月。

先说说这个问题的现象: 我在游戏中利用box2d进行碰撞检查,在地图上有些多边形,我的主角是一个圆形的物体,我发现当我的多边形的形状不同时,主角与该多边形的碰撞有时候可以被检测到,有时候不能。

我首先在网上做了一番大范围的搜索,但没有发现有人跟我遇到相同的问题,接着我尝试了各种形状的多边形,但是没有发现其中的规律,这让我有点抓狂,由于之前对box2d只是看了些简单的应用,对整个原理并不是很清楚,所以我怀疑是自己在某些用法上没有做对,我先认真把box2多边形相关的官方文档认真读了一遍,并检查了自己的代码可能产生这种现象的地方并进行调试,还是没能发现问题所在,然后我开始怀疑是不是libgdx中所做的box2d的封装是不是有什么bug,为了确保自己的工程足够简单,我下载了最新的libgdx并新建了一个游戏项目,写了最简单的碰撞代码,还是有类似情况出现,于是我转而用cocos2d开发类似的功能。

终于我发现cocos2d中的box2d同样也存在同样的情况,万幸,这不是libgdx中的bug,更好的情况是,使用cocos2d可以方便地调试box2d的的代码,经过调试,发现是主角在某些情况下进入了sleep状态。

至此也就知道大致的解决方案,取其一: 1.调用Body相关接口不允许主角sleep。 2.在world初始化函数时不允许sleep。

结果,这个卡住我一个多月差点让我放弃的box2d问题,就在改动一行代码的情况下被解决了,让我自己也苦笑不得,相信很多人也遇到过类似的问题,看似很难搞的的一个问题最终发现是一个很简单的解决方案。

这里我主要想表达的一个意思是: 1.对于一个本身不理解其工作原理的东西,用你旧的知识体系去推测其现象是极其没有根据的。 2.知道how和知道why是两个差别很大的概念。