2013年10月3日木曜日

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アプリ開発へ




0 件のコメント:

コメントを投稿