0

他の多くの人がオンラインで提案しているように、レイヤーのタッチを有効にしようとしています:

        hudLayer = [[[CCLayer alloc] init] autorelease];
        [self addChild:hudLayer z:3];

        gameLayer = [[[CCLayer alloc] init] autorelease];
        [self addChild:gameLayer z:1];
        gameLayer.isTouchEnabled = YES;

        rileyLayer = [[[CCLayer alloc] init]autorelease];
        [self addChild:rileyLayer z:2];

        pauseMenu = [[[CCLayer alloc] init] autorelease];
        [self addChild:pauseMenu z:4];

        [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:hudLayer priority:0 swallowsTouches:YES];

私のタッチメソッドはここにあります:

- (BOOL)ccTouchBegan:(NSSet *)touch withEvent:(UIEvent *)event {
    return  TRUE;
}

- (void)ccTouchEnded:(NSSet *)touch withEvent:(UIEvent *)event {
    if (!paused) {
        ratMove = 0;
    }
}

ただし、これは継続的にエラーをスローします: キャッチされていない例外 'NSInternalInconsistencyException' によるアプリの終了、理由: 'Layer#ccTouchBegan override me'

このエラーをオンラインで見つけることができる唯一の理由は、ccTouchBegan 関数が含まれていない場合ですが、このエラーが表示される他の理由を知っている人はいますか?

4

2 に答える 2

1

CCLayer をサブクラス化して hud レイヤーを作成し、その内部でこれらのメソッドを実装します。

hud レイヤーをターゲット デリゲートとして追加し、少なくともccTouchBegan:withEvent:メソッドを実装する必要があります。hud をターゲット デリゲートにしたい場合は、CCLayer サブクラスを作成し、ターゲット タッチ デリゲート プロトコルのメソッドを実装します。

于 2012-11-02T22:19:38.727 に答える
0

関数は適切な署名を実装していません。試す:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    // your stuff here
}

複数のタッチ処理 (署名) が必要な場合は、targetedTouchDelegate の代わりに StandardDelegate を追加する必要があります。

編集:そして今、客観的なcで:

[[CCDirector sharedDirector].touchDispatcher addStandardDelegate:self priority:0];

タッチ ディスパッチャーによって実装されるプロトコルは 2 つあります。現在、targetTouchDelegate として登録していますが、standardDelegate のデリゲート メソッドを実装しています。メソッドを保持したい場合は、上記の行を使用して登録してください。

編集 2 : そして今、cocos のコードから直接、プロトコルの正確な構文。ご覧のとおり、NSSet (あなたの署名) を使用した ccTouchBegan はありませんが、代わりに ccTouchesBegan があります。どちらの取り扱い方法(標準を対象とする)でも、以下のプロトコルに準拠する必要があります。

@プロトコル CCTargetedTouchDelegate

/** Return YES to claim the touch.
 @since v0.8
 */
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
@optional
// touch updates:
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;
@end

/**
 CCStandardTouchDelegate.

 This type of delegate is the same one used by CocoaTouch. You will receive all the  events (Began,Moved,Ended,Cancelled).
 @since v0.8
*/
@protocol CCStandardTouchDelegate <NSObject>
@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;
@end
于 2012-11-02T23:43:35.917 に答える