cocos2d-x项目中c++调用objective_c

来源:互联网 发布:dnf闪光网络中断 编辑:程序博客网 时间:2024/05/18 02:51

本篇继续介绍另外一个在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. #import <Foundation/Foundation.h>
  9. NSString * str;
  10. @interface HSpriteOC
  11. +(void) testLog;
  12. +(void) testLogWithStr:(NSString*)_str;
  13. +(void) hMessageBox:(NSString*)pszMsg title:(NSString*)pszTitle;
  14. @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. #import "HSpriteOC.h"
  9. @implementation HSpriteOC
  10. +(void) testLog{
  11. str = @"Himi->string is: ";
  12. NSLog(@"HSprite: testLog");
  13. }
  14. +(void) testLogWithStr:(NSString*)_str{
  15. str = [NSString stringWithFormat:@"%@%@",str,_str];
  16. NSLog(@"%@",str);
  17. }
  18. +(void) hMessageBox:(NSString*)pszMsg title:(NSString*)pszTitle{
  19. UIAlertView * messageBox = [[UIAlertView alloc] initWithTitle: pszTitle
  20. message: pszMsg
  21. delegate: nil
  22. cancelButtonTitle: @"OK"
  23. otherButtonTitles: nil];
  24. [messageBox autorelease];
  25. [messageBox show];
  26. }
  27. @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. #ifndef Oc_Cpp_HSprite_h
  9. #define Oc_Cpp_HSprite_h
  10. #include "cocos2d.h"
  11. using namespace cocos2d;
  12. class HSpriteCPP:public cocos2d::CCSprite {
  13. public:
  14. static HSpriteCPP* hspriteWithFile(const char *spName);
  15. void myInit();
  16. virtual ~HSpriteCPP();
  17. };
  18. #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. #include "HSpriteCPP.h"
  12. HSpriteCPP* HSpriteCPP::hspriteWithFile(const char *spName)
  13. {
  14. HSpriteCPP *pobSprite = new HSpriteCPP();
  15. if (pobSprite && pobSprite->initWithFile(spName))
  16. {
  17. pobSprite->myInit();
  18. pobSprite->autorelease();
  19. return pobSprite;
  20. }
  21. CC_SAFE_DELETE(pobSprite);
  22. return NULL;
  23. }
  24. void HSpriteCPP::myInit(){
  25. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  26. //iOS代码
  27. [HSpriteOC testLog];
  28. [HSpriteOC testLogWithStr:@"wahaha"];
  29. [HSpriteOC hMessageBox:@"cocos2dx调用oc函数" title:@"Himi"];
  30. #else
  31. //Android代码
  32. #endif
  33. }
  34. HSpriteCPP::~HSpriteCPP(){
  35. }

此类是个自定义精灵类,都是简单的创建等函数,其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,看运行效果:

本文出自 “李华明Himi” 博客,请务必保留此出处http://xiaominghimi.blog.51cto.com/2614927/908852

原创粉丝点击