2012年12月4日火曜日

cocos2d-xとはなんじゃらほい?

本エントリーはAndroid Advent Calendar4日目「裏」を担当します@f_megmeg5です。
本日12/4の「表」エントリーは@bina1204さんによる「DevicePolicyManager について」ですので、合わせてそちらも御覧ください。

さて、私はiPhoneアプリの開発経験もあり、iPhone関連の勉強会にも参加します。
iPhoneなら書籍が幾つか発売されているのに、Androidもその恩恵を受けられるのにあまり知名度がない技術としてcocos2dが挙げられるのではないでしょうか。
私の友人達はcocos2d for iPhoneをバリバリ使っているし、2Dゲームを作りやすくなるのだから知っていた方が良いと思いますので、今回はcocos2dの中でもcocos2d-xについて紹介をしていきたいと思います。
ほら、ゲームの中に広告組み込むとお金も稼ぎやすいとかなんとか言いますし。
たぶん。
また、cocos2d for iPhoneを使ったゲームを開発されている@ajinotatakiさんのアプリでElectroMasterHungryMasterがあります。
古き良きレトロゲームの雰囲気があり、ゲームとして面白い部分が凝縮されているのでとてもハマっていました。
HungryMasterに関しては世界ランキングで一時期1位取っていましたし。
これらのゲームはSpriteの数もかなり多く使用されているゲームの一つです。
そのようなSpriteの管理等も出来るため、cocos2dを使用して2Dゲームを開発していくのが効率が良いでしょう。
開発するには楽に越したことはありません。
少なくとも私は楽したいです。

そんなこんなで、Androidでも使用できるcocos2d-xが大雑把にでも知って頂ければ、Android開発者でもcocos2d使いが増えてきて楽しくなるのではないかと妄想しています。
ちなみにJavaScriptを使用してcocos2dを動かす「cocos2d javascript bindings」なるものもあるらしいです。
派生系も多いですので、自分の開発しやすい言語で開発が行えるような環境にあるのもcocos2dの魅力の一つです。

技術的なことは本当にお触りしかやっていないのですが、これから少しずつ見ていく予定ですのであしからず。
Macでの環境構築に関してはこの記事この記事を参照してください。


cocos2d-xとは


cocos2d for iPhoneを継承してC/C++で記述していくゲームエンジンです。
オープンソースですので、中は見放題ですしゃっほい!
ちなみにこちらが公式サイトです。
cocos2d-xの開発は中国で法人化して行っているとのことですので、力の入れようがわかります。
ソースをC/C++で記載していきますので、例えばiPhoneでも同じソースで動けます。
一つのソースで様々な環境で動く、これがcocos2d-xのクロスプラットフォームとしての最大の強みです。
やはり、iPhoneとAndroidの両方でリリースを行いたいと考えられている方も多いですので、その場合cocos2d-xですとiPhoneとAndroidのそれぞれで開発をしていくよりもcocos2d-xで書いた方が時間短縮ができると思いますので、両方でリリースを考えられている方には良いゲームエンジンです。
実際にURARA-WORKS Co., Ltd.さんの腐ったミカン鉄球ヘブン等はcocos2d-xで開発されているようです。
また、他の開発者の方もcocos2d-xを使用してマルチプラットフォームでリリースできるように開発をされていますので、少しずつですが普及し始めているゲームエンジンと言えるのではないでしょうか。


どうしてcocos2d-xなの?


Androidでcocos2dを行うためのゲームエンジンは実は他にもあります
それが「cocos2d-android」と「cocos2d-android-1」というものがあります。
しかもこれ、Javaで書けるのです。
それならこっちの方が良いやーんとなりますが、そうは問屋が卸しません。
これらの更新は1年以上止まっているのです。
仮にcocos2d for  iPhoneの更新が止まっていて、それに追いついた状態で止まっているのならまだマシも、cocos2d for iPhoneは日々更新されています。
cocos2d for iPhoneからどんどん引き離されているものを使用するのも嫌ですし、バグ対応もされていないので使うのも怖いのです。
ですが、cocos2d-xでしたら、こちらも現在も更新がされ続けられていますので、Androidでcocos2dを使う場合は、cocos2d-xを使う方が良いのではないかという流れになりつつあります。
このような見解はcocos2dのエバンジェリストである@Seasonsさんも仰っています。


cocos2d-xを実際に使ってみて


私はcocos2d for iPhoneをあまりやったことがないまま、cocos2d-xに取り組みました。
そもそもC/C++もやったことありませんですし、cocos2dのご作法もなんとなーくしかわからないままやっていましたら、死にました。
ええ、どうしてこうなったというぐらいさっぱりわからなくなりました。
とりあえずはこちらのサンプルを見ながらぽちぽち写経を行なっていました。
このサンプルですとAndroidでできますし。
それで一通り動かしてみてわからないままでしたが、ゲームとして形ができていくのは面白かったです。
ただ、スケールの問題がありますので、それは別途対応を行わなければならないのがちょっと面倒かなという部分はありました。
理解できていないところがほとんどですので、もっと勉強していきたい分野です。
わからなければ、頼り甲斐のある方が周りにいらっしゃいますし!


cocos2d-xをこれからやる際のアドバイスとして


もし、MacがあるのならEclipseで開発するよりもXcodeやAppCodeでの開発の方がいいと思います。
AppCodeならC++の補完も入っているとのことですし、両方共書きやすいですし。
iOSのシミュレータでも動きます。
Androidの爆速エミュレータではどのような挙動になるのかは確認していないですが、Xcodeで開発したときはEclipseよりも書きやすくて感動した記憶があります。
私の環境が悪いだけかもしれませんが…。
また、Xcodeも無料で落とせますし、シミュレータだけで挙動を確認したいのなら、Appleへのお布施も必要ではありません。
Xcodeでcocos2dのお勉強をしてからcocos2d-xを組んだ方が理解しやすいと思います。
私は逆でしたので死にましたので、本当にこの順序をオススメします。
そうしないと私と同じ轍を踏んでしまいます。
また、Dashでもcocos2dやcocos2d-x等のリファレンスの参照ができますので、入れるのをオススメします。
もちろんAndroidも参照できますので、ぜひぜひ。


