cocos2d-html5使用jsbinding显示广告

最近在研究手机游戏,作为web coder自然选择javascript作为开发语言(关键也不太会别的语言。。。)。经过对比选择了比较成熟的cocos2d-html5作为游戏引擎,主要原因基于以下原因:

1.跨平台

cocos2d-h5内嵌了spidermonkey这个js引擎,上层逻辑代码可以使用javascript进行开发,同一套代码做少许改动就可以运行在浏览器下,也可以打包成native app(不是phonegap的方式)

2.性能

通过jsb,cocos2d-h5把渲染等工作交给了底层的c++代码,所以性能基本上能接近native app.


选定游戏引擎,说干就干,熟悉了一阵后写了个flappy,代码放到了:<a href="https://luyongfugx.github.io/" title="https://luyongfugx.github.io/">https://luyongfugx.github.io/</a>

在android,ios,safari下都能跑通,并且打包的app性能很不错,完全称得上是接近native app.

但是麻烦来了,怎么接入广告呢?cocos2d-h5提供的api只是编写游戏逻辑的,而一些第三方广告平台都是在app这一层进行接入。

在cocos2d-html5下只能通过jsbinding来调用android, ios应用层代码了。下面说一下我的方法,以接入domob广告为例,

原理就是通过在spidermonkey注册jsbinding函数,使用js调用c++,再通过c++分别调用ios,android 应用层代码显示广告。

首先编写一个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


你可能感兴趣的:(cocos2d-html5使用jsbinding显示广告)