2013年02月24日

すみません。修正しました!

Cocos2d-xでもデータの管理はシングルトンでしたいの.cppのソースが張り付けミスしてました。。
さっそく修正しました。

こちらの方のご指摘でわかりました。
ご指摘ありがとうございました!!
http://qiita.com/items/5eca8aab0dbd3f33273c#comment-a7cbb8eae2fdd5078c1c

posted by itokami1123 at 22:44| Comment(0) | 日記

cocos2d-xのCCTableViewを使ってみました。

Cocos2d-xでiPhoneとAndroid同時リリースがんばるぞ〜。

今日は学習アプリでよくある成績発表画面を作る為に
一覧表の表示を調べて行きたいと思います。

Objective-C (UIKit)で言うUITableView風のものが
Cocos2d-xに CCTableViewっていう名前であるらしいです。

命名規約がUIKitに似ていて分かりやすいですね〜。

おそらくUITableViewと一緒なんでしょうから
DelegateとDataSourceの実装がいるんでしょうかねぇ。

まず公式サイトのリファレンスを読んでみます。
英語一杯ですね。。。
英語がすらすら読める様に勉強せねば。。

CCTableViewDelegate Class Referenceを見ますと
"tableCellTouched" に "pure virtual"って書いてます。

多分pure virtualがObjective-Cで言う
required(実装必須メソッド)なんでしょうかね。

CCTableViewDataSource Class Referenceを見ますと
"cellSizeForTable" "numberOfCellsInTableView" "tableCellAtIndex"の
3つが"pure virtual"みたいですね。

それでは最小限のテーブルをゲーム画面に追加してみます。

Objective-C (UIKit)のUITableViewのサンプルだと
DelegateとDataSourceの
@protocol(Javaで言うinterfaceみたいなもの)を
実装するんですけど...

Cocos2d-x (C++)では多重継承を使うみたいですね。
人生初の多重継承です。

ゲーム画面のヘッダ(GameScene.h)に追加しました。

class Game : public cocos2d::CCLayer,
public cocos2d::extension::CCTableViewDataSource,
public cocos2d::extension::CCTableViewDelegate
{


extensionでエラーが??

設定が足りないみたいなので以下を加えるとなおりました。

#include "cocos-ext.h"
using namespace cocos2d;
using namespace cocos2d::extension;


CCTableViewは拡張機能なんでしょうかねぇ。。
まぁ気にせず進みます。

ヘッダファイルのpublic:に以下を加えました。

public:
  ・・・ 省略 ・・・
// CCTableViewDelegate用
virtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);

// CCTableViewDataSoruce用
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);

// ポイント!これも要るよ〜。
// CCTableViewDelegateがCCScrollViewDelegateを継承していて
// それの実装必須のものみたいです。
virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view) {};
virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view) {}
  ・・・ 省略 ・・・

};


宣言部も用意出来たので".cpp"にDelegateとDataSourceの実装をして行きます。


// CCTableViewDelegate用
void Game::tableCellTouched(CCTableView* table, CCTableViewCell* cell)
{
// Cellをタッチした時の番号を表示
CCLOG("cell wo touch sitayo Idx ha --> %i", cell->getIdx());
}

// CCTableViewDataSoruce用
CCSize Game::cellSizeForTable(CCTableView *table)
{
// 一つのCellのサイズ
return CCSizeMake(200, 40);
}

CCTableViewCell* Game::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
CCString *string = CCString::createWithFormat("%i行目", idx);

// Cellがもう作られているかチェック
CCTableViewCell *cell = table->dequeueCell();
if (!cell) {
// 無ければ作る
cell = new CCTableViewCell();
cell->autorelease();

// セルの背景を描画
CCLayerColor *layer = CCLayerColor::create( ccc4(250, 250, 250, 255) );
layer->setContentSize( CCSizeMake(200, 38) ); //.contentSize = CGSizeMake(100, 100);
layer->setAnchorPoint(ccp(0, 0));
layer->setPosition(ccp(0, 0));
layer->setTag(111);
cell->addChild( layer );

// ラベル文字を表示
CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Hiragino Kaku Gothic ProN", 24);
layer->setAnchorPoint(ccp(0, 0));
label->setPosition(ccp(40, 10));
label->setTag(112);
label->setHorizontalAlignment( kCCTextAlignmentLeft );
cell->addChild(label);

label->setColor( ccc3(0, 0, 0) );


}else{
// 既にCellが生成済みであればそれを再利用して文字を表示する
CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(112);
label->setString(string->getCString());
}
return cell;
}

