【iOS-cocos2d-X 游戏开发之十四】cocos2dx(c++)中访问object函数

简介:

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

 

 
 
  1. // 
  2. //  HSpriteOC.h 
  3. //  Oc_Cpp 
  4. // 
  5. //  Created by Himi  on 12-4-10. 
  6. //  Copyright (c) 2012年 Himi. All rights reserved. 
  7. // 
  8.   
  9. #import <Foundation/Foundation.h> 
  10.   
  11. NSString * str; 
  12. @interface HSpriteOC 
  13.   
  14. +(void) testLog; 
  15. +(void) testLogWithStr:(NSString*)_str; 
  16. +(void) hMessageBox:(NSString*)pszMsg title:(NSString*)pszTitle; 
  17. @end 
HSpriteOC.m

 

 
 
  1. // 
  2. //  HSprite.m 
  3. //  Oc_Cpp 
  4. // 
  5. //  Created by Himi on 12-4-10. 
  6. //  Copyright (c) 2012年 Himi. All rights reserved. 
  7. // 
  8.   
  9. #import "HSpriteOC.h" 
  10.   
  11. @implementation HSpriteOC 
  12.   
  13. +(void) testLog{ 
  14.     str = @"Himi->string is: "
  15.     NSLog(@"HSprite: testLog"); 
  16.   
  17. +(void) testLogWithStr:(NSString*)_str{ 
  18.     str = [NSString stringWithFormat:@"%@%@",str,_str]; 
  19.     NSLog(@"%@",str); 
  20.   
  21. +(void) hMessageBox:(NSString*)pszMsg title:(NSString*)pszTitle{ 
  22.   
  23.     UIAlertView * messageBox = [[UIAlertView alloc] initWithTitle: pszTitle 
  24.                                                           message: pszMsg 
  25.                                                          delegate: nil 
  26.                                                 cancelButtonTitle: @"OK" 
  27.                                                 otherButtonTitles: nil]; 
  28.     [messageBox autorelease]; 
  29.     [messageBox show]; 
  30.   
  31. @end 

这个类比较简单,简单定义了几个静态函数,打印和显示一个提示框,不赘述,大家大概看下就可以了;

下面来看c++的类:

HSpriteCPP.h

 

 
 
  1. // 
  2. //  HSpriteCPP.h 
  3. //  Oc_Cpp 
  4. // 
  5. //  Created by Himi on 12-4-10. 
  6. //  Copyright (c) 2012年 Himi. All rights reserved. 
  7. // 
  8.   
  9. #ifndef Oc_Cpp_HSprite_h 
  10. #define Oc_Cpp_HSprite_h 
  11.   
  12. #include "cocos2d.h" 
  13. using namespace cocos2d; 
  14.   
  15. class HSpriteCPP:public cocos2d::CCSprite { 
  16. public
  17.     static HSpriteCPP* hspriteWithFile(const char *spName); 
  18.     void myInit(); 
  19.     virtual ~HSpriteCPP(); 
  20. }; 
  21. #endif 

 

HSpriteCPP.cpp

 

 
 
  1. // 
  2. //  HSpriteCPP.mm 
  3. //  Oc_Cpp 
  4. // 
  5. //  Created by Himi on 12-4-10. 
  6. //  Copyright (c) 2012年 Himi. All rights reserved. 
  7. // 
  8. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) 
  9. #include "HSpriteOC.h" 
  10. #endif 
  11.   
  12. #include "HSpriteCPP.h" 
  13.   
  14. HSpriteCPP* HSpriteCPP::hspriteWithFile(const char *spName) 
  15.     HSpriteCPP *pobSprite = new HSpriteCPP(); 
  16.   
  17.     if (pobSprite && pobSprite->initWithFile(spName)) 
  18.     { 
  19.         pobSprite->myInit(); 
  20.         pobSprite->autorelease(); 
  21.         return pobSprite; 
  22.     } 
  23.     CC_SAFE_DELETE(pobSprite); 
  24.     return NULL; 
  25. }  
  26.   
  27. void HSpriteCPP::myInit(){ 
  28. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) 
  29.     //iOS代码 
  30.     [HSpriteOC testLog]; 
  31.     [HSpriteOC testLogWithStr:@"wahaha"]; 
  32.     [HSpriteOC hMessageBox:@"cocos2dx调用oc函数" title:@"Himi"]; 
  33. #else 
  34.     //Android代码 
  35. #endif 
  36.   
  37. }  
  38.   
  39. HSpriteCPP::~HSpriteCPP(){  
  40.   

此类是个自定义精灵类,都是简单的创建等函数,其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中加入以下测试代码:

 

 
 
  1. HSpriteCPP * sp =HSpriteCPP::hspriteWithFile("Icon.png"); 
  2.     sp->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width*0.5,CCDirector::sharedDirector()->getWinSize().height*0.5-100)); 
  3.     this->addChild(sp); 

别忘记导入对应使用的类哦~OK,看运行效果:










本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/908852,如需转载请自行联系原作者
目录
相关文章