【问题标题】:Box2D world sizeBox2D 世界大小
【发布时间】:2011-11-05 12:10:55
【问题描述】:

我创建了一个 box2d 世界,我想限制世界的高度。 我确实搜索了谷歌,显然在以前版本的 box2d 中有一个选项,你必须定义你的世界的大小,但我不确定你是否能够设置世界的高度,但在当前版本中他们有完全取消了该选项。

所以我只是在寻找一种限制高度的方法,因为我的球员是一个上下跳跃的球,我想限制它可以跳多高(跳跃是通过物理和重力以及球,所以在几次良好的跳跃之后,随着速度的增加,球跳得非常高,我不想限制速度)并设置边界让我们说y=900。

【问题讨论】:

    标签: objective-c xcode cocos2d-iphone box2d box2d-iphone


    【解决方案1】:

    Box2D 世界的大小是无限的。您无法限制世界,但您可以创建一个形状,将 Box2D 世界中的某个区域包围起来。

    以下是如何创建一个在屏幕周围放置一个形状的主体和形状,这样对象就不会离开屏幕。通过更改角坐标以适应您的需要,很容易调整此代码:

            // for the screenBorder body we'll need these values
            CGSize screenSize = [CCDirector sharedDirector].winSize;
            float widthInMeters = screenSize.width / PTM_RATIO;
            float heightInMeters = screenSize.height / PTM_RATIO;
            b2Vec2 lowerLeftCorner = b2Vec2(0, 0);
            b2Vec2 lowerRightCorner = b2Vec2(widthInMeters, 0);
            b2Vec2 upperLeftCorner = b2Vec2(0, heightInMeters);
            b2Vec2 upperRightCorner = b2Vec2(widthInMeters, heightInMeters);
    
            // static container body, with the collisions at screen borders
            b2BodyDef screenBorderDef;
            screenBorderDef.position.Set(0, 0);
            b2Body* screenBorderBody = world->CreateBody(&screenBorderDef);
            b2EdgeShape screenBorderShape;
    
            // Create fixtures for the four borders (the border shape is re-used)
            screenBorderShape.Set(lowerLeftCorner, lowerRightCorner);
            screenBorderBody->CreateFixture(&screenBorderShape, 0);
            screenBorderShape.Set(lowerRightCorner, upperRightCorner);
            screenBorderBody->CreateFixture(&screenBorderShape, 0);
            screenBorderShape.Set(upperRightCorner, upperLeftCorner);
            screenBorderBody->CreateFixture(&screenBorderShape, 0);
            screenBorderShape.Set(upperLeftCorner, lowerLeftCorner);
            screenBorderBody->CreateFixture(&screenBorderShape, 0);
    

    注意:此代码适用于 Box2D v2.2.1。我假设这就是您正在使用的,因为您说“以前的版本”需要以不同方式编写此代码(使用 SetAsEdge 方法)。

    【讨论】:

    • 谢谢,效果很好:) ...只有一个问题,为什么人们会得到以米为单位的宽度?我见过一些人这样做...
    • Box2D 标准长度单位以米为单位,但任何人都可以定义应用程序中米的“长度”。因此,PTM(像素与米)比率。
    • 我喜欢你的回答,但我建议删除关于无限大小的第一句话。虽然 Box2D 世界没有明确的大小限制,但在任何可用的意义上它都不是无限的。模拟会降低距离原点 (0, 0) 较远的物体,并且具有由数字的 floating point 表示施加的硬限制。 Box2D 手册在第 1.7 章和第 13 章中也提到了限制。
    猜你喜欢
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多