結論


MacがあるならXcodeを落としてcocos2dやると幸せになれるよ!
AndroidのAdventCalendarなのに、この結論は酷いです。
ですが、今までの経験上このような結論となってしまいますので、仕方がないのかなとなっています。


cocos2d関連で…


cocos2d関連のコミュニティはいくつかSNS状にあります。
Twitter

facebook
このようなコミュニティもありますので、フォローをして情報を追うと色々面白い情報が流れてきます。
cocos2dに関してはこれらのコミュニティ以外でも、勉強会等でもよく話題に上がりますし、勉強会でも実際に使われている方もいらっしゃるので、そのような方にお話を伺うのも面白いと思います。

また、 cocos2d日本語の書籍も幾つか出ています。
他にも幾つかありますが、代表的なのはこの2冊だと思います。
前者は入門としてオススメです。
後者は中級以降でオススメです。

ちなみに本日ですが、GREE社でcocos2dの勉強会が行われます。
こちらはまだ空きがありますので、興味のある方は是非いらっしゃってください。
冒頭で触れました「cocos2d javascript bindings」についての話もありますので、JavaScript使いの方は是非いらしてください!
また、ハッシュタグは#cocos2d_devcon3_jpですので、濃いー話を聞きにきたいけど、来れそうにない方はこちらのハッシュタグを追うのも良いかと思います。


最後に


あまりAndroid界隈でcocos2dの話が出てこないこととiPhone界隈では割りと話されていることですので、それなら少しでもcocos2dを知るきっかけになれば良いかなと思い今回はAdventCalendarを書かせていただきました。
最終的にはiPhoneやAndroid等関係なく、cocos2dを扱うということで色んな方とお話をしたり、技術的意見交換の場ができると面白いのかなとも思いました。
やはり色んな方とお話したりするのは楽しいですし、面白いですからね!

私はiPhoneアプリの開発から離れてAndroidアプリの開発を行なっていました。
それで周りの方々がcocos2dを扱っている時に「Androidでもできるといいのに」と思っていました。
そういう思いがあった時に@Seasonsさんからcocos2d-xの情報が流れてきた時に、
「これだ!」
となり、早速環境構築や弄ってみたことを勉強会で発表したりしました。
最近はあまり触れていませんが、もう少しcocos2dの勉強をしたらcocos2d-xの勉強も再会する予定です。
そうしましたら、また技術的内容をブログに公開していきたいと思っています。

最後になりましたが、「今ならこういうこともできるのかー」という新しいことを知れるとワクワクしませんか?
私はワクワクします。
そしてその「新しいこと」に触れてうっひょうと楽しくなることが、好きです。
よくわからなくて、てんやわんやしていてもやっぱり楽しいものは楽しいなとなります。
それが私がプログラムをやっていける気持の根源なのだと思います。
仕事では病みまして、休職からの退職コンボを決めかねない状況ですが、本職ではなくても細々と続けていきそうな気はします。
どうなるんだろう、私の人生。


さて、明日は表は@u_s_kさんによるエントリーと裏は@kabayanさんによるエントリーですので、お二方のエントリーも是非ご覧ください♪

2012年11月30日金曜日

銚子とかに行ってきたよー


11/23と11/24とで銚子近辺をぶらぶらしてきました。
天気は雨が多かったですが、24日のお昼ぐらいから晴れて来たのが救いでした。
ええ、おかげで23日に鳥見をしまくろうと思ったらざんざか降られて出来ませんでしたとも。

写真は銚子で鳥見すると大体行く鈴女というお店の海鮮丼です。
ここは基本的に特盛りなので、定食は止めて丼にしておけば安心じゃないのか!となって海鮮丼を楽しました。
そして写真のようなてんこ盛りの丼がやって来た次第です。
この丼が来た時、頭を抱えているAAが脳裏に浮かんだのは秘密です。
種類も色々入っており、お魚も新鮮で美味しかったです!
個人的にはご飯が酢飯なのがポイント高かったです。
さらに、物によっては厚みが1cmぐらいあるんじゃないのかというものもありました。
マグロはそれぐらいあったと思います。
何せお箸で刺身を持つと、重さでぷるぷるしてしまうんですよ?
こういう体験はそうそうできません。
量は多かったですが、頑張って完食しました!
これで1500円なのは安いですよねー。
量がとんでもないですが、大食いの方には良いのではないでしょうか。

雨なので光学機器が濡れる状況での鳥見は嫌でしたので、早々にお宿に行きました。

次の日もそこそこ雨が降っていましたが、時間が経つにつれて上がってきていましたのでポイントを絞って鳥見をしていました。
ちなみに鳥アルバムはGoogle+に公開しています。

午後はのんびり佐原近辺を回って帰りました。
晴れて良かったですが、ちょっと冷えました。
遅めのお昼ご飯で入ったフレンチレストランで飲んだホットロイヤルミルクティが冷えきった体にはとても嬉しかったです。

とてもいい気分転換になって良かったです。

久しぶりに鳥見をしたお話


ちょっと前ですが、割と近場にある泉の森に行きました。
ここの公園はそこそこカモが来るので好きなのです。

リハビリがてら歩いていたのであまり長居はしませんでしたが、それでもカモ達のエクリプスを見てテンションが上がったり、ご夫婦でコーギーの散歩をされていましたのでそのコーギーを撫でくり回したり、アオジをじっくり観察できたのはとても良かったです。

いやはやお散歩がてらの鳥見はやっぱり良いですね!

ちなみに写真はヒドリガモがみょーんと伸びをしているところです。
気付いたら撮れていました。
奥が♀で手前が♂エクリプスかな?
違うかもしれないな…。

2012年11月27日火曜日

予約投稿ができるかな!

ええ、タイトルの通りです。
如何ともしがたい事情ができたので、予約投稿をしなければなりません。

なので、そのテストなりー。

2012年10月14日日曜日

抜歯

現在、大体週に一回のペースで親知らずの抜歯を行っています。
元々は、前職の有給消化中にあまりにも歯が痛くなり、酷い虫歯になったものだと思いながら近所の新しい歯医者に電話をしました。

