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

相关文章
相关标签/搜索