読者です 読者をやめる 読者になる 読者になる

とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

Cocos2dx 3.0 TableViewを使ってみる

2.x系の記事はありますが、3.x系の記事が見当たらないので備忘録。
numberOfCellsInTableViewの型が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());
}