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

NO IMAGE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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裡

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

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;
}

}

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

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

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

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

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

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

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

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

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

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

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