【问题标题】:CCNode as child of CCScene Touch Handler cocos2d v3CCNode 作为 CCScene Touch Handler cocos2d v3 的子节点
【发布时间】:2014-02-23 23:45:36
【问题描述】:

我已经为此苦恼了一段时间。我知道在 cocos2d v3 中它发生了变化,因此只要您设置 contentSize 并设置 self.userInteractionEnabled = YES,CCNode 就可以接受触摸。

这对我不起作用。我有一个作为子节点添加到 CCScene 的 CCNode,但没有注册任何触摸。

这是 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,关于这个版本的文档还不是很多:(

【问题讨论】:

  • 嘿,我也遇到了同样的问题。你是怎么解决这个问题的?谢谢

标签: ios cocos2d-iphone


【解决方案1】:

在 CCResponderManager.m 中设置断点 touchesBegan:withEvent:

它遍历所有具有 userInteractionEnabled 的 CCNode 并检查命中。您可以做的第一件事是查看您的目标 CCNode 是否在 _responderList 中。如果是,您可以跟踪该 CCNode 的 hitTestWithWorldPos: 并查看它返回 false 的原因。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。 在我的 CCScene 中,我使用 [self addChild:map z: -1] 添加 CCNode *map;当我将 z: 选项更改为 0 或更多时,我的 touchBegan 函数会响应。 我不太好解释这一点,但现在它起作用了。

    【讨论】:

      【解决方案3】:

      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 顺序将确定应首先注册哪个触摸,正如 Dany 指出的那样。 z 顺序越大,触摸优先级越高。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多