userInteractionEnabled = NO是什么意思,它是如何工作的

时间:2014-04-14 07:43:45

标签: ios objective-c cocos2d-iphone

Cocos 2d-iphone 3.0。我正在使用此代码来检测是否触摸了单个精灵

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

CGPoint location = [touch locationInView: [touch view]];
CGPoint convertedlocation = [[CCDirector sharedDirector] convertToGL: location];
CGPoint convertedNodeSpacePoint = [self convertToNodeSpace:convertedlocation];

  if (CGRectContainsPoint([_sprite boundingBox],convertedNodeSpacePoint)) 
  {
     // Remove sprite 
  }

我里面有一些代码应该从父级删除一些其他的精灵。逻辑上,_sprite

时 第二次触摸

,应用程序将崩溃,因为其他精灵已被删除。

我试图使用_sprite使_sprite.userInteractionEnabled = NO;无法触及,但这没有效果。

userInteractionEnabled究竟是什么意思,以及如何使用它来促进精灵上的触摸检测。

在我的场景中处理精灵的最佳触摸方式是什么?

3 个答案:

答案 0 :(得分:2)

无法禁用ccsprite上的交互。你应该做的是:

bool firstTimeClicked=false;
-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
 if(firstTimeClicked==true)
 {
     return NO;
 }
CGPoint location = [touch locationInView: [touch view]];
CGPoint convertedlocation = [[CCDirector sharedDirector] convertToGL: location];
CGPoint convertedNodeSpacePoint = [self convertToNodeSpace:convertedlocation];
if (CGRectContainsPoint([_sprite boundingBox],convertedNodeSpacePoint)) {
firstTimeClicked=true;    } 
}

答案 1 :(得分:0)

userInteractionEnabled做什么

在精灵上设置userInteractionEnabled=YES时,意味着将调用用户交互回调。

例如,在你的场景中,如果你有userInteractionEnabled=NO你的-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event就不会被调用。

我们正在做什么

您正在检测场景中的触摸。然后你我们正在检查那个触摸位置下面的东西,所以如果有什么东西在那里就会被检测到。

如何正确完成此操作 - 将CCSprite

子类化

您希望在自定义CCSprite课程中处理这类行为,因为如果不是,您的场景touchBegan将变成巨大的错误 if else switch声明。

相信我,我一直在那里。

以下是此类的示例代码示例:

.h 文件

@interface SubclassedSprite : CCSprite

@end

.m 文件

@implementation SubclassedSprite

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

- (void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    CCLOG(@"Touch began on sprite");
    // Your code when the Sprite was touched [self removeFromParentAndCleanup:YES];
}

@end

这是处理此问题的正确,可扩展的方式。

答案 2 :(得分:-1)

下面的代码没有额外的BOOL变量,它应该适合你:

-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint location = [touch locationInView: [touch view]];
    CGPoint convertedlocation = [[CCDirector sharedDirector] convertToGL:                   location];
    CGPoint convertedNodeSpacePoint = [self  convertToNodeSpace:convertedlocation];

    if (CGRectContainsPoint([_sprite  boundingBox],convertedNodeSpacePoint)) {
      if(_sprite.userInteractionEnabled)//Here you can remove the children of _sprite. e.g.
         {
          //Here run some action or do what you want to do. For e.g.
          CCFadeTo *fadeOut = [CCFadeTo actionWithDuration:0.5f opacity:0];
          CCCallfuncN *clean = [CCCallFuncN actionWithTarget:self SEL:@selector(cleanSpriteChildren:)];
          for(id item in _sprite.children)
             if(item)
               [item runAction:[CCSequence runActions:fadeOut, clean]];
         }
         else{//Do your own task while _sprite is untouchable} 
    } 
  }

  -(void)cleanSpriteChildren:(id)sender
     {         
        [item removeFromParentAndCleanUp:YES]
        if(([_sprite children] count) == 0)
           _sprite.userInteractionEnabled = YES; //Here make the _sprite touchable again
     }