首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在box2dweb中实现边界侦听器

在box2dweb中实现边界侦听器
EN

Stack Overflow用户
提问于 2014-05-14 18:15:20
回答 1查看 111关注 0票数 1

我对box2d比较陌生,我使用的是box2dweb版本。我希望能够检测到运动学物体何时离开了舞台的边界。Box2D.Dynamics.b2BoundaryListener是显而易见的答案,但box2dweb build显然不支持它。

有没有一种有效的方法来创建侦听器,而不是在每次调用update()的过程中原始地检查每个主体的坐标?我试着用静态物体作为传感器,但它们不能检测到运动物体。

EN

回答 1

Stack Overflow用户

发布于 2014-05-15 06:08:43

据我所知,b2BoundaryListener是Box2D早期版本的一部分,由于Box2D世界不再有界限,因此被删除了。

您可以使用动态传感器,因为这些传感器也可以检测运动学物体。如果你的世界使用重力,你将不得不修复身体。

您可以通过施加抵消重力的力或通过关节(例如焊接接头)将这些动态传感器主体固定到静态主体来实现这一点。

较新的Box2D Javascript端口还包括setGravityScale方法,允许您创建不受重力影响的动态体(例如JSBox2D)

但我认为在update中手动执行此操作可能是一个更好的主意,如果您使用b2AABB类,则应该非常简单。当对象的边界框在您的边界之外时,此操作将删除对象。

你可以像下面这样做(未测试的代码):

代码语言:javascript
复制
var body = world.GetBodyList();
        while (body != null) {
            var fixture = body.GetFixtureList();
            var bodyIsInBounds = false;
            while (fixture != null) {
                // bounds AABB are your boundaries (as b2AABB object)
                if (fixture.GetAABB().TestOverlap(boundsAABB)) { 
                    bodyIsInBounds = true;
                    break;
                }
                fixture = fixture.GetNext();
            }
            if (!bodyIsInBounds) {
                world.DestroyBody(body);
            }
            body = body.GetNext();
        }

您可能还需要检查b2AABB.Contains。如果boundsAABB完全包含另一个b2AABB对象,我不确定TestOverlap是否会返回true。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23651759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档