0

現在、追加されたスプライトのタッチ検出を処理する「コンソール」CClayerがあります。ただし、コンソール層の一部ではない、タッチ検出を行いたいスプライトもいくつかあります...それらは現在、CCNode から継承するクラスの子です。

私の理解では、「isTouchEnabled」プロパティが true に設定されている cocos オブジェクトが多いほど、パフォーマンスが影響を受けるので、これにどのようにアプローチすればよいのでしょうか?

するべきか:

A) コンソールの touchesBegan メソッドに、CCNode に属するスプライトの検出を実行させますか?

B) CCNode オブジェクトに isTouchEnabled を実装するだけ

C) 他のアプローチ?

4

1 に答える 1

0

まあ、まず第一に、あなたが懸念している場合、つまり、(シミュレータではなくデバイス上で) 不適切な応答時間を確認または測定している場合にのみ、パフォーマンスについて懸念する必要があります。

別のノードに関係するタッチを検出することは避けます。ソフトウェア的に厄介になる可能性があります。タッチが検出ノードにとって関心のあるオブジェクトの場所にある場合、私は厳密に YES (ccTouchBegan から) を返す傾向があります。NO を返すと、ディスパッチャーは、そのような CCNode がバイトするまで、タッチを他のハンドラー (コンソールの「下」) に渡します。次のような種類:

- (void) onEnter{
    [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
    [super onEnter];
}

- (void) onExit{
    [[[CCDirector sharedDirector] touchDispatcher] removeDelegate:self];
[super onExit];
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
    if (!_visible || !_enabled) {
        return NO;
    }
    CGPoint loc = [touch locationInView:touch.view];
    loc = [[CCDirector sharedDirector] convertToGL:loc];

    if ([self containsPoint:loc]) {
        // do your thing here !
        return YES;
    }

    return NO;
}

-(BOOL) containsPoint:(CGPoint) location {
    // determine here whether this node should be handling
    // this touch.
}
于 2012-10-29T23:58:00.303 に答える