关于cocostudio的ScrollView使用

前端之家收集整理的这篇文章主要介绍了关于cocostudio的ScrollView使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

想做一个关卡需求是这样的:

点击关卡按钮player会从当前关卡移动到目标按钮关卡的位置,同事背景也要移动,并且保证背景没有黑边的情况下,尽量使player位于x轴y轴的中间位置。

如果不能滚动的话,直接移动背景就好了,现在需求滑动也能选择关卡,那么久需要用scrollView并设置一下containLayer的offset了。

初始化的scrollView时候scrollView位于左上角,设置也没有作用,现在发现的只能这么做设置一下time让它有个动作移动到目的位置了。

  1. auto innerSize = scView->getInnerContainer()->getContentSize();
  2. auto scViewSize = scView->getContentSize();
  3. scViewPos = Vec2(innerSize.width - scViewSize.width,scViewSize.height-innerSize.height);


ScrollView是按百分比移动的,其中百分比的目标宽度是scViewPos.x,目标高度是scViewPos.y注意目标高度是负值。因为cocos初始化的时候是在左上角的,也就是向下移动了

innerSize.height - scViewSize.height距离。


代码

.h

  1. #ifndef LevelLayer_H__
  2. #define LevelLayer_H__
  3. #include "BasicLayer.h"
  4. #include "Define.h"
  5. #include "cocostudio/CocoStudio.h"
  6. #include "ui/CocosGUI.h"
  7. #include "Tools.h"
  8. using namespace ui;
  9. using namespace std;
  10. class LevelLayer : public BasicLayer
  11. {
  12. public:
  13. LevelLayer(){};
  14. ~LevelLayer(){};
  15. static Scene* scene();
  16. virtual bool init();
  17. void initData();
  18. void initView();
  19. void btn_callBack(Ref *pSender,Widget::TouchEventType type);
  20. void test(float dt);
  21. CREATE_FUNC(LevelLayer);
  22. public:
  23. Size bgSize;
  24. int curPageIndex;
  25. ScrollView* scView;
  26. Sprite* hero;
  27. vector<Vec2> levPoints;
  28. //当前scViewPos 也就是innerlayer多出view部分 宽度为正 高度为负
  29. Vec2 scViewPos;
  30. //当前scview占得百分比
  31. Vec2 percentPos;
  32. };
  33. #endif
.cpp
  1. #include "LevelLayer.h"
  2. #include "math.h"
  3. Scene* LevelLayer::scene()
  4. {
  5. auto sc = Scene::create();
  6. auto layer = LevelLayer::create();
  7. sc->addChild(layer);
  8. return sc;
  9. }
  10.  
  11. bool LevelLayer::init()
  12. {
  13. BasicLayer::init();
  14. initData();
  15. initView();
  16. return true;
  17. }
  18.  
  19.  
  20. void LevelLayer::initData()
  21. {
  22. curPageIndex = 1;
  23. }
  24.  
  25. void LevelLayer::initView()
  26. {
  27. Node* root = CSLoader::createNode("LevelLayer.csb");
  28. this->addChild(root);
  29. hero = (Sprite*)seekNodeByName(root,"hero");
  30. auto bg = (Sprite*)seekNodeByName(root,"levelBg");
  31. bgSize = bg->getContentSize();
  32. scView = (ScrollView*)seekNodeByName(root,"scrollView");
  33. auto innerSize = scView->getInnerContainer()->getContentSize();
  34. auto scViewSize = scView->getContentSize();
  35. scViewPos = Vec2(innerSize.width - scViewSize.width,scViewSize.height-innerSize.height);
  36. percentPos = Vec2(0,100);
  37. scView->scrollToPercentBothDirection(percentPos,4.5f,true);
  38. for(int i=1;i<=EVERY_LEVEL_NUMES;i++)
  39. {
  40. const char* btName = String::createWithFormat("button_%02d",i)->getCString();
  41. auto node = (Button*)seekNodeByName(root,btName);
  42. node->addTouchEventListener(CC_CALLBACK_2(LevelLayer::btn_callBack,this));
  43. auto pos = node->getPosition();
  44. // CCLOG("i = [posX:%f posy:%f tag:%d]",pos.x,pos.y,node->getTag());
  45. levPoints.push_back(pos);
  46. }
  47. this->schedule(schedule_selector(LevelLayer::test),0.2f);
  48. }
  49.  
  50. void LevelLayer::btn_callBack(Ref *pSender,Widget::TouchEventType type)
  51. {
  52. if(type == Widget::TouchEventType::ENDED)
  53. {
  54. CCLOG("btn_callBack");
  55. Button* btn = (Button*)pSender;
  56. int tag = btn->getTag();
  57. auto curPos = hero->getPosition();
  58. auto aimPos = levPoints[tag-1];
  59. float dis = curPos.distance(aimPos);
  60. CCLOG("dis:%f",dis);
  61. float moveTime = dis * 0.01f;
  62. auto moveTo = MoveTo::create(moveTime,aimPos);
  63. hero->runAction(moveTo);
  64. CCLOG("i = [posX:%f posy:%f tag:%d]",aimPos.x,aimPos.y,tag);
  65. int x = MAX(aimPos.x,winWidth / 2);
  66. int y = MAX(aimPos.y,winHeight/ 2);
  67. x = MIN(x,bgSize.width - winWidth/2);
  68. y = MIN(y,bgSize.height - winHeight/2);
  69. auto goodPoint = Vec2(x,y);
  70. auto centerOfScreen = winCenter;
  71. centerOfScreen.subtract(goodPoint);
  72. // auto bg = hero->getParent();
  73. // auto bgMove = MoveTo::create(moveTime,centerOfScreen);
  74. // bg->runAction(bgMove);
  75. float perX = centerOfScreen.x/scViewPos.x*100;
  76. float perY = centerOfScreen.y/scViewPos.y*100;
  77. CCLOG("[center:]%f %f [%f %f]",centerOfScreen.x,centerOfScreen.y,perX,perY);
  78. Vec2 perPos = Vec2(perX,perY);
  79. Vec2 curPrePos = percentPos - perPos;
  80. curPos = scView->getInnerContainer()->getPosition();
  81. CCLOG("curpos:%f %f",curPos.x,curPos.y);
  82. scView->scrollToPercentBothDirection(curPrePos,moveTime,true);
  83. }
  84. }
  85.  
  86. void LevelLayer::test(float dt)
  87. {
  88. auto layer = scView->getInnerContainer();
  89. CCLOG("layer:%f %f",layer->getPositionX(),layer->getPositionY());
  90. }

测试图片

猜你在找的Cocos2d-x相关文章