我有一个类似的cpp类..
class MyContactListener : public b2ContactListener
{
int countContact;
///this is an objective c class...
HelloWorld *hel;
public:
void EndContact(b2Contact* contact)
{
///initialize objective c object
hel=[[HelloWorld alloc] autorelease];
///call objective c method.........
[hel beginContact];
}
};
在cpp类中我调用一个客观的c方法。目标c方法看起来像..
-(void )beginContact
{
shakeCounter++;
[_label setString:[NSString stringWithFormat:@"%d",shakeCounter]];
}
客观c方法被调用....并且变量shakeCounter也增加了......但是 _label字符串未更新...._标签已正确初始化并且如果我调用则正常工作 客观c类的客观c方法使用self ....
任何人都可以帮忙???
答案 0 :(得分:2)
在Contact侦听器中使用Delegate来调用objective-c类上的方法:
class MyContactListener : public b2ContactListener
{
public:
MyDelegateClass *delegate;
void BeginContact(b2Contact* contact) {
[delegate beginContact:contact];
}
void EndContact(b2Contact* contact) {
[delegate endContact:contact];
}
void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) {
[delegate preSolve:contact manifold:oldManifold];
}
void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) {
[delegate postSolve:contact impulse:impulse];
}
};
为代表声明一个协议:
#import "Box2D.h"
@protocol B2ContactListener <NSObject>
-(void) beginContact:(b2Contact*) contact;
-(void) endContact:(b2Contact*) contact;
-(void) preSolve:(b2Contact*) contact manifold:(const b2Manifold*) oldManifold;
-(void) postSolve:(b2Contact*) contact impulse:(const b2ContactImpulse*) impulse;
@end
声明实现协议的接口:
@interface MyDelegateClass: CCLayer <B2ContactListener> {
//interface code here.
}
@end
@implementation MyDelegateClass
-(void) beginContact:(b2Contact*) contact {
//implement your code here
}
-(void) endContact:(b2Contact*) contact {
//implement your code here
}
-(void) preSolve:(b2Contact*) contact manifold:(const b2Manifold*) oldManifold{
//implement your code here
}
-(void) postSolve:(b2Contact*) contact impulse:(const b2ContactImpulse*) impulse{
//implement your code here
}
@end
构造委托并在代码中指定委托。将其设置在您的世界对象中:
MyContactListener *listener = new MyContactListener();
listener->delegate = self;
world_->SetContactListener(listener);
现在,您的objective-c课程将收到活动。
答案 1 :(得分:0)
oww ....我解决了....
将其放在项目的顶部
#define PTM_RATIO 32
#import "HelloWorldScene.h"
id refToSelf;
并在onload或类似的东西中初始化...
self = [super init];
refToSelf = self;
现在使用此方法调用目标c方法....
[refToSelf beginContact];
它会起作用............
答案 2 :(得分:0)
我不确定它是否是您问题的根源,但是这一行:
hel=[[HelloWorld alloc] autorelease];
应该是:
hel=[[[HelloWorld alloc] init] autorelease];
答案 3 :(得分:0)
您的代码完全混淆了。我假设你想在endContact中创建Objective-C对象并将其持久化到稍后的某个点。目前,您每次都在创建一个新对象,但您根本没有初始化它。你的代码永远不会起作用。
C ++方法应该类似于:
void EndContact(b2Contact* contact)
{
// release old object and initialize a new one
[hel release];
hel = [[HelloWorld alloc] init];
///call objective c method.........
[hel beginContact];
}
或
void EndContact(b2Contact* contact)
{
HelloWorld* hel = [[HelloWorld alloc] init];
[hel beginContact];
[hel release];
}
取决于您希望hel对象持续多长时间。
我不知道为什么_label没有更新。您需要向我们展示您的代码,以便对其进行初始化以解决问题。
答案 4 :(得分:0)
少数事情:
_label是NSString还是NSMutableString? NSString不会响应setString
,因为它在创建时已得到修复。
这:
self = [super init]; refToSelf = self;
至少可以说是奇怪的。你基本上在这里说self = self
。您永远不需要在init
上致电self
。
我强烈建议您在这里查看Apple的精彩介绍:The Objective C Language