【发布时间】:2012-06-02 23:29:06
【问题描述】:
我正在使用 cocos2D 和 Box2D 为 Mac OS 编写游戏。我在我的世界中添加了一个b2ContactListener 子类,如下所示:
contactListener = new ContactListener();
world->SetContactListener(contactListener);
这很好用,但我不确定从当前没有直接引用联系人监听器的其他类访问联系人监听器的最佳/可接受的方式。
我知道我可以将引用传递给需要它的其他类,但我想知道是否有更好的方法。更具体地说,虽然我找不到执行此操作的方法,但是否有类似的方法:
world->GetContactListener();
在 Box2D 中?
我尝试这样做的原因仅仅是因为我更愿意将一些游戏逻辑(即身体是否能够根据来自接触侦听器的信息进行跳跃)移动到相关类本身,而不是将所有内容都放入主要的游戏类。
谢谢!
【问题讨论】:
-
接触式监听器的重点是当事情发生时你等待它告诉你,你不要自己去问它。也许你可以让接触监听器调用游戏对象中的一个函数,让他们知道他们触摸了哪些其他对象。
-
@iforce2d 这不一定是真的。只有在为当前步骤计算了模拟之后,您才不能更改您的 box2d 实体状态。并且接触侦听器用于在完成后分析当前的模拟步骤。
-
什么不正确?我在哪里说过他应该在时间步内改变身体状态?在时间步长期间调用联系侦听器 - 然后您可以分析事物,只要在时间步长之后之前不更改 Box2D 世界中的任何内容。回到最初的问题,联系人监听器只是作为 BeginContact、EndContact、PreSolve 和 PostSolve 四个函数的入口点。通常它没有成员变量,所以没有理由得到它,因为没有什么可以从 得到它。也许我们应该问问乔恩,如果他能找到听众,他会怎么做。
-
@iforce2d 如果您将其添加为答案,我会将其标记为正确
标签: objective-c macos cocos2d-iphone box2d objective-c++