CCLayoutBox в Cocos2d-x?

Есть ли что-то похожее на CCLayoutBox в Cocos2d-x? Я ищу Cocos Studio, но ничего не нахожу. Мне нужен узел, который может размещать своих дочерних элементов в области с неизвестной шириной и/или высотой, чтобы отдельные компоненты были равномерно распределены.


person Jonny    schedule 20.04.2015    source источник


Ответы (1)


Я не знаком с CCLayoutBox, но думаю, что вам нужен Layout. На вики есть несколько примеров, объясняющих, как его использовать. Вот один из них:

// Create the layout
    Layout* layout = Layout::create();
    layout->setLayoutType(LayoutType::VERTICAL);
    layout->setContentSize(Size(280, 150));
    Size backgroundSize = background->getContentSize();
    layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f +
                              (backgroundSize.width - layout->getContentSize().width) / 2.0f,
                              (widgetSize.height - backgroundSize.height) / 2.0f +
                              (backgroundSize.height - layout->getContentSize().height) / 2.0f));
    _uiLayer->addChild(layout);


    Button* button = Button::create("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png");
    layout->addChild(button);

    LinearLayoutParameter* lp1 = LinearLayoutParameter::create();
    button->setLayoutParameter(lp1);
    lp1->setGravity(LinearLayoutParameter::LinearGravity::CENTER_HORIZONTAL);
    lp1->setMargin(Margin(0.0f, 5.0f, 0.0f, 10.0f));


    Button* titleButton = Button::create("cocosui/backtotopnormal.png", "cocosui/backtotoppressed.png");
    titleButton->setTitleText("Title Button");
    layout->addChild(titleButton);

    LinearLayoutParameter* lp2 = LinearLayoutParameter::create();
    titleButton->setLayoutParameter(lp2);
    lp2->setGravity(LinearLayoutParameter::LinearGravity::CENTER_HORIZONTAL);
    lp2->setMargin(Margin(0.0f, 10.0f, 0.0f, 10.0f));


    Button* button_scale9 = Button::create("cocosui/button.png", "cocosui/buttonHighlighted.png");
    button_scale9->setScale9Enabled(true);
    button_scale9->setContentSize(Size(100.0f, button_scale9->getVirtualRendererSize().height));
    layout->addChild(button_scale9);

    LinearLayoutParameter* lp3 = LinearLayoutParameter::create();
    button_scale9->setLayoutParameter(lp3);
    lp3->setGravity(LinearLayoutParameter::LinearGravity::CENTER_HORIZONTAL);
    lp3->setMargin(Margin(0.0f, 10.0f, 0.0f, 10.0f));

«Установка трех параметров макета — LinearLayoutParameter, Gravity и Margin, затем установка параметров макета для трех внутренних виджетов UIPanel.

Здесь мы использовали линейную вертикальную схему, но каждая гравитация установлена ​​как LinearLayoutParameter::LinearGravity::CENTER_HORIZONTAL, которая отображается по центру по горизонтали. Margin показывает расстояние по краям, обратите внимание, что значение lp2 равно UIMargin(20, 20, 0, 5), что означает расстояние слева, сверху, справа и кнопки. Когда левый интервал равен 20, вы можете видеть, что позиция textButton имеет небольшое смещение вправо. За исключением направления, другие настройки вертикальной схемы размещения аналогичны горизонтальной схеме. И две схемы называются Linear Layout, они используют одни и те же параметры."

person Jgod    schedule 21.04.2015
comment
Я вернулся... это сбивает меня с толку. Должны ли мы устанавливать правила для макета для каждого элемента? С помощью CCLayoutBox мы просто устанавливаем правила во внешнем блоке макета, тогда любой добавленный в него элемент будет красиво выстроен, и нам не нужно вручную устанавливать позицию для каждого элемента. - person Jonny; 03.06.2015
comment
Я, наконец, попробовал это, и я считаю, что Layout не может делать ничего подобного CCLayoutBox. Основная причина заключается в том, что все, что добавляется в макет, должно наследоваться от UIWidget, то есть кнопки и т. д., поэтому мы не можем просто добавить к нему какой-либо узел. С помощью CCLayoutBox мы можем добавить все, что наследуется от простого CCNode, поэтому очень легко размещать строки и столбцы и создавать сетки. - person Jonny; 08.06.2015