ccTouchesMoved可以使用,但ccTouchMoved没有

时间:2013-03-26 06:29:05

标签: iphone ios cocos2d-iphone

self.isTouchEnabled = YES; 在init方法中。

-(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不调用.. 有什么帮助吗?!

2 个答案:

答案 0 :(得分: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方法是必需的,并返回一个布尔值。

  3. 因此,对于每个可用的触摸,将单独调用ccTouchBegan,并返回YES表示您关心的触摸。 ccTouchBegan声明的触摸随后将传递给Moved,Ended和Cancelled事件(所有这些都是可选的)。

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

    - (void)registerWithTouchDispatcher {
         [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; }

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

    使用哪种?

    除了更复杂的注册外,目标触摸代理通常更容易使用,因为您不必自己拆分NSSet,而且您不必继续检查是否事件是您在Moved / Ended / Cancelled事件中想要的事件。 如果您想在一种方法中处理多个触摸(例如,因为您将它们组合成缩放或旋转输入),您可能希望使用标准触摸委托。 请注意,您只能使用其中一种。

答案 1 :(得分:0)

有两种行为:一种用于标准触摸,一种用于多次触摸。您不必addTargetedDelegate:::,只需将touchMode属性设置为您喜欢的值即可。 CCLayer会为您处理注册。

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

在幕后,更改touchMode将禁用然后重新启用触摸,启用触摸(enableTouch)将通过调用addStandardDelegate为您注册正确的代理或addTargetedDelegate