中学生、いや、もしかしたら小学生以来かもしれない歯医者でしたので行くのも億劫でした。
そこで簡単に見てもらいましたら、歯槽膿漏になりかけていたとのことでした。
そのため、歯磨き指導をしてもらい、今も続けてその磨き方をしているとそのような痛みは無くなってきました。
検査をしてもらっている時に先生がにこやかにこう言いました。
「親知らずが中途半端に生えていて、しかもその所為で一部の歯の歯並びが悪くなっているから、取ってしまおうね」
目の前が真っ暗になりました。
よく、親知らずを抜く時の痛みは凄まじいということを聞くので、恐がりな私はそれだけで憂鬱になっていました。

抜歯当日。
あまりにも気が落ちていてげんなりしながら、徒歩で行ける距離の歯医者に向かいます。
麻酔の駐車でも少し痛くなってしまい、麻酔後の痛みがどれほどのものなのかと考えるだけで震えてしまいます。
最初は右奥上の親知らずです。
この歯は若干外側に向かって生えていたのですが、あっさり先生は抜いてくれました。
抜歯そのものの時間は5分もかからなかったと思います。
私は下の親知らずも抜かれると覚悟をしていましたが、どうやら一回に一本ずつ抜く方針だったようで、あれだけ恐怖を感じていたのに肩すかしを食らいました。

麻酔が切れた後の痛みは薬のおかげかそれほどでもありませんでした。
ただ、難を言えば穴に食べ滓が入ってしまうので、念入りにくちを漱ぐことでしょうか。

さらにしばらくして、今度は右奥下の親知らずの抜歯です。
この日はちょうどさいたま勉強会と重なっていましたので、抜歯を行いそのまま蕨に直行する予定です。
この日の抜歯は切開も行いました。
なぜかと言いますと、親知らずを半分程覆うように歯茎が乗っていたためです。
これがぴろぴろ動くなら切開をしなくても良かったのですが、あいにくそのようには動いてくれなかったため切開をすることになりました。
この日の抜歯は前回に比べて、
「メリメリ!」
という音がよく聞こえてきました。
抜歯自体の時間も前回よりも長いです。
なんとか抜けたと思いましたが、切開をしたため縫合することになりました。
ただ、この次の週は病院側が休みであるため、2週間後の土曜日に抜糸及び抜歯をすることになりました。
口の中を血だらけにして蕨に向かったのも今ではいい思い出です。
そして痛みが引きにくかったため、焼き鳥をもりもり食べることが出来なくて残念でした。

この抜糸及び抜歯を行ったのが昨日です。
抜糸自体はすぐに完了しました。
先生のチェックでは傷の治りも順調とのことでした。
確かに、最初の頃に比べて食べ滓が穴に入りにくくなったような気がします。
そしてこの日行ったのは左上の親知らずの抜歯です。
こちらも最初の抜糸と同じく、それほど時間はかかりませんでした。
痛みも薬のおかげかそれほどありません。

最後に残すのは左下の親知らずのみです。
こちらは抜糸後の痛みが大きそうですので今から憂鬱です。
早く心置きなく美味しい物が食べられるようになりたいです。

2012年5月22日火曜日

cocos2d-xのHeloo Worldの表示の違いについて考えてみた

先日、Twitterやcocos2dのグループに投稿しましたらページビューが一気に上がりまして小躍りしていました。
こんなに行くとは思いもよらなかったので、SNSの威力を身に染みて感じました。

さて、タイトルの件ですがこっそりと会社のSC-04D(Galaxy Nexus)に入れてみますと、下記のように表示されました。
fpsがT-01Cの2倍です
また、T-01C(REGZA phone)ではこのように表示されます。
残念なfpsを叩き出すT-01C

上下に並べるとわかりやすいですが、文字と画像の表示サイズが異なります。
読み込んでいるaplファイルは同一の物を使用しています。

では、何故このようなことが起きるのかを見ていきたいと思います。
まず、Hello Worldと記載されているラベルの部分はこのように書かれていました。
CCLabelTTF* pLabel = CCLabelTTF::labelWithString("Hello World", "Arial", 24);
// ask director the window size
CCSize size = CCDirector::sharedDirector()->getWinSize();
// position the label on the center of the screen
pLabel->setPosition( ccp(size.width / 2, size.height - 50) );

次に、中央に表示されている画像はこのように書かれていました。
CCSprite* pSprite = CCSprite::spriteWithFile("HelloWorld.png");
// position the sprite on the center of the screen
pSprite->setPosition( ccp(size.width/2, size.height/2) );

Androidで考慮するべきdpiの概念が全くされていないですね…。
位置に関してはセンタリングのみですので、この書き方でいいでしょうが、サイズに関しましてはdpiのことを考慮に入れるべきなのではないかと思いました。
実際、T-01CとSC-04Dとでは見た目の大きさが異なっていますので、このままゲームを作っていきますと端末毎にゲームの表示される大きさが異なるようになっていって寂しいことになっていきそうです。
というかよろしくないです。

2Dゲームならアスペクト比が一定になるように描画をしていくようにして作成していく方が作りやすそうではあります。
ただし、使われない画面スペースも出てきますので、その辺りの塩梅をどのようにするかは考え中です。

うーん、Android対応は難しいですね。
ぐぬぬ。

【追記】
dpiの値に関してですが、

  • T-01C=1.5
  • SC-04D=2
だったと思います。
hdpiとxhdpiの差が生まれていますね…。
そういえば、解像度に合わせての画像の種類はどう切り分けるのでしょうかね?
Resourcesフォルダを見ても切り替えられるようにディレクトリが振り分けられていないです。
これはもしかして、コード側で切り替えになるんでしょうかね?
もう少しこの辺りは追っていきます。

Androidでcocos2d-xをやり始めた その2

前回はcocos2d-xをビルドしてAndroidアプリとして動かすところまで行いました。
今回は実際にコーディングを行うC++のクラス類の読み込みのところから行っていきます。
何故このようなことをすると言いますと、JavaもC/C++も一緒にビルドが行えるらしいのです。
なんと便利。
いちいちコマンドを打たなくても一緒にビルドが出来るのなら楽をしたいじゃないですか。

というわけで、ちみちみと設定を行っていきます。
参考にしたURLは前回記載したURLと同じですので、そちらを参考にしてください


