手把手教你swift項目添加cocos2dx-lua

本文所用各版本信息:
Xcode9.2 + swift4版本
cocos2d-x v3.17 中文官方網(wǎng)站

集成思路

首先網(wǎng)上給出一個C系的思路,本人未親測,并且以C調(diào)用lua,繞過了cocos2d-x的調(diào)用思路,不覺得這種方式很好,所以棄之;

C語言調(diào)用思路
C語言調(diào)用思路

本文思路如圖:

swift->objective-c->c++->lua
swift->objective-c->c++->lua

首先swift與objective-c的互相調(diào)用非常方便,其次oc只需要將.m文件寫成.mm就可以在實現(xiàn)中直接調(diào)用c++方法,并且c++可以直接綁定lua,這樣一來,就實現(xiàn)了,ios系語言寫主框架,lua寫游戲邏輯,直接通過ViewController展現(xiàn)就可以了;并且lua腳本可以像資源添加的方式直接在文件夾中替換,非常方便;基于以上思路,說干就干;

首先你需要一個swift項目

新建一個swift語言寫的工程,我們默認你已經(jīng)會用Xcode做這件事了,于是,工程的結(jié)構(gòu)先大致看一下;

Nothing項目結(jié)構(gòu)
Nothing項目結(jié)構(gòu)
image_1cf2g61423hj8ks12ngn544ov1g.png-122.4kB
image_1cf2g61423hj8ks12ngn544ov1g.png-122.4kB

這里是我自己的swift工程,上面的是總結(jié)構(gòu),下面的是內(nèi)部工程結(jié)構(gòu),我們這里只關(guān)注一下bridge,首先創(chuàng)建一個CocosViewController的控制器,這里的控制器可以是OC類型的,也可以使用swift類型的(由于我們需要用OC做橋接文件,所以需要我們創(chuàng)建一個OC的類,我這里自己寫了一個單例用來做橋接,所以控制器就無所謂是OC還是swift了),用來呈現(xiàn)我們用cocos2dx-lua展現(xiàn)的游戲頁面;在swift工程中添加OC文件會自動生成橋接文件,名字如圖;另外還需要注意一點,CocosViewController的.m文件要修改成.mm類型,這樣就可以在實現(xiàn)中直接調(diào)用C++的類了;

創(chuàng)建好后先不要動,我們再來創(chuàng)建一個OC類型的單例,用來進行引擎的初始化操作,以及對lua游戲操作進行封裝,我自己命名為LuaBridge;

image_1cf2h2kvq7381eho18ieh5v1s5o1t.png-12kB
image_1cf2h2kvq7381eho18ieh5v1s5o1t.png-12kB

#import "LuaBridge.h"
#include "CocosLua.hpp"

@interface LuaBridge()
{
    CocosLua _cocosLua;
}

@end

@implementation LuaBridge

- (instancetype)init
{
    self = [super init];
    if (self) {
        _cocosLua = CocosLua();
        
    }
    return self;
}

static LuaBridge* _bridge = nil;

+ (instancetype)shared {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _bridge = [[LuaBridge alloc] init];
    });
    return _bridge;
}
@end

上面出現(xiàn)的CocosLua是一個c++的類,在工程中自己創(chuàng)建的;創(chuàng)建它的目的是用來封裝cocos2dx-lua的操作,這個類直接被隱藏在LuaBridge單例中,在實際應(yīng)用過程中可能用的不是很多,我們這里出現(xiàn)它只是為了說明本文的類型結(jié)構(gòu);

#ifndef CocosLua_hpp
#define CocosLua_hpp

#include <iostream>

class CocosLua {
    
public:
    CocosLua();
    ~CocosLua();
    
public:
    void cocos_lua();
};

#endif /* CocosLua_hpp */

創(chuàng)建一個cocos2dx-lua項目

首先我們需要去cocos官網(wǎng)上下載cocos2dx源碼,鏈接在本文開始,我自己下載的是v3.17版本,下載的是zip包,解壓后如下圖:

