忘れちゃいそうなアレやコレをメモっておくサイト。



プロジェクトの作成

Xcodeテンプレートの更新


sudo 【cocos2d-xのフォルダ】/install-templates-xcode.sh -f

「-f」をつけることで強制的に更新することができる。

コマンドでプロジェクトを作成する

下記パスまで移動する。

【cocos2d-xのフォルダ】/tools/project-creator

create_project.pyを実行する。
引数は
-projectプロジェクト名
-packageパッケージ名
-languagecpp

【cocos2d-xのフォルダ】/projectsに生成される。

Eclipseの設定 (Android版の作成時)

create_project.pyを使うとcocos2dxフォルダ(実際にはその下のprojectsフォルダ)にプロジェクトを作ることになります。
自分の好きなフォルダで作りたいときに以下の手順にする。

プロジェクトのプロパティで以下の箇所を設定する。
  1. libcocos2dxプロジェクトをインポートする。
    cocos2dxフォルダのcocos2dx/platform/android/javaにプロジェクトが存在する。
  2. create_project.pyで作ったプロジェクトフォルダ(proj.android)を任意のフォルダへ移動する。
  3. プロジェクトの設定を開いて下記の箇所を設定する。
  4. [C/C++ビルド] の「bash ${ProjDirPath}/build_native.sh」を「bash ${ProjDirPath}/build_native.sh NDK_DEBUG=1 NDK_LOG=1 -j 4」に変更する。
    (jオプションは並列コンパイルの数)
  5. [C/C++ビルド] - [環境]に「NDK_ROOT」を追加する。
    ここでも使用するNDKのバージョンを設定すること。
    さらに「COCOS2DX_ROOT」を追加する。
    この変数にはcocos2dxのルートパスを設定する。
  6. [C/C++一般] - [パスおよびシンボル]のcocos2dxのインクルードフォルダパスの修正。
    注意:C, C++など全ての設定に同じものがある。
    cocos2dxフォルダ, cocos2dx/includeフォルダ
    先ほど設定した環境変数「${COCOS2DX_ROOT}」を使用する。
  7. [C/C++一般] - [パスおよびシンボル]のcocos2dxのシンボルの変更。
  8. [リソース] - [リンクされたリソース]に「COCOS2DX」を追加する。
    パスは使用するcocos2dxの親フォルダになる。(使用するバージョンを設定する)
  9. iOSのClassesフォルダと共通化させたい場合は既存のリンクされたClassesフォルダを削除する。
    そしてプロジェクトを右クリックして[新規]-[フォルダー]を選択し,[拡張]ボタンを押してLinkフォルダーを選択。
    リンクさせたいClassesフォルダをリンクさせる。
  10. 左ペインの[Android]を選択して,画面下部の[ライブラリー]にlibcocos2dxのプロジェクトを追加する。
    既存のパスが通っていない可能性がある。
    Classesなどはリフレッシュをすると再構築される。
  11. プロジェクトフォルダにあるファイル「build_native.sh」の書き換え。
    「COCOS2DX_ROOT="$DIR/../../.."」の行頭に"#"をつけてコメント化する。
    コメント化することで先ほど設定した環境変数のCOCOS2DX_ROOTの内容が使用される。
  12. Application.mk, Android.mkファイルの変更。

この時点でビルドができるようになる。



リンクされたリソースの追加

  1. メニューから[ファイル] - [新規] - [フォルダ]を選択して「拡張ボタン」を押す。~「リンクされたフォルダー」を選択して追加することができる。


Eclipseプロジェクトの移動

プロジェクトを選択して右クリックより[リファクタリング]-[移動]でフォルダを移動できる。
proj.androidへの移動が可能。

C/C++のインデクサーが遅い

C/C++のインデクサー処理が重くてコード更新ができない場合は手動更新にする。
手動更新後はプロジェクト・エクスプローラーから右クリックを押して[インデックス] - [再ビルド]を選択すればビルドしなおせる。

実装編

Layerのタッチイベント


iOSでマルチタッチを取得するには
iOS側での設定が必要になる。

AppController.mm

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.

    UIScreen* mainScreen = [UIScreen mainScreen];
    
    CGRect screenRect = [mainScreen applicationFrame];
    CGRect screenBounds = [mainScreen bounds];
    
    // Add the view controller's view to the window and display.
    window = [[UIWindow alloc] initWithFrame: [mainScreen bounds]];
    
    CGRect windowBounds = [window bounds];

    EAGLView *__glView = [EAGLView viewWithFrame: screenRect
                                     pixelFormat: kEAGLColorFormatRGBA8
                                     depthFormat: GL_DEPTH_COMPONENT16
                              preserveBackbuffer: NO
                                      sharegroup: nil
                                   multiSampling: NO
                                 numberOfSamples:0 ];

    // マルチタッチを有効にする
    [__glView setMultipleTouchEnabled:YES];
  


CCLayerの初期化時に設定する。