まず、cocos2d-xとして作成してEclipse内に作ったプロジェクトを右クリックして、「New→Others→C/C++→COnvert to a C/C++ Project(Adds C/C++ Nature)」を選択します。

この箇所をクリック
そうしますと、次にこのようなダイアログが表示されます。
この時に「Project type」の「Makefile project」は「Other Toolchain」を選択してFinishボタンを押します。
このように選択すればOK

次にC/C++プロジェクトのビルド設定を行って行きます。
プロジェクトを選択し、「Properties→C/C++ Build→Builder Settingsタブ」を選択し、「Use default build command」のチェックを外します。
それから、Build commandに
bash ${workspace_loc:/プロジェクト名}/build_native.sh NDK_DEBUG=1 V=1
と記入します。
私の場合、「MegTest」で作っていますので、
bash ${workspace_loc:/MegTest}/build_native.sh NDK_DEBUG=1 V=1 
と記入します。
記入が終わりましたら、Applyを選択し、OKを選択します。
このように記入します。
そして、プロジェクトをビルドして、ログに出力されればビルドに成功しています。
ログがずらずらと。
気になったのは、こちらとログの種類が異なっているんですよね…。
うーん、バージョンの問題なんですかね…。
とりあえず、放置しておきます。

ファイルを開くとわかりますが、WarningやErrorが大量に入っています。
これらを取り除く作業を行います。
プロジェクトの「Properties→C/C++ General→Paths and Symbols」を開きます。
その中のIncludesタブ内のGNU++を選択します。
そして、AndroidNDK内にある今回選択したプロジェクトターゲットのパスとcocos2d-xのパスを追加します。
/Applications/android-ndk-r8/platforms/android-8/arch-arm/usr/include
/Applications/cocos2d-1.0.1-x-0.12.0/cocos2dx/include
パスを追加したらApplyを選択して、OKを選択します。
前回と同じ注意なのですが、パスはそれぞれの環境に合うように通してください。 


まだまだエラーが出ているので設定を弄り倒したいと思います。
まず、「#include "AppDelegate.h"」の箇所でエラーが出ています。
これもパスの問題らしいので、それを修正していきます。
プロジェクトの「Properties→C/C++ General→Paths and Symbols」を開きます。
その中のSource locationタブのLink Folderを選択します。
そうすると、新しくダイアログが表示されます。
そのダイアログのLink to a folder in the file systemにチェックを入れて、Browseで「cocos2d-x/プロジェクト名/Classes」のフォルダを選択します。
このように設定します。
最初の物をキャプチャし忘れたので、エラーになっています…。
最初はエラーにならないです。


そしてこのダイアログのOKボタンを押すと小さなダイアログは消えます。
次の元々表示されていたダイアログがありますので、いつも通りApplyを選択して、OKを選択します。
そうしますと「#include "AppDelegate.h"」の箇所でエラーが出なくなりました。
ただ、EclipseでのC++のヘッダファイル読み込みはあまりよろしくないために、エラーが吐かれているらしいです。
なんてこったい。


というわけで、コード解析の設定を弄ります。
「Properties→C/C++ General→CodeAnalysis」を選択します。
ワークスペース全体に対して設定を行いたいのなら、「Use workspace settings」にチェックを入れて、Configure Workspace Settingsを選択します。
ワークスペース全体に対して設定を行うため、このような表示になる。
Syntax and Sematinc Errorsのチェックを外せばエラーが出なくなります。
ちょっと怖いですが、とりあえずこれで進めようかなと思います。
設定に関しては、プロジェクト毎にも設定できますので他の物に対して影響を出したくない場合は、プロジェクト毎に設定を行うのが良いでしょう。

この状態でEclipseでビルドを行いましてアプリを端末に入れましたところ、アプリの変更点(Hello WorldをMegTestに変えた程度です)が反映されていました。
これでコマンドを打たなくてもビルドが行えるようですので良かったです。

まだ、続きがあるのですがそちらは後日に書ければ良いなと思っています。

2012年5月17日木曜日

Androidでcocos2d-xをやり始めた


さて、巷では「cocos2d!cocos2d!」と騒がれています。
しかし、この話は専らiPhoneアプリのお話です。
私もAndroidでcocos2d使いたい!
けど、cocos2d for Androidは死んでいるみたいな噂話もあるからどうしよう…。
そんな私に朗報です。
Androidでも使えるcocos2dがあります。
その名もcocos2d-x
cocos2d-xはクロスプラットフォームで行えるのでとっても便利です。
そして、こまめにアップデートやメンテナンスもされていて素敵です。
これを使うしかないな!ということで使いたいとなって環境構築のお話です。
書いていく言語はC/C++なのがネックですが、頑張ります。

ちなみに参考にしたのはこちらです。
Facebook内のcocos2d Developers Japanというグループで紹介されていた記事
そして我らが@yoichinejiさんがブログに書かれていた記事
この二つを読み解いて、少しずつ環境構築を行っていきましょう。

注意!
私は開発に関わるものは基本的に/Applications内に入れるようにしています。
そのため、サンプルで上げているパスが/Applications始まりになっていますが、パスは各自の環境に合わせて修正をしてください!

1.cocos2d-xをインストールする

まず、Androidでcocos2d-xを使うとなると、AndroidのSDK環境だけではなくNDKの環境が必要となります。
C/C++で書いていきますからね。
AndroidのNDK環境の環境構築に関しては、先達の素晴らしい方々がブログに記事を残していますので、そちらを参考にしてください。
cocos2d-xの箇所から書いていきたいと思います。

まず、cocos2d-xのダウンロードページから、zipファイルを落としてきます。
私は現時点で、最新の安定板としてcocos2d-1.0.1-x-0.12.0.zipを落としてきました。
落としてきたzipファイルを任意の箇所に展開します。
そして、コマンドでcocos2d-xのフォルダに移動します。
$ cd /Applications/cocos2d-1.0.1-x-0.12.0 
この中にcreate-android-project.shというファイルがあります。
このファイルを編集しなければならないのですが、このように編集します。

