cocos2d-x」タグアーカイブ

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

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

[top]

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

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

topへ

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


5

CGRectはCCRect

cocos2d for iPhone
[c]
CGRect rect=CGRectMake(x, y, w, h);
[/c]

cocos2d-x ココス2d−x
[c]
CCRect rect=CCRect(x, y, w, h);
[/c]

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

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

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

アニメーション

2013年7月8日現在で動作未確認、コンパイルエラーなし、実行未確認(画像未作成のため)
cocos2d for iPhone
[c]
// 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];
[/c]

cocos2d-x
[c]
// 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]

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

参考サイト
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
[c]
//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];
[/c]

cocos2d-x
[c]
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)));
[/c]

・音声、サウンド

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

cocos2d-x
[c]
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.3);
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("BGM2-hiyoko_out64k.mp3", true);

[/c]

topへ

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

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

・ポーズ

cocos2d for iPhone
[c]
[[CCDirector sharedDirector]pause];
[/c]

ココス2d−x
[c]
CCDirector::sharedDirector()->pause();
[/c]

・メニュー

cocos2d for iPhone
[c]
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];//
[/c]

ココス2d−x
[c]
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);

[/c]

・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()内に記載なし。
[c]
-(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];
//必要に応じてタップの処理を記入
}

[/c]

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

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

関数
[c]
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());
//必要に応じてタップの処理を記入

}

[/c]
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
[c]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 ];
[/c]

cocos2d-x
CCStringはそのままでは使えません。char型にする必要があります。
アンドロイドへのクロスプラットフォームのことがあるので、余計な道に入らない王道で記載します。
[c]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);
[/c]
init側ならばリリースができる。

・int から文字列変換

cocos2d for iPhone

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

cocos2d-x
[c]int i;
i=10;
const char* climitTimeString=CCString::createWithFormat("%d",i)->getCString();[/c]

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

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

cocos2d-x
[c]CCSprite * restSprite=new CCSprite();
restSprite->initWithFile("sample.png");
restSPrite->autorelease;

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

・ランダム

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

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


cocos2d-x
オブジェクトであれば、CCArrayに追加、挿入できますが、int型なのでできません。
cocos2d-xに見当たらない、探すのが面倒なので、vectorにする
[c] vector<int> v_ar_speed;
vector<int>::iterator begin,end;

v_ar_speed.push_back( 10 );//追加
v_ar_speed[0];//として呼び出し可能[/c]

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はそのまま記載して画像を設定します。

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

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

・スケジュールの設定


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

void HelloWorld::timer(){
iTimer++;
}
[/c]

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

・座標の取得 position


[c]
CCSprite *test
int x;
int y;
x=test->getPositionX();
y=test->getPositionY();
[/c]


[c]
CCSprite *test
int x;
int y;
x=test.position.x
y=test.position.y
[/c]

・フォーラムの質問の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();
が必要

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

[/c]


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


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

[c]
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
[/c]

