CCNode作为CCScene的子节点时的触摸事件处理程序,cocos2d v3。

7

我已经花了一段时间在这个问题上苦思冥想。 我知道在cocos2d V3中,只要设置contentSize并将self.userInteractionEnabled = YES,CCNode就可以接受触摸事件。

但是对于我来说,这并没有起作用。我有一个CCNode,将其添加为CCScene的子项,但是无法注册任何触摸事件。

这是CCNode的代码:

-(id) initWithPortName:(NSString *)portName andDesc:(NSString *)desc {
    self = [super init];
    if (!self) return(nil);

    CGSize winSize = [[CCDirector sharedDirector] viewSize];

    self.contentSize = winSize;
    self.portName = portName;
    self.desc = desc;

    self.descLabel = [[CCRPGLabel alloc] initWithString:desc fontName:@"Arial" fontSize:18.0f dimensions:CGSizeMake(300, 150)];
    self.descLabel.color = [CCColor blackColor];
    self.descLabel.position = ccp(winSize.width/2, -200);

    [self addChild:self.descLabel];

    return self;
}

- (void) onEnter {
    self.userInteractionEnabled = YES;
    [super onEnter];
}

- (void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    NSLog(@"here");
}

还有CCScene:

self.portNode = [[MainPort alloc] initWithPortName:@"Santa Maria Port" andDesc:@"This port is soweeeet"];
self.portNode.position = ccp(0, winSize.height);
self.portNode.contentSize = winSize;

[self addChild:self.portNode];

我在 touchBegan 函数中没有得到任何日志。是我做错了什么吗?请记住这是 cocos2d v3 版本,目前文档不是很完善 :(


嘿,我也遇到了同样的问题。你是怎么解决这个问题的?谢谢。 - lionserdar
3个回答

3

在CCResponderManager.m的touchesBegan:withEvent:方法中设置一个断点。

它会遍历所有具有userInteractionEnabled属性的CCNode,并检查是否被点击。你可以首先确定你的目标CCNode是否在_responderList列表中。如果是,你可以跟踪进入该CCNode的hitTestWithWorldPos:方法,看看为什么它返回false。


2

我也遇到了同样的问题。 在我的CCScene中,我使用[self addChild:map z:-1];添加了CCNode * map,并且当我将z:选项更改为0或更高时,我的touchBegan函数会做出响应。 虽然我不太擅长解释,但现在它可以工作了。


0

CCNode是在同一个.m文件中还是在不同的文件中读取的?如果您正在从不同的类文件中读取,它可能看起来像这样(我删除了您的标题以简化您要完成的内容):

头文件:

#import "MainPort.h";

在你的场景中:

CGSize screenSize = [[CCDirector sharedDirector]viewSize];
CCNode *santaMaria = [MainPort node];
santamaria.contentSize = screenSize;
[self addChild:santaMaria];

在你的MainPort节点中:
- (void)onEnter
{
    [super onEnter];
    self.userInteractionEnabled = YES;
}

如果它在同一个类文件中,z顺序将决定哪个触摸应该先注册,正如丹尼所指出的那样。 z顺序越大,触摸优先级越高。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接