2012-02-22 112 views
1

如何禁用触摸后的CCRect/sprite触摸?如何在一次触摸后禁用CGRect/Sprite上的触摸

我在init()方法来设置精灵:使用精灵作为其参数的位置和大小

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"testAtlas_default.plist"]; 
      sceneSpriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"testAtlas_default.png"]; 

[self addChild:sceneSpriteBatchNode z:0]; 

dinosaur1_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur1-c.png"]; 
[sceneSpriteBatchNode addChild:dinosaur1_c]; 

[dinosaur1_c setPosition:CGPointMake(245.0, winSize.height - 174.0)]; 

我然后创建一个的CGRect:

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint touchLocation = [touch locationInView:[touch view]]; 
    touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation]; 
    touchLocation = [self convertToNodeSpace:touchLocation]; 

    dinosaur1 = CGRectMake(dinosaur1_c.position.x - (dinosaur1_c.contentSize.width/2), dinosaur1_c.position.y - (dinosaur1_c.contentSize.height/2), dinosaur1_c.contentSize.width, dinosaur1_c.contentSize.height); 

    if(CGRectContainsPoint(dinosaur1, touchLocation)) 
    { 
     CCLOG(@"Tapped Dinosaur1_c!"); 
     PLAYSOUNDEFFECT(PUZZLE_SKULL); 

     // Code to disable touches?? 
     // Tried to resize CGRect in here to (0, 0, 1, 1) to get it away from the original sprite, but did not work. Still was able to tap on CGRect. 
     // Tried [[CCTouchDispatcher sharedDispatcher] setDispatchEvents:NO];, but disables ALL the sprites instead of just this one. 

    } 
} 

我能够成功点击这个精灵来让它播放声音,但是我无法弄清楚如何在被触摸后禁用CGRect。我已经尝试了上面代码中评论的不同方法。任何想法或提示都表示赞赏!

+0

您是否尝试在'ccTouchBegan:withEvent:'上返回'NO'? – 2012-02-22 02:50:32

+0

解决了!只要stackoverflow允许我发布我的解决方案。我几乎在我的init方法中设置了一个 - (BOOL)已跳到NO,并且在检查它的什么时候被点击时,我也检查它是否为!= YES。在这种方法中,我设置为YES,所以下一次出现时,它会通过。 – rizzlerazzle 2012-02-22 02:59:36

回答

1

行,所以我解决了这个问题。在任何人想知道的情况下,我在我的头文件中设置了一个 - (BOOL)已打开,并在我的init方法中将其设置为NO。

当我检查与接触点和CGRect的碰撞时,我还检查是否isTapped!= YES(意味着它尚未被轻敲)。在这个if语句中,我会像通常那样执行所有操作,但随后会设置isTapped = YES。现在,当我再次点击时它会跳过。下面是我的代码添加位在*的

.h file: 

BOOL isTapped; 

之间,并在.m文件:

.M:

-(id)init 
{ 
    isTapped = NO; 
    // Rest of init method. 
} 

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint touchLocation = [touch locationInView:[touch view]]; 
    touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation]; 
    touchLocation = [self convertToNodeSpace:touchLocation]; 

    dinosaur1 = CGRectMake(dinosaur1_c.position.x - (dinosaur1_c.contentSize.width/2), dinosaur1_c.position.y - (dinosaur1_c.contentSize.height/2), dinosaur1_c.contentSize.width, dinosaur1_c.contentSize.height); 

    if(CGRectContainsPoint(dinosaur1, touchLocation) **&& isTapped != YES**) 
    { 
     CCLOG(@"Tapped Dinosaur1_c!"); 
     PLAYSOUNDEFFECT(PUZZLE_SKULL); 

     **isTapped = YES;** 
    } 
    else 
    { 
     CCLog(@"Already Tapped!"); 
    } 
} 

为寻找谢谢!

1

这也将帮助你

- (void)selectSpriteForTouch:(CGPoint)touchLocation { 
for (CCSprite *sprite in _projectiles) { 

if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) { 

    NSLog(@"sprite was touched"); 


    [sprite.parent removeChild:sprite cleanup:YES]; 

    [self removeChild:sprite.parent cleanup:YES]; 

} 
    } } 

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
CGPoint touchLocation = [self convertTouchToNodeSpace:touch]; 
[self selectSpriteForTouch:touchLocation]; 
NSLog(@"touch was _"); 
return TRUE; }