(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へ

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

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


前回(5)の記事はこちら
タップしたときに画像の領域にあるか、画像をタップしたかの判定

<ファイル名の記載ルール>
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を指定することになります。
 そのままの画像の座標を指定すればよいのです。
 指定したサイズがスプライトして表示されます。レティナであれば、その半分のサイズ(倍の密度)で表示されます。
 
 このように、フレームワークが異なるといろいろと設定が異なってきます。こういった設定をきちんと把握することが必要です。
 現在学習中です。
 
 

[c]

[/c]

31画像
ディーゼル ナイロンベルトとスクリューバックでハードなミリタリーを感じさせるクロノグラフ
在庫あり
店舗名:インポートセレクトSHOPでらでら
32画像
ディーゼル DIESEL ディーゼル 腕時計 DZ7260 メンズ腕時計 多針アナログ表示 クロノグラフ ディーゼル DIESEL ディーゼル腕時計 MEN’S うでどけい【0405_腕時計】
在庫あり
店舗名:CAMERON
33画像
D&Gメンズ腕時計Twin Tip (ツインチップ)ホワイトシルバー文字盤【DW0755】DOLCE&GABBANA/ドルチェ&ガッバーナ/ドルガバ【ウォッチ】【あす楽対応】【レビューを書いて送料無料!】【新品、本物、当店在庫だから安心】
在庫無し
店舗名:Ryu’s Selection
34画像
【送料無料】即納●MZIエムゼーアイ M.Johansson自動巻カレンダー温湿度計VicusLSB
在庫あり
店舗名:Googoodsグーグッズ楽天市場店
35画像
クロノグラフ風ハイエンドモデル■遊びを忘れたオトナ達へ■木製腕時計No.1老舗テンス/TENSEウッドウォッチメンズ/ダーク&ブラウンサンダルウッド/白檀(ビャクダン)[正規輸入品/2年保障]【楽ギフ_包装】【楽ギフ_メッセ入力】【0405_腕時計】
在庫あり
店舗名:ウッドウォッチコレクション
36画像
D&G ディーアンドジー DW0379 PRIMETIME プライムタイム シルバー/ゴールド メンズウォッチ/腕時計【楽ギフ_包装】【激安】【通販】【価格見直し】
在庫あり
店舗名:1&one

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

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

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

・CGRectはCCRect
cocos2d for iPhone
[c]
CGRect rect=CGRectMake(x, y, w, h);
[/c]

cocos2d-x ココス2d−x
[c]
CCRect rect=CCRect(x, y, w, h);
[/c]

・タップしたときに画像の領域にあるか、画像をタップしたかの判定
cocos2d for iPhone
[c]
//locationは、-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)eventのCGPoint
CGRect rect=CGRectMake(x, y, w, h);
if(CGRectContainsPoint(rect, location)){
//
}
[/c]

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

・アニメーション

2013年7月8日現在で動作未確認、コンパイルエラーなし、実行未確認(画像未作成のため)
cocos2d for iPhone
[c]
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];
[/c]

cocos2d-x
[c]
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]
・テクスチャアニメーション、ぱらぱらあにめ
参考サイト

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
[c]
//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];
[/c]

cocos2d-x
[c]
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=CCAnimation::createWithSpriteFrames(animFrames, 0.1);
<del>animation_test->initWithSpriteFrames(animFrames, 0.1);</del>
<del datetime="2013-07-13T12:10:41+00:00">animation_test->initWithAnimationFrames(animFrames, 0.1, true);//後日実行するとエラーでした</del>
<del>animation_test=CCAnimation::createWithSpriteFrames(animFrames, 0.1);</del>//error
//sprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));//
[/c]

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

cocos2d-x
[c]
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.3);
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("BGM2-hiyoko_out64k.mp3", true);
__[/c]

31画像
【送料無料】ねんどろいど マクロスF(フロンティア) シェリル・ノーム(ホビー)
在庫あり
店舗名:ハピネット・オンライン
32画像
【仮面ライダーフォーゼ】フォーゼモジュールチェンジシリーズEXFMCS04 仮面ライダーメテオ【キャラクターセール☆仮面ライダー】
在庫あり
店舗名:トイセルタウン
33画像
銀魂 フィギュア GEM シリーズ 神楽 【予約7月】 代引き不可
在庫あり
店舗名:天天ストア 楽天市場店
34画像
オーキッドシード クイーンズブレイド 美しき闘士たち アレイン フィギュア【1月予約】
在庫あり
店舗名:でじたみん 楽天市場店
35画像
ヤマトガールズコレクション 宇宙戦艦ヤマト2199 岬百合亜 (艦内服Ver.) 1/8 完成品フィギュア[メガハウス]《10月予約》
在庫あり
店舗名:あみあみ
36画像
アルター 1/8 ソードアート・オンライン 桐ヶ谷直葉 フィギュア【11月予約】
在庫あり
店舗名:でじたみん 楽天市場店
37画像
ジェルストラップコレクション うたの☆プリンスさまっ♪Shining All Star CD BOX[コトブキヤ]《08月予約》
在庫あり
店舗名:あみあみ
38画像
リネージュII ダークエルフ(通常版) 1/7 完成品フィギュア[マックスファクトリー]《09月予約》
在庫あり
店舗名:あみあみ

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

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

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

