2013-03-26 87 views
1

self.isTouchEnabled = YES; 在init方法中。ccTouchesMoved工作但ccTouchMoved不

-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:[touch view]]; 
    location = [[CCDirector sharedDirector] convertToGL:location]; 
} 

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint location = [touch locationInView:[touch view]]; 
    location = [[CCDirector sharedDirector] convertToGL:location]; 

} 

在上面的代码ccTouchesMoved工作正常,但ccTouchMoved不调用.. 任何帮助吗?!

回答

3

Cocos2d支持两种不同的触摸事件处理方式。这些由两种不同类型的委托定义(均在CCTouchDelegateProtocol.h中定义)。

标准触摸代表: @optional

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 

这些都是同样类型的你会在一个标准的CocoaTouch应用程序获取事件。你会得到所有的事件,所有的接触;您可以自行决定在多点触控环境中关注哪些触控。要在CCLayer子类中获取这些事件,只需设置isTouchEnabled = YES,如下所示:

self.isTouchEnabled = YES;

针对性触摸代表

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event; 
@optional 
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event; 
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event; 
- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event; 

两个重要的区别目标和标准触摸代表之间

  1. 这些方法只提供单点触控,而不是一组他们 - 因此,方法名称以“ccTouch”而不是“ccTouches”开头。

  2. ccTouchBegan方法是必需的,并返回一个布尔值。

因此,ccTouchBegan将针对每个可用触摸单独调用,并且返回YES指示您关心的触摸。 只有ccTouchBegan声称的触摸才会被传递到Moved,Ended和Canceled事件(所有这些都是可选的)。

要接收这些事件,您必须注册为全局调度程序的目标触摸代表。在一个CCLayer子类中,重写registerWithTouchDispatcher如下:

- (无效)registerWithTouchDispatcher {
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:自优先权:0 swallowsTouches:YES]; }

(这将意味着导入文件顶部的“CCTouchDispatcher.h”)。

要使用哪种?

除了更复杂的注册,目标触摸委托通常更容易使用,因为你没有给NSSet中分裂自己,你没有继续检查该事件是否为在Moved/Ended/Canceled事件中您想要的那个。但是如果您想在一种方法中处理多个触摸(例如,因为您将它们组合为缩放或旋转输入),您可能需要使用标准触摸代表。 请注意,您只能使用其中一个。

+0

我觉得你可以同时使用,或者注册自己作为触摸委托从触摸委托中删除它? – LearnCocos2D 2013-03-26 08:30:54

+0

我从来没有测试过它们是否能够很好地一起工作,需要尝试一段时间 – 2013-03-26 08:56:04

+1

在最新版本的cocos2d中,您无需为了有针对性的触摸而重写'registerWithTouchDispatcher'。你只需要设置'self.touchMode = kCCTouchesOneByOne;'。请参阅http://2sa-studio.blogspot.com/2013/03/touch-swallowing-in-cclayer.html – fiddler 2013-03-26 10:45:53

0

有两种行为:一种是标准触摸,一种是多点触摸。您不必addTargetedDelegate:::,您可以简单地将touchMode属性设置为您喜欢的值。 CCLayer将负责为您注册。

- (void)onEnter 
{ 
    [self setTouchMode: kCCTouchesAllAtOnce]; //resp kCCTouchesOneByOne 
} 

在幕后,改变touchMode将禁用然后重新启用触摸,并启用触摸(enableTouch)将注册相应的代表对你来说,通过调用addStandardDelegateaddTargetedDelegate

相关问题