最近在研究手機遊戲,做爲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