最近在研究手机游戏,作为web coder自然选择javascript作为开发语言(关键也不太会别的语言。。。)。经过对比选择了比较成熟的cocos2d-html5作为游戏引擎,主要原因基于以下原因:
1.跨平台
cocos2d-h5内嵌了spidermonkey这个js引擎,上层逻辑代码可以使用javascript进行开发,同一套代码做少许改动就可以运行在浏览器下,也可以打包成native app(不是phonegap的方式)
2.性能
通过jsbinding,cocos2d-h5把渲染等工作交给了底层的c++代码,所以性能基本上能接近native app.
选定游戏引擎,说干就干,熟悉了一阵后写了个flappy,代码放到了:https://luyongfugx.github.io/
在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
//
// AdBind.h
// flappy
//
// Created by waynelu on 14-3-11.
//
//
#ifndef __flappy__AdBind__
#define __flappy__AdBind__
#include
#include
#include
class AdBind
{
public:
std::string showAd();
void hideAd();
AdBind() {};
~AdBind() {};
bool adIsShow;
};
#endif
/* defined(__flappy__AdBind__) */
AdBind.cpp
//
// 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
#include "platform/android/jni/JniHelper.h"
#include
#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(){
}
然后通过cocos2dx提供的jsbinding代码生成工具,生成相关的jsbinding 代码:
这里包含3个文件:
agAdbind_api.js:
/**
* @class AdBind
*/
AdBind = {
/**
* @method hideAd
*/
hideAd : function () {},
/**
* @method showAd
* @return A value converted from C/C++ "std::string"
*/
showAd : function () {},
};
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
//
// AdWrapper.h
// flappy
//
// Created by waynelu on 14-3-11.
//
//
class AdWrapper
{
public:
void testLog();
void showAd();
};
AdWrapper.mm
//
// 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];
}
然后在COCOS2D-HTML5的Appcontroller里增加显示广告的方法showAd就可以了
2.android
android下也是一样的原理,但是android由于上层代码是java,所以还要使用jnl来在c++代码里面调用java代码
在AdBind.cpp的showAd里面判断如果是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);
}
调用com.waynelu.flappy.flappy的showAd这个方法显示广告,代码如下:
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();
}
}
到这里整个流程都通了,可以在android,ios下实现互动广告了,可以赚钱了:)