Как отличить нажатие от перетаскивания - PullRequest
0 голосов
/ 07 января 2012

Я создаю приложение и пытаюсь сделать так, чтобы я мог перетаскивать спрайт (со вторым спрайтом сверху) по экрану, но если я просто коснусь спрайта, должен вызываться другой метод.

Я получил перетаскивание, работающее нормально, когда я касаюсь края моего спрайта, но когда я пытаюсь перетащить из середины спрайта (где второй спрайт сверху), перетаскивание не работает вообще, но нажмите вызов.

Я знаю, почему этого не происходит, хотя у обоих спрайтов есть противоречивые прикосновения, потому что тот, что сверху, глотает прикосновение, прежде чем ударит второй под ним.

Как бы я мог реализовать это там, где я хочу, чтобы спрайт перетаскивал, если палец двигался, но я хочу, чтобы касание регистрировалось, когда дается только касание (т.е. палец не двигался на экране)?

Визуализация спрайтов, с которыми я работаю (если это помогает): enter image description here

Желтая руна - это отдельный спрайт от камня под ней (потому что там задействованы анимации).

--------Touch for the top sprite----------
-(BOOL) ccTouchBegan:(UITouch*)touch withEvent:(UIEvent *)event{
    lastTouchLocation = [RuneScene locationFromTouch:touch];
    BOOL isTouchHandled = CGRectContainsPoint([charSprite boundingBox], lastTouchLocation);

    return isTouchHandled;
}
-(void) ccTouchEnded:(UITouch*)touch withEvent:(UIEvent *)event{
    NSLog(@"Tap received!");

}

------Touch for the bottom sprite--------

-(BOOL) ccTouchBegan:(UITouch*)touch withEvent:(UIEvent *)event{
    lastTouchLocation = [RuneScene locationFromTouch:touch];
    BOOL isTouchHandled = NO;

    // Check if this touch is on the Spider's sprite.
    if (CGRectContainsPoint([current.runeSprite boundingBox], lastTouchLocation)){
        mover = current;
        isTouchHandled = YES;
    }
    else if(CGRectContainsPoint([rune1.runeSprite boundingBox], lastTouchLocation)){
        mover = rune1;
        isTouchHandled = YES;
    }
    else if(CGRectContainsPoint([rune2.runeSprite boundingBox], lastTouchLocation)){
        mover = rune2;
        isTouchHandled = YES;
    }else if(CGRectContainsPoint([rune3.runeSprite boundingBox], lastTouchLocation)){
        mover = rune3;
        isTouchHandled = YES;
    }else if(CGRectContainsPoint([rune4.runeSprite boundingBox], lastTouchLocation)){
        mover = rune4;
        isTouchHandled = YES;
    }else if(CGRectContainsPoint([rune5.runeSprite boundingBox], lastTouchLocation)){
        mover = rune5;
        isTouchHandled = YES;
    }else if(CGRectContainsPoint([rune6.runeSprite boundingBox], lastTouchLocation)){
        mover = rune6;
        isTouchHandled = YES;
    }else if(CGRectContainsPoint([rune7.runeSprite boundingBox], lastTouchLocation)){
        mover = rune7;
        isTouchHandled = YES;
    }else if(CGRectContainsPoint([rune0.runeSprite boundingBox], lastTouchLocation)){
        mover = rune0;
        isTouchHandled = YES;
    }

    // Stop the move action so it doesn't interfere with the user's scrolling.
    //[self stopActionByTag:ActionTagCastingLayerMovesBack];

    // Always swallow touches, GameLayer is the last layer to receive touches.
    return isTouchHandled;

}

-(void) ccTouchMoved:(UITouch*)touch withEvent:(UIEvent *)event{
    CGPoint currentTouchLocation = [RuneScene locationFromTouch:touch]; 

    // Take the difference of the current to the last touch location.
    CGPoint moveTo = ccpSub(lastTouchLocation, currentTouchLocation);

    // Then reverse it since the goal is not to give the impression of moving the camera over the background, 
    // but to touch and move the background.
    moveTo = ccpMult(moveTo, -1);

    lastTouchLocation = currentTouchLocation;

    [self moveActionWithLocation: moveTo];
}

-(void) ccTouchEnded:(UITouch*)touch withEvent:(UIEvent *)event{
    if (!current.isPlaced && mover == current && currentR < Rune6) {
        // Move the game layer back to its designated position.
        CCMoveTo* move = [CCMoveTo actionWithDuration:1 position:curPt];
        CCEaseIn* ease = [CCEaseIn actionWithAction:move rate:0.5f];
        //ease.tag = ActionTagCastingLayerMovesBack;
        [current.runeSprite runAction:ease];

        [current setIsPlaced:YES];
        current.charSprite = [characters objectAtIndex:currentR];
        current.charSprite.position = curPt;
        //charSprite.visible = YES;
        [current performSelector:@selector(fade:) withObject:current.charSprite afterDelay:1];
        [current reorderChild:current.charSprite z:10];

        [self updateCurrentRune:currentR];
        [self updateCurrentCastNum:currentP];
        [self reorderChild:current z:10];
    }
}

Я пытался заглянуть в UITapGestureRecognizer, но все, что я делаю, чтобы попытаться реализовать, никогда не работает. Мои слои / спрайты не позволят мне добавить их в качестве жестов. Я также читал кое-что о CCGrstureRecognizer или что-то на форумах cocos2d, но я не могу найти никакой документации по этому классу, и при этом я не могу узнать, как фактически использовать это ...

Кто-нибудь здесь знает, как помочь мне с моей проблемой?

1 Ответ

0 голосов
/ 07 января 2012

Вместо использования (если CGRectContainsPoint) попробуйте использовать viewInside: withEvent: для возврата NO.Это приведет к тому, что система будет действовать так, как будто вас не видно.

...