Как отключить касание на CGRect / Sprite после одного касания - PullRequest
2 голосов
/ 22 февраля 2012

Как я могу отключить касания для CCRect / 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 после того, как это затронуто.Я пробовал разные методы, как указано в коде выше.Любые идеи или советы приветствуются!

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Хорошо, поэтому я решил проблему.В случае, если кому-то было интересно, я установил - (BOOL) isTapped в моем заголовочном файле и установил для него значение NO в моем методе init.

Когда я проверяю столкновения с Touchpoint и 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 голос
/ 22 февраля 2012

это также поможет вам

- (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;  }
...