轉自:http://www.himigame.com/iphone-cocos2dx/743.html
Cocos2dx系列博文的上一篇詳細介紹了如何在Xcode中利用jni調用Android的Java層代碼,還沒有看過的童鞋,請移步到如下博文:
【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯並通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
本篇繼續介紹另外一個在Cocos2dx中必經之路:在Cocos2dx中調用蘋果Api以實現后期iOS的GameCenter和iap的相關操作, 那么Himi這里就跟大家簡單分享探討下;如何在Xcode中進行c++與oc混編吧~
參考王哥說的 SimpleAudioEngine 類;
首先Himi建立了兩個類,一個object-c ,一個c++,詳細如下:
HSpriteOC.h
// // HSpriteOC.h // Oc_Cpp // // Created by Himi on 12-4-10. // Copyright (c) 2012年 Himi. All rights reserved. // #import <Foundation/Foundation.h> NSString * str; @interface HSpriteOC +(void) testLog; +(void) testLogWithStr:(NSString*)_str; +(void) hMessageBox:(NSString*)pszMsg title:(NSString*)pszTitle; @end
HSpriteOC.m
// // HSprite.m // Oc_Cpp // // Created by Himi on 12-4-10. // Copyright (c) 2012年 Himi. All rights reserved. // #import "HSpriteOC.h" @implementation HSpriteOC +(void) testLog{ str = @"Himi->string is: "; NSLog(@"HSprite: testLog"); } +(void) testLogWithStr:(NSString*)_str{ str = [NSString stringWithFormat:@"%@%@",str,_str]; NSLog(@"%@",str); } +(void) hMessageBox:(NSString*)pszMsg title:(NSString*)pszTitle{ UIAlertView * messageBox = [[UIAlertView alloc] initWithTitle: pszTitle message: pszMsg delegate: nil cancelButtonTitle: @"OK" otherButtonTitles: nil]; [messageBox autorelease]; [messageBox show]; } @end
這個類比較簡單,簡單定義了幾個靜態函數,打印和顯示一個提示框,不贅述,大家大概看下就可以了;
下面來看c++的類:
HSpriteCPP.h
// // HSpriteCPP.h // Oc_Cpp // // Created by Himi on 12-4-10. // Copyright (c) 2012年 Himi. All rights reserved. // #ifndef Oc_Cpp_HSprite_h #define Oc_Cpp_HSprite_h #include "cocos2d.h" using namespace cocos2d; class HSpriteCPP:public cocos2d::CCSprite { public: static HSpriteCPP* hspriteWithFile(const char *spName); void myInit(); virtual ~HSpriteCPP(); }; #endif
HSpriteCPP.cpp
// // HSpriteCPP.mm // Oc_Cpp // // Created by Himi on 12-4-10. // Copyright (c) 2012年 Himi. All rights reserved. // #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) #include "HSpriteOC.h" #endif #include "HSpriteCPP.h" HSpriteCPP* HSpriteCPP::hspriteWithFile(const char *spName) { HSpriteCPP *pobSprite = new HSpriteCPP(); if (pobSprite && pobSprite->initWithFile(spName)) { pobSprite->myInit(); pobSprite->autorelease(); return pobSprite; } CC_SAFE_DELETE(pobSprite); return NULL; } void HSpriteCPP::myInit(){ #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) //iOS代碼 [HSpriteOC testLog]; [HSpriteOC testLogWithStr:@"wahaha"]; [HSpriteOC hMessageBox:@"cocos2dx調用oc函數" title:@"Himi"]; #else //Android代碼 #endif } HSpriteCPP::~HSpriteCPP(){ }
此類是個自定義精靈類,都是簡單的創建等函數,其HSprite.cpp類的導入和在 myInit() 自定義初始化函數中都加入了預編譯(#if #else #endif 對預編譯不太了解的自定百度下吧),主要為了區別當前手機設備的平台區分做處理;而且在myInit()中我使用了object-c語法進行調用之前OC寫的HSprite類函數;
其實通過觀察以上兩個類童鞋們估計很容易看出在xcode中cpp和oc如何混編;其實就是兩點:
1. 混編的類需要將其實現類(.cpp)改成(.mm)類,那么Xcode就會智能知道這個類混編類了,不用復雜的操作;
2. 混編中cpp調用oc,其實就是各自使用各自語法即可,沒差異!(最好對OC和c++都比較熟悉更效率)
然后Himi在HelloWorldScene.cpp中加入以下測試代碼:
HSpriteCPP * sp =HSpriteCPP::hspriteWithFile("Icon.png"); sp->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width*0.5,CCDirector::sharedDirector()->getWinSize().height*0.5-100)); this->addChild(sp);
別忘記導入對應使用的類哦~OK,看運行效果: