(2)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ、Androidクロスプラットフォーム化へ CCTextuer2DからCCSpriteを使う
他の関連記事cocos2d-xに移植する過程の記録メモまとめ、Androidクロスプラットフォーム化へ 、(1)〜(6)分
—
いろいろと本を3冊買って、cocos2d for iPhone をcocos2d-xに移植する過程を試みていますが、結構進みません。
objective-cをc++にしようとするとかなり時間がかかりそうです。すんなりとはいきません。
・スプライトの作成の場合の比較
C++であるcocos2d-xは、オブジェクトの生成の時にnewを使用します。
一方のobjective-cはそのまま記載して画像を設定します。
・C++ , cocos2d-x
1 2 3 4 5 |
CCSprite *sprite=new CCSprite(); sprite->initWithFile("hiyoko_sample.png"); sprite->setPosition(ccp(0,0); this->addChild(sprite); sprite->autorelease(); |
・objective-C, cocos2d for iPhone
1 2 3 |
CCSprite *sprite=[CCSprite spriteWithFile:@"hiyoko_sample.png"]; sprite.position=ccp(0,0); [self addChild:s]; |
・スケジュールの設定
C++ , cocos2d-x
int iTimer;
//schedule 1秒ごとに加算する
1 2 3 4 5 6 7 8 9 |
bool HelloWorld::init()//この場所にスケジュールをした場合 { this->schedule(schedule_selector(HelloWorld::timer), 1.0); this->scheduleUpdate(); } -- void HelloWorld::timer(){ iTimer++; } |
objective-C, cocos2d for iPhone
1 2 3 4 |
[self schedule:@selector(timer:) interval:1.0f]; -(void)timer:(ccTime*)delta{ iTimer++; } |
・座標の取得 position
C++ , cocos2d-x
1 2 3 4 5 |
CCSprite *test int x; int y; x=test->getPositionX(); y=test->getPositionY(); |
objective-C, cocos2d for iPhone
1 2 3 4 5 |
CCSprite *test int x; int y; x=test.position.x y=test.position.y |
・フォーラムの質問のallocのCocos2d-iphone to Cocos2d-X
タイトル:Converting snipets of code from Cocos2d-Iphone to Cocos2d-x
>Cocos2d-iphone
CCArray *spiders = [[CCArray alloc] initWithCapacity:5];
>Cocos2d-X
CCArray *spiders=CCArray::createWithCapacity(5);
Texture2dText.cpp
CCTextureCache使うときは、CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();
が必要
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
void TextureMipMap::onEnter() { TextureDemo::onEnter(); CCSize s = CCDirector::sharedDirector()->getWinSize(); CCTexture2D *texture0 = CCTextureCache::sharedTextureCache()->addImage("Images/grossini_dance_atlas.png"); texture0->generateMipmap(); ccTexParams texParams = { GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE }; texture0->setTexParameters(&texParams); CCTexture2D *texture1 = CCTextureCache::sharedTextureCache()->addImage("Images/grossini_dance_atlas_nomipmap.png"); CCSprite *img0 = CCSprite::createWithTexture(texture0); img0->setTextureRect(CCRectMake(85, 121, 85, 121)); img0->setPosition(ccp( s.width/3.0f, s.height/2.0f)); addChild(img0); CCSprite *img1 = CCSprite::createWithTexture(texture1); img1->setTextureRect(CCRectMake(85, 121, 85, 121)); img1->setPosition(ccp( 2*s.width/3.0f, s.height/2.0f)); addChild(img1); CCEaseOut* scale1 = CCEaseOut::create(CCScaleBy::create(4, 0.01f), 3); CCActionInterval* sc_back = scale1->reverse(); CCEaseOut* scale2 = (CCEaseOut*) (scale1->copy()); scale2->autorelease(); CCActionInterval* sc_back2 = scale2->reverse(); img0->runAction(CCRepeatForever::create(CCSequence::create(scale1, sc_back, NULL))); img1->runAction(CCRepeatForever::create(CCSequence::create(scale2, sc_back2, NULL))); CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo(); } |
CCTexture2dを使用するとき
objective-C, cocos2d for iPhone
1 2 3 |
UIImage *img =[UIImage imageNamed:filename]; CGImageRef imageRefAll =[img CGImage]; textureOther =[[CCTexture2D alloc]initWithCGImage:imageRefAll resolutionType:kCCResolutioniPhoneRetinaDisplay]; |
COCS2d-x
CCTexure2Dでの注意、initWithTextureだと autorelease() is oK。しかし、CCSprite::createWithTextureでは、autorelease()を設定すると実行後しばらくしてエラーになる。
半自動か、手動管理のメモリ管理を決めましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CCTexture2D *testTexure=new CCTexture2D(); CCImage *img=new CCImage();//UIImage img->initWithImageFile("hiyoko_sample.png"); testTexure->initWithImage(img); CCSprite *testSprite=new CCSprite(); //Textureの設定ではinitでも::createでもOKでもautoreleaseはinitになる。 testSprite->initWithTexture(testTexure);//OK autorelease() is oK. //testSprite=CCSprite::createWithTexture(testTexure);//OK //but, not autorerelease() this->addChild(testSprite); testSprite->setPosition(ccp(120,240)); testTexure->autorelease(); testSprite->autorelease();//for initWithTexure |