http://www.cnblogs.com/dudu580231/p/4924192.HTML原文
cocos2dx ListVIEw 动态加载(代码)
其实是根据上篇文章得出的:
在ListVIEw中加载少量的内容,
然后在滑出界面的时候在加载一部分剩余的内容,
这样实现动态加载!!!
为了看出效果来,需要建立一个场景,然后点击按钮之后实现跳转,进而可以看出等待时间
代码:
1 @[email protected] 2 3 @H_404_30@#ifndef __MAINSCENE_SCENE_H__ 4 #define __MAINSCENE_SCENE_H__ 5 6 #include "cocos2d.h" 7 8 // 使用 cocosstudio 1.6 制作的头文件 9 #include cocos-ext.h10 @H_404_30@USING_NS_CC;11 @H_404_30@USING_NS_CC_EXT;12 using namespace@H_404_30@ cocos2d::ui; 13 14 @H_404_30@USING_NS_CC;15 16 class MainScene : public@H_404_30@ cocos2d::cclayer17 @H_404_30@{18 public@H_404_30@:19 Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'ID' in cocos2d-iphone20 virtual bool@H_404_30@ init(); 21 22 there's no 'ID' in cpp,so we recommend returning the class instance pointer23 static cocos2d::CCScene*@H_404_30@ scene();24 25 a selector callback26 voID menuCloseCallback(cocos2d::CCObject*@H_404_30@pSender,cocos2d::ui::touchEventType type);27 28 implement the "static node()" method manually29 @H_404_30@ CREATE_FUNC(MainScene);30 @H_404_30@};31 32 #endif __MAINSCENE_SCENE_H__
@[email protected]#include MainScene.h"@H_404_30@#include HelloWorldScene.h" 'scene' is an autorelease object CCScene *scene =@H_404_30@ CCScene::create(); 'layer' is an autorelease object MainScene *layer =@H_404_30@ MainScene::create(); add layer as a child to scene scene->@H_404_30@addChild(layer); return the scene return@H_404_30@ scene;}bool@H_404_30@ MainScene::init(){ if ( !@H_404_30@cclayer::init() ) { return false@H_404_30@; } 以下使用的必须是Json文件 cocos2d::ui::Widget *m_pWidget = GUIReader::shareReader()->WidgetFromJsonfile(ListVIEwItem_1/ListVIEwItem_1.Json"@H_404_30@); 创建一个可以装WIDge的一个层 cocos2d::ui::UILayer *m_pUIlayer =@H_404_30@ cocos2d::ui::UILayer::create(); 使用 addWidget 方法加载 cocosstudio制作的Json文件 m_pUIlayer->@H_404_30@addWidget(m_pWidget); 将 UILayer 添加到场景中 this->@H_404_30@addChild(m_pUIlayer); 获取按钮 cocos2d::ui::UIbutton *button = dynamic_cast<cocos2d::ui::UIbutton*>(m_pUIlayer->getWidgetByname(dybtn_buttonitem"@H_404_30@)); button->settouchEnabled(true@H_404_30@); button->addtouchEventListener(this,SEL_touchEvent(&@H_404_30@MainScene::menuCloseCallback)); true@H_404_30@;} voID MainScene::menuCloseCallback(cocos2d::CCObject*@H_404_30@pSender,cocos2d::ui::touchEventType type){ switch@H_404_30@ (type) { case@H_404_30@ cocos2d::ui::touchEventType::touch_EVENT_BEGAN: { cclOG(-- silent -- began -- menuCallBack ---- "@H_404_30@); } break@H_404_30@; case@H_404_30@ cocos2d::ui::touchEventType::touch_EVENT_MOVED: { } case@H_404_30@ cocos2d::ui::touchEventType::touch_EVENT_ENDED: { CCScene *pScene =@H_404_30@ HelloWorld::scene(); CCDirector::sharedDirector()->@H_404_30@replaceScene(pScene); } case@H_404_30@ cocos2d::ui::touchEventType::touch_EVENT_CANCELED: { } break@H_404_30@; default@H_404_30@: break@H_404_30@; }}
@[email protected]测试ListVIEw的动态加载的场景#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__@H_404_30@#include ListVIEwItem.h 使用 cocosstudio 1.6 制作的头文件#include "@H_404_30@USING_NS_CC;USING_NS_CC_EXT;namespace@H_404_30@ cocos2d::ui; class HelloWorld : public@H_404_30@ cocos2d::cclayer{public@H_404_30@: bool@H_404_30@ init(); static cocos2d::CCScene*@H_404_30@ scene(); implement the "static node()" method manually@H_404_30@ CREATE_FUNC(HelloWorld); 往ListVIEw中添加内容,实现动态加载ListVIEw中的内容 voID@H_404_30@ addobjiceList();private@H_404_30@: cocos2d::ui::UIListVIEw *m_pListVIEw; ListVIEw 对象@H_404_30@}; __HELLOWORLD_SCENE_H__
@[email protected]#include UIMyListVIEw.h"@H_404_30@USING_NS_CC_EXT;USING_NS_CC;CCScene*@H_404_30@ HelloWorld::scene(){ 'layer' is an autorelease object HelloWorld *layer =@H_404_30@ HelloWorld::create(); on "init" you need to initialize your instancebool@H_404_30@ HelloWorld::init(){ ////////////////////////////// 1. super init first ListVIEw_1/ListVIEw_1.Jsonthis->@H_404_30@addChild(m_pUIlayer); 获取文件中的 ListVIEw 列表容器 m_pListVIEw = dynamic_cast<cocos2d::ui::UIListVIEw*>(m_pUIlayer->getWidgetByname(dylv_twoListvIEw"@H_404_30@)); dybtn_button"@H_404_30@)); 在动态加载之前,先加载一屏幕的内容@H_404_30@ addobjiceList(); addobjiceList(); addobjiceList(); addobjiceList(); 动态加载ListVIEw 使用方法 UIMyDynamicListVIEw*@H_404_30@ m_pDynamicListVIEw; 创建动态类 m_pDynamicListVIEw =@H_404_30@ UIMyDynamicListVIEw::createExpendDynamicListVIEw(); 将ListVIEw加载到动态类中 m_pDynamicListVIEw->@H_404_30@init(m_pListVIEw); 当ListVIEw加载到顶部时 动态加载的数量 m_pDynamicListVIEw->setAddCount(1@H_404_30@); 设置ListvIEw中Item的总数 m_pDynamicListVIEw->setItemNeedDynamicCount(50@H_404_30@); 界面类中添加的回调函数 addobjiceList为回调函数 处理ListvIEw的信息 就是在外面初始化之后再添加到ListVIEw中,这样就可以动态加载了 m_pDynamicListVIEw->setCallBackFunctionAddItem(true@H_404_30@;}voID@H_404_30@ HelloWorld::addobjiceList(){ for(int i = 0; i < 100; i++)@H_404_30@ { 创建一个 layout 用来添加另一个 cocosstudio 导出的 Json 文件 cocos2d::ui::Layout *pLayout =@H_404_30@ cocos2d::ui::Layout::create(); 设置 layout 的大小 pLayout->setSize(cocos2d::CCSizeMake(70,70@H_404_30@)); for(int i = 0; i < 5; i ++@H_404_30@) { 创建另一个 Json 文件, 即一个按钮 (使用 cocosstudio 制作) ListVIEwItem *item =@H_404_30@ ListVIEwItem::create(i); 设置按钮的位置 ( 实现三排的效果, 在中间之后一次往后排 ) item->setposition(ccp((i)*0@H_404_30@)); 将三个 按钮 都添加到一个 layout 中,使其实现在同一排的效果 pLayout->@H_404_30@addChild(item); } vecLayout.push_back(pLayout); 初始化 100 个 m_pListVIEw->pushBackCustomItem(pLayout); 将 layout 添加到 ListVIEw 中@H_404_30@ }}
@[email protected]动态类,主要是这个类的作用#ifndef _UI_MYListVIEW_#define _UI_MYListVIEW_@H_404_30@#include "@H_404_30@USING_NS_CC_EXT;typedef voID (cocos2d::CCObject::*@H_404_30@m_AddItemfunction)();class UI_MyListVIEw: public@H_404_30@ cocos2d::ui::UIListVIEw{public@H_404_30@: 设置ListvIEw的选项 voID setCurSelectedindex(int@H_404_30@ index); 设置ListvIEw的移动点 voID@H_404_30@ setpositionOfContainer(cocos2d::CCPoint pos); 获得ListvIEw的移动点@H_404_30@ cocos2d::CCPoint getpositionOfContainer();};动态加载ListVIEw使用方法UIMyDynamicListVIEw* m_pDynamicListVIEw;创建动态类m_pDynamicListVIEw = UIMyDynamicListVIEw::createExpendDynamicListVIEw();将ListVIEw加载到动态类中m_pDynamicListVIEw->init(m_pServerList);当ListVIEw加载到顶部时 动态加载的数量m_pDynamicListVIEw->setAddCount(3);设置ListvIEw中Item的总数m_pDynamicListVIEw->setItemNeedDynamicCount(m_allServers.size());界面类中添加的回调函数 addobjiceList为回调函数 处理ListvIEw的信息m_pDynamicListVIEw->setCallBackFunctionAddItem(this,(m_AddItemfunction)(&ObjiceLayer::addobjiceList));class UIMyDynamicListVIEw:public@H_404_30@ cocos2d::CCObject{static UIMyDynamicListVIEw* createExpendDynamicListVIEw(); 创建动态类用来包裹ListVIEw@H_404_30@ UIMyDynamicListVIEw(); ~@H_404_30@UIMyDynamicListVIEw(); voID init(cocos2d::ui::UIListVIEw* ListVIEw); 将ListVIEw添加到动态类中 voID addItemTo(); 加载的item cocos2d::CCObject*@H_404_30@ m_pListener; voID setCallBackFunctionAddItem(cocos2d::CCObject*@H_404_30@ pListener,voID (cocos2d::CCObject::*@H_404_30@pfunction)()) { m_pListener =@H_404_30@ pListener; m_pCallFunc =@H_404_30@ pfunction; } voID setAddCount(unsigned int nCount); 设置动态加载的数量(即每次滑到底部的时候要加载的数量) unsigned int getAddCount(); 获取动态加载的数量 voID setItemNeedDynamicCount(unsigned int nCount); 设置未加载的个数 unsigned int getItemNeedDynamicCount(); 获取未加载的个数private@H_404_30@: ListVIEw的滑动事件 voID menuEvent(cocos2d::CCObject*@H_404_30@pSender,cocos2d::ui::ScrollvIEwEventType type); m_AddItemfunction m_pCallFunc; // voID (cocos2d::CCObject::*@H_404_30@m_AddItemfunction)() m_pCallFuncs; bool m_bLockAddItem; 是否加载 unsigned int m_nAddCount; 每次动态添加的个数 unsigned int m_nItemNeedDynamicCount; item的剩余未加载数 cocos2d::ui::UIListVIEw* m_ListVIEw; 外界传进来的ListVIEw@H_404_30@};#endif1 @[email protected] 2 3 4 #include 5 @H_404_30@USING_NS_CC; 6 namespace@H_404_30@ cocos2d::ui; 7 8 9 voID UI_MyListVIEw::setCurSelectedindex(int@H_404_30@ index) 10 @H_404_30@{ 11 _curSelectedindex =@H_404_30@ index; 12 @H_404_30@ updateInnerContainerSize(); 13 if(_curSelectedindex>0@H_404_30@) 14 @H_404_30@ { 15 float fPercent = float(_curSelectedindex - 1)/(getChildrenCount() - 3@H_404_30@); 16 if(fPercent>1.000000f@H_404_30@) 17 @H_404_30@ { 18 fPercent = 1.000000f@H_404_30@; 19 @H_404_30@ } 20 CCScrollVIEwDirection s = this->get(); 21 if (this->getDirection() ==@H_404_30@ SCRolLVIEW_DIR_HORIZONTAL) 22 @H_404_30@ { 23 jumptopercentHorizontal(fPercent*100@H_404_30@); 24 @H_404_30@ } 25 else this->getDirection() ==@H_404_30@ SCRolLVIEW_DIR_VERTICAL) 26 @H_404_30@ { 27 jumptopercentVertical(fPercent* 28 @H_404_30@ } 29 30 @H_404_30@ } 31 else 32 @H_404_30@ { 33 34 @H_404_30@ { 35 jumptopercentHorizontal(0@H_404_30@); 36 @H_404_30@ } 37 38 @H_404_30@ { 39 jumptopercentVertical( 40 @H_404_30@ } 41 @H_404_30@ } 42 @H_404_30@} 43 voID@H_404_30@ UI_MyListVIEw::setpositionOfContainer(cocos2d::CCPoint pos) 44 @H_404_30@{ 45 _innerContainer->@H_404_30@setposition(pos); 46 @H_404_30@} 47 48 @H_404_30@cocos2d::CCPoint UI_MyListVIEw::getpositionOfContainer() 49 @H_404_30@{ 50 return _innerContainer->@H_404_30@getposition(); 51 @H_404_30@} 52 53 54 55 @H_404_30@UIMyDynamicListVIEw::UIMyDynamicListVIEw() 56 @H_404_30@{ 57 58 @H_404_30@} 59 60 UIMyDynamicListVIEw::~@H_404_30@UIMyDynamicListVIEw() 61 @H_404_30@{ 62 m_pListener =@H_404_30@ NulL; 63 m_pCallFunc =@H_404_30@ NulL; 64 @H_404_30@} 65 66 UIMyDynamicListVIEw*@H_404_30@ UIMyDynamicListVIEw::createExpendDynamicListVIEw() 67 @H_404_30@{ 68 69 UIMyDynamicListVIEw* Widget = new@H_404_30@ UIMyDynamicListVIEw(); 70 if@H_404_30@ (Widget) 71 @H_404_30@ { 72 Widget->@H_404_30@retain(); 73 return@H_404_30@ Widget; 74 @H_404_30@ } 75 @H_404_30@ CC_SAFE_DELETE(Widget); 76 return@H_404_30@ NulL; 77 @H_404_30@} 78 79 voID UIMyDynamicListVIEw::init(cocos2d::ui::UIListVIEw*@H_404_30@ ListVIEw) 80 @H_404_30@{ 81 if@H_404_30@ (ListVIEw) 82 @H_404_30@ { 83 m_bLockAddItem = true; 设置未加载 84 m_ListVIEw =@H_404_30@ ListVIEw; 85 m_nAddCount = 0@H_404_30@; 86 m_nItemNeedDynamicCount = 0@H_404_30@; 87 m_ListVIEw->addEventListenerScrollVIEw( 88 @H_404_30@ } 89 90 @H_404_30@} 91 92 voID UIMyDynamicListVIEw::menuEvent(cocos2d::CCObject*@H_404_30@pSender,cocos2d::ui::ScrollvIEwEventType type) 93 @H_404_30@{ 94 switch@H_404_30@ (type) 95 @H_404_30@ { 96 case cocos2d::ui::SCRolLVIEW_EVENT_SCRolliNG: 在ListVIEw滑动的时候添加内容,只要界面滑动就可以添加内容 97 { 98 if (m_bLockAddItem) 99 {100 addItemTo();101 }102 }103 break;104 case cocos2d::ui::SCRolLVIEW_EVENT_SCRolL_TO_BottOM: 在ListVIEw滑动到底部的时候添加内容105 @H_404_30@ { 106 if@H_404_30@ (m_bLockAddItem)107 @H_404_30@ {108 @H_404_30@ addItemTo();109 @H_404_30@ } 110 @H_404_30@ }111 break@H_404_30@;112 case cocos2d::ui::SCRolLVIEW_EVENT_SCRolL_TO_RIGHT: 在ListVIEw滑动到右部的时候添加内容113 @H_404_30@ { 114 115 @H_404_30@ {116 @H_404_30@ addItemTo();117 @H_404_30@ } 118 @H_404_30@ }119 120 default@H_404_30@:121 122 @H_404_30@ }123 @H_404_30@}124 125 每次要添加的内容126 voID UIMyDynamicListVIEw::setAddCount(unsigned int@H_404_30@ nCount)127 @H_404_30@{128 m_nAddCount =@H_404_30@ nCount;129 @H_404_30@}130 131 unsigned int@H_404_30@ UIMyDynamicListVIEw::getAddCount()132 @H_404_30@{133 return@H_404_30@ m_nAddCount;134 @H_404_30@}135 136 设置还需要加载的数量137 voID UIMyDynamicListVIEw::setItemNeedDynamicCount(unsigned 138 @H_404_30@{139 m_nItemNeedDynamicCount =@H_404_30@ nCount;140 @H_404_30@}141 142 unsigned int@H_404_30@ UIMyDynamicListVIEw::getItemNeedDynamicCount()143 @H_404_30@{144 return@H_404_30@ m_nItemNeedDynamicCount;145 @H_404_30@}146 147 设置加载函数148 voID@H_404_30@ UIMyDynamicListVIEw::addItemTo()149 @H_404_30@{150 如果ListVIEw存在的话151 if@H_404_30@ (m_ListVIEw)152 @H_404_30@ {153 将其设置为未加载154 m_bLockAddItem = false@H_404_30@;155 int nAddCount = 0; 设置本次加载的数量156 当还有要加载的内容时157 while@H_404_30@ (m_nItemNeedDynamicCount)158 @H_404_30@ {159 nAddCount++; 将本次加载数量 +1160 将本次加载数量与每次要加载的数量做比较,本次加载多于每次加载时则不再加载了161 if (nAddCount>@H_404_30@m_nAddCount)162 @H_404_30@ {163 m_bLockAddItem = true@H_404_30@;164 return@H_404_30@;165 @H_404_30@ }166 更新未加载的数量167 m_nItemNeedDynamicCount--@H_404_30@;168 m_ListVIEw->@H_404_30@pushBackDefaultItem();169 if (m_pListener == 0 || m_pCallFunc == 170 @H_404_30@ {171 assert(false@H_404_30@);172 173 @H_404_30@ }174 (m_pListener->*m_pCallFunc)(/*sender*/@H_404_30@);175 m_ListVIEw->@H_404_30@sortAllChildren();//在绘画之前,排列所有的孩子数组一次,而不是每次添加或者删除子节点时都排序。 这个方法可以大幅度地提高性能。注解:不要手动调用这个方法,除非一个添加过的子节点将要被删除在这个结构内。176 @H_404_30@ }177 @H_404_30@ }178 } 总结
以上是内存溢出为你收集整理的cocos2dx ListView 动态加载(代码)全部内容,希望文章能够帮你解决cocos2dx ListView 动态加载(代码)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)