cocos2d for iPhone をcocos2d-xに移植する開発過程の記録メモまとめ、Androidクロスプラットフォーム化へ 、(1)〜(6)分

cocos2d for iPhone をcocos2d-xに移植する開発過程の記録メモまとめ、Androidクロスプラットフォーム化へ 、(1)〜(6)分の記事まとめしたもの

[top]

Contents

・アイフォンアプリ作成とアンドロイド向けアプリ開発作成のための記事

フレームワークはcocos2d for iPhoneとcocos2d-xです。
(6)マルチディスプレイ対応のためのディレクトリ配置と画像
(5)タップしたときに画像の領域にあるか、画像をタップしたかの判定

  1. CGRectはCCRect
  2. タップしたときに画像の領域にあるか、画像をタップしたかの判定
  3. アニメーション

(4)update(float delta)、タップイベント
(3)CCArrayにint型を挿入する方法、これがcocos2d-xに見当たらないので、vectorにする
(2)CCTextuer2DからCCSpriteを使う
(1)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ

(6)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ、Androidクロスプラットフォーム化へ 、マルチディスプレイ対応のためのディレクトリ配置と画像

<ファイル名の記載ルール>

cocos2d for iPhoneでは、レティナ対応のとき、画像のファイル名は-hdを付記してファイル名としました。これは、aaa.png,aaa-hd.pngというファイルを用意すると、aaa.pngで指定すれば、あとは勝手に判別してくれました。つまり、いちいち、aaa-hd.pngとして指定する必要はありません。

 cocos2d-xでは、その方法が異なります。これはアンドロイドにも対応しなければならないため、-hd,-ipadhdとするだけでは対応しきれないと判断したとのこと。
 またまた、移植に手間がかかります。
 
 それぞれのスクリーンサイズ、プラットフォームに対応するフォルダーを個別に作成し、同じファイル名にするそうです。
 iOS-folder、Retina4、Retina3.5、Android−A、Android-Bのように分類するみたいです。
 iPad,iPadRetina,nomal
 Android-folder,type1024,typeB,nomal
 みたいにしてみます。

そして、パスを指定するコードを各自用意するようです。

cocos2d-x マルチディスプレイに対応させる | studycocos2dx

・画像の座標取得の場合の注意

 ツール(複数の画像を一つの画像にまとめて座標のListにしてくれるソフト等のことをここでは指しています)を使って、画像の座標を自動で設定する場合はソフト側が自動で処理してくれるのでプラットフォームや解像度別に座標の比率を考慮する必要はありません。
 しかし、ツールを使わずに、ペイントソフトで目算で座標を取得、メモしたりするときは注意が必要です。なぜツールを使わないのかというと、ツールの使い方を覚えるのが面倒であり、修正があるたびにツールを使って修正しなくてはならないので面倒であるからです。扱う画像やアニメーション画像が少ない場合は、ツールを使わずに、ペイントソフトで座標を取得した方がわかりやすくて早いのです。
 
 cocos2d for iPhoneでは、レティナか非レティナで画像の座標を変更する必要があります。
 例えば、レティナ対応の場合、100ピクセルの正方形画像があった場合、実際は50ピクセルとして表示されます。これはレティナの密度が倍の密度だからです。そのため、100ピクセルサイズの座標を取得する場合は、半分の100/2のサイズで取得するようにCGRectMakeを指定します。

作成した実サイズの大きさ(領域)で指定するのではなくて、実際に表示される大きさ(領域)で指定すると言うことです。

 (1ピクセル1ドットとして説明していますので、ピクセルとドットの概念を取り違えているかもしれません。)
 次に、cocos2d-xでは、100ピクセルの正方形画像があった場合、レティナであっても、そのままのサイズで指定します。つまり、cocos2d for iPhoneとは異なるCGRectMakeを指定することになります。
 そのままの画像の座標を指定すればよいのです。
 指定したサイズがスプライトして表示されます。レティナであれば、その半分のサイズ(倍の密度)で表示されます。
 
 このように、フレームワークが異なるといろいろと設定が異なってきます。こういった設定をきちんと把握することが必要です。
 現在学習中です。
 
 

