鍍金池/ 教程/ Java/ 跨平臺移植和廣告植入
游戲暫停和觸摸屏蔽
游戲場景過渡
碰撞檢測
跨平臺移植和廣告植入
批次渲染
觸摸事件和優(yōu)先級
背景音樂和音效
別急,先處理好CCScene和CCLayer的關(guān)系
自定義敵機精靈
UFO層特殊道具
主角的登場和幀動畫
引擎坐標系,錨點和背景滾動
分數(shù)的本地存儲
子彈層的處理
搞個飛機來玩玩

跨平臺移植和廣告植入

整個游戲是出爐了,但是只在PC上玩很不過癮,觸屏的體驗是鼠標沒辦法達到的。所以這節(jié)我們把它移植到Android平臺上。當然這個游戲太微不足道了,所以我也不指望它能為我賺什么錢,現(xiàn)在考慮些就圖樣圖森破了。這里的廣告只是純技術(shù)上的研究。做游戲,浮躁不得。

1.移植到Android平臺

其實這些我在http://blog.csdn.net/jackystudio/article/details/11516435一文中就有講過了,這里就再重復(fù)一遍吧。Cygwin和Eclipse自行準備好吧。

1.1.配置Android項目

(1)點擊已配置好的create-android-project.bat,創(chuàng)建JackyAirplane的安卓項目。配置方式創(chuàng)建請看上文。

(2)Win32項目下的Classes里面的所有源文件和頭文件都放進Android項目中的Classes。如果你寫的源文件和頭文件是放在proj.win32中的,也把它們拷出來到Classes。

(3)進入proj.android,把音效,字體,圖片這些資源拷入asset文件夾中。

(4)進入proj.android,res下各目錄存放有游戲的圖標,你可以進行修改。

(5)進入proj.android,jni→helloworld目錄下有main.cpp,這是跨平臺的入口,也就是jni層相關(guān)。找到這個函數(shù)Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit,修改如下內(nèi)容。

        if (!CCDirector::sharedDirector()->getOpenGLView())
        {
            CCEGLView *view = &CCEGLView::sharedOpenGLView();
            view->setFrameSize(w, h);
            // set the design resolution screen size, if you want to use Design Resoulution scaled to current screen, please uncomment next line.
             view->setDesignResolutionSize(480, 800);//加入這一句,目的就是為了適配屏幕

            AppDelegate *pAppDelegate = new AppDelegate();
            CCApplication::sharedApplication().run();
        }

(6)進入proj.android,jni。打開android.mk,修改LOCAL_SRC_FILES字段為下面內(nèi)容,這就是所有的源碼。

    LOCAL_SRC_FILES := helloworld/main.cpp
               ../../Classes/AppDelegate.cpp
               ../../Classes/BulletLayer.cpp
               ../../Classes/ControlLayer.cpp
               ../../Classes/EnemyLayer.cpp
               ../../Classes/Enemy.cpp
               ../../Classes/GameLayer.cpp
               ../../Classes/GameScene.cpp
               ../../Classes/PlaneLayer.cpp
               ../../Classes/WelcomeLayer.cpp
               ../../Classes/WelcomeScene.cpp
               ../../Classes/UFOLayer.cpp
               ../../Classes/GameOverLayer.cpp
               ../../Classes/GameOverScene.cpp
               ../../Classes/MutiBulletsLayer.cpp
               ../../Classes/NoTouchLayer.cpp

1.2.交叉編譯

打開Cygwin,把proj.android中的build-native.sh拖到Cygwin中,執(zhí)行編譯。正常編譯成功后,你可以在proj.androidlibsarmeabi目錄下找到libgame.so。這就是整個游戲的內(nèi)容被打包進去了。.so是linux下的動態(tài)鏈接庫,相當于windows下的.dll。

1.3.導(dǎo)入android項目,生成apk

打開Eclipse,F(xiàn)ile-Import-Android-Existing Android code to workspace。選擇剛才的proj.android。導(dǎo)入。Eclipse工作區(qū)就可以看到這個游戲的android項目了。啥都不用改了,直接編譯成.apk就可以了。

注意:AVD不支持openGLES2.0,所以必須用真機調(diào)試。

2.廣告植入

現(xiàn)在這類廣告多如牛毛。選擇哪家我也就不多說了,免得有廣告嫌疑。如何植入廣告這里我也只能簡單的說下。因為實際植入還是很麻煩的,畢竟廣告商的SDK不一樣,還涉及到j(luò)ni技術(shù),java基礎(chǔ),Android開發(fā)基礎(chǔ),這些都要有了解。

這里我把廣告分為兩類,這部分我也算初學(xué),如果有什么錯誤,煩請指出。。。

2.1.Android廣告和cocos2d-x游戲無交互

這類比如開場插屏廣告之類的。

這里廣告和游戲沒有交互,也就是說它和游戲的相對獨立的,大體步驟是:

(1)單獨的做出一個帶有廣告LoadingActivity和對應(yīng)布局,然后在AndroidManifest.xml中把啟動Activity指向它。

(2)我們看一下JackyActivityActivity(cocos2d-x自動幫你生成的):

    public class JackyAirplane extends Cocos2dxActivity
    public class Cocos2dxActivity extends Activity

是的,cocos2d-x游戲也是一個Activity,所以可以在LoadingActivity中實現(xiàn)Runnable接口,開啟一個線程調(diào)用它。

    Runnable runnable=new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            Intent intent = new Intent(LoadActivity.this, JackyAirplane.class);
            LoadActivity.this.startActivity(intent);//切換Activity
            LoadActivity.this.finish();
        }
    };

2.2.Android廣告和cocos2d-x游戲有交互

這類比如過場廣告,暫停廣告之類的。

這里處理起來就比無交互的麻煩多了。其實也就是要在C++代碼中調(diào)用JavaAPI,所以采用了Jni技術(shù)。

(1)Java代碼:給JackyAirplane添加一個靜態(tài)廣告成員變量。

    public class JackyAirplane extends Cocos2dxActivity{
    ...
    public static AdView adView;    // 第3方廣告

    }

(2)Java代碼:添加靜態(tài)成員方法,用來顯示廣告。

    public static void showAD() {
      new Thread(new Runnable(){

      @Override
      public void run() {
      adView.setVisibility( adView.VISIBLE );
      }

      }).start();
    }

(3)C++代碼:通過jni調(diào)用showAD()。

    #include 

    JniMethodInfo minfo;
    jobject jobj;

    bool b = JniHelper::getStaticMethodInfo(minfo,
    "com/jacky/jackyAirplane/JackyAirplane",  //類路徑
    "showAD",   //靜態(tài)方法名
    "()V");   //括號里的是參數(shù),后面的是返回值
    if(b)
        jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
    else
        ;//打印錯誤...

如果要控制廣告的開關(guān),可以在Java內(nèi)使用Handler來接收消息控制,不過這個時候就要記得傳參(開/關(guān))了。

好了,微信飛機大戰(zhàn)講解到這里就全部結(jié)束了。感謝CCTV什么的就不來了。希望這一系列的教程能夠幫助您開啟cocos2d-x游戲的快樂旅途!

本系列源碼:VS2008+Cocos2d-x 2.0.1版 https://github.com/fusijie/Airplane_2.0.1,

VS2010+Cocos2d-x 2.2.0版(教程按照此版編寫)

Xcode+Cocos2d-x 3.0版

直接Fork吧:)

游戲下載猛擊這里:[http://as.baidu.com/a/item?docid=4225601&pre=web_am_se&f=web_alad_5@next][2]