image_1cf2mkgfu1m1uk0i13ppv7jieh3h.png-77.4kB
image_1cf2mkgfu1m1uk0i13ppv7jieh3h.png-77.4kB

接下來打開終端,我們創(chuàng)建一個lua項目;

image_1cf2mm4hr2387mi1snp1iv51gtb3u.png-82.5kB
image_1cf2mm4hr2387mi1snp1iv51gtb3u.png-82.5kB

一路cd到我們下載的cocos2dx文件夾下,然后:

$ cd tools/cocos2d-console/bin/

到上面的這個目錄下新建工程,使用下面的命令格式:

cocos new <game name> -p <package identifier> -l <language> -d <location>
<game name> 工程名
<package identifier> 包名,bundle id
<language> 所用語言 cpp lua js
<location> 項目創(chuàng)建路徑
$ ./cocos new Nothing-lua -p com.charles.nothing -l lua -d /Users/dizi/Desktop
image_1cf2n16id1lfp13phripbgh13ta4b.png-153.7kB
image_1cf2n16id1lfp13phripbgh13ta4b.png-153.7kB
image_1cf2n2esh15vo18se12q01i7dih54o.png-29kB
image_1cf2n2esh15vo18se12q01i7dih54o.png-29kB

整合swift項目與lua項目