CotEditor好きなんです
ここで重要になるのは、
  • NDK_ROOT_LOCAL="/Applications/android-ndk-r8"
  • ANDROID_SDK_ROOT_LOCAL="/Applications/android-sdk-macosx"
というものです。
これは各自の環境に合わせてパスを指定してください。
よくAndroidSDKですと、「/Applications/android-sdk-macosx/tools」まで指定することがありますが、今回は必要ないです。
何故かと言いますと、cocos2d-x側で補完してくれます。
この箇所は注意してください。

これでできる!と思ったのでcreate-android-project.shを実行しましたところ、多いにエラーが吐かれました。
しかも,
「AndroidSDKのtools/androidがないよ!」
と怒られていました。
確認したところありました。
うーんうーんと唸りながら色々見ていますと、create-android-project.sh内にNDK_ROOTなるものがあります。
なんだろう?と思いながら、.bash_profileファイルにAndroidNDKのパスをNDK_ROOTに設定しまして、create-android-project.shを実行しましたところ動きました。
よくわからないです。

2.cocos2d-xをビルドしてみる

1の段階で少し触れましたが実際にどのようにビルドを行うのかを書いていきます。
まず、前述した通りにコマンドでcocos2d-xのフォルダに移動します。
次に、create-android-project.shを実行します。
実行コマンドは下記の通りです。
$ ./create-android-project.sh
実行しますとこのようにターミナルに表示されます。
Input package path. For example: org.cocos2dx.exampleと出ていますので、使用するパッケージ名を入力していきます。
ただ、ここで注意したいのはNDKを利用しますので途中でパッケージ名を変えますと、Java側だけではなく、C/C++側に記載したパッケージ名の変更も発生します。
SDKからNDKのメソッドを呼び出すには、NDK側で呼び出されるメソッド名がパッケージ名から始まるのです。
例えば「jp.co.megmegfive.startGame」といったメソッド名にしないと呼べなかったと思います。
そのため、パッケージ名を変更するとなるとリファクタリングの量が多くなってしまいます。
一気にリファクタリングができるかあやふやですが、後々のことを考えますとこの段階でパッケージ名を決定させておくと後々楽になるのではないかとおもいます。
一度NDK周りでこのパッケージ名の変更でとんでもなくはまったことがありますからね…。
あんな思いはしたくないです。

閑話休題。

ずらずらと出てきました!
パッケージ名を入力しますとターゲットの一覧が表示されます。
これはAndroidSDKでインストールしている内容ですので、それぞれが違うと思います。
表示されたidを入力します
input target idとありますので、リストで表示されたidを入力します。

idとプロジェクト名を入力しました。
ターゲットを入力しますと、input your project name:と表示されますので、任意のプロジェクト名を入力して下さい。
ずらずらっとまた出ました。
プロジェクト名を入力して、上記のような画像が表示されたらビルドの成功です!
ここまで辿り着くまでがとても長かったです。

3.Eclipseに読み込む

ビルドが通りましたので、今度はEclipseに読み込んでapkファイルを作成していきます。
先ほどビルドしたものは、cocos2d-x直下に記載したプロジェクト名でフォルダが作成されています。
フォルダの中はこのような構成になっています。
シンプル
これでEclipseに読み込めばOKというとそうではありません。
最初にやってしまいましたが、このままandroidフォルダでプロジェクトを作成しましてもエラーがあるためビルドが通りませんでした。
よくよくみますとlibs/armeabiフォルダがありません。
NDKの場合ですと、この中にある.soファイルを読み取ってAndroidSDKと連携を取っていきます。
では、どうやって.soファイルを作るかと言いますと、まず、コマンドでプロジェクトのandroidフォルダに移動します。
次に、
./build_native.sh
というコマンドを実行します。
このコマンドを実行しますと、nativeのビルドが実行されていきます。
ものすごくログは長いです。
この前に大量のログがあるので一部割愛しています。
注目すべきは最後の7行目からです。
.soファイルの生成に成功したようです。
よかったよかった。

さて、本題のEclipseへの読み込みです。
右クリックをして、
New→Android Projectを選択。
ダイアログが表示されますので、先ほど書きましたプロジェクト名を入力します。
それからCreate project from existing sourceを選択しまして、
cocos2d-xのフォルダ/プロジェクト名/android
をLocationとして選択します。
こんな感じで入力します
次にNextを選びまして、2で選んだビルドターゲットを同じものを選びます。
異なるビルドターゲットを選んで齟齬が起きるんじゃないかと思ってこうしています。
実際はわからないですが、揃えられるのなら揃えていた方が安全な気はします。
私はAPI Level8のものを選んだので、それにしています。
そしてダイアログのFinishボタンを押しますとEclipseにプロジェクトが生成されます。
これでEclipseへの読み込みは完了です。

4.Eclipseからアプリをインストール

ここから先は通常のAndroid アプリと同じです。
新規作成したプロジェクトですので、念のためProject→Cleanを選びます。
これでクリーンビルドは完了です。
次に、プロジェクトを選択してRun As→Android Applicationを選択します。
そうしますと、先ほどビルドを行ったapkファイルが端末にインストールされます。
T-01Cだからfpsが残念すぎる…。
この画面が表示されましたら、無事に環境が整ったということです!
これでcocos2d-xで開発ができますね!

5.まとめ

家でおおいにターゲット一覧が出なくてハマった理由の解消法としまして、

  • AndroidSDKを置いているディレクトリ名を変更した(android-sdk-mac_x86からandroid-sdk-macにしました)
  • パス指定の修正
2番目は凡ミスとしましても、1番目はなんでダメだったんでしょうかね?
よくわからなかったです…。


さて、cocos2d-xやcocos2dもほとんどわかっていないので、これからも情報発信はしていきますが、かなり遅くなると思います。
C/C++もさっぱりわかっていないので、さらに時間がかかりそうではあります。
それでも少しずつやっていこうかと思っていますので、よろしくお願いします。

とりあえず、どなたかに簡単に開発の基礎を教えていただければ嬉しいです!
そのためにもcocos2dのあのイベントには参加しなければ…!

2012年4月23日月曜日

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会に参加したよ

参加というか、正確にはチューターとしてひーこら言いながら働いていました。
イベントはこちらで告知されていたものです。

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会[女性枠] #andiphone #andronjo

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会[男性枠] #andiphone


