Obj C调用Cocos2dx C ++非静态函数

时间:2013-12-10 09:08:51

标签: ios objective-c c in-app-purchase cocos2d-x

我正在我的cocos2dx游戏中编写iOS应用内购买代码。我想从Obj C调用我的C ++函数。我可以通过使用* .mm实现文件Obj-C ++来调用C ++静态函数。但我想在购买进度的同时更新用户界面。我试图创建一个单例类,但是Obj-C仍然无法识别单例对象中的函数。

C ++:SceneAcc.cpp

void SceneAcc::stateChecker()
{
    if(BridgeObjCpp::sharedBridge()->isPurchasing == false)
   {
       this->unschedule(schedule_selector(SceneAcc::stateChecker));
       removeBuyCash();
   }
}

// There is an update scheduler to check if the purchase phase done

C ++:BridgeObjCpp.mm

BridgeObjCpp* BridgeObjCpp::sharedBridge(){
    if (! s_bridge) {
        s_bridge = new BridgeObjCpp();
    }
    return s_bridge;
}

// Init singleton object
// And bool isPurchasing property in the header

IAPManager.m

- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@"Complete Transaction...");

    // I want something like this
    BridgeObjCpp::sharedBridge()->isPurchase = true;

    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
    [[SKPaymentQueue defaultQueue]finishTransaction:transaction];

}

1 个答案:

答案 0 :(得分:1)

您需要修改BridgeObjCpp.mm或IAPManager.m。

  • 在BridgeObjCpp.mm中添加静态方法来处理静态对象 有效的BridgeObjCpp.mm将作为沟通C ++的包装器 方法。

<强> BridgeObjCpp.h

@interface BridgeObjCpp : NSObject

+(void)setPurchasing:(BOOL)purchasing:

@end

<强> BridgeObjCpp.mm

@implementation BridgeObjCpp

+(void)setPurchasing:(BOOL)purchasing {
  BridgeObjCpp::sharedBridge()->isPurchase = purchasing ;
}

@end

<强> IAPManager.m

[BridgeObjCpp setPurchasing:YES];

  • 将IAPManager.m重命名为IAPManager.mm以使用C ++约定。

注意:在.mm文件中,编译器需要混合使用目标C和C ++代码。在.m文件中,它只期望客观的C代码。所以请分别进行编码。