2014-09-19 95 views
1

在我的游戏中,我有两种类型的手势;一个轻拍和一个按住。当我将手指放在屏幕上时,会导致调用touchBegan:(UITouch *)touch withEvent:(UIEvent *)event,因为我的tapper方法也被调用,因此两个手势都被调用。我怎样才能避免这个问题?我必须使用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 2014-09-19 23:44:16

+1

水龙头是友谊的象征。持有是爱的标志。 – quellish 2014-09-20 03:16:07

回答

1

它可以通过以下方式实现。

定义在报头中的计时器即touchTimer

在touchBegan启动定时器

touchTimer = [的NSTimer scheduledTimerWithTimeInterval:延迟目标:自选择器:@selector(touchHasBeenHeld :) USERINFO:无重复:NO];

如果计时器到期并且触发释放之前调用选择器-touchHasBeenHeld标识。其举办活动。 在这里你也使计时器无效。

否则,如果调用了-touchEnded并且定时器仍然有效,那么它是一个触摸事件。 您再一次使计时器无效。

0

如果可以,我会坚持UIGestureRecognizer。苹果的手势识别器被调整为让用户感到熟悉。如果您自己创建,则您的时间或阈值可能会略有不同,并且对习惯于系统默认设置的用户而言,手势会感到不可思议。 Here是向cocos2d项目添加UIGestureRecognizer的快速教程。