講師:@corosuke_kさん
講師の模様をメモを取る係:@muo_jpさん
愉快な仲間1号:@yoichinejiさん
愉快な仲間2号:@corruptexさん
愉快な仲間3号:@f_megmeg5(私)

また、こちらでtogetterのまとめがあります。
第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会

私はイベントの模様は写真を撮っていないのですが、他の方が写真を撮っていると信じています。
というか、あの状況では撮れませぬ…。
色々やっていたのでそういう暇がなかったなんですよね。

さて、本題です。
ハンズオン自体は、ハッシュタグとmup_jpさんのメモやコードをWebサービスを使って表示させていたので、情報共有は強固にできたのではないかと思います。
こちらは参加者の方やmup_jpさんのおかげで本当に助かりました。
コンソールアプリでひたすらログを出す時は、苦戦されている方も多かったようです。
よくよく見ていますと、Android(というよりもJavaかな?)の命名規約とobjective-cの命名規約が異なるので、メソッド名のスペルが合っていても大文字小文字でエラーが出るといったこともありました。
これに関しましては、ソース補間をやれば少しは軽減できたのではないかと思いました。
escボタンでXcodeは補間ができますしね。

実際にiPhoneアプリを作るときになりますと、InterfaceBuilderとクラスの補間能力の違いで楽しんでくれている方が多かったと思います。
私もちゃんとは扱っていなかったのですが、IBOutletやIBActionも先に.hファイルに定義しないでも、みーっと引っ張って、そこで定義を行えば.mや.hに自動的に書かれるんですね!
これは便利すぎます。
ただ、その便利さのおかげで弊害として起きたのは、実はいらないIBOutletをソースから消しても.xibファイルに残っているために、実行時にエラーが起きてしまうパターンにはまっている方も多かったようでした。
ここは今回の経験を活かして、次から気を付けてもらえれば良いのかなってなりました。

チューター組はてんやわんやしていましたが、結構楽しんでもらえたのではないかと思っています。
お約束事はAndroidとiPhoneとでは違うことも多いですから、そこは慣れるしかないですしね。

参加者の方がかなり詰まっていたというか、理解するのに時間がかかっていたなと思ったのはメモリ管理部分です。
JavaですとGCのおかげで、メモリ管理を気にしないですみます。
Androidの場合ですと、GCだけではなく自分で適宜色々やらないといけないですが。
ただobjective-cですと、メモリ管理が重要になります。
iOS5からARCが入ってきましたが、基本的なことですし、ライブラリによってはARCに対応していないものもありますので、どのように行っていくのかが重要になります。
「releaseとautoreleaseの違いはなんだ?」となっている方もいましたし、retainとreleaseの使いどころもよくわからない方も多かったと思います。
今までC関連の言語を扱ったことがある方なら理解しやすかったかもしれませんが、そうではない方ですとチンプンカンプンだったと思います。
私も最初はわかりませんでしたからね…。

このメモリ管理の部分に関しましては、Twitterを見ていたらしい@splhacksさんがハッシュタグ付きで書かれていましたので、参考書として読むのが一番良いと思います。
というか、むしろ会場に来て話してほしかったね、ところすけさんと話していましたw


後、今回の反省点というか次に活かせたら良いのではないのかなとなったことです。

資料やソースコードの共有は早めに行う

これは大事です。
実際に、当日になるまで何をやるのかをチューター組は把握できていませんでした。
また、
「なんでこういう書き方をするんだろう?」
となってしまった部分も多かったですので、そこの理解をチューター側がもてるようにする時間も欲しかったのです。
ころすけさんも忙しいようでしたから高望みなのかもしれませんが、次はもうちょっと余裕を持って準備していけたら良いな!となりました。
そういう面で、私が本当に書き方やちょっとしたテクニックを忘れまくっていて、あばばばばばとなっていたんですよね…。
本当に参加者の方には申し訳なかったです。
さすがに1年以上触っていなくて、まともに最新情報を追えていないと大変なことになることを実感しました。
む、難しかったな…!

ソースコードが見やすい机配置にする

今回、ちょくちょく聞こえたのが、
「ソースが見えにくい」
というものでした。
そのため、次は大きなディスプレイが見やすい位置に机を配置した方が良いのかなとなりました。
途中から、全体的に前に詰めましたしね。


チューターの人数を増やす

今回はチューターが3人でしたが、もう一人二人いてほしかったなーとなりました。
わからない方を長時間放置することになってしまう時もあったので、そういうことを無くすためにも人手が欲しかったです。
ころすけさんの魅力なら人が集まるよ!!!


とりあえずはこんなところです。
立ちっぱなしで疲れもしましたが、参加された方が楽しそうだったので良かったです。
次回もあればお手伝いしたいなと思っています。

2012年4月18日水曜日

TextViewでリンクを付けてみよう

開発中のアプリで、
「テキストの途中にリンクを入れて欲しいなー。ほら、htmlみたいに!」
といったことがありましたので、備忘録です。

TextView内でリンク処理を入れるには大まかに分けて3つのパターンがあります。

  1. Linkify.addLinksで行う
  2. TextViewの属性であるandroid:autoLinkを使う
  3. TextViewにhtmlの文字列を読み込ませる
こんな感じです。
で、最終的には3を使ったのですが、最初に1を使ってはまってしまいました。


1.Linkify.addLinksで行う


TextView textLink = (TextView)findViewById(R.id.textLink);
textLink.setText("頑張ってぐぐるよ!");
Pattern pattern = Pattern.compile("ぐぐる");
String scheme = "https://www.google.co.jp/";
Linkify.addLinks(textLink , pattern, scheme);

これだけです。
これで「ぐぐる」の部分にリンクが表示されます。
まあ、便利。
ただ、Linkifyはちょっとした問題があります。
それは「スキーマで指定したURLの後にパターンで指定した文字列がくっついて表示される」ということです。
これには地味にはまりました。
Applies a regex to the text of a TextView turning the matches into links. If links are found then UrlSpans are applied to the link text match areas, and the movement method for the text is changed to LinkMovementMethod.
と思いっきり「into links」ってあるやん!となってしまいまして、ふりだしに戻りました。