如果你做到這一步,那么我們離成功不遠了;接下來我們要把lua項目里的資源拷貝到swift項目中,具體跟著我一步一步做;

  1. 把lua項目下frameworks/cocos2d-x文件夾拖動到swift目錄下:

    image_1cf2ni2nnkpq1pmrsbd1iippri55.png-160.2kB
    image_1cf2ni2nnkpq1pmrsbd1iippri55.png-160.2kB

    這里說一點,如果工程是用git管理,因為cocos2d-x下文件比較多,而且是cocos2dx代碼文件,所以不必要上傳,可添加.gitignore文件:
    image_1cf2o45re1ahs1lvjn8mca14be5i.png-16.3kB
    image_1cf2o45re1ahs1lvjn8mca14be5i.png-16.3kB

  2. 把lua項目下frameworks/runtime-src/Classes文件夾拖動到swift目錄下:

    image_1cf2o6cm9rhe1tj416tl1acf8285v.png-197.8kB
    image_1cf2o6cm9rhe1tj416tl1acf8285v.png-197.8kB

  3. 在swift項目目錄下新建Resources文件夾,將lua項目中的如圖三項拷貝進該文件夾下,這樣以后lua的所有資源則將全部在該目錄下替換,不需要修改工程中其他地方:

    image_1cf2obieh1vrtujma7ucml86d6c.png-112.3kB
    image_1cf2obieh1vrtujma7ucml86d6c.png-112.3kB

  4. 將剛剛添加的文件引用到工程項目中:


    image_1cf2ogs2gai2rj01e701jks1q2h79.png-75.4kB
    image_1cf2ogs2gai2rj01e701jks1q2h79.png-75.4kB

    image_1cf2pbtk51lrv1kek18me1i5brlh8j.png-68.5kB
    image_1cf2pbtk51lrv1kek18me1i5brlh8j.png-68.5kB

    注意我們的coco2d-x目錄并不需要一并引入到工程中,我們不會用到它(不引用它并不說不會用到,不要刪掉,不要刪掉,不要刪掉?。。。?br> PS:這里注意藍色文件夾和黃色文件夾的區(qū)別;

工程環(huán)境配置

接下來到了重頭戲,工程環(huán)境配置,這個部分我們需要耐心一點,因為有很多路徑需要我們自己去找,還要搞清楚幾個不同的工程項目配置,我們一步一步來;

  1. 引入工程文件,這幾個工程文件分別生成cocos-lib以及調(diào)拭用.a庫,以下依次:


    image_1cf2vge2nmebc02hcgk8k1a199g.png-241.5kB
    image_1cf2vge2nmebc02hcgk8k1a199g.png-241.5kB

    image_1cf2vjknh14co12bq15jqahuh0a9t.png-103.2kB
    image_1cf2vjknh14co12bq15jqahuh0a9t.png-103.2kB

    image_1cf2vl0kf1skll42p86qi11k16aa.png-156.1kB
    image_1cf2vl0kf1skll42p86qi11k16aa.png-156.1kB
  2. 接下來配置資源庫,點擊工程TARGETS->Build Phases,在Target Dependencies中添加:

    image_1cf2vs1jffgj8avof61vg11iuaan.png-85.6kB
    image_1cf2vs1jffgj8avof61vg11iuaan.png-85.6kB

    在Link Binary With Libraries中添加如下支持庫,其中l(wèi)ib文件需要打開Add other添加,按shift + command + G,在其中輸入/usr/lib
    image_1cf304l9cja61nu71r9h1l8b539b4.png-118.7kB
    image_1cf304l9cja61nu71r9h1l8b539b4.png-118.7kB

    image_1cf309lts1b921oan4rhvkd1svebh.png-110.7kB
    image_1cf309lts1b921oan4rhvkd1svebh.png-110.7kB

  3. cocos2dx不支持bitcode,在buildsetting中Enable Bitcode改為NO;

    image_1cf30d889rs6173d8s411e0i5jbu.png-21.7kB
    image_1cf30d889rs6173d8s411e0i5jbu.png-21.7kB

    C++編譯器部分:
    image_1cf30ekpb1omd1rj61m56qo1eracb.png-26.4kB
    image_1cf30ekpb1omd1rj61m56qo1eracb.png-26.4kB

  4. Header Search Paths中添加:

$(inherited)
$(PROJECT_DIR)/cocos2d-x/cocos
$(PROJECT_DIR)/cocos2d-x/external/lua/tolua
$(PROJECT_DIR)/cocos2d-x/external/lua/lua
$(PROJECT_DIR)/cocos2d-x/external/lua
$(PROJECT_DIR)/cocos2d-x/external
$(PROJECT_DIR)/cocos2d-x/Classes
image_1cf30m5opf41hq513ib1eekflbco.png-130.9kB
image_1cf30m5opf41hq513ib1eekflbco.png-130.9kB
  1. 引入工程配置:
    cocos2d_libs.xcodeproj工程配置中,確保以下架構(gòu)都支持;
    image_1cf30qh2sddp1mi95kj89o1725d5.png-52.8kB
    image_1cf30qh2sddp1mi95kj89o1725d5.png-52.8kB

    cocos2d_lua_bindings.xcodeproj工程配置中,確保以下支持平臺為iOS;
    image_1cf30sk2o1211j4t88f11lt172dff.png-98.9kB
    image_1cf30sk2o1211j4t88f11lt172dff.png-98.9kB
  2. 好了,開始編譯你的工程吧!

去倒杯水吧,這個過程會很久。。。

image_1cf31g68atfq3l31v3uf4n1nm6fs.png-8.4kB
image_1cf31g68atfq3l31v3uf4n1nm6fs.png-8.4kB

Congratulations! 至此,工程已經(jīng)全部配置完畢,你已經(jīng)解決一個大Boss了;
今天就到這里吧,之后我們再續(xù)如何用swift調(diào)用lua 手把手教你swift項目添加cocos2dx-lua(2)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 老同學打電話過來說,聚一下。心想,好久不見,聚一下也是極好的。 “喂,有事沒,我們六點一十在xxx集合啊” “啊,...
    走在月光下閱讀 255評論 0 0
  • 心理學巨匠威廉·詹姆士說:“播下一個行動,收獲一種習慣;播下一種習慣,收獲一種性格;播下一種性格,收獲一種命運。 ...
    Dan2020閱讀 539評論 2 2
  • 可兒: 這是你離開家的第十天,也是你走進大學校園的第10天。這些天,我們的家前所未有的顯得空曠,幾個房間就...
    沙漠里的夕陽閱讀 285評論 0 7
  • 我走在路上 和他們不一樣 他們在原地 在笑 在鬧 在哭 我走著 不一樣 那又怎樣 我有自己的倔強 我想在路上,不想...
    By于你與你閱讀 117評論 0 0

友情鏈接更多精彩內(nèi)容