2013年10月3日木曜日

cocos2d-x v3のschedule( schedule_selector(""))でエラー!cocos2d::SEL_SCHEDULE' (aka 'void (cocos2d::Object::*)(float)') is not allowedの解決方法

こんにちは!

予想外のところで躓いたためメモです。

cocos2d-x v3を使用しています。
schedule( schedule_selector(""));を使用したところ、何故かErrorが・・・・。

エラーは「cocos2d::SEL_SCHEDULE' (aka 'void (cocos2d::Object::*)(float)') is not allowed」という内容でした。

はい、エラーの指摘内容の意味がわかりません・・・・。
仕方がないので、サンプルソースのSapleGameのソースの該当部分をみると・・・・。
え!?floatの引数が指定されているじゃありませんか!

■エラーが出たソース
//HelloWorldScene.h
class HelloWorld : public cocos2d::Layer
{
public:
    void gameLogic();
}

//HelloWorldScene.cppでの呼び出し箇所
    this->schedule(schedule_selector(HelloWorld::gameLogic),1.0);


■修正後のソース
//HelloWorldScene.h
class HelloWorld : public cocos2d::Layer
{
public:
    void gameLogic(float dt); //←ここ
}

//HelloWorldScene.cppでの呼び出し箇所
    this->schedule(schedule_selector(HelloWorld::gameLogic),1.0);


先が思いやられますが、こんな感じでC++と格闘しています。



にほんブログ村 Androidアプリ開発へ

cocos2d-x v2とv3の違いについて

こんにちは!

以前はWindowsでAndEngineを使ってAndroid向けのアプリ開発をしていましたが・・・・
iPhoneのマーケットにも出したいと思い、MacBookPro(Airではなく・・・・)を購入してしまいました。

そんなことはさておき、開発もcocos2d-xに変更し参考書籍やサンプルソースをß読み
人生初のC++と悪戦苦闘しています。

cocos2d-x歴は浅いですがAndEngineと比べると、画像(Sprite)やアクション(3秒に1回◯◯するとか、5秒後に消えるとか)を扱うメソッドが充実しているのと、外部ツール(PhysicsEditor、LevelHelper、CocosBuilderなど)が充実しているのが魅力です。

cocos2d-xは、現在v2(v2.1.5)とv3(v3.0 alpha0)に分かれています。
参考書籍はv2なのですが、v3のサンプルソースなどを見比べて気が付いた点を自分の備忘録としてメモしたいと思います。



cocos2d-xの「SimpleGame」のソースコードで比較してみます。

■「CCSene」が「Sean」に
//v2の場合
CCScene * scene = CCScene::create();
HelloWorld *layer = HelloWorld::create();
scene->addChild(layer);

//v3の場合
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);


■「MenuItemImage」や「Director::getInstance()」など「CCPointZeroはPoint::ZERO」に
//v2の場合
  CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
   "CloseNormal.png",
   "CloseSelected.png",
   this,
   menu_selector(HelloWorld::menuCloseCallback));
  CC_BREAK_IF(! pCloseItem);
        
  // Place the menu item bottom-right conner.
        CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
        CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
        
  pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2,
                                    origin.y + pCloseItem->getContentSize().height/2));

  // Create a menu with the "close" menu item, it's an auto release object.
  CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
  pMenu->setPosition(CCPointZero);
  CC_BREAK_IF(! pMenu);

  // Add the menu to HelloWorld layer as a child layer.
  this->addChild(pMenu, 1);


//v3の場合
  auto closeItem = MenuItemImage::create(
   "CloseNormal.png",
   "CloseSelected.png",
            CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
  CC_BREAK_IF(! closeItem);
        
  // Place the menu item bottom-right conner.
        auto visibleSize = Director::getInstance()->getVisibleSize();
        auto origin = Director::getInstance()->getVisibleOrigin();
        
  closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2,
                                    origin.y + closeItem->getContentSize().height/2));

  // Create a menu with the "close" menu item, it's an auto release object.
  auto menu = Menu::create(closeItem, NULL);
  menu->setPosition(Point::ZERO);
  CC_BREAK_IF(! menu);

  // Add the menu to HelloWorld layer as a child layer.
  this->addChild(menu, 1);