2.TextViewの属性であるandroid:autoLinkを使う

これはよくある方法です。
この中で定義されている「android:autolink」の属性で自動的に読み取ってリンク化してくれます。
とっても便利。
ちなみに設定できる値は下記の通りです。
  • web:リンクにURLを貼り、ブラウザを起動させる
  • email:メールアドレスにリンクを貼り、メーラーを起動させる
  • phone:電話番号にリンクを貼り、電話を起動させる
  • map:住所にリンクを貼り、マップを起動させる
  • all:上記全てにリンクを貼り、各リンクに合わせた挙動を行ってくれる
うん、とっても便利ですね。
でも、これだけですとhtmlのような文字リンクが実現できません。
そのため、最後にこの方法で実現させました。

3.TextViewにhtmlの文字列を読み込ませる

大雑把に言うとこんな感じですので、コードを載せます。

TextView textLink = (TextView)findViewById(R.id.textLink);
CharSequence charSequence = Html.fromHtml("がんばってぐぐるよ!");
MovementMethod mMethod = LinkMovementMethod.getInstance();
textLink.setMovementMethod(mMethod);
textLink.setText(charSequence);  

こんな感じで書いていきますと「ぐぐる」の箇所にリンクが貼れます。
最終的にはこれで行きまして、なんとかうまくいきました。
ただ、2で説明しました「android:autolink」属性をxmlに定義しますと、リンクが表示されなくなってかなりはまってしまいましたので注意してください。

ちょっと長くなりましたが、このようにして私は実装を行ってきました。
そのうちネタが集まったら改めて更新しようっと。

Androidアプリ開発者のためのiPhoneアプリ開発ハンズオンに参加します

来る4/22に渋谷で行われるイベントにチューターとして参加します!

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会[女性枠] #andiphone #andronjo

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会[男性枠] #andiphone

講師はCoronaSDKのエバンジェリストであるころすけさん(@corosuke_k)です!


ころすけさんと愉快な仲間達でやることになっていますので、お時間のある方はまだ残席があるようですのでぜひぜひー。


今気付いたけど、愉快な仲間達になった経緯はねじさん(@yoichineji)のさいたま勉強会な気がするんだな。
さいたま勉強会は蕨の商工会議所で不定期に行われていますので、もし行われるのでしたら告知しますね。


あああ、頑張ってobjective-cの勉強をしなくっちゃ!

2012年3月6日火曜日

UnityのiOSとAndroidライセンスが無料!?

こんにちは、とってもwktkして仕事が手につきません!
嘘です。
心が折れているだけです。

なのでちょっとした雑談でもしたくなっちゃったのです。
さて、昨日の夜からTLを騒がしているのが表題の件です。
ちなみにここからできるらしいです。
https://store.unity3d.com/

500エラーが発生しちょる・・・。
どうやら世界中からアクセスがあって、どーんと落ちているようですね。
Unityのライセンスの違いは「強火で進め」を書かれているnakamura001さんの記事が参考になります。





ライセンスをゲットして、Unityで遊ぶぞー!

2012年2月27日月曜日

AndroidとFacebook連携をやってみて発狂しそうになったから備忘録

タイトルが酷いですが、本当のことなのです。

昨日、現在開発中の要件で「FacebookとTwitter」への投稿をしなくちゃなりません。
最近SNSも流行っているので時代の流れですね!

Twitterとの連携に関しましては、@yusukeyさんが作られたTwitter4Jを使っています。
後でライセンス周りを確認しなくては…。

では、Facebookはどうするのかとなりまして色んなサイトを参考にしてちまちまと環境構築をしていきました。
最初に参考にした記事はこちらの記事です。


1.Git環境構築
ほむほむ、Gitから最新SDKを落としてこないといけないのですね。
はい、最初の関門!
私の会社はSVNでのバージョン管理ですので基本的にGitの環境がありません。
なので、そこから環境構築です。
あ、ちなみにマシンはWindows7使っていますよ!

さらに調べていくとTortisesGitなるもので落とすと便利とありました。
「じゃあ、これを入れるぞ!」となったのですが、TortisesGitを動かすためにはGit Bashなるものが必要とのこと。
で、Git Bashを入れるにはmsysgitを入れないといけないので、インストールします。

これで突貫のGit環境構築が出来上がりました。
てなわけで、こちらからFacebookSDKを落とします。
https://github.com/facebook/facebook-android-sdk/



2.Facebook連携のためにアプリを登録
Facebook連携のために、アプリをこちらに登録します。
https://developers.facebook.com/apps
そうなると細かい設定もできるようになります。
アプリ名等を登録して、いざAndroidとの連携部分に着手します。
…Android Key Hash?
なにこれ???
と思ったのでとりあえず、後回し。
とりあえず、AppIDがゲットできればここはOKです。



3.FacebookSDKのライブラリ作成
githubから落としてきたSDKをソースに入れても動きません。
Androidのライブラリプロジェクトとして動かさないと動かないのです。
面倒やなーと、なりましたがFacebook連携をやるのならこれぐらい簡単でしょ?ということなのでしょうきっと。
というわけで、SDK用のライブラリプロジェクトを作成します。
新規Androidアプリを作成する時に、外部ソースを読み込みを選択します。
ただ、私なんかこれでうまく動かなかったんですよね。
ちなみに外部読み込むをするソースはこちらです。
facebook-android-sdk/facebook
動かない場合はこの中のソースを新規に作ったプロジェクトの中にコピペすれば幸せになれますよ!
とりあえず、これでSDKのライブラリは作成できました。

次に、自分のAppIDga有効かどうかを確認します。
私はsample内のsimpleを使って遊んでみました。
そんでもってデバッグもしてみて、挙動を確認してみました。
public static final String APP_ID = "xxxxxxxx";
この部分に登録したAppIDを記入します。
これでアプリは実行できますが、KeyHashを登録していないためログインに失敗します。


4.Key Hashを作ろう
これに一番はまりました…。
もうね、Windowsの環境構築に苦しむのはいやんなのです。
けど、これしかマシンが無いので半泣き状態でやりましたとも、ええ。

閑話休題。

さて、Key Hashを作成にするには下記のものが必要です。
・JDKのkeytool.exe
・C:\Users\ユーザー名\.android内にあるdebug.keystore
・opensslコマンド
コマンドについてはさっぱりですので、とりあえずcd でkeytoo.exeのところまで行き、下記のようなコマンドを打ちました。

keytool -exportcert -alias simple -keystore "C:\Users\ユーザー名\.android\debug.keystore"
| openssl.exe  sha1 -binary
| openssl.exe base64

ここでopensslコマンドが有効じゃないよと怒られました。
なので、OpenSSLの設定をこちらを参考にしてやっていきました。
http://homepage2.nifty.com/protocol/openssl/
ふむふむOpenSSLをWindowsで動かすにはActive Perlが必要らしい。
それならActive Perlを入れてみます。
それからOpenSSLのインストールを行います。
さあ、どうだ!とコマンドを打ってみる。
…動かない。
何故???

とりあえず、調べまくると環境変数が問題っぽい。
調べまくると、
OPENSSL_CONF C:\OpenSSL-Win64\bin\openssl.cnf
PATH \OpenSSL-Win64\bin
を設定すればいいらしい。

とりあえず、keytool.exeのフォルダに移動してversionコマンドを打つと動いた!
さあ、これでKeyHashが作れる!

keytool -exportcert -alias simple -keystore "C:\Users\ユーザー名\.android\debug.keystore" | openssl.exe  sha1 -binary | openssl.exe base64
もう一度こいつを打ってみた!
…エラー???
「simpleなんかないよー」
というのが出てきた。
最後に最後にこれかよ。
なのでコマンドを探しました。
すると、こちらが参考になりそうです。
http://d.hatena.ne.jp/language_and_engineering/20110830/p1

keytool -exportcert -alias androiddebugkey -keystore C:\Users\ユーザ名\.android\debug.keystore | openssl sha1 -binary | openssl base64

おお、うまくいきそう。
キーストアのパスワードが訊かれますが、debug.keystoreは全て同じパスワードなので「android」と打ちます。
するとずらずらとハッシュが表示されました!


5.アプリと連携させてみる
Facebookのアプリ情報設定画面でこの表示されたKeyHashを登録します。
そして、simpleアプリを起動させるとログインできました!

いやはや良かった良かった。

ここまでの苦労を水の泡にしたくなかったものです。


正直なことを言うと、メッセージのみしか送らない(twitpic投稿等もしなくて、純粋にメッセージのみ)のなら、暗黙的Intentを使ってメッセージを他のアプリに送ることができるのだから、TwitterやFacebook連携にこだわらなくてもいいんじゃないのかなーと思いましたとさ。

2012年2月7日火曜日

ブラウザからアプリを立ち上げてみよう!

こういう要件があって、面倒やなーとなっていましたがあっさりとできたので備忘録。

1.Manifext.xmlでActivityの定義を行う









こんな感じで定義します。
ここでミソなのがintent-filter内の



です。

まず、

はブラウザから参照できますよーという意味だったはずです。
うん、うろ覚えですみません。

そして、

はブラウザというかhtmlに指定するスキーマです。
こちらはアプリで一意になるようにした方が良いです。
他のアプリでもこういうことをしているアプリと競合が起きたら困りますもの。
とりあえず、これで下準備はOK


2.呼び出し元のhtmlの準備
ブラウザから呼び出すためにはhtmlが必要なのねん。
というわけで、どういう風なhtmlを準備すればよいのかを簡単に記載します。

 

アプリ起動テスト
 
アプリ起動
基本的にはこの書き方でOKです。
確か動いたので。

そして、やはりWebとの連携ですからWeb側から適宜DBの値をgetで貰うことも可能です。
その場合はhtmlは
 

アプリ起動テスト
 
アプリ起動
と記載します。

3.Activityの準備
呼び出される側のActivityの準備です。
今回はとりあえず基本的なこととして、onCreateで取得したURLをLogcatに表示させるようにします。

protected void onCreateDetail(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Intent intent = getIntent();
String action = intent.getAction();

if(Intent.ACTION_VIEW.equals(action)){

Uri uri = intent.getData();
String url = uri.toString();
//とりあえずログに出す
Log.d("Dbg", "uri = [" + url + "]");
}

こんな感じで書けば「startapp://id=123」が文字列として取得できるので、適宜処理をしてあげて素敵にしましょう。

ふう、マジメな記事を書いて疲れました…。

2012年1月11日水曜日

スマートフォン擬人化同人誌を読んだよ!

いきなりアレなネタですが読んでみました。
その名も「SmartPHONEGirl」。

単なるイラスト集かよと思ったら侮る事なかれ。
ガチで端末レビューでした。
iPhoneは一纏めにされていて、後はWindowsPhone7とAndroidが目白押し。
国内端末がメインでしたが、読み応えがあります。
所持している物や触ったことがある物について書いてあるようで、私のレグポンも擬人化&レビューされていましたよしゃっほい!
しかも「伝説の迷器」という二つ名まで与えてくれて、涙が出ちゃいそうです。
だって女の子だもん。

文体は軽妙で個人的には読みやすかったです。
途中でクスっと笑えたりもしましたから。
ただ、ちょっと誤字が気になりましたね…。
おそらく締め切りが重なっていたからこのようになったのでしょうが、ちょっと気にしてほしかったですね。
また、最近の端末というよりもちょっと古めの端末が多かったです。
HT-03AやIS01も取り扱ってくれているのはむふふとなりましたね。
個人的には最近のrayたんとかacroとかも扱ってくれれば良かったです。
そうすればとっても良い幼女がゲフガフ。

イラストの傾向は表紙でわかるようにロリです。
というか幼女です。
おねーたまがいなくて私はしょんぼりでしたが、これはこれで楽しめましたから良いのです。
幼女が大好きな大きいお友達でガジェット大好きな方にオススメします。
絵柄は可愛いからいいですよ!

借りてさらっと読みましたが、持っていてもいいかなーとなった同人誌でした。

2012年1月10日火曜日

というわけで

久しぶりにブログをやろうかなとなっています。
タイトルの通り、鳥とかAndroidとかiPhoneとかについて書いていければ良いかなとなっています。

よしなに。