topへ

(5)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ、Androidクロスプラットフォーム化へ 、タップしたときに画像の領域に重なっているか、画像をタップしたかの判定


5

CGRectはCCRect

cocos2d for iPhone

CGRect rect=CGRectMake(x, y, w, h);


cocos2d-x ココス2d−x

CCRect rect=CCRect(x, y, w, h);

タップしたときに画像の領域にあるか、画像をタップしたかの判定

cocos2d for iPhone

//locationは、-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)eventのCGPoint
            CGRect rect=CGRectMake(x, y, w, h);
            if(CGRectContainsPoint(rect, location)){
            //
            }
            


cocos2d-x

    
//locationは、ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)のCCPoint
       CCRect rect=CCRect(x, y, w, h);
        if (rect.containsPoint(location)) {
            //
        }
        

アニメーション

2013年7月8日現在で動作未確認、コンパイルエラーなし、実行未確認(画像未作成のため)
cocos2d for iPhone

// CCSprite namiは、ヘッダーに宣言
        nami=[CCSprite spriteWithFile:@"nami1.png"];
        nami.position=ccp(-80,windowsSize.height/2);
        id namiMove=[CCMoveTo actionWithDuration:8.0f position:ccp(500,windowsSize.height/2)];
        id callfuncN_nami=[CCCallFuncN actionWithTarget:self selector:@selector(moveNami:)];
        id sequence_nami=[CCSequence actions:namiMove,callfuncN_nami, nil];
        [nami runAction:[CCRepeatForever actionWithAction:sequence_nami]];
        [self addChild:nami];
        


cocos2d-x

// CCSprite namiは、ヘッダーに宣言
    nami=new CCSprite();
    nami->initWithFile("nami1.png");
    nami->autorelease();
    nami->setPosition(ccp(-80,size.height/2));
    CCMoveTo *namiMove=CCMoveTo::create(8, ccp(500, size.height/2));
    CCCallFuncN *callfuncN_nami=CCCallFuncN::create(this, callfuncN_selector(HelloWorld::moveNami));
    CCSequence *sequence_nami=CCSequence::createWithTwoActions(namiMove, callfuncN_nami);
    nami->runAction(CCRepeatForever::create(sequence_nami));
    this->addChild(nami);

・テクスチャアニメーション、ぱらぱらあにめ

参考サイト
c++ – How to play animations in Cocos2d-x? – Game Development Stack Exchange

  1. android – cocos2d-x sprite animation using .plist – Stack Overflow
  2. Cocos2d-xのパラパラアニメーション: 業務系エンジニアによるiPhoneアプリ開発日記
  3. Cocos2d-x CCAnimation メモリリーク – Qiita [キータ]
  4. CCAnimationの基本 | Blog for Smartphone Seminar 2013

2013年7月9日現在で動作未確認、コンパイルエラーなし、実行未確認(画像未作成のため)
cocos2d for iPhone

        //anime
        CCSprite *tmpSprite=[CCSprite spriteWithFile:@"hiyoko_256by256_base.png"];
        CCSpriteFrame *frame1=[CCSpriteFrame frameWithTexture:tmpSprite.texture
                                                         rect:CGRectMake(0, 0, 60, 60  )];
        CCSpriteFrame *frame2=[CCSpriteFrame frameWithTexture:tmpSprite.texture
                                                         rect:CGRectMake(60, 0, 60, 60  )];
        CCSpriteFrame *frame3=[CCSpriteFrame frameWithTexture:tmpSprite.texture
                                                         rect:CGRectMake(120, 0, 60, 60  )];
        CCSpriteFrame *frame4=[CCSpriteFrame frameWithTexture:tmpSprite.texture
                                                         rect:CGRectMake(180, 0, 60, 60  )];
        NSArray *animFrames=[NSArray arrayWithObjects:frame1,frame2
                             ,frame3,frame4, nil];
        animation_test=[CCAnimation animationWithSpriteFrames:animFrames delay:0.1f];
        