■「CCSpriteがSprite」、「ccpがPoint」に
//v2の場合
  CCSprite *player = CCSprite::create("Player.png", CCRectMake(0, 0, 27, 40) );
        
  player->setPosition( ccp(origin.x + player->getContentSize().width/2,
                                 origin.y + visibleSize.height/2) );
  this->addChild(player);

  this->schedule( schedule_selector(HelloWorld::gameLogic), 1.0 );

  this->setTouchEnabled(true);

  _targets = new CCArray;
  _projectiles = new CCArray;

  // use updateGame instead of update, otherwise it will conflit with SelectorProtocol::update
  // see http://www.cocos2d-x.org/boards/6/topics/1478
  this->schedule( schedule_selector(HelloWorld::updateGame) );

  CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav", true);


//v3の場合
  auto player = Sprite::create("Player.png", Rect(0, 0, 27, 40) );
        
  player->setPosition( Point(origin.x + player->getContentSize().width/2,
                                 origin.y + visibleSize.height/2) );
  this->addChild(player);

  this->schedule( schedule_selector(HelloWorld::gameLogic), 1.0 );

  this->setTouchEnabled(true);

  _targets = new Array();
        _targets->init();
        
  _projectiles = new Array();
        _projectiles->init();

  // use updateGame instead of update, otherwise it will conflit with SelectorProtocol::update
  // see http://www.cocos2d-x.org/boards/6/topics/1478
  this->schedule( schedule_selector(HelloWorld::updateGame) );

  CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("background-music-aac.wav", true);


■DirectorはJavaでよくみたシングルトンの呼び出しと同じに
//v2の場合
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
 // "close" menu item clicked
 CCDirector::sharedDirector()->end();
}

//v3の場合
void HelloWorld::menuCloseCallback(Object* sender)
{
 // "close" menu item clicked
 Director::getInstance()->end();
}

JAVAでのシングルトンの呼び出しと同じgetInstance()が登場して、
v2ではなく、v3で開発をしようと思っています。
(参考書籍の記述と違うのが悩みどころ・・・・・)



にほんブログ村 Androidアプリ開発へ




2013年9月2日月曜日

スマートフォンアプリにBaaS(Backend as a Service)を組み込む

スマートフォンアプリにおけるサーバーサイドのバックエンドサービス(ユーザー管理、セーブデータやアチーブメントやランキング、Push通知、etc・・・)などなど、実装したいけど大変だなぁとおもっていたら、最近はBaaS(Backend as a Service)というサービスがあるんですね。

BaaSとは・・・・
スマートフォンなどのアプリケーションのバックエンドとして求められる
 ・「ユーザー管理機能」(会員登録・修正・削除)
 ・「データストア機能」
 ・「プッシュ通信機能」
 ・「ソーシャルとの連係」(招待コードとか)
 ・「ロケーション(GPS)との連係」
などをアプリケーション側のAPIで呼び出すだけで使えるようにしてくれるサービスです。

頑張って作れば、amazonのAWS(amazon web service)なども、近いといえば近いと思います。

Parse」というところが有名らしいです。(Facebookが買収)
ちなみにWindowsPhone向けのAzureというサービスもあるようです。


日本語(?)で使えそうなサービスも増えつつあって、現時点(2013年9月)では次の3つがHITしました。

【1】appiaries
http://www.appiaries.com

【2】Kii cloud
http://pr.kii.com

【3】BaaSday
https://baasday.com


それぞれ、ストレージのサイズや、月間のAPIの呼び出し回数など
無料で使える制限や、備わっている機能がちょっとづつ異なっています。
(じょじょに増えるんだと思いますが・・・・・)

ソーシャルゲームのように招待の機能や、
端末に依存せずに共通のアカウントでデータを管理したり、
ランキングもアプリを開いた時に、上がった!下がった!と通知してくれるような
機能をもたせたいとおもっていたので、試しに使ってみようと思います。

BaaSも、有料プランを検討しなければいけない状態に早くなりたいものですね~。