• 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,看运行效果:

  • 相关阅读:
    Android 一个app启动另一个app
    Android 电池电量进度条,上下滚动图片的进度条(battery)
    Android 返回键双击退出程序
    Failed to load or instantiate
    GNUstep 快捷键编译
    Android 文件夹命名规范 国际化资源
    mac 安装protobuf,并编译为java,c++,python
    Android 贝塞尔曲线 折线图
    android 制作自定义标题栏
    Gson
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/3191707.html
Copyright © 2020-2023  润新知