【问题标题】:cocos2d-x: Box2d Scalingcocos2d-x: Box2d 缩放
【发布时间】:2014-01-04 11:51:54
【问题描述】:

我有一个物体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 倍?当然,精灵本身也减少了

【问题讨论】:

  • 您是要缩小特定对象相对于其他对象的大小,还是要同时缩小场景中所有对象的大小?

标签: box2d cocos2d-x


【解决方案1】:

你不能,也不应该。动态增长或收缩身体的形状会带来许多问题,这就是为什么它一开始不受支持的原因。

您只能通过移除身体的形状并将其替换为相应缩放的另一个形状来做到这一点。缩放相应的精灵很简单。

与缩放物理物体相关的一个问题是,当两个物体接触时,您稍微缩放其中一个物体时,它会将接触的物体推开,并且不一定以“物理上正确”的方式。如果您在单个帧中大量缩放,您可以在调整大小的主体中部分或全部包含其他主体,迫使它们在单个帧中超出主体,使它们从调整大小的主体中“弹出”到最近的非接触位置。

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

【讨论】:

  • 如何创建一个更大的对象?我在描述 PolygonSprite 中添加了代码
  • 您拥有该形状使用的原始顶点。假设 0,0 在中心,您需要做的就是将每个点的 x/y 坐标乘以比例因子。然后从主体中删除现有形状,然后使用新点创建一个形状并将其添加到主体中。如果您想为尺寸变化设置动画,请在每一帧都这样做。
  • 我仍然无法理解如何在将精灵添加到场景之前增加精灵。请帮忙))
  • 精灵有一个缩放属性
  • 这可能是 ... hmmm CCNode 的子类? ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多