cocos2dレイヤの上に広告を表示する

| コメント(0) | トラックバック(0)
こんにちは。開発担当のICTFです。

cocos2dで作ったアプリで広告を表示して収益化を目指したい事があるのではないでしょうか。
今回はその方法についてご紹介します。
サンプルとして広告はAppBank様のNendSDKを使用します。

cocos2d環境で広告を表示する事に主眼を置きますので、NendSDKの導入については触れません。
まずはNendSDKをプロジェクトに追加し、正常にビルドできる事を確認して下さい。

広告用のレイヤを作ります。こうすれば画面遷移が多くてもぺたぺた広告レイヤを張るだけで広告表示ができますので便利です。
且つNend以外の広告にもすぐ対応できるよう、広告レイヤのベースクラスを作成し、基本処理を実装しようと思います。

【AdLayerBase.h】

// 広告の全画面表示開始通知

#define IAD_LAYER_NOTIFY_SCREEN_SHOW_BEGIN @"iAdLayerNotifyScreenShowBegin"


// 広告表示位置

typedef enum {

iAdLayerPosition_Top_Center,

iAdLayerPosition_Botton_Center

} eiAdLayerPosition;


// 広告レイヤの基底クラス

@interface AdLayerBase : CCLayer 

{

UIView* _adView;

BOOL _isAllowShow; // 広告の表示が許されているか

eiAdLayerPosition _framePosition; // 表示位置

}


@property (nonatomic, readwrite) eiAdLayerPosition FramePosition;


// 表示位置を指定して初期化する

+(id) nodeWithFramePosition:(eiAdLayerPosition)position;


// バナーを意図的に隠す

-(void) hideIAd;


// バナーを表示する

-(void) showIAd;


// 通知センタからの通知イベント

-(void) NotifyFromNotificationCenter:(NSNotification*)notification;


// 広告ビューの生成

-(void) createIAd;


// 広告ビューの解放

-(void) releaseIAd;


// 表示位置を得る

-(CGPoint) getShowPoint;


@end


【AdLayerBase.m】

@implementation AdLayerBase


@synthesize FramePosition = _framePosition;


// 表示位置を指定して初期化する

+(id) nodeWithFramePosition:(eiAdLayerPosition)position

{

return nil;

}


-(id) init

{

if (self = [super init]) {

// 通知センタのオブザーバ登録

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(NotifyFromNotificationCenter:) 

name:nil object:nil];

_adView = nil;

_isAllowShow = YES;

_framePosition = iAdLayerPosition_Top_Center;

}

return self;

}


-(void) dealloc

{

// 通知センタのオブザーバ登録を削除する

[[NSNotificationCenter defaultCenter] removeObserver:self];

[self releaseIAd];

[super dealloc];

}


// 画面遷移完了通知

-(void) onEnterTransitionDidFinish

{

[self createIAd];

}


// 通知センタからの通知イベント

-(void) NotifyFromNotificationCenter:(NSNotification*)notification

{

if (notification.name == ROOTVIEWCONTROLLER_NOTIFY_MSG_ROTATE) {

// 画面回転通知

// 広告の位置を調整する

CGRect rect = _adView.frame;

rect.origin = [self getShowPoint];

_adView.frame = rect;

// 表示許可があれば、広告を表示する

if (_isAllowShow) {

_adView.hidden = NO;

}

}

else if (notification.name == ROOTVIEWCONTROLLER_NOTIFY_MSG_WILL_ROTATE) {

// 回転前準備通知

// 広告を非表示にする

_adView.hidden = YES;

}

}


// バナーを意図的に隠す

-(void) hideIAd

{

_adView.hidden = YES;

_isAllowShow = NO;

}


// バナーを表示する

-(void) showIAd

{

_adView.hidden = NO;

_isAllowShow = YES;

}


// 表示位置を得る

-(CGPoint) getShowPoint

{

CGPoint position = CGPointZero;

CGSize winSize = [[CCDirector sharedDirector] winSize];

switch (_framePosition) {

case iAdLayerPosition_Top_Center:

position = CGPointMake((winSize.width - _adView.frame.size.width) / 2, 0);

break;

case iAdLayerPosition_Botton_Center:

position = CGPointMake((winSize.width - _adView.frame.size.width) / 2, winSize.height - _adView.frame.size.height);

break;

default:

break;

}

return position;

}


// 広告ビューの生成

-(void) createIAd

{

}


// 広告ビューの解放

-(void) releaseIAd

{

}


@end


通知センターから画面回転に関する通知を受け取り、画面の回転に合わせて広告が移動するようにしています。

画面回転の通知を発行する箇所については今回は省きます。

次にNend広告のレイヤを作ります。


【NADViewLayer.h】

@interface NADViewLayer : AdLayerBase <NADViewDelegate>

{

    

}


@end


【NADViewLayer.m】

@implementation NADViewLayer


// 表示位置を指定して初期化する

+(id) nodeWithFramePosition:(eiAdLayerPosition)position

{

NADViewLayer* layer = [NADViewLayer node];

if (layer != nil) {

layer.FramePosition = position;

}

return layer;

}


// 広告ビューの生成

-(void) createIAd

{

// 広告ビューが生成済みの場合、一度解放する

[self releaseIAd];

// 広告ビューを初期化

_adView = [[NADView alloc] initWithFrame:CGRectMake(0, 0, NAD_ADVIEW_SIZE_320x50.width, NAD_ADVIEW_SIZE_320x50.height)];

[(NADView*)_adView setNendID:NAD_KEY spotID:NAD_ID];

[(NADView*)_adView setBackgroundColor:[UIColor clearColor]];

[(NADView*)_adView setDelegate:self];


     AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;

UINavigationController* rootViewController = delegate.navController;

[(NADView*)_adView setRootViewController:rootViewController];

// 広告位置の調整

CGPoint offset = [self getShowPoint];

_adView.frame = CGRectOffset(_adView.frame, offset.x, offset.y);

[rootViewController.view addSubview:_adView];

// 広告のロード

[(NADView*)_adView load:nil];

}


// 広告ビューの解放

-(void) releaseIAd

{

if (_adView != nil) {

[(NADView*)_adView setDelegate:nil];

[_adView removeFromSuperview];

[_adView release];

_adView = nil;

}

}


// 広告のロード成功時にコールされる

-(void) nadViewDidFinishLoad:(NADView*)adView

{

CCLOG(@"NAD Load Success");

}


@end


使い方は次の通りです。

CCLayer adLayer[NADViewLayer nodeWithFramePosition:iAdLayerPosition_Top_Center];

[self addChild:adLayer];


その他原語環境によってiAdやGoogleAdMobに適宜切換える事も考えられますので、コールするだけで適した広告レイヤを返してくれるFactoryクラスを設計するのも良いかもしれません。

トラックバック(0)

トラックバックURL: http://www.ict-fractal.com/MovableType/mt/mt-tb.cgi/43

コメントする

Twitterボタン
Twitterブログパーツ