Cocos2dx 3.0 TableViewを使ってみる

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

2.x系の記事はありますが、3.x系の記事が見当たらないので備忘録。
抽象クラスの型がv3から変更されています。定義には注意してください。

・40行分のテーブルを表示
・交互に背景色を変更
・スクロールさせる

結果はこちら

f:id:raharu0425:20140514173749p:plain

Overview.h

//
// Overview.h
// Abyss
//
// Created by raharu on 2014/05/10.
//
//
#ifndef __Abyss__Overview__
#define __Abyss__Overview__
#include <iostream>
#include "cocos2d.h"
#include <extensions/cocos-ext.h>
USING_NS_CC;
using namespace extension;
class Overview : public Layer,
public TableViewDataSource,
public TableViewDelegate
{
Size window_size;
public:
static cocos2d::Scene* createScene();
virtual bool init();
//TableViewDataSourceの抽象メソッド
virtual Size cellSizeForTable(TableView* table);
virtual TableViewCell* tableCellAtIndex(TableView* table,ssize_t idx);
virtual ssize_t numberOfCellsInTableView(TableView* table);
//TableViewDelegateの抽象メソッド
virtual void tableCellTouched(TableView* table,TableViewCell* cell);
//TableViewDelegateが継承しているScrollViewの抽象メソッド
virtual void scrollViewDidScroll(ScrollView* view){};
virtual void scrollViewDidZoom(ScrollView* view){};
CREATE_FUNC(Overview);
};
#endif /* defined(__Abyss__Overview__) */

Overview.cpp

//
// Overview.cpp
// Abyss
//
// Created by raharu on 2014/05/10.
//
//
#include "Overview.h"
Scene* Overview::createScene()
{
auto scene = Scene::create();
auto layer = Overview::create();
scene->addChild(layer);
return scene;
}
// on "init" you need to initialize your instance
bool Overview::init()
{
//初期化
if ( !Layer::init() ) return false;
//画面サイズサイズを取得
window_size = Director::getInstance()->getWinSize();
TableView* tableView = TableView::create(this, window_size);
//展開方向
tableView->setDirection(TableView::Direction::VERTICAL);
//表示順序上からしたへ
tableView->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);
//追加
tableView->setDelegate(this);
addChild(tableView);
tableView->reloadData();
return true;
}
// セルの大きさを設定する
Size Overview::cellSizeForTable(TableView *table){
return Size(window_size.width, 25);
}
// 1セルに表示させるValueをセット
TableViewCell* Overview::tableCellAtIndex(TableView *table, ssize_t idx){
std::string id = StringUtils::format("%zd", idx);
std::string text = StringUtils::format("Line %zd", idx);
TableViewCell *cell = table->dequeueCell();
cell = new TableViewCell();
cell->autorelease();
// セルの背景は交互に色を変更する
auto background_color = Color3B(255,255,255);
if (idx%2) {
background_color = Color3B(200,200,200);
}
Sprite* bg = Sprite::create();
bg->setAnchorPoint(Point(0, 0));
bg->setTextureRect(Rect(0, 0, window_size.width, 24));
bg->setColor(background_color);
bg->setTag(100);
cell->addChild(bg);
// ボーダーライン
Sprite* line = Sprite::create();
line->setAnchorPoint(Point(0, 0));
line->setTextureRect(Rect(0, 0, window_size.width, 1));
line->setColor(Color3B(0,0,0));
cell->addChild(line);
// ID部分
auto *label_1 = LabelTTF::create(id.c_str(), "Arial", 20);
label_1->setAnchorPoint(Point(0, 0));
label_1->setPosition(Point(50, 0));
label_1->setColor(Color3B(0,0,0));
cell->addChild(label_1);
// テキスト部分
auto *label_2 = LabelTTF::create(text.c_str(), "Arial", 20);
label_2->setAnchorPoint(Point(0, 0));
label_2->setPosition(Point(100, 0));
label_2->setColor(Color3B(0,0,0));
cell->addChild(label_2);
return cell;
}
// セル数
ssize_t Overview::numberOfCellsInTableView(TableView *table){
return 40;
}
// セルがタッチされた時のcallback
void Overview::tableCellTouched(TableView* table, TableViewCell* cell){
CCLOG("%ziのセルがタッチされました", cell->getIdx());
}