0

我正在使用 Cocos2d iPhone 和 Box2D 来创建一个基本的物理引擎。

有时用户需要在一个小的 box2D 对象周围拖动。

在小物体上创建触摸关节有点偶然,游戏引擎将其视为对空白空间的点击,就像实际创建适当的触摸关节一样频繁。在实践中,这意味着用户不断地用手指在屏幕上捣碎,但徒劳地试图移动一个顽固的物体。我希望游戏能够轻松选择小物体,而不会出现这种“命中注定”的效果。

这张(真棒)图片以卡通格式显示了我正在谈论的内容。 这也是对生命意义的松散过敏。

我可以创建带有较大传感器的小物体,但这并不理想,因为超过一定尺寸(直径约 40 像素)的物体不需要这种额外的复杂层;小物体只是按比例缩小的大物体。

在移动小物体时,我可以使用哪些策略来让用户体验更好?

这是 ccTouchBegan 中的 AABB 代码:

b2Vec2 locationWorld = b2Vec2(touchLocation.x/PTM_RATIO, touchLocation.y/PTM_RATIO);

    b2AABB aabb;
    b2Vec2 delta = b2Vec2(1.0/PTM_RATIO, 1.0/PTM_RATIO); 
    //Changing the 1.0 here to a larger value doesn't make any noticeable difference.
    aabb.lowerBound = locationWorld - delta;
    aabb.upperBound = locationWorld + delta;
    SimpleQueryCallback callback(locationWorld);
    world->QueryAABB(&callback, aabb);

    if(callback.fixtureFound){
      //dragging code, updating sprite location etc.
    }

SimpleQueryCallback 代码:

    class SimpleQueryCallback : public b2QueryCallback
    {
    public:
    b2Vec2 pointToTest;
    b2Fixture * fixtureFound;

    SimpleQueryCallback(const b2Vec2& point) {
        pointToTest = point;
        fixtureFound = NULL;
    }

    bool ReportFixture(b2Fixture* fixture) {
        b2Body* body = fixture->GetBody();
        if (body->GetType() == b2_dynamicBody) {
            if (fixture->TestPoint(pointToTest)) {
                fixtureFound = fixture;
                return false;
            }
        }        
        return true;
    }        
};
4

2 回答 2

0

触摸的最小碰撞框怎么样?直径小于 40px 的对象使用 40px 直径,所有较大的对象使用其实际直径。

于 2012-07-31T21:41:19.797 回答
0

我最终做的 - 感谢 iforce2d,将 SimileQueryCallback 中的 ReportFixture 更改为:

bool ReportFixture(b2Fixture* fixture) {
    b2Body* body = fixture->GetBody();
    if (body->GetType() == b2_dynamicBody) {

        //if (fixture->TestPoint(pointToTest)) {
        fixtureFound = fixture;

        return true;
        //}
    }        
    return true;
} 

并将增量增加到 10.0/PTM_RATIO。

于 2012-08-07T17:52:52.823 回答