こんにちは!
以前は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で開発をしようと思っています。
(参考書籍の記述と違うのが悩みどころ・・・・・)