cocos2d-x

    CCTexture2D *animeTexture=new CCTexture2D();
    CCImage *animeImg=new CCImage();
    animeImg->initWithImageFile("hiyoko_256by256_base.png");
    animeTexture->initWithImage(animeImg);
    CCSpriteFrame *frame1=new CCSpriteFrame();
    CCSpriteFrame *frame2=new CCSpriteFrame();
    CCSpriteFrame *frame3=new CCSpriteFrame();
    CCSpriteFrame *frame4=new CCSpriteFrame();
    frame1->initWithTexture(animeTexture, CCRectMake(0, 0, 60, 60));
    frame2->initWithTexture(animeTexture, CCRectMake(60, 0, 60, 60));
    frame3->initWithTexture(animeTexture, CCRectMake(120, 0, 60, 60));
    frame4->initWithTexture(animeTexture, CCRectMake(180, 0, 60, 60));
    CCArray *animFrames=new CCArray();
    animFrames->initWithCapacity(4);
    animFrames->addObject(frame1);
    animFrames->addObject(frame2);
    animFrames->addObject(frame3);
    animFrames->addObject(frame4);
    animation_test->initWithAnimationFrames(animFrames, 0.1, true);
   //or CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, 0.3f);
//sprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));

・音声、サウンド

        [SimpleAudioEngine sharedEngine].backgroundMusicVolume=0.3f;
        [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"BGM2-hiyoko_out64k.mp3" loop:YES];


cocos2d-x

    SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.3);
    SimpleAudioEngine::sharedEngine()->playBackgroundMusic("BGM2-hiyoko_out64k.mp3", true);

topへ

(4)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ、Androidクロスプラットフォーム化へ 、update(float delta)、タップイベント

4
cocos2d-xの参考になるサイトです。
CCActionを利用する

・ポーズ

cocos2d for iPhone

[[CCDirector sharedDirector]pause];


ココス2d−x

CCDirector::sharedDirector()->pause();

・メニュー

cocos2d for iPhone

        CCMenuItemImage *item=[CCMenuItemImage itemWithNormalImage:@"seiseki.png"
                                                     selectedImage:@"seiseki_down.png"
                                                            target:self selector:@selector(doSeiseki:)];
        CCMenu *menu_miss=[CCMenu menuWithItems:item, nil];
        menu_miss.position=ccp(windowsSize.width/2,40);
        [self addChild:menu_miss];//
        


ココス2d−x

 CCMenuItemImage *item=new CCMenuItemImage();
        item->initWithNormalImage("seiseki.png", "seiseki_down.png", "seiseki.png", this, menu_selector(HelloWorld::doSeiseki));
        item->autorelease();
        CCMenu *menu_miss=CCMenu::create(item,NULL);
        menu_miss->setPosition(ccp(size.width/2,40)  )  ;
        this->addChild(menu_miss,20);

・CCLabelTTF の文字列設定 setString(const char*)

cocos2d for iPhone
CCLabelTTF *limiTime;
NSString *limitTimeString=[NSString stringWithFormat:@”%02d”,allCount-tcount];
limitTime=[CCLabelTTF labelWithString:limitTimeString
fontName:@”Helvetica”
fontSize:32 ];
limitTime.position =ccp(140,300);
limitTime.color =(ccc3(200, 0, 0));
[limitTime setString:limitTimeString];

ココス2d−x
const char* string=CCString::createWithFormat(“%d”,allCount-tcount)->getCString();
CCLabelTTF *limiTime;
limiTime->initWithString(climitTimeString, “Helvetica”, 32);
limiTime->autorelease() ;
limiTime->setString(string);

