cocos2d-html5使用jsbinding顯示廣告

最近在研究手機遊戲,做爲web coder天然選擇javascript做爲開發語言(關鍵也不太會別的語言。。。)。通過對比選擇了比較成熟的cocos2d-html5做爲遊戲引擎,主要緣由基於如下緣由:javascript

1.跨平臺html

cocos2d-h5內嵌了spidermonkey這個js引擎,上層邏輯代碼可使用javascript進行開發,同一套代碼作少量改動就能夠運行在瀏覽器下,也能夠打包成native app(不是phonegap的方式)html5

2.性能java

經過jsb,cocos2d-h5把渲染等工做交給了底層的c++代碼,因此性能基本上能接近native app.android


選定遊戲引擎,說幹就幹,熟悉了一陣後寫了個flappy,代碼放到了:<a href="https://luyongfugx.github.io/" title="https://luyongfugx.github.io/">https://luyongfugx.github.io/</a>ios

在android,ios,safari下都能跑通,而且打包的app性能很不錯,徹底稱得上是接近native app.c++

可是麻煩來了,怎麼接入廣告呢?cocos2d-h5提供的api只是編寫遊戲邏輯的,而一些第三方廣告平臺都是在app這一層進行接入。git

在cocos2d-html5下只能經過jsbinding來調用android, ios應用層代碼了。下面說一下個人方法,以接入domob廣告爲例,github

原理就是經過在spidermonkey註冊jsbinding函數,使用js調用c++,再經過c++分別調用ios,android 應用層代碼顯示廣告。web

首先編寫一個c++接口代碼以下:

AdBind.h

<code>

//

//  AdBind.h

//  flappy

//

//  Created by waynelu on 14-3-11.

//

//


#ifndef __flappy__AdBind__

#define __flappy__AdBind__

#include <string>

#include <stdint.h>

#include <iostream>



class AdBind

{

public:

    std::string  showAd();

    void hideAd();

    AdBind() {};

    ~AdBind() {};

    bool adIsShow;

};

#endif

/* defined(__flappy__AdBind__) */

</code>

AdBind.cpp

<code>

//

//  AdBind.cpp

//  flappy

//

//  Created by waynelu on 14-3-11.

//

//

#include "AdBind.h"

#include "cocos2d.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

#include "AdWrapper.h"

#else

#include <jni.h>

#include "platform/android/jni/JniHelper.h"

#include <android/log.h>

#endif


std::string AdBind::showAd(){


#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

    //iOS代碼

    AdWrapper *iosAd=new AdWrapper();

    iosAd->showAd();


#else

    //Android代碼

    cocos2d::JniMethodInfo minfo;//定義Jni函數信息結構體

    //getStaticMethodInfo 次函數返回一個bool值表示是否找到此函數

    bool isHave = cocos2d::JniHelper::getStaticMethodInfo(minfo,"com/waynelu/flappy/flappy","showAd", "()V");

    

    if (!isHave) {

        //CCLog("jni:此函數不存在");

    }else{

        //CCLog("jni:此函數存在");

        //調用此函數

        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);

    }

   // CCLog("jni-java函數執行完畢");

#endif

    std::string str="adbind show ad";

    return  str;

}

void AdBind::hideAd(){

    

}

</code>

而後經過cocos2dx提供的jsbinding代碼生成工具,生成相關的jsbinding 代碼:

這裏包含3個文件:

agAdbind_api.js:

<code>

/**

 * @class  AdBind

 */

AdBind = {


/**

 * @method  hideAd

 */

hideAd : function () {},


/**

 * @method  showAd

 * @return  A value converted from C/C++ "std::string"

 */

showAd : function () {},


};

</code>

agAdbind.hpp(這裏就不列出來了)

agAdbing.cpp:(這裏就不列出來了)


而後咱們須要在AppDelegate的applicationDidFinishLaunching方法裏面加入jsbind的註冊:

 sc->addRegisterCallback(register_all_agAdbind);

到這裏咱們若是調用agAdbind_api.js裏的showAd方法,spidermonkey會幫咱們映射到AdBind.cpp的showAd方法,這樣就完成了jsbind映射,咱們只要在AdBind.cpp裏面調用上層app顯示廣告就能夠了,下面是兩個平臺的作法

1.ios

在ios下,因爲要調用oc代碼,咱們須要增長一個包裝的c++類AdWrapper:

AdWrapper.h

<code>

//

//  AdWrapper.h

//  flappy

//

//  Created by waynelu on 14-3-11.

//

//


class AdWrapper 

{

    public:

        void testLog();

        void showAd();

};

</code>

AdWrapper.mm

 <code>

//

//  AdWrapper.m

//  flappy

//

//  Created by waynelu on 14-3-11.

//

//


#import "AdWrapper.h"

#import "AppController.h"

void AdWrapper ::testLog(){


}




void AdWrapper::showAd(){

   //調用Appcontroller的方法顯示廣告

    AppController* appController = (AppController*) [UIApplication sharedApplication].delegate;

    [appController showAd];


}

</code>

而後在COCOS2D-HTML5的Appcontroller裏增長顯示廣告的方法showAd就能夠了


2.android

android下也是同樣的原理,可是android因爲上層代碼是java,因此還要使用jnl來在c++代碼裏面調用java代碼

在AdBind.cpp的showAd裏面判斷若是是android則:

<code>

  cocos2d::JniMethodInfo minfo;//定義Jni函數信息結構體

    //getStaticMethodInfo 次函數返回一個bool值表示是否找到此函數

    bool isHave = cocos2d::JniHelper::getStaticMethodInfo(minfo,"com/waynelu/flappy/flappy","showAd", "()V");

    

    if (!isHave) {

        //CCLog("jni:此函數不存在");

    }else{

        //CCLog("jni:此函數存在");

        //調用此函數

        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);

    }

<code>

調用com.waynelu.flappy.flappy的showAd這個方法顯示廣告,代碼以下:

<code>

    public static void showAd(){

    if (mInterstitialAd.isInterstitialAdReady()){

    //mInterstitialAd.showInterstitialAd(context)

    ((Activity) getContext()).runOnUiThread(new Runnable() {

                @Override

                public void run() {

                mInterstitialAd.showInterstitialAd(getContext());

                }

            }) ;

} else {

Log.i("DomobSDKDemo", "Interstitial Ad is not ready");

mInterstitialAd.loadInterstitialAd();

}

    }

</code>

到這裏整個流程都通了,能夠在android,ios下實現互動廣告了,能夠賺錢了:)

作完這些,我寫了個小遊戲放在了91安卓市場上:

<a href="http://apk.91.com/Soft/Android/com.waynelu.flappy-1-1.0.html" title="http://apk.91.com/Soft/Android/com.waynelu.flappy-1-1.0.html">http://apk.91.com/Soft/Android/com.waynelu.flappy-1-1.0.html</a>

有興趣的能夠試試

因爲圖片什麼的不甚滿意就不上appstore了。。。


最後給本身的博客作個廣告http://www.seamlu.com

相關文章
相關標籤/搜索