项目需要实现按钮的斜向滚动,记录下实现(滚动基于的ui::ScrollView控件):
原理:纵向移动单位距离(两个相邻节点的竖坐标间距),横向坐标亦需偏移单位距离(两个相邻节点的横坐标间距)
添加测试测试按钮(文本)
void HelloWorld::addItems()
{
Size visibleSize = Director::getInstance()->getVisibleSize();
auto scroll = ui::ScrollView::create();
scroll->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
scroll->ignoreAnchorPointForPosition(false);
scroll->setContentSize(Size(200, 300));
scroll->setClippingEnabled(true);
//scroll->setBounceEnabled(true);
scroll->setPosition(visibleSize*0.5);
this->addChild(scroll);
int unitH = 50;
int num = 20;
scroll->setInnerContainerSize(Size(scroll->getContentSize().width, unitH*num));
scroll->setMoveFunc(CC_CALLBACK_1(HelloWorld::scrollCallBack, this));
int innerH = scroll->getInnerContainerSize().height;
char buff[16] = { 0 };
for (size_t i = 0; i < num; i++)
{
auto txt = Text::create();
txt->setFontSize(30);
sprintf(buff, "%2d", i);
txt->setString(std::string("text--") + buff);
scroll->addChild(txt);
txt->setPosition(Vec2(scroll->getContentSize().width*0.5, innerH - (i + 0.5)*unitH));
_items.push_back(txt);
}
this->scrollCallBack(scroll);
}
根据ScrollView的滑动更新按钮(文本位置)
void HelloWorld::scrollCallBack(cocos2d::Node* node)
{
auto scroll = static_cast<ui::ScrollView *>(node);
int basePosX = scroll->getContentSize().width*0.5;
int basePosY = scroll->getInnerContainerSize().height;
int disW = 10, disH = 50;
int minY = scroll->getContentSize().height - scroll->getInnerContainerSize().height;
float moveH = scroll->getInnerContainerPosition().y- minY;
for (int i = 0; i < _items.size(); i++) {
float x = basePosX - disW * (i- moveH / disH);
float y = basePosY - disH * (i+0.5);
_items.at(i)->setPosition(Vec2(x, y));
}
}
实现的效果如下图: