2014-09-19 3 views
1

제 게임에는 두 가지 유형의 제스처가 있습니다. 단일 탭 및 보류 화면에 손가락을 쥐면 내 도청 방식이 호출 된 곳에서 touchBegan:(UITouch *)touch withEvent:(UIEvent *)event이 호출되어 두 제스처가 모두 호출됩니다. 이 문제를 어떻게 피할 수 있습니까? UIGestureRecognizers을 사용해야합니까, 아니면 내장 된 cocos2d 메소드를 사용하는 방법이 있습니까? 나는이 제스처가 서로 결합되어 있지 않고 독점적으로 호출되어야합니다.탭과 홀드를 구별하는 방법은 무엇입니까?

typedef NS_ENUM(NSUInteger, BPMovementState) { 
    kTouchUp, //Finger is not on the screen 
    kTouchDown //Finger is on the screen 
}; 

@implementation HelloWorldScene 
{ 
    CCSprite *_hero; 
    BPMovementState _touchState; 
} 

- (instancetype)init 

    self = [super init]; 
    if (!self) return(nil); 

    // Enable touch handling on scene node 
    self.userInteractionEnabled = YES; 

    _touchState = kTouchUp; 

    return self; 
} 

- (void)fixedUpdate:(CCTime)delta{ 

    if(_touchState == kTouchDown){ 
     //_hero slide 
     _hero.position = ccp(_hero.position.x + 1, _hero.position.y); 
    } 

} 

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

    _touchState = kTouchDown; 
    if(touch.tapCount == 1) 
     [_hero jump] 

} 

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


    _touchState = kTouchUp; 

} 
+0

터치 시작과 터치 종료 사이의 시간을 확인할 수 있습니다. 그런 다음 탭 및 대기를 인식하는 기준을 맞춤 설정할 수 있습니다. – Renaissance

+1

톡은 우정의 신호입니다. 홀드는 사랑의 표시입니다. – quellish

답변

1

다음과 같은 방법으로 달성 할 수 있습니다.

즉 touchTimer가

touchBegan에서 타이머를 시작 헤더 타이머 정의

touchTimer = NSTimer scheduledTimerWithTimeInterval : 지연 대상 : 자기 선택기 : @ 선택기 (touchHasBeenHeld : 유저 정보 : 반복 닐 : NO] 없다

타이머가 만료되고 터치가 해제되기 전에 -touchHasBeenHeld 선택기가 호출 된 경우. 그것의 보류 사건. 여기에서는 타이머도 무효화합니다.

그렇지 않으면 -touchEnded가 호출되고 timer가 여전히 유효하면 터치 이벤트입니다. 다시 타이머를 무효화합니다.

0

가능한 경우 UIGestureRecognizer을 붙일 것입니다. Apple의 제스처 인식기는 사용자에게 익숙한 느낌을 주도록 조정되었습니다. 자신 만의 템플릿을 만들면 타이밍이나 임계 값이 약간 달라질 수 있으며 시스템 기본 설정에 익숙한 사용자에게는 제스처가 이상하게 느껴질 수 있습니다. HereUIGestureRecognizer을 cocos2d 프로젝트에 추가하는 방법에 대한 빠른 자습서입니다.

관련 문제