检测子场景Cocos2d上是否触摸了精灵

时间:2014-04-13 23:11:12

标签: objective-c cocos2d-iphone

我有一个带按钮和节点级别的场景,我在其中加载另一个场景(使用Sprite Builder创建的层):

-(void) didLoadFromCCB {
//the Gameplay Scene loaded
    // tell this scene to accept touches
    self.userInteractionEnabled = TRUE;
    //load level in gameplay scene
   CCScene *level = [CCBReader loadAsScene:@"Scenes/scene_01"];
   [_levelNode addChild:level];
}

所有东西都在加载,我有一个带有常用按钮的游戏场景和一个带有精灵作为孩子的scene_01

现在我正在尝试检测来自scene_01的精灵是否被触及。我可以跟踪_levelNode上是否发生了触摸:

- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

    CGPoint _touchLocation = [touch locationInNode:_levelNode];
    CCLOG(@"levelNode touched");
    // Define which touched Object
    if (CGRectContainsPoint([_part01 boundingBox], _touchLocation))
    {
        _part01.position = _touchLocation;
        _touchingPart01 = YES;
        _touchPoint = _touchLocation;
        CCLOG(@"_part01 touched");
    }
}

但上面代码的第二部分不起作用,控制台说根本找不到精灵:

[1531:60b] CCBReader: Couldn't find member variable: _part01

我的结论是 - 父场景无法访问加载场景中的精灵,问题是:

  1. 让游戏切换到子节点的节点是一个好习惯:级别而不是将级别加载为场景吗?

  2. 如果是 - 如何管理该级别内的对象,我是否需要更精确的选择器? (例如:if (CGRectContainsPoint([***level.***_part01 boundingBox], _touchLocation)))

  3. 我想我可以创建.ccb个文件并创建类来描述Cocos中的这些精灵,但是每个级别会有5个精灵和几十个级别,这意味着我会得到50个以上的课程,我相信它不是创建游戏的好方法。 (由于缺乏技能,我不能为部分创建一个类并将其链接更改为sprite。)

1 个答案:

答案 0 :(得分:0)

经过一些挖掘和修改我接下来要做的问题:

  1. 让我的游戏场景添加级别场景作为孩子(以及一般按钮,如next,prev,back ......):
  2. Gameplay.m

    -(void) didLoadFromCCB { // tell this scene to accept touches self.userInteractionEnabled = TRUE; //load level CCScene *level = [CCBReader loadAsScene:@"Scenes/scene_01"]; [_levelNode addChild:level];
    }

    1. 创建了Scene_01类,让所有游戏机制都在该类中发生:
    2. Scene_01.m

      @implementation Scene_01 {
      CCSprite *_part01;
      ...}
      
      -(void) didLoadFromCCB {
          // tell this scene to accept touches
          self.userInteractionEnabled = TRUE;
      }
      
      - (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
      
      CGPoint _touchLocation = [touch locationInNode:self];
      // Define which touched Object
      if (CGRectContainsPoint([_part01 boundingBox], _touchLocation))
      {
         //some action if _part01 is touched
          CCLOG(@"_part01");
      }
      }
      

      现在这对我有用。我从一开始就没有这样做的原因,接下来是我的步骤:

      1. 我的精灵名为_part01,...并分配给" Doc root var" (在Sprite Builder中),让它们可以访问scene_01但是当我命名那个场景的根节点时,我的项目在构建时崩溃,所以我认为这是因为命名节点不能作为子节点添加到其他场景(在Xcode)。

      2. 将变量分配更改为"不要分配"并且错误:[1531:60b] CCBReader: Couldn't find member variable: _part01从日志中消失了,所以这就是关于我使用的对象的链接,而不是关于访问它们。

      3. 退后一步,重复为这个场景创建类,在该类中移动逻辑,将场景作为孩子添加到Gameplay场景中 - 瞧,它有效!

      4. P.S。我现在仍然不确定为什么它现在第一次没有工作,寻找任何可能有助于理解这种情况的评论。感谢。