1. 程式人生 > >cocos2d-js製作的遊戲整合到原生app裡的方法之iOS版

cocos2d-js製作的遊戲整合到原生app裡的方法之iOS版

1、使用cocos2d-x 3.13版本(當然其他版本也可以的,不過可能有些地方改動不一樣),在命令列中新建cocos2d專案,使用js語言。

2、新建成功後,找到檔案所在目錄,開啟,目錄如下.

3、然後開啟cocos2d_js_binding.xcodeproj工程,如圖目錄下。

9618BAB7-7576-4556-9E7B-6A027531D671.png 1235x552 80.3 KB

4、按如圖配置一下,然後編譯(模擬器最好選iphone5,因為之前做cocos2d-lua的時候,xcode8對luajit的支援好像不完善,導致模擬器執行的時候只能選擇iphone5及以下,真機的話就沒這個問題了)

5、真機除錯的話,這裡選擇Generic iOS Device。debug和release模式看個人了,我一般先用debug,萬一有錯誤的話,查起來方便,之後就改為release。

F2B58196-97AE-478E-A58A-51AF7BCD969C.png 1107x297 58.7 KB

6、點選左上角那個三角形編譯成功後,選中左側靜態庫libcocos2d iOS.a,看右邊的fullpath,點選最後面的小箭頭,就會指引你去這個靜態庫所在目錄啦。

1FD4DB01-5EB5-4F1E-8A9C-77F7FAA0D0E6.png
984x471 78.4 KB

7、如果點選後沒跳轉的話,那就只能複製一下這個路徑了,比如/Users/cxp/Library/Developer/Xcode/DerivedData/cocos2d_libs-gtvjufizxzyrodawozkyysktnkmn/Build/Products/Debug-iphoneos/ 然後開啟Finder ,按下Command+shift+G進入資料夾搜尋,粘貼後點選前往就可以啦,這次準能找到,再找不到,額,那我,也不知道咋整了。

8、找到的就是這個啦,複製一下備用先。

5B1B0462-F5C6-4BA4-9267-8C08FF761882.png
820x180 16.5 KB

9、然後把Classes和剛剛生成的libjscocos2d iOS.a拷貝到cocos2d_libs.xcodeproj同級目錄下,開啟剛剛新建的cocos2d_libs.xcodeproj工程。Classes裡面主要是可以連線cocos和ios那邊的介面。

F38CB3AE-8EDE-43DA-8F5E-517CE82B52AA.png 882x448 57.2 KB

10、把Classes和靜態庫libjscocos2d iOS.a新增到工程裡。

11、設定一下標頭檔案查詢路徑,避免等會出現各種找不到標頭檔案的錯誤提示。

AA954128-E188-44EA-B6DB-D401B1A49BBD.png 981x738 138 KB

12、新增cocos需要的相應庫,並把靜態庫拖到那裡。

348CF126-A44B-4B53-BF38-5539B68591F1.png 1056x647 106 KB

13、如圖把Classes下的可執行檔案即.mm .cpp檔案拖到Compile Sources裡,參與編譯。

7A21172F-02AB-40F7-9669-B13C82AF3734.png 988x564 139 KB

14、這裡是重點了(敲黑板狀)!把CocosManager.h拖到Headers下面的Public下,其他的標頭檔案都拖到Project下,因為之後CocosManager.h要暴露出來作為介面給iOS用的。

C6AB69DD-096A-4324-A8F8-CD9D115D8A72.png 953x755 148 KB

15、然後就是和步驟4、5、6、7一樣了生成libcocos2d iOS.a靜態庫,並找到它拷貝備用。

16、這裡編譯的時候可能會出現找不到一些.a檔案的錯誤,如圖,這時候就把Link Binary With Libraries下的相關.a檔案先刪掉,然後在左側的extenal下把剛剛刪除的那幾個再拖過去,然後在編譯一下,還是有錯的話就重啟Xcode就沒問題了,恩,如果還有問題,我也布吉島啦。

C88C1B8F-623A-49F8-B10F-837C21C9E4C4.jpg 846x588 269 KB

