タグ別アーカイブ: クロスプラットフォーム

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を使ったのは、使った事があったからで、特別の理由はありません。

(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の開発にしようと思います。