iOS/Androidとの相互API呼び出しを行う際のコツ:C++でクロスプラットフォームを実現するCocos2dx入門(後編)(3/3 ページ)
スマホ向けゲームアプリ開発フレームワークの概要や使い方を解説する特集です。今回は、C++とJava/Objectve-Cとのバインドコードを使って拡張する方法や注意点、メモリ解放機能などを解説します。
描画処理関連のAPIを呼び出す場合の注意点
最後に、ちょっとしたおまけとして、描画処理が絡むAPIを呼び出す場合に注意が必要な点をお話します。
Cocos2dxのメインスレッドは、AndroidのUIThreadで動作していませんので、Cocos2dx側から描画処理を行うようなAndroid上のAPIを呼び出す拡張コードを実装する場合は、以下のようにHandlerを利用するなどし、UIThreadで描画処理が実行されるようにケアしてあげる必要があります。
public static void showDialog(final Object obj){ new Thread(new Runnable(){ public void run(){ Cocos2dxGreePlatform.getPlatformUIHandler().post(new Runnable(){ public void run(){ final ShareDialog dialog = (ShareDialog)obj; dialog.show(); } }); } }).start(); }
メモリ管理周りの構造に注意
ここまでに説明した内容で、大多数のプラットフォームの提供する機能をCocos2dxに、クロスプラットフォームを実現しつつ拡張することが可能となったかと思います。
ただ、拡張機能を実装する場合には、それ以外にも気を付けるべきポイントがあるのではないでしょうか。
ここでは、拡張実装を行っていくうえで筆者が少しはまってしまったメモリ管理周りの構造について説明します。
インスタンスの自動解放機能「CCAutoreleasePool」
Cocos2dxでは「CCAutoreleasePool」という機能を使うことにより、ユーザーがいちいち気にしなくとも、生成したインスタンスの自動解放ができます(基本的にはCocoaの「NSAutoreleasePool」と同じものかと思います)。
使い方としては、CCObjectを継承している全てのクラスにおいて、生成した際に以下のようにautorelease()を実行するだけです。
CCString *func(){ CCString *str = new CCString("XXXX"); str->autorelease(); return str; }
こうしておけば、変数「str」は後ほどCocos2dxフレームワークによって自動で解放されますが、問題は解放されるタイミングです。解放はCocos2dxのMainLoopの中で毎回行われます。
自動解放したくない場合は
Cocos2dx単体で実装を行っている場合は、シングルスレッドなので特に気にする必要がありませんが、ここまで説明したコールバックは別のスレッドで実行されるので、コールバックでインスタンスを受け取り、Cocos2dxのメインスレッドで扱いたい場合は、もれなく上記の自動解放の恩恵を受けてしまいます。
これを避ける手段として筆者の場合は、拡張コード内で1度retainメソッドを実行することにしました。
CCString *func(){ CCString *str = new CCString("XXXX"); str->autorelease(); str->retain(); return str; }
retainを実行すると、インスタンス内で保持している参照カウンタの値が1つインクリメントされます。autoreleaseメソッドは参照カウンタが0の場合のみ動作するので、これらのインスタンスは自動解放されません。
ただし、ユーザーに使い終わった場合に1度releaseメソッドを呼んでもらう必要があります。
str->release();
この辺りについては、他にも良い方法があるかとは思いますが、気を付けるべき内容ということで触れておきました。
オープンソースの拡張ライブラリ「GreePlatformSDKCocos2dx」
ここまで、どのようにiOS/Android向けにクロスプラットフォームな拡張機能の実装をすると良いかを説明しましたが、筆者がこれまでに説明した内容を用いて実装を行った拡張ライブラリ「GreePlatformSDKCocos2dx」を紹介します。
GreePlatformSDKCocos2dxは、ゲーム開発者の方に使ってもらえればということで、すでにオープンソースとして一般に公開し、使い方も「Integrate GREE Platform SDK into your cocos2dx game for Android」「GREE Platform SDK for Cocos2dx now supports iOS.」(http://labs.gree.jp/blog/2013/03/7773/)に記述しています。
このライブラリを使用すれば、グリーの展開するSNS機能にアクセス可能なCocos2dxのゲーム開発が可能となります。またプラットフォーム依存のWebView機能をCocos2dxコンテキスト上から使用可能なWebViewPluginも実装されています。
GREE Platoformについては、こちらをご覧ください。
専用のテンプレートなども準備していますので、よろしければ使ってください。
Cocos2dxを使ってみて
前後編にわたり、簡単にCocos2dxを紹介してきましたが、いかがでしたでしょうか。最後に、拡張ライブラリ実装を通してCocos2dxに触れてみた感想を述べます。
まず簡単に触ってみた感想ですが、軽いなぁと感じました。コードも非常に追いやすかったです(コードが追えるという点ではオープンソースであることも大きな魅力ですね)。拡張コードの実装を進めていくうえでも、すでに多くの拡張コードが存在するので、どのように組み込めばよいか考えやすかったです。
また、多くの有識者の方々がすでにWeb上でさまざまな深い情報を公開してくださっているのも、非常に心強いです(筆者自身も多くの記事を参考とさせていただきました。ありがとうございます)。
これを1つの機会として、Cocos2dxに興味を持つ方が増えて、開発者の輪がさらに広がっていけば良いなと思っています。ありがとうございました。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 「cocos2d」でiPhoneゲームを作ってみよう
iOS向けにゲームアプリを開発するためのフレームワーク「cocos2d」。用意されているテンプレートを使ってiPhoneゲームを作ってみた - Unityで楽々スマホ用3Dアプリ開発入門
3Dアプリ開発を容易にするUnityの概要を紹介し、Unity機能を拡張するプラグインを利用してネイティブ機能との連携方法について紹介していきます - 現場が教えるUnityで実践iPhoneゲーム制作
3Dコンテンツ開発ツール「Unity」を使った、簡単な3Dミニゲーム制作の流れを一から解説していきます - enchant.jsでHTML5+JavaScriptゲーム開発入門(1):enchant.jsでゲームを作る7つの利点と5つの注意点
大人気のHTML5+JavaScriptベースのゲームエンジン「enchant.js」を使ってゲームアプリを作る方法を解説していく - PlayNでクロスプラットフォームのゲーム開発
Javaで書いたアプリをiOS、Android、HTML5、Flashなどにクロスコンパイルできるライブラリの概要や基本的な使い方を解説していきます