広告配信システム アスタ用 iOSモジュール(スモールフロート広告)
cocos2d-xプロジェクトへの組込み方法

2015年9月4日
株式会社マルジュ
http://www.astrsk.net/

cocos2d-xのインストールディレクトリ/tools/project-creator/create_project.py を使って新規プロジェクトを作成し、
cocos2d-xのインストールディレクトリ/projects/プロジェクト名/proj.ios をXcodeで開いているものとしてご説明します。

目次


frameworkの組み込み

Mr6SmallFloatSDK.framework を追加します。
詳しくはSDKご利用方法を参照下さい。


ソースの編集

■AppControllerの編集

ヘッダファイル"AppController.h"、その実装の"AppController.mm"を編集します。

インスタンスに外部から参照できるようにするため、下記の記述を追加します。

ios/AppController.h

@interface AppController : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    RootViewController    *viewController;
}

// 以下の行を追加
@property (nonatomic, retain) RootViewController *viewController;

@end
    
ios/AppController.mm

@implementation AppController

// 以下の行を追加
@synthesize viewController;
    

■クロスプラットフォームでの共通ヘッダーファイルの作成

Androidと共通で使用するクロスプラットフォームのファイルを置く「common」フォルダを作成し、
その中に「NativeCodeAst.h」を作成します。
(「common」フォルダ名称は任意です。)

common/NativeCodeAst.h

#ifndef NativeCodeAst_h
#define NativeCodeAst_h

namespace AstExt {
    class NativeCodeAst {
    public:
        // 広告表示開始用と、停止用、そして初期化用の3つのメソッドを定義
        static void initAstSmallFloat();
        static void showAstSmallFloat();
        static void hideAstSmallFloat();

    };
}

#endif
        

■広告の配置や表示、非表示の実装

次に、iOS向け実装ファイルの下記の3つのファイルを作成します。

NativeCodeAst.mmは、cocos2d-xのライブラリを使ったC++のソース中からメソッドを呼び出され、
実際の処理を行なうobjective cで書かれたNativeCodeAst_objc.mmに橋渡しを行ないます。
(NativeCodeAst_objc.hで、NativeCodeAstクラスを宣言している関係上、AstExtというnamespaceを使用しております。
この AstExt という名称は任意のものにしていただいて問題ありません。)

ios/NativeCodeAst.mm

#import "NativeCodeAst.h"
#import "NativeCodeAst_objc.h"
#import "AppController.h"

static void static_initAstSmallFloat()
{
    AppController *appController = (AppController *)[UIApplication sharedApplication].delegate;
    UIViewController *controller = (UIViewController *)appController.viewController;

    [[NativeCodeAst sharedInstance] initAstSmallFloat:controller];
}
static void static_showAstSmallFloat()
{
    [[NativeCodeAst sharedInstance] showAstSmallFloat];
}
static void static_hideAstSmallFloat()
{
    [[NativeCodeAst sharedInstance] hideAstSmallFloat];
}

namespace AstExt {
    void NativeCodeAst::initAstSmallFloat()
    {
        static_initAstSmallFloat();
    }
    void NativeCodeAst::showAstSmallFloat()
    {
        static_showAstSmallFloat();
    }
    void NativeCodeAst::hideAstSmallFloat()
    {
        static_hideAstSmallFloat();
    }
}
        

NativeCodeAst_objc.h では、 c++ (NativeCodeAst.mm) から呼び出すメソッドを宣言します。
NativeCodeAst_objc.mm で、広告の配置や、表示、非表示の処理を実装しています。

ios/NativeCodeAst_objc.h

#import <Foundation/Foundation.h>

// __TEST__の部分にはメディア識別コードを入れてください
#define AST_SMALLFLOAT_MEDIA_CODE @"__TEST__"

#define AST_SPOT_WIDTH  114.0f
#define AST_SPOT_HEIGHT 114.0f

@interface NativeCodeAst : NSObject

// シングルトン
+ (NativeCodeAst *)sharedInstance;

// スモールフロート広告操作メソッド
- (void)initAstSmallFloat:(UIViewController *)controller;
- (void)showAstSmallFloat;
- (void)hideAstSmallFloat;

@end
        
ios/NativeCodeAst_objc.mm

#import "NativeCodeAst_objc.h"
// アスタSDKのヘッダーファイルをインポートしておきます
#import <Mr6SmallFloatSDK/Mr6SmallFloatSDK.h>

#import "AppController.h"

@interface NativeCodeAst() <Mr6LoaderDelegate>

@property (nonatomic, retain) Mr6Loader *spotLoader;
@property (nonatomic, retain) Mr6Spot *spot1;

@end

@implementation NativeCodeAst

// 同一インスタンスを参照できるように、このクラスをシングルトンにしています。
+ (instancetype) sharedInstance{
    static dispatch_once_t once;
    static NativeCodeAst *sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance =  [[self alloc] init];
    });
    return sharedInstance;
}

