最原始的代码是sunstar1989大佬写的C++源码,我这里是用了MOGRE+MyGUI+Physx Candy Wrapper做的一个.NET版本的转换,目前代码托管在GitHub上:
GitHub - cookgreen/BilliardGame: Open Source Billiard Game
关于这个游戏,我只想说两点:
第一点:NxOgre和Physx Candy Wrapper之间有很多不一样的地方
NxOgre是英国人betajean做的一个Physx的封装,相当于是对原本的Physx API进行OO化(也就是对象化),他里面封装了很多的东西,比如Trigger,Volume什么的,这在原来的Physx API是没有的。
而Physx Candy Wrapper是Ageia写的一个关于Physx SDK的.NET的封装,虽然表面上使用了OO设计思想,但是基本上仍然是对Physx API的封装而没有OO化,更没有对Physx进行二次封装,因此在寻找两者关联的时候费了不少劲儿。
这就需要我们有一定的阅读源代码的能力,我查了好多NxOgre的源码,然后再加上对Physx SDK的研究,才总算摸索出一条调用之路。
比如挂钩Physx场景碰撞事件的时候,在C#代码需要你的类实现三个接口:
第一个是IUserNotify
第二个是IUserContactReport
第三个是IUserTriggerReport(NxOgre封装在了Trigger,这就是我为什么说Physx Candy Wrapper没有进行彻底的OO化设计)
实现完这三个接口,记得要在Scene里面进行注册,比如下面这段代码:
physxScene.UserNotify = this;
physxScene.UserTriggerReport = this;
physxScene.UserContactReport = this;
我这里使用this指针,因为我的这个类就实现这三个接口,如果你用的是其他类,那你就得用对应类的对象指针。
第二个:NxOgre大量使用Volume进行碰撞检测
betajean在NxOgre开发库里面引入了Volume的概念,意思就是一个不可见的碰撞检测体,用途当然非常广泛,比如胜利条件检测,可以使用这个,或者触发某段剧情也可以用这个。甚至还可以用来做透明墙。
在NxOgre里面,betajean给我们封装了对应的Volume类,我们直接new就行,但是在Physx Candy Wrapper里面没有这个东西,所以我们只能自己手动创建碰撞检测的Actor。
上一点截图:
当然和原本游戏是一摸一样的(这不是废话么。。。)
这里的光感效果感觉不太好,是不是材质脚本写的有什么问题,或者是MOGRE引擎有什么局限性。
另外就是目前的MyGUI似乎不能捕捉事件,我只要一挂钩事件,然后调用InputManager的Inject方法就会出现问题。
比如当我给Button挂载EventButtonOnClick事件,然后在调用InputManager的InjectMouseRelease方法就会出现“AccessViolation”的错误,貌似是什么地方出了问题。
不知道 @sunstar1989 大佬能否给解读一下,感谢。