unsigned int Game::numberOfCellsInTableView(CCTableView *table)
{
// Cellの数は10個にする
return 10;
}

どーしてもセルの背景色の付け方が分からなくて
セルの中に四角の白い矩形を追加して背景にしました。
あってるのかなぁ??

最後にCCTableViewを画面に追加します。

bool Game::init()
{
・・・ 省略 ・・・

/* 画面にテーブルを追加 */
CCTableView* tableView = CCTableView::create( this, CCSizeMake(300, 200) );
tableView->setDirection( kCCScrollViewDirectionVertical );
tableView->setPosition( ccp( 60, 200 ) );
tableView->setDelegate( this );
this->addChild( tableView, 1 );
tableView->reloadData();

return true;
}


なんとかテーブルが表示されました。
CCTableView.png

ちょっとUITableViewと動きが違ってますねぇ。

テーブル表示に2日ほど悩んでしまいました。。
う〜む、このままではソフト公開に1年位かかってしまいそうです〜。

posted by itokami1123 at 22:24| Comment(0) | 日記

2013年02月19日

Cocos2d-xでシングルトンによる画面間データ連携

Cocos2d-xでiPhoneとAndroid同時リリースがんばるぞ〜。

今日はメニューで選んだ内容を保持する所を
作って行きたいと思います。

今回作ってる単位先生というゲームでは
「長さ」「かさ」などの単位をメニューで選びますので
ゲーム画面で選択された機能の情報が必要になります。

↓、前回作製したシングルトンクラスのヘッダに
ゲームモードを保持する機能をつけた例です。

// GameManager.h

#ifndef __TaniSensei__GameManager__
#define __TaniSensei__GameManager__

// (1).追加ポイント --> start
typedef enum{
GameModeMenu ,
GameModeNagasa ,
GameModeKasa ,
}GameMode;
// (1).追加ポイント <-- end

#include "cocos2d.h"

class GameManager
{
private:
GameManager();
static GameManager* m_mySingleton;

public:
static GameManager* sharedGameManager();

// (2).追加ポイント --> start
GameMode gameMode;
// (2).追加ポイント <-- end
int count;

};

#endif /* defined(__TaniSensei__GameManager__) */


(1).ゲームモードでありえそうな内容を列挙します。
この例ではメニュー、長さモード、かさモードの3種類が
GameModeという型に設定しています。

・・・省略・・・
// (1).追加ポイント --> start
typedef enum{
GameModeMenu ,
GameModeNagasa ,
GameModeKasa ,
}GameMode;
// (1).追加ポイント <-- end
・・・省略・・・



(2).次はメンバー変数に保持するようにします。

・・・省略・・・
public:
static GameManager* sharedGameManager();
// (2).追加ポイント --> start
GameMode gameMode;
// (2).追加ポイント <-- end
・・・省略・・・



そうすると↓(3)のようにゲームモードをどこからでも設定/参照できるようになります。

// 例)MenuScene.cpp
// 長さクイズボタン押下時
void Menu::nagasaStartBtnDidPushCallback(CCObject* pSender)
{
// (3).追加ポイント --->
// ゲームの種類を長さゲームに確定
GameManager::sharedGameManager()->gameMode = GameModeNagasa;
// (3).追加ポイント <---

// ゲーム画面のシーンを生成
CCScene* gameScene = Game::scene();

// ゲーム画面の登場シーンの種類を 0.5秒間 右からスライドに設定
CCTransitionScene *transitionScen = CCTransitionSlideInR::create( 0.5, gameScene );

// 画面シーンの切り替えを実行(メニュー画面からゲーム画面に遷移開始!)
CCDirector::sharedDirector()->replaceScene( transitionScen );
}



次はゲーム結果画面にObjective-cのUITableViewのようなものが出せないか調べようと思います。

posted by itokami1123 at 08:32| Comment(0) | 日記