Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2020-7-3] p2 物理引擎在 egret 中进行碰撞检测,打印结果不正确 #40

Open
coppyC opened this issue Jul 3, 2020 · 0 comments

Comments

@coppyC
Copy link
Owner

coppyC commented Jul 3, 2020

昨天做一个物理小游戏,用的 egret,辣是真的 **

安装都 能卡半天,明明做为一个第三方库,但在 egretProperties.json 的配置项中只要打错一个字母,就用不了了,name 必须是 physics 才能用,我想起个 p2 都不行,这tm不是第三方来的吗,怎么像内置的一样,打错一个字母都不行。

接着是文档,先不说egret 的文档对 p2 的教程是近乎没有,就连 p2 自己的文档也和没有一样。

于是我就从 p2 的 README 里面那些demo 学习,但学得是真的难受,又找了些 教程

但做到关键的碰撞检测时,教程里面写的居然是 TODO,woc!!

后来又找到 p2 的官方 wiki,发现那个程序其实就是翻译了一下官方wiki,结果我在wiki一翻,原来官方 wiki 里面大大方方写的就是 TODO,woc !!!,我还以为是翻译还没翻,才写的 TODO。更糟糕的是,这个库已经几年没有更新了,以后可能也会一直这样保持 TODO 到宇宙毁灭。

然后又对着 p2 官方的碰撞检测 demo,看了半天,也没看到什么有用的代码,而且 egret 的 p2 还是改过的,又有些出入。

后来,我又找啊找,终于找到一个比较靠谱的,但是事情才刚刚开始

从文章中,我得知 碰撞过程会产生4个事件,postBroadphase、preSolve、beginContact、endContact

首先,这四个事件只能在 world 监听,不能在 body 监听,这麻烦不少,但至少游戏能做下去了。

于是,我在游戏中写入代码,world.on('beginContact', (e) => console.log(e));,长达一天的恶梦便开始了

接着,我用一个球在几个物体之间发生碰撞,但是我在控制台发现,每次碰撞的结果 bodyA 和 bodyB 会变,不正确,对不上

完全找不到头绪,整整卡了快一天,整个下午,都在搜索 egret 垃圾,什么的,完全搞不清楚一个文档缺失这么严重的 引擎,为什么国内好像还挺多人用的。

就这样,第二天,也就是今天,又搜索了一下,又发现一个事件可以监听impact,安排,换上,这次好像有点按照自己的预料发展了(其实也还了其它一点代码)。于是便有了此文,但是,在写此文的过程中,我发现还有些地方怪怪的,这次,终于让我找到了问题所在。

这次,也成打印 console.log(e.bodyA, e.bodyB),结果,这次,打印结果全对得上,如自己预期的那样,可是我除了修改打印部分,其它的都没修改啊,怎么回事,难道说!!!

为了验证我的猜想,我又写了如下代码。

            let _e;
            this.world.on('impact', (e) => {
                if (_e) {
                    console.log(e === _e);
                }
                _e = e;
            });

结果也如自己想的一样,是 true,也就是说,每次碰撞的结果是同一个引用,如果是异步打印的话,就会出错。像我们在控制台上打印e,点开e的时候,e里面的属性已经变了,所以就会出现结果对不上的现象。

这是真的坑,人见过哪个事件回调是同一个引用的,我就没见过这样糟糕的设计,

也就是说,此事是无中生有,如果我不打印这个e,继续写代码(前提是我的代码是同步的),根本就不会发现这个特性,也不会遇见什么bug。

事情搞明白了,这下可以专心码代码了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant