Xcode中c++&Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api


轉自: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,看運行效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM