cocos2dx ListView 动态加载(代码)

cocos2dx ListView 动态加载(代码),第1张

概述http://www.cnblogs.com/dudu580231/p/4924192.html原文 cocos2dx ListView 动态加载(代码) 其实是根据上篇文章得出的: 在ListView中加载少量的内容, 然后在滑出界面的时候在加载一部分剩余的内容, 这样实现动态加载!!!   为了看出效果来,需要建立一个场景,然后点击按钮之后实现跳转,进而可以看出等待时间   代码: 1 Ma

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@};#endif
1 @[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 动态加载(代码)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1078008.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存