Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Obj C调用Cocos2dx C++;非静态函数_Ios_Objective C_C_In App Purchase_Cocos2d X - Fatal编程技术网

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

Ios Obj C调用Cocos2dx C++;非静态函数,ios,objective-c,c,in-app-purchase,cocos2d-x,Ios,Objective C,C,In App Purchase,Cocos2d X,我正在为我的cocos2dx游戏中的iOS应用程序内购买编写代码。我想调用Obj C.的C++函数,我可以用*.mm实现文件Obj-c++调用C++静态函数。但我想在采购过程中更新用户界面。我试图创建一个singleton类,但Obj-C仍然无法识别singleton对象中的函数 C++:sceneac.cpp void SceneAcc::stateChecker() { if(BridgeObjCpp::sharedBridge()->isPurchasing == false

我正在为我的cocos2dx游戏中的iOS应用程序内购买编写代码。我想调用Obj C.的C++函数,我可以用*.mm实现文件Obj-c++调用C++静态函数。但我想在采购过程中更新用户界面。我试图创建一个singleton类,但Obj-C仍然无法识别singleton对象中的函数

C++:sceneac.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
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@"Complete Transaction...");

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

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

}
@implementation BridgeObjCpp

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

@end
[BridgeObjCpp setPurchasing:YES];
IAPManager.m

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

// Init singleton object
// And bool isPurchasing property in the header
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@"Complete Transaction...");

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

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

}
@implementation BridgeObjCpp

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

@end
[BridgeObjCpp setPurchasing:YES];

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

  • 在BridgeObjCpp.mm中添加静态方法以处理静态对象,并在 有效的桥接Objpp.mm将充当包装器来传递C++ 方法
BridgeObjCpp.h

@interface BridgeObjCpp : NSObject

+(void)setPurchasing:(BOOL)purchasing:

@end
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
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@"Complete Transaction...");

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

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

}
@implementation BridgeObjCpp

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

@end
[BridgeObjCpp setPurchasing:YES];
IAPManager.m

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

// Init singleton object
// And bool isPurchasing property in the header
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@"Complete Transaction...");

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

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

}
@implementation BridgeObjCpp

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

@end
[BridgeObjCpp setPurchasing:YES];

  • 重命名IAPMeReals.m到IAPMaMARE.mm,使用C++约定。

注:在.mm文件中,编译器期望目标C和C++代码的混合。在.m文件中,它只需要目标C代码。因此,请分别进行编码。

它是如何失败的?调用
BridgeObjCpp::sharedBridge()->isPurchase=trueIAPManager.m
上的code>应该可以工作(尽管您必须将其重命名为.mm或将其类型更改为
Objective-C++Source
)。尝试这样做,并告诉我们编译器错误,如果这不工作,我很抱歉,我不能给出失败报告。我在调整代码时遇到另一个错误。现在,我得到了“词汇或预处理器错误-ccDATAvist.H:String”文件,未找到“:(是的,在那个点<代码> CCDATAAVISTIONER .H./COD>可能是代码< >代码> <包含代码>包含C++代码块的部分(如<代码>包含< /代码>)你最好把你的Objj-C++项目,添加<代码> -X ObjuleC++/C>到你的编译器标志中。我得到了3个下拉标志菜单:其他C、其他C++和其他警告标志。它们每个都有调试和发布属性。我应该设置哪一个?-X ObjuleC++?其他C标志应该是FI。词法或预处理器错误-未找到CCDataVisitor.h:“字符串”文件"当我将bool isPurchasing转换为静态属性时。我所要做的就是从Obj-C获取当前运行的SceneApp.cpp类实例的引用,并调用该方法来更新我的UI。是否可能?编辑后的答案有一个隐藏包装器实现。感谢Midhere,它可以工作!我之前使用了一个静态变量来实现它简单,但不起作用。然后我使用你的方法使用singleton对象中的变量,并且工作得很好。:)