前3回のcocos2d-xに移植する過程の記録メモ

・ポーズ
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());
//必要に応じてタップの処理を記入

}

31画像
ドラゴンボールSCultures 造形天下一武道会3 其ノ一 全2種 人造人間18号・チチ
在庫あり
店舗名:電脳萬屋弐号館 楽天市場店
32画像
■予約■【フィギュア】モモ・ベリア・デビルーク (2013年11月発売)
在庫無し
店舗名:Jam
33画像
ROBOT魂<SIDE FFN> ファフナー・マークザイン
在庫あり
店舗名:トイズボックス楽天市場店
34画像
トランスフォーマープライム AM-03 クリフジャンパー【キャラクターセール☆トランスフォーマー】
在庫あり
店舗名:トイセルタウン
35画像
【再生産】超像可動 ジョジョの奇妙な冒険 第三部 空条承太郎・セカンド(荒木飛呂彦指定カラー) 【税込】 メディコス [ジョジョ3クウジョウジョウタロウ2nd]【返品種別B】【送料無料】
在庫あり
店舗名:Joshin web 家電とPCの大型専門店
36画像
トランスフォーマープライムAM-11 アーシー【キャラクターセール☆トランスフォーマー】
在庫あり
店舗名:トイセルタウン

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

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

CCArrayにint型を挿入する方法がわかりました。
CCIntegerを使うみたいです。以下に記載しました。

(1)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモ

(2)cocos2d for iPhone をcocos2d-xに移植する過程の記録メモCCTextuer2DからCCSpriteを使う

・アンカーポイント

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;//
CCLabelTTF *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 v_ar_speed;
vector::iterator begin,end;

v_ar_speed.push_back( 10 );//追加
v_ar_speed[0];//として呼び出し可能

コンテナ【vector】

その後、CCIntegerを使えば良いみたいです。
[cocos2d-x入門 クロスプラットフォームによるゲーム開発 クロスプラットフォームによるゲーム開発]に書いてありました。
それを参考にしました。

int i=10;
(CCArrayの生成は省略します。)
INT型の追加
array->addobject(CCInteger::create(i));

取り出し
int n=2;
int f=( (CCInteger*)array->objectAtInteger(n) )->getValue();

でもかなり面倒なので、INT型はC++なのでvectorベクターを使った方が簡単に扱えます。
(さらに追記)
なお、vectorは実行速度がlistよりも遅いという記事を読みましたので、今後はlistを使った方が良いかもしれません。
vectorを使ったのは、使った事があったからで、特別の理由はありません。

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

(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

・objective-C, cocos2d for iPhone

・スケジュールの設定

C++ , cocos2d-x
int iTimer;
//schedule 1秒ごとに加算する

objective-C, cocos2d for iPhone

・座標の取得 position

C++ , cocos2d-x

objective-C, cocos2d for iPhone

・フォーラムの質問の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();
が必要

CCTexture2dを使用するとき

objective-C, cocos2d for iPhone

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

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

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

AndEngineによるアンドロイドゲームアプリ「ひよこレスキュー」を作成しました。こちらからダウンロードできます。
ダウンロードはこちらからです。無料です。広告収入のためにADMOBを入れています。(2014年1月11日追記)

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

 スマートフォンの市場は、アイフォンとアンドロイドの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++への移植は思ったよりも難航しそうです。
まず、何を何から変えてよいのかわからない。
単純にそのまま、表示させる程度のものでも。

2014年1月11日追記
現在のところ、cocos2dXについての開発を中止しました。
アンドロイドアプリではダウンロードされそうにないみたいなので、無理して、クロスプラットフォームで開発する必要がなくなりました。
今後はアイフォン向けアプリとUnityの開発にしようと思います。

(2)その後、cocos2d-xにしてEclipseでandroid実行するもエラーで動かず、そして、エラーはなくなったが、エミュレータが起動しても画面に画像が表示されない

前回のandroid環境インストールの状況 MacOSXでの場合

前回までは、Eclipseでビルドまでできたのですが、Runで、could not find aaa.apkで 動かず。
いろいろといじるもダメな状態でした。

その後になります。
—-

結論を先に申せば、JAVA、Eclipse開発環境を再インストールしました。
設定をいじるよりも、一気に時間がかかるけどめんどくさいことである新規にインストールをした方がすっきりしたみたいです。

1.Javaをインストールでもだめ

よくよく考えてみたら、Java SE Development Kit 7 をインストールしていないことに気づきました。
すでに入れている思っていたら、飛ばしていたようです。

早速、インストールしました。
でもだめ。

2.別のEclipseをインストール

別のEclipseをインストールして見ることにしました。なおEclipseの名称を変更しておきました。
また、ディレクトリは最初のEclipseがドキュメント直下に対して、新規に追加しEclipseは、アプリケーション内に入れました。

べつのEclipseをインストール後、SDKがユーザーディレクトリのところに、前回は手動でアプリケーションのところに移動させたのですが、今回は勝手に移動してました。ちなみに、SDKは再ダウンロードしてません。
ADT Plugin、CDTプラグインをインストールしました。
そして、Eclipseを立ち上げ直すと、ちゃんとAVDがメニューのところに表示されていました。

Eclipseを再度入れ直してよかったです。
たぶん、PHP用のEclipseを入れて、その後、JAVAのプラグインを入れて、その後に、Androidoのプラグインとなって何かが欠落したのでしょうか。

3.再度、Xcodeのcocos2d-xプロジェクトをアンドロイド用に出力し、読み込む

iPhone用のプロジェクトのコンバートです。ここが面倒なのですね。こういった部分が自動されると良いですね。

4.Eclipseにインポート、実行なるか?

ビルドすると、
The import org.cocos2dx.lib cannot be resolved myproj5.java
というエラー。調べるとJAVAのパスが設定されていないと言うことで、設定すると余計にエラーが増えました。
そこで、[C/C++ Build]→[Environment]を設定するがだめ。

The import org.cocos2dx.lib cannot be resolved Cocos2dxActivity.java
というエラーが増えました。

そこで、今度は、よけいなJAVAのパスを設定しているのではないか想い、JAVAのパスを削除してみたら、エラーが消えました。

???
という感じです。
おそらく [C/C++ Build]→[Environment]が抜けていて、実行後のエラーをJAVAの設定と勘違いしたのでしょうか。(これは、libのファイルをプロジェクトにコピーしていなかった為とも考えられますが、また後日試してみます。)

とりあえず、前日よりは進歩しました。

そして、実行してエラーはありませんが、エミュレータが起動しても画面に画像が表示されない状態です。
これも何か設定があるのでしょうか?
上のメニューのRun configrationで、どのエミュレータを使用するのかを指定する箇所がありました。でも、画像が表示されてませんけど。

>android エミュレータ 動かない,エミュレータを起動してもアプリが実行されない
EclipseからAndroidエミュレータを起動してもアプリが実行されない
この記事を参考にしてようやくハローワールドが表示されました。なお、cocos2d-xでは試していません。2013.09.13

とりあえず、ビルドまでできたので、次回は、クロスプラットフォームとしてcocos2d-xでアイフォンアプリを作成してみようと思います。

5.まとめ 環境設定でダメなときは、アプリを再インストールしましょう。

 原因を究明したかったのですが、ネットにもその情報がなく、というか少ないのかな、時間と焦りが出てしまうので、無駄な時間を費やすよりも建設的な方法をとりました。
 まずは、アイフォンとアンドロイドのcocos2d-xによるクロスプラットフォーム環境を整えることにしました。
 
 
 cocos2d-x tutorial getting started

こっちをよんだ方が良さそうですね。
jni/hellocpp/main.cppにソースがあるようです。
Classes/いかにも.h.cppがあるようです。


有機栽培宇治三年番茶 180gがお得【播磨園】農薬、化学肥料を使用せず栽培したお茶の葉と茎を程よくブレンドし、乾燥、熟成させ、充分にほうじた番茶です。カフェインなどの刺激がほとんどないので、ご家族みなさまでお召し上がりいただけます。

画像クリスタルガイザー(500mLX24本入)ミネラルウォーター

画像【送料無料】サントリー天然水阿蘇2L×6本

ベンザブロックL、のどの痛み発熱に

cocos2d-xにしてEclipseで実行するもエラーで動かず、いまここ

とりあえず、Xcodeでcocos2d-xで実行までできました。そして、シェルを使ってアンドロイド用まで作成し、エクリプスで読み込むところまでOK。

その後、コンパイルと実行をするも、エラーで前に進まず。

make: *** [clean-installed-binaries] Error 1 myproj3 C/C++ Problem
cocos2d-xのパーミッションが原因でした。

[2013-06-01 15:14:09 – myproj3] Could not find myproj3.apk!
またエラーです。
今度はアプリがないらしい。

それよりもAVDがメニュー上にないのです。
なんだろうと悩みつつ、いろいろと検索するうちに、SDKマネージャーを見ると
必要なものがインストールされていると思い込んでいた模様です。

つまり、Android4.2.2(API17)の主要な部分だけをインストールして、他の部分はインストールしておらず。
そこで、まとめて、ほかのAPIシリーズもインストールすることにしました。

そして、AVDのメニューについては、なんと、SDKマネージャーにありました。
ネットの参考図と変わっていたのです。

その後もだめ。
いろいろといじっていたら、
make all
Cannot run program “make”: Unknown reason

Error: Program “make” not found in PATH
PATH=[/usr/bin:/bin:/usr/sbin:/sbin]
別のエラーになって、今度はビルドもダメになりました。

いまここ。

調べたサイトメモ


  1. Android NDK トラブルシューティング – 戌印-INUJIRUSHI- (Androidあれこれ) –

  2. Android トラブルシューティング – 戌印-INUJIRUSHI- (Androidあれこれ) –

  3. C++でクロスプラットフォームを実現するCocos2dx入門(前編):Cocos2dxでiOS/Androidの2Dゲーム開発を始めるには (2/3) – @IT

  4. NDKを使って、nativeに処理をさせる « Tech Booster

  5. Android 4.0でアプリ開発を始めるための環境構築 (3/3) – @IT

  6. EclipseからAndroid NDKサンプルプロジェクトをビルドして実行 (Windows) – outcesticide

  7. 【cocos2d-x 2.0】【手順】macでのcocos2d-x環境構築 – KOBAブロ

  8. MacにCocos2d-xの開発環境を作る #cocos2d-x – Qiita [キータ]

  9. dotnetmackenzie: Android – Could not find HelloWorld.apk! – fix

  10. Nerd Posts: ANDROID: Could not find *.apk!

  11. 一日でできる簡単Androidアプリの作り方まとめ。 – NAVER まとめ

  12. 初心者のためのAndroidアプリ開発 – エミュレータの作成

  13. MacのAndroid エミュレータでサイト制作 – to-R

  14. Android開発初心者がよくやる失敗【開発環境構築編】 (2) « Tech Booster

  15. AVDが使えるようになるインストールの仕方 – /* memolog */

  16. Google Play を使用する端末を設定または追加 – Google Play ヘルプ

  17. google play 登録方法 – YouTube

  18. Androidアプリをマーケットに公開する方法の作業手順メモ (リリース時とアップグレード時のチェックリスト) – 主に言語とシステム開発に関して

  19. 【初心者向け】ゼロからAndroidアプリ開発をマスターするためのまとめ 2013。 – NAVER まとめ

  20. Androidマーケット(Google Play)へのアプリ公開手順 – NAVER まとめ

  21. デベロッパーの登録 – Android Developer ヘルプ

Andoroidでゲームアプリ作成、cocos2d-xでアイフォンも一緒に作ってみよう

Andoroidでゲームアプリ作成、cocos2d-xでアイフォンも一緒に作ってみよう

MacOSXでアンドロイドアプリ環境を構築過程の記事その後の記事です。なかなか構築するのは大変でした。

現在iPhone用のゲームを作成しています。できればアンドロイド用にゲームアプリを作っても良いかと思いました。
そこで、アンドロイドの開発環境を調べて、関連ソフトをインストールしてみようともいます。
いまのところ、cocos2d-xを用いることで、アイフォン、アンドロイド用のゲームアプリを開発する方がよさそうです。
アンドロイドはエクリプスを使ってJAVA用のアプリを作る必要があるようです。
そこで、まだ作成しているわけではないのですが、iPhone用にココス2dxで作成すると、ファイルをそのまま、利用できるのでしょうか?それとも、単に必要な箇所をコピペでしょうかね。
いくらクロスプラットフォームでも、アイフォンのXCODEはObjective-Cなので、固有のコマンドがありますからそのまま、JAVAに適用できないのではないかと思っています。

なにかコンバーター的なことをしてくれるのでしょうか。まずは、アンドロイドのSDKなどをインストールして、サンプル版をコンパイルしてアプリを実行させてみることにします。

I am making a game for iPhone. So I think making a game for Andoroid. I check andoroid developing environment information and I try to install andoroid sdks.

・解説
Macでcocos2d-x 2.1.2を使用した、Androidアプリの開発環境構築について
>スライド式プレゼンテーションによる解説

まずは、アンドロイドの開発環境の構築から

MacにCocos2d-xの開発環境を作る #cocos2d-x – Qiita [キータ]
C++でクロスプラットフォームを実現するCocos2dx入門(前編):Cocos2dxでiOS/Androidの2Dゲーム開発を始めるには (2/3) – @IT
Android 4.0でアプリ開発を始めるための環境構築 (1/3) – @IT
【cocos2d-x 2.0】【手順】macでのcocos2d-x環境構築 – KOBAブロ
cocos2d-x + Adstir 広告の表示/非表示を試してみた – おかひろの雑記

31画像
USB 扇風機 フレキシブルファン★節電対策に★小型扇風機【メール便専用】【RCP】
在庫あり
店舗名:ココロミクラブ楽天市場店
32画像
usb扇風機 強力/静音 小型扇風機/サーキュレーター/送風機 卓上/usb/小型/ファン エコ 節電 電池式扇風機 おしゃれ デスクファン オフィス 省エネ ポータブルクーラー usb-fan10【RCP】
在庫あり
店舗名:便利グッズ・面白家電 ブレイド
33画像
ナカバヤシ Digio2 USB扇風機(乾電池対応) UA-041P ピンク[【数量限定セール】在庫処分sale中 ナカバヤシ 卓上扇風機 ケンコーコム]
在庫あり
店舗名:ケンコーコム
34画像
シグマAPO USBどこでもマグネットスゴ扇風機 ホワイト UMF01RWH
在庫あり
店舗名:アウトレットショップ大蔵屋
35画像
FLM-T180 | フォレストライフ 扇風機 18cm ブルー/ピンク 便利に使えるコンパクトサイズの卓上扇風機 首振り機能 風量2段階切り替え FOREST LIFE [宅配便のみ対応][送料無料][新品][即納]【RCP】
在庫あり
店舗名:大引屋キング
36画像
シャークスチームモップ専用 取り替えパッド!【1枚】SHARK STEAM MOP 交換パッド【1回の注文で2枚までメール便送料で買えます】【モップ/スチームクリーナー/掃除機/花粉/マイクロファイバー/パット/新生活】
在庫あり
店舗名:美容健康のお店 ハピスパ!