17、這裡還要提一下,剛剛的那個CocosManager介面,想起來改了個關於觸控傳遞的東東。觸控層預設是隻能在cocos層或者ios層的,沒法穿透,當然可以選擇把cocos的view做小,cocos沒遮到的ios層就還是可以點選的了,我是做了一個處理,過載了下-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event,使得點選遊戲層裡的相關部分不穿透,遊戲裡的其他部分的話就直接穿透到ios層。
@property (nonatomic, assign)CGRect m_notAllowedTouchRect; //不可點選區域
@property (nonatomic, assign)BOOL m_allowedThrough; //是否穿透 
上面這兩句加到CCEAGLView-ios.h裡

680C77CD-821A-4A21-9DFB-0E4D65841C65.png 1149x704 177 KB

18、在CCEAGLView-ios.mm裡最上面加入 BOOL b_testHits;

96C80378-65B6-4309-97C0-BECC8F2D3CC6.png 1259x355 80.1 KB

19、在CCEAGLView-ios.mm裡最下面過載-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event,
-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
if (b_testHits) {
return nil;
}

if (CGRectEqualToRect(self.m_notAllowedTouchRect, CGRectZero)) {
    return self;
}
else{
    //返回Touch操作初始點所在的檢視(View),即需要將觸控事件傳遞給其處理的檢視
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView == self) {
        b_testHits = YES;

        CGPoint superPoint = [self.superview convertPoint:point fromView:self];
        UIView *superHitView = [self.superview hitTest:superPoint withEvent:event];
        b_testHits = NO;
        //NSLog(@"CGRectContainsPoint.....x = %f  y = %f",point.x,point.y);
        //NSLog(@"CGRectContainsPoint.....x = %f  y = %f  width = %f  height = %f",self.m_notAllowedTouchRect.origin.x,self.m_notAllowedTouchRect.origin.y,self.m_notAllowedTouchRect.size.width,self.m_notAllowedTouchRect.size.height);
        //判斷當前點是否在矩形區域內,不在矩形區域內就穿透
        if (!CGRectContainsPoint(self.m_notAllowedTouchRect, point)) {
            //NSLog(@"CGRectContainsPoint...");
            hitView = superHitView;
        }

        if(self.m_allowedThrough){
            hitView = superHitView;
        }
    }
    return hitView;
}

}

C88C1B8F-623A-49F8-B10F-837C21C9E4C4.jpg 846x588 269 KB

20、然後開啟CocosManager.mm檔案,裡面就可以設定觸控不可穿透區域的範圍啦。

98568D1F-11A4-4A45-9447-4DF97E92EF26.png 876x430 76.3 KB

21、接下來就可以新建一個ios空工程了,然後把剛剛生成的靜態庫libcocos2d iOS.a和CocosManager.h拷貝到ios工程根目錄下,並新建一個Resources資料夾。

22、把cocos工程下的script資料夾整個拷貝到ios工程根目錄下。

C345B3F4-1A05-408A-A151-3A028E14D9AB.png 1212x531 86.8 KB

23、把自己cocos工程下的這四個檔案拷貝到剛剛新建的Resources下面。

24、開啟ios工程,並新增剛剛加的那些檔案。

25、注意新增script資料夾時,選擇reference選項。

26、新增Resources後,把裡面的檔案刪除後再以reference方式新增,然後這些資料夾會顯示藍色。

27、給ios工程新增相應框架。

3F4F2E59-7807-4726-B24E-50046E0B44A6.png 1123x650 124 KB

28、在需要接入cocos2d遊戲的類裡引入CocosManager.h。

C9974689-4B50-4B2B-A649-6BE278380335.png 574x528 54.1 KB

29、然後在需要的地方呼叫相應介面顯示遊戲。(具體介面實現都在classes裡面的CocosManager.mm裡)

2356ADC0-4EDB-443D-B1F8-054B25B95178.png 779x222 23.5 KB

30、最終的流程就是,ios這邊呼叫介面載入cocos,然後再呼叫其他介面切換場景。需要其他的介面就改一下CocosManager這類就可以啦,比如顯示和隱藏遊戲,播放動畫什麼的。。。