- (void)initAstSmallFloat:(UIViewController *)controller
{
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    CGFloat screenWidth = screenSize.width;
    CGFloat screenHeight = screenSize.height;
    if (screenWidth > screenHeight) {
        // ランドスケープ表示の時は、iOS7以前と互換性をもたせるため、幅と高さを反転
        screenWidth = screenSize.height;
        screenHeight = screenSize.width;
    }

    /* ここではランドスケープ表示時に、広告を横一列に等間隔での表示を想定しています。 */

    // SpotとSpotの間隔を算出。Spotとは個々の広告画像のことを指し、 UIView のサブクラスとなります。
    int spotCount = 3;
    CGFloat spotMargin = (screenHeight - AST_SPOT_WIDTH * spotCount) / (spotCount - 1);

    // 【1】loader (複数Spotの読み込みを管理するクラス) の生成。
    _spotLoader = [[Mr6Loader alloc] init];

    // 【2】Spotを配置したい位置、表示させたいサイズに応じて、CGRectを生成します。
    CGRect frame1 = CGRectMake(
            0.0f, screenWidth - AST_SPOT_HEIGHT, AST_SPOT_WIDTH, AST_SPOT_HEIGHT);

    // 【3】Spot インスタンスの生成。
    _spot1 = [[Mr6Spot alloc] initWithFrame:frame1];

    // 【4】loader への Spot の登録 (retain されます)。
    [_spotLoader addSpot:_spot1];

    // 【5】表示させたい場所の view へ 配置。
    [controller.view addSubview:_spot1];
    _spot1.hidden = YES;

    /* 【2】~【5】を繰り返し、表示したい個数 (最大20)だけSpotを追加していきます。
       【2】では、第1引数をspotMarginとSpotの横幅分ずつずらして繰り返します */


    // 【6】広告の取得やエラーの発生を捕まえるために、このクラスのオブジェクトを指定しています。
    _spotLoader.delegate = self;
}

- (void)showAstSmallFloat
{
    _spot1.hidden = NO;
    
    // 広告取得を開始します。
    [_spotLoader startLoadWithMediaCode:AST_SMALLFLOAT_MEDIA_CODE];
}

- (void)hideAstSmallFloat
{
    _spot1.hidden = YES;
    
    // 広告取得を停止します。
    [_spotLoader stop];
}

- (void)dealloc
{
    _spotLoader.delegate = nil;

    [_spotLoader removeSpot:_spot1];
    [_spot1 removeFromSuperview];

    self.spot1 = nil;
    self.spotLoader = nil;
    [super dealloc];
}

@end
        

■ゲーム内に広告を表示させる

広告を表示するには、まず初期化を行います。
初期化は下記のコードで行うことができます。


AstExt::NativeCodeAst::initAstSmallFloat();
    

下記の例では、AppDelegate.cpp内で行っています。

Classes/AppDelegate.cpp

#include "AppDelegate.h"
#include "HelloWorldScene.h"
#include "NativeCodeAst.h"

// ↑↑↑ヘッダファイルの読み込みが必要です

USING_NS_CC;

AppDelegate::AppDelegate() {

}

AppDelegate::~AppDelegate() 
{
}

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
    
    pDirector->setOpenGLView(pEGLView);
    
    // turn on display FPS
    pDirector->setDisplayStats(true);
    
    // set FPS. the default value is 1.0/60 if you don't call this
    pDirector->setAnimationInterval(1.0 / 60);
    
    // 以下の行を追加。最初の画面が表示される前に初期化しておきます。
    AstExt::NativeCodeAst::initAstSmallFloat();
    
    // create a scene. it's an autorelease object
    CCScene *pScene = HelloWorld::scene();

    // ~以下略~
    

続いて、広告を表示させます。
広告の表示には下記のコードで行うことができます。


AstExt::NativeCodeAst::showAstSmallFloat();
    

下記の例では、タイトルに広告を表示させています。

Classes/TitleScene.cpp

// NativeCodeAst.hをインクルードしておきます
#include "NativeCodeAst.h"

using namespace cocos2d;

TitleScene::TitleScene()
{
    // コンストラクタ内などでshowAstSmallFloat()メソッドを実行します。
    AstExt::NativeCodeAst::showAstSmallFloat();

    // ~中略~
}
        

広告を非表示にするには、下記のコードを使用します。
シーンの切り替えなど、広告を非表示にする際に実行してください。


AstExt::NativeCodeAst::hideAstSmallFloat();
    

※ 注記

本マニュアルの実装例以外にも様々な実装例がございますので、アスタSDKに固有の箇所以外は適宜実装の方法を変えて頂くことが可能です。


■ 実装例の動作環境について

このマニュアルでは、以下の環境で動作確認を行なっております。


■ 更新履歴

v1.0.0 (2015/09/04)