・定期スケジュール(1/30、1/60)

cocos2d for iPhone
ヘッダーファイルには記載なしか必要に応じて記載する
init()内
[self scheduleUpdate];

-(void)update:(ccTime)dt{
//
}

ココス2d−x
ヘッダーファイル
virtual void update(float delta);

C++ファイル
init()に記載
this->scheduleUpdate();

void HelloWorld::update(float delta){
//
}

・CCArrayにCCSpriteオブジェクトを追加して、CCSpriteにコピーするとき

cocos2d for iPhone
CCArray *array;(初期化、配列数、オブジェクトの追加は省略してます。)
CCSprite *sprite=[array objectAtIndex:i];

ココス2d−x
CCArray *array;(初期化、配列数、オブジェクトの追加は省略してます。)
   CCSprite *sprite=new CCSprite();
sprite=(CCSprite*)array->objectAtIndex(i);
sprite->autorelease();

・表示可否ビジブル

TRUEで表示、FALSEで見えない状態にします。
cocos2d for iPhone
sprite.visible=TRUE;

ココス2d−x
sprite->setVisible(true);

・タップイベント シングルタップ

cocos2d for iPhone
宣言.h特に記入なし
シングルタップなので、init()内に記載なし。

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
   return YES;
}

-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event{
    CGPoint locationInView=[touch locationInView:[touch view]];
    CGPoint location=[[CCDirector sharedDirector]convertToGL:locationInView];
//必要に応じてタップの処理を記入 
}


ココス2d−x
宣言.h バーチャル仮想関数で宣言します。
virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent);

init()内に
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);

関数

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
    return true;
}

void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){
    CCDirector *pDirector=CCDirector::sharedDirector();
    CCPoint touchPoint=pDirector->convertToGL(pTouch->getLocationInView());
   //必要に応じてタップの処理を記入 
   
    
}

topへ

(3)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ、Androidクロスプラットフォーム化へ 、CCArrayにint型を挿入する方法、これがcocos2d-xに見当たらないので、vectorにする

3

・アンカーポイント

cocos2d for iPhone
background.anchorPoint=ccp(0,0);

ココス2d−x
background->setAnchorPoint(ccp(0,0));

・ウィンドウサイズの取得

cocos2d for iPhone
CGSize size=[[CCDirector sharedDirector]winSize];

cocos2d-x
CCSize size=CCDirector::sharedDirector()->getWinSize();

size.width
size.height

・CCLabelTTF

CCStringはNSStringの変わりのように利用できません。
char型になります。

cocos2d for iPhone

limitTime=[CCLabelTTF labelWithString:limitTimeString
                                     fontName:@"Helvetica"
                                     fontSize:32 ];
        limitTime.position  =ccp(140,300);
        limitTime.color     =(ccc3(200, 0, 0));
        [limitTime setString:limitTimeString];
        [self addChild:limitTime z:60 ];
        


cocos2d-x
CCStringはそのままでは使えません。char型にする必要があります。
アンドロイドへのクロスプラットフォームのことがあるので、余計な道に入らない王道で記載します。

const char* climitTimeString;//
limiTime    =CCLabelTTF::create(climitTimeString, "Helvetica", 32);
or
	limiTime=new CCLabelTTF();
    limiTime->initWithString(climitTimeString, "Helvetica", 32);
    limiTime->autorelease() ;
    this->addChild(limiTime,30);
    limiTime->setPosition(ccp(size.width/2,size.height-30));
    limiTime->setColor(ccc3(200, 0, 0));
    limiTime->setString(climitTimeString);
    

init側ならばリリースができる。

・int から文字列変換

cocos2d for iPhone

	int i;
	i=10;
	NSString* str;
    str = [ NSString stringWithFormat : @"%02d", i];


cocos2d-x

int i;
i=10;
const char* climitTimeString=CCString::createWithFormat("%d",i)->getCString();

・スプライトの幅と高さのサイズを取得