bool MyLayer::init()
{
    // タッチ処理を有効にする
    this->setTouchEnabled(true);

    // マルチタッチを有効にする
    this->setTouchMode(kCCTouchesAllAtOnce);
}

この設定をするとCCLaye::onEnter()時に適切にデリゲート(イベントハンドラ)を登録してくれる。
マルチタッチkCCTouchesAllAtOnceStanderd
シングルタッチkCCTouchesOneByOneTarget

オーバライドするメソッド。

    // default implements are used to call script callback if exist
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

    // default implements are used to call script callback if exist
    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

iOSでは


Objctive-CクラスのCCDirectorCallerでディスプレイとの同期をとっている。
この同期ではCADisplayLinkクラスを使用している。

同期ごとにCCDisplayLinkDirector::mainLoop()がコールされる形をとっている。



Android

wglSwapIntervalEXT(1) OpneGLをつかった垂直同期。


クリッピング

iOSでCCClippingNodeを使うときはOpenGL Viewの生成時に設定する必要がある(?)

    EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]
                                     pixelFormat: kEAGLColorFormatRGBA8
                                     depthFormat: GL_DEPTH24_STENCIL8_OES
//                                     depthFormat: GL_DEPTH_COMPONENT16
                              preserveBackbuffer: NO
                                      sharegroup: nil
                                   multiSampling: NO
                                 numberOfSamples:0 ];

depthFormatをTestCppのものに合わせると使用できる。

AndroidでTestCppを動かす

  1. 既存のプロジェクトとして追加する。
  2. プロジェクトのプロパティを開く。
    [リソース]-[リンクされたリソース]に「COCOS2DX」を追加してcocos2dxのホームディレクトリを設定する。
    プロジェクトにあるcocos2dxフォルダが展開できるようになるので,その中から「cocos2dx/platform/android/java/src」を右クリックして[ビルド・パス]-[ソースフォルダとして登録]をクリック。

イメージキャッシュ

CCSpriteを作るとイメージが自動的にキャッシュされる。
よく生成する場合はいいけど,タイトル画面でしか使わないときは
キャッシュをクリアした方がいいかも!?

void CCTextureCache::purgeSharedTextureCache()


OSの判定

ファイル「CCPlatformConfig.h」にOS定義されている。

// define supported target platform macro which CC uses.
#define CC_PLATFORM_UNKNOWN            0
#define CC_PLATFORM_IOS                1
#define CC_PLATFORM_ANDROID            2
#define CC_PLATFORM_WIN32              3
#define CC_PLATFORM_MARMALADE          4
#define CC_PLATFORM_LINUX              5
#define CC_PLATFORM_BADA               6
#define CC_PLATFORM_BLACKBERRY         7
#define CC_PLATFORM_MAC                8
#define CC_PLATFORM_NACL               9

// Determine target platform by compile environment macro.
#define CC_TARGET_PLATFORM             CC_PLATFORM_UNKNOWN

使い方

#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
#endif

コントロール

cocos2d-xにもコントロールクラスが用意されている。
ただしフレームワークの拡張としての位置づけのようです。

使用するには以下のファイルをインクルードすること。

#include "cocos-ext.h"

コントロールにはフォーカス処理やセレクト処理が実装されている。
これらの処理はCCControlクラスを継承することで使用することができる。

CCColtrolクラスはイベント発生時にコールバックする仕組みが実装されている。

void CCControl::addTargetWithActionForControlEvent(CCObject* target, SEL_CCControlHandler action, CCControlEvent controlEvent)
{    
    // Create the invocation object
    CCInvocation *invocation = CCInvocation::create(target, action, controlEvent);

    // Add the invocation into the dispatch list for the given control event
    CCArray* eventInvocationList = this->dispatchListforControlEvent(controlEvent);
    eventInvocationList->addObject(invocation);    
}

このメソッドにコールバック関数を登録することでイベント発生時に呼び出してくれる。

逆にイベントを発生させたいときは以下の関数をコールすることでハンドラに送信することができる。

void CCControl::sendActionsForControlEvents(CCControlEvent controlEvents)
{
    // For each control events
    for (int i = 0; i < kControlEventTotalNumber; i++)
    {
        // If the given controlEvents bitmask contains the curent event
        if ((controlEvents & (1 << i)))
        {
            // Call invocations
            // <CCInvocation*>
            CCArray* invocationList = this->dispatchListforControlEvent(1<<i);
            CCObject* pObj = NULL;
            CCARRAY_FOREACH(invocationList, pObj)
            {
                CCInvocation* invocation = (CCInvocation*)pObj;
                invocation->invoke(this);
            }
        }
    }
}

実際のフォーカス処理などはCCControlクラスには実装されていない。
(インタフェースだけ用意されている)

基本的な処理についてCCControlButtonクラスに実装されている。
一般的なコントロールを実現するにはCCControlButtonクラスを参考に実装する。
とくにタッチイベントに関してはコピーしても問題ないと思う。
タグ
×

この広告は60日間更新がないwikiに表示されております。

フリーエリア

Menu

メニューサンプル1

メニューサンプル2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

管理人のみ編集できます