Ios Obj C调用Cocos2dx C++;非静态函数
我正在为我的cocos2dx游戏中的iOS应用程序内购买编写代码。我想调用Obj C.的C++函数,我可以用*.mm实现文件Obj-c++调用C++静态函数。但我想在采购过程中更新用户界面。我试图创建一个singleton类,但Obj-C仍然无法识别singleton对象中的函数 C++:sceneac.cppIos 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
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++ 方法
@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对象中的变量,并且工作得很好。:)