cocos2d for iPhone

CCSprite *restSprite=[CCSprite spriteWithFile:@"base.png"];
restSprite.contentSize.height;//これを代入したりますがここでは省略してます。


cocos2d-x

CCSprite * restSprite=new CCSprite();
restSprite->initWithFile("sample.png");
restSPrite->autorelease;

restSprite->getContentSize().height;//これを代入したりますがここでは省略してます。

・ランダム

たぶんどっちもあり
int tmpRandom=arc4random_uniform(5);

・CCArrayにint型を挿入する方法、これがcocos2d-xに見当たらないので、vectorにする
CCArray型のarrayにintを追加します。
NSNumberオブジェクト使ってINTを配列に入れます。

[array addObject:[NSNumber numberWithInt:(30)]];


cocos2d-x
オブジェクトであれば、CCArrayに追加、挿入できますが、int型なのでできません。
cocos2d-xに見当たらない、探すのが面倒なので、vectorにする

 vector<int> v_ar_speed;
 vector<int>::iterator begin,end;
 
v_ar_speed.push_back(   10  );//追加
v_ar_speed[0];//として呼び出し可能

topへ
(2)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ、Androidクロスプラットフォーム化へ CCTextuer2DからCCSpriteを使う
2
 いろいろと本を3冊買って、cocos2d for iPhone をcocos2d-xに移植する過程を試みていますが、結構進みません。
 objective-cをc++にしようとするとかなり時間がかかりそうです。すんなりとはいきません。

・スプライトの作成の場合の比較

C++であるcocos2d-xは、オブジェクトの生成の時にnewを使用します。
一方のobjective-cはそのまま記載して画像を設定します。

 
 CCSprite *sprite=new CCSprite();
    sprite->initWithFile("hiyoko_sample.png");
    sprite->setPosition(ccp(0,0);
    this->addChild(sprite);

 
 CCSprite *sprite=[CCSprite spriteWithFile:@"hiyoko_sample.png"];
 sprite.position=ccp(0,0);
 [self addChild:s];

・スケジュールの設定

 
	int iTimer;
    //schedule 1秒ごとに加算する
    bool HelloWorld::init()//この場所にスケジュールをした場合
	{
    this->schedule(schedule_selector(HelloWorld::timer), 1.0);
    this->scheduleUpdate();
    }
  	--
	void HelloWorld::timer(){
  	  iTimer++;
	}

 
	[self schedule:@selector(timer:) interval:1.0f];
	-(void)timer:(ccTime*)delta{
		iTimer++;
	}

・座標の取得 position

 
CCSprite *test
    int x;
    int y;
    x=test->getPositionX();
    y=test->getPositionY();

 
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();
が必要

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();
}

UIImage     *img        =[UIImage imageNamed:filename];
    CGImageRef  imageRefAll =[img CGImage];
    textureOther            =[[CCTexture2D alloc]initWithCGImage:imageRefAll resolutionType:kCCResolutioniPhoneRetinaDisplay];


CCTexure2Dでの注意、initWithTextureだと autorelease() is oK。しかし、CCSprite::createWithTextureでは、autorelease()を設定すると実行後しばらくしてエラーになる。
半自動か、手動管理のメモリ管理を決めましょう。

 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
    

(1)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ、Androidクロスプラットフォーム化へ

1

楽してスマートフォンの二つのプラットフォームに対応したアプリをつくるには?

 スマートフォンの市場は、アイフォンとアンドロイドの2つの勢力でほぼ占めています。アイフォンで作ったアプリをAndroidへも展開することで、ごく単純に考えて2倍のダウンロード数が可能になる計算になります(実際は、そこまでいかないでしょうけど)。
 アイフォンアプリは、MacOSX上で動作するXCODEでobjective-cを使用します。アンドロイド用アプリは、JAVAを使用します。つまり、objective-cとJAVAなわけですから、かたやオブジェクト指向のC言語(C++ではないのにオブジェクト指向)とオブジェクト指向の本流の言語として、開発環境が異なると言うことになります。ゲームシナリオやアルゴリズム、画像、音楽データ、データベースなどは同じものが使えるとして、コーディングについては、ほぼ別のものを作る必要があります。
 
 コードを共通化したい
そこで、クロスプラットフォームとして、cocos2d-xを使うことにします。

cocos2d for iPhoneとcocos2d-xとは
「cocos2d for iPhone」 とはアイフォンアプリでゲームを作るためのフレームワークで、xcodeでobjective-cを使います。

「cocos2d-x」はアイフォンアプリでゲームを作るためのフレームワークで、xcodeでc++を使います

cocos2d-xのメリットは、Androidアプリを作るためのクロスプラットホームのための効率化です。アイフォン用として動作するアプリ(コード)がAndroidアプリと動作することができます。

つまり、アイフォンアプリを作ってAndroidへ移植する時の効率が非常に優れていることです。「cocos2d for iPhone」で作った場合、Androidへそのままコードをコピペしても動きません。ゼロからJAVA用に書き換える必要があります。こうかくと「cocos2d for iPhone」の利便性が低いように思えますが、「cocos2d for iPhone」はobjective-cでコードを記載するので、MacOSX,iOSアプリを作っている人が利用しやすく、objective-c固有のコードやライブラリを使用することができます。ただ、ゲームの世界でobjective-c固有のコードやライブラリを使用するのは多いことではありません。
クロスプラットフォームとして考えるとどうしても「cocos2d-x」が優位と考えられます。
ゲームメーカーも「cocos2d-x」を利用しているそうです。

cocos2d for iPhoneとcocos2d-xのどちらもcocos2dと冠しているのでコマンドの内容や指定手順はほとんど同じです。objective-cかc++というほんの少し文法が違う点を除けば、同じ感覚でプログラムを作っていくことができます。

<cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ>

まず、以前作成したひよこレスキューというアイフォンアプリcocos2d for iPhone をcocos2d-xに移植しAndroidアプリとして公開しようと思います。

iTunesはこちら

画面

今回が初めての試みですので、途中で挫折するか、別のアプリを作成する方向に変わるかもしれません。そのときはごめんなさい。

<第一回>
キャラクタクラスを作成し、画像を表示する

クラスの作成
CCSpriteクラスを承継するcHiyokoクラスを作成
スプライトを設定し、クラス生成

 C++の文法を忘れてます。ほんとに覚えることがあって大変です。
やっとobjective-cのコーディングになれてきたのに。

(正式な方法や正式名称を使わずに、説明しているところがあります。
ご注意ください。)

objective-Cでは、クラスを
voidをかっこで挟んで、マイナスをつけます。

AA.m
-(void)function{//メソッドのあとに、かっこがない

}
となります。

C++ではクラス名があって::をつけてメソッドを書きます。
AA.mm
クラス名::function(){//メソッドの後にかっこ必要

}

まず、C++なので当然ながらプロパティがなくて、マクロを利用します。

CC_SYNTHESIZE(cocos2d::CCSprite, _spriteHiyoko, spriteHiyoko);
こんな感じ。このとき、型の宣言とプロパティ、シンセサイズまでまとめて設定されます。
クラスメソッドは、
ID型がないので、boolかstaticにしてポインタにします。
ここらへんがややこしくなります。
+(CCScene *) scene
は、static cocos2d::CCScene* scene();みたいになります。

インスタンスメソッドは、マイナスのついたメソッドのことですが、boolになります。

<感想>
objective-cからC++への移植は思ったよりも難航しそうです。
まず、何を何から変えてよいのかわからない。
単純にそのまま、表示させる程度のものでも、

topへ

関連記事

「スポンサーリンク」


ツイートツイート
カテゴリー: iPhoneアイフォンアプリ開発 タグ: , , , パーマリンク