2014-01-04 3 views
1

У меня есть объект b2body, например прямоугольник, как его уменьшить или увеличить? Как сам объект, так и его спрайт-курс. создать объект так:cocos2d-x: Box2d Scaling

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 раза? И, конечно, сам спрайт уменьшается

+0

Вы пытаетесь уменьшить конкретный объект относительно других объектов или пытаетесь одновременно уменьшить размер всех объектов в своей сцене? – FuzzyBunnySlippers

ответ

1

Вы не можете, и не должны. Существует ряд проблем, связанных с динамическим ростом или сжатием формы тела, поэтому он не поддерживается в первую очередь.

Вы можете сделать это, сняв форму корпуса и заменив ее на другую форму, которая была масштабирована соответствующим образом. Масштабирование соответствующего спрайта является простым.

Одна из проблем, связанных с физическими телами, заключается в том, что когда два тела находятся в контакте, и вы масштабируете один из них незначительно, он будет выталкивать контактные тела и не обязательно «физически правильно». Если вы масштабируетесь большими объемами в одном кадре, вы можете частично или полностью содержать другие тела в измененном корпусе, вытесняя их за пределы тела в пределах одного кадра, делая их «выскользнуть» из измененного тела в сторону ближайшего бесконтактного должность.

При этом, если ваша физическая симуляция контролируется, имеет несколько тел и редких контактов, и вы масштабируете тело маленькими шагами, используя метод «заменить форму», который все еще может работать достаточно хорошо для ваших требований.

+0

Как создать объект с большим размером? Я добавил код в описание PolygonSprite – user3079929

+0

У вас есть оригинальные вершины, используемые формой. Предполагая, что 0,0 находится в центре всего, что вам нужно сделать, это умножить координаты x/y каждой точки на коэффициент масштабирования. Затем удалите существующую фигуру из тела, затем создайте фигуру с новыми точками и добавьте ее в тело. Продолжайте делать это каждый кадр, если хотите оживить изменение размера. – LearnCocos2D

+0

Я до сих пор не могу понять, как я могу увеличить спрайт, прежде чем добавить его в сцену. Помогите, пожалуйста)) – user3079929

Смежные вопросы