cocos2d-x:Box2d缩放

时间:2014-01-04 11:51:54

标签: box2d cocos2d-x

我有一个物体b2body,例如一个矩形,我该如何减少或增加它?作为对象本身及其精灵课程。 我创建了一个像这样的对象:

bool Horizontal_balka::initWithWorld(b2World *world)
{
    NotCut=false;
    star=false;
    deleteStar=false;
    int32 count = 4;
    string file = "Horizontal_balka.png";
    b2Vec2 vertices[] = {
        b2Vec2(0.0/PTM_RATIO,26.0/PTM_RATIO),
        b2Vec2(0.0/PTM_RATIO,0.0/PTM_RATIO),
        b2Vec2(412.0/PTM_RATIO,0.0/PTM_RATIO),
        b2Vec2(412.0/PTM_RATIO,26.0/PTM_RATIO)
        /*b2Vec2(60.0/PTM_RATIO,14.0/PTM_RATIO),
         b2Vec2(34.0/PTM_RATIO,59.0/PTM_RATIO),
         b2Vec2(28.0/PTM_RATIO,59.0/PTM_RATIO)*/
    };
    CCSize screen = CCDirector::sharedDirector()->getWinSize();
    b2Body *body = createBodyForWorld(world, b2Vec2(screen.width/2/PTM_RATIO, screen.height/2/PTM_RATIO), 0, vertices, count, 5.0, .2, .2);
        PolygonSprite::initWithFile(file, body, true);

    return true;
}

PolygonSprite.cpp

bool PolygonSprite::initWithFile(string filename, b2Body *body, bool original)
{
    CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage(filename.c_str());
    return initWithTexture(texture, body, original);
}

bool PolygonSprite::initWithTexture(cocos2d::CCTexture2D *texture, b2Body *body, bool original)
{
    b2Fixture *originalFixture = body->GetFixtureList();
    b2PolygonShape *shape = (b2PolygonShape*)originalFixture->GetShape();
    int vertextCount = shape->GetVertexCount();
    vector<Vector2d> points;

    for (int i = 0; i < vertextCount; i++)
    {
        Vector2d p = Vector2d(shape->GetVertex(i).x * PTM_RATIO, shape->GetVertex(i).y * PTM_RATIO);
        points.push_back(p);
    }
    PRFilledPolygon::initWithPointsAndTexture(points, texture);
    _body = body;
    _body->SetUserData(this);
    _original = original;
    _centriod = _body->GetLocalCenter();
    this->setAnchorPoint(ccp(_centriod.x * PTM_RATIO / texture->getContentSize().width,
                             _centriod.y * PTM_RATIO / texture->getContentSize().height));
    return true;
}

如何减少对象的大小2次?当然精灵本身也会减少

1 个答案:

答案 0 :(得分:1)

你不能,也不应该。动态增长或缩小身体形状存在许多问题,这就是为什么它首先不受支持的原因。

您只能通过移除正文的形状并将其替换为相应缩放的其他形状来执行此操作。缩放相应的精灵很简单。

与缩放物理体相关的一个问题是,当两个物体接触时,你将它们中的一个略微缩放,它会将接触体推开,而不一定以“物理上正确”的方式。如果您在单个框架中进行大量缩放,则可以在调整大小的实体中部分或全部包含其他实体,将它们强制在一个框架内的体外,使它们从调整大小的主体“弹出”到最近的非接触位置。

也就是说,如果您的物理模拟受到控制,几乎没有物体和稀有接触,并且您使用“替换形状”方法以小步骤缩放主体,它仍然可以很好地满足您的要求。