0

CCMenuItemSpriteの「selected」メソッドが呼び出されたときに、ターゲットセレクター(以下を参照: buttonPressedWithId:)を呼び出したいと思います。

 CCMenuItemSprite *buttonB = [CCMenuItemSprite itemWithNormalSprite:[CCSprite spriteWithSpriteFrameName:@"emptyCircle.png"] selectedSprite:[CCSprite spriteWithSpriteFrameName:@"greenCircle.png"] target:self  selector:@selector(buttonPressedWithId:)];

CCMenuItemSpriteの実装を調べたところ、次のことがわかりました。

-(void) selected
{
    [super selected];
    //HERE IS WHERE I WANT TO CALL buttonPressedWithId: 
    if( selectedImage_ ) {
        [normalImage_ setVisible:NO];
        [selectedImage_ setVisible:YES];
        [disabledImage_ setVisible:NO];

    } else { // there is not selected image

        [normalImage_ setVisible:YES];
        [selectedImage_ setVisible:NO];
        [disabledImage_ setVisible:NO];
    }
}

目標は、選択したメソッドでターゲットセレクターを呼び出すことです。そこで、initWithNormalSpriteメソッドを調べて、次のことを見つけました。

-(id) initWithNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite disabledSprite:(CCNode<CCRGBAProtocol>*)disabledSprite target:(id)target selector:(SEL)selector
{
    // avoid retain cycle
    __block id t = target;

    return [self initWithNormalSprite:normalSprite selectedSprite:selectedSprite disabledSprite:disabledSprite block:^(id sender) {
        [t performSelector:selector withObject:sender];
    } ];
}

どういうわけか_block関数を呼び出す必要があると思いますが、その方法を理解するための良い例は見当たりません。また、* _block*が何であるかについてもよくわかりません:(。

ここで、CCMenuItemSpriteをサブクラス化し、この動作を変更する必要がありますか?もしそうなら、どうすればターゲットセレクターを呼び出すことができますか?

前もって感謝します :)

4

1 に答える 1

2

CCMenuItemSpriteのスーパークラスに-activateメソッドがあります--CCMenuItem。したがって、必要に応じて、CCMenuItemSpriteをサブクラス化し、その-selectedメソッドを次のようにすることができます。

-(void) selected
{
    [super selected];
    [self activate];
}

また、-activateのコードを見ることができます、それは非常に簡単です:)

于 2012-09-06T22:08:45.160 に答える