最近在研究手机游戏,做为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