検索
連載

iOS/Androidとの相互API呼び出しを行う際のコツC++でクロスプラットフォームを実現するCocos2dx入門(後編)(3/3 ページ)

スマホ向けゲームアプリ開発フレームワークの概要や使い方を解説する特集です。今回は、C++とJava/Objectve-Cとのバインドコードを使って拡張する方法や注意点、メモリ解放機能などを解説します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

描画処理関連の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拡張コードから呼び出されるJavaコード

メモリ管理周りの構造に注意

 ここまでに説明した内容で、大多数のプラットフォームの提供する機能を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.

前のページへ |       
ページトップに戻る