遊戲項目中對CCTableView的使用

在當的遊戲項目中爲了找到一個合適的可橫向滑動圖標列表容器,並且支持選中狀態的標記,所以首先想到的是CCListView,當然這也是從一些Cocos2dx的教程書籍中看到的。

但是當我在工程中引用“CCListView.h”的時候才發現cocos2dx 2.1以及之後的版本竟然沒有了這個類,當時挺納悶的,baidu GooG 各種搜索才找到當前cocos2dx的滑動列表類以及命名爲CCTableView了,在使用的過程中也遇到了一些問題,OK  下面記錄一下使用的方法以及遇到的問題和解決的辦法。

首先引入TableView:

#include "cocos-ext.h"

USING_NS_CC_EXT;

class MyTableLayer : public CCLayer ,
                                public CCTableViewDataSource, public CCTableViewDelegate{

};


需要實現的方法:

virtual void scrollViewDidScroll(CCScrollView* in_pView);//需要繼承,但是可以不實現內容
    
virtual void scrollViewDidZoom(CCScrollView* in_pView);//需要繼承,但是可以不實現內容
    
//處理觸摸事件,可以計算點擊的是哪一個子項
virtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
    
//每一項的寬度和高度
virtual cocos2d::CCSize cellSizeForTable(cocos2d::extension::CCTableView *table);
    
//生成列表每一項的內容
virtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);
    
//一共多少項
virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);
    
//按下去的時候,就是高亮顯示,這裏可以設置高亮狀態
virtual void tableCellHighlight(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);
                                    
//鬆開的時候,取消高亮狀態
virtual void tableCellUnhighlight(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);


TableView的屬性設置:

m_pTableView = CCTableView::create(this, CCSizeMake(***, ***));//設置TableView的大小
m_pTableView->setDirection(kCCScrollViewDirectionHorizontal);//這裏根據項目需要選中了橫向設置
m_pTableView->setAnchorPoint(CCPointZero);
m_pTableView->setPosition(ccp(***, ***));
m_pTableView->setDelegate(this);
m_pTableView->setVerticalFillOrder(kCCTableViewFillTopDown);//數據加載的方式選擇了自上至下
this->addChild(m_pTableView);
m_pTableView->reloadData();

TableView的數據加載:

CCTableViewCell* HurtSoldierItemLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
    CCTableViewCell *t_pCell = table->dequeueCell();
    if (!t_pCell) {
        t_pCell = new CCTableViewCell();
        t_pCell->autorelease();
        
    }else{
        t_pCell->removeAllChildren();//這個地方的RemoveAllChildren很重要,一定要記得remove,不認就會導致列表下標和顯示重複混亂
         
    }
    
    CCSprite* tmp_pSpSoldierCell = CCSprite::create("BG5.png");
    t_pCell->addChild(tmp_pSpSoldierCell);
    
    return t_pCell;
}


高亮與取消高亮可以根據自己的項目需求來實現,他的默認實現方式是當點擊列表中的圖標就執行tableCellHighlight,鬆開點擊後馬上執行tableCellUnhighlight,原理就就像菜單按鈕一樣,按下去是一個狀態,鬆開又恢復原來的狀態。


OK,其中最值得注意的地方是tableCellAtIndex方法中加載cell是時候一定要記得remove已存在下標的Cell,不然加載會出現覆蓋導致順利混亂有誤,網上有個博客針對這個問題給出了一個殺雞取卵的解決方案,就是去CCTableView::dequeueCell()方法中將if (m_pCellsFreed->count() == 0)修改成if(1),注意會導致每次dequeueCell都會new出新的Cell,加載數量一多,必定掛掉。


Over

發佈了7 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章