2011-12-26 10 views
2

私はcocos2d公式サイトからチュートリアルに従いました。私はそれらを作成するときに私は1つのパラメータでセレクタを渡すメニューのいくつかの項目を作成しようとします。各項目について、私は別のセレクタを渡します。私はここに問題があると思うが、なぜここに問題があるのか​​は分かりません。私のヘッダファイルにはなりますNSInvocation invocationWithMethodSignature、メソッドのシグネチャ引数はゼロにできません

// When you import this file, you import all the cocos2d classes 
#import "cocos2d.h" 
#import "CCTouchDispatcher.h" 

// HelloWorldLayer 
@interface HelloWorldLayer : CCLayer { 

    CCSprite *first; 
    CCSprite *second; 
} 

// returns a CCScene that contains the HelloWorldLayer as the only child 
+(CCScene *) scene; 
- (void) setUpMenus; 
- (void) doSomethingOne: (CCMenuItem *) menuItem; 
- (void) doSomethingTwo: (CCMenuItem *) menuItem; 
- (void) doSomethingThree: (CCMenuItem *) menuItem; 

@end 

実装ファイル:あなたはすべての3つのメニュー項目の作成呼び出しで同じタイプミスを持っている

// Import the interfaces 
#import "HelloWorldLayer.h" 

// HelloWorldLayer implementation 
@implementation HelloWorldLayer 

+(CCScene *) scene 
{ 
    // 'scene' is an autorelease object. 
    CCScene *scene = [CCScene node]; 

    // 'layer' is an autorelease object. 
    HelloWorldLayer *layer = [HelloWorldLayer node]; 

    // add layer as a child to scene 
    [scene addChild: layer]; 

    // return the scene 
    return scene; 
} 

- (void) doSomethingOne: (CCMenuItem *) menuItem 
{ 
    NSLog(@"The first menu was called"); 
} 
- (void) doSomethingTwo: (CCMenuItem *) menuItem 
{ 
    NSLog(@"The second menu was called"); 
} 
- (void) doSomethingThree: (CCMenuItem *) menuItem 
{ 
    NSLog(@"The third menu was called"); 
} 


// on "init" you need to initialize your instance 
-(id) init 
{ 
    // always call "super" init 
    // Apple recommends to re-assign "self" with the "super" return value 
    if((self=[super init])) { 

     first = [CCSprite spriteWithFile:@"seeker.png"]; 
     first.position = ccp(100, 100); 

     [self addChild:first]; 

     second = [CCSprite spriteWithFile:@"Icon.png"]; 
     second.position = ccp(50, 50); 

     [self addChild:second]; 

     [self schedule:@selector(nextFrame:)]; 

     [self setUpMenus]; 

     self.isTouchEnabled = YES; 
    } 

    return self; 
} 


- (void) registerWithTouchDispatcher { 

    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; 
} 

- (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 

    return YES; 
} 

- (void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { 

    CGPoint location = [self convertTouchToNodeSpace: touch]; 

    [second stopAllActions]; 

    [second runAction: [CCMoveTo actionWithDuration:1 position:location]]; 

} 

- (void) nextFrame:(ccTime)dt { 

    first.position = ccp(first.position.x + 100*dt, first.position.y); 

    if (first.position.x > 480+32) { 

     first.position = ccp(-32, first.position.y); 
    } 
} 

- (void) setUpMenus { 

    CCMenuItemImage *menuItem1 = [CCMenuItemImage itemFromNormalImage:@"myfirstbutton.png" 
                 selectedImage:@"myfirstbutton_selected.png" 
                   target:self 
                  selector:@selector(doSomenthingOne:)]; 

    CCMenuItemImage *menuItem2 = [CCMenuItemImage itemFromNormalImage:@"mysecondbutton.png" 
                 selectedImage:@"mysecondbutton_selected.png" 
                   target:self 
                  selector:@selector(doSomenthingTwo:)]; 
    CCMenuItemImage *menuItem3 = [CCMenuItemImage itemFromNormalImage:@"mythirdbutton.png" 
                 selectedImage:@"mythirdbutton_selected.png" 
                   target:self selector:@selector(doSomenthingThree:)]; 

    CCMenu *myMenu = [CCMenu menuWithItems:menuItem1,menuItem2,menuItem3, nil]; 

    [myMenu alignItemsVertically]; 

    [self addChild:myMenu]; 

} 



// on "dealloc" you need to release all your retained objects 
- (void) dealloc 
{ 
    // in case you have something to dealloc, do it in this method 
    // in this particular example nothing needs to be released. 
    // cocos2d will automatically release all the children (Label) 

    // don't forget to call "super dealloc" 
    [super dealloc]; 
} 
@end 

答えて

1

CCMenuItemImage *menuItem1 = [... selector:@selector(doSomenthingOne:)]; 
CCMenuItemImage *menuItem2 = [... selector:@selector(doSomenthingTwo:)]; 
CCMenuItemImage *menuItem3 = [... selector:@selector(doSomenthingThree:)]; 

のが、あなたの方法の実際の名前は doSomethingOne:doSomethingTwo:、および doSomethingThree:いる場所あなたが(真ん中のスプリアス のnに注意してください)、彼らが使用する必要があるセレクタが doSomenthing...と呼ばれるメニュー項目を言っています。

エラーメッセージの正確な原因は、後でメニュー項目でセレクタを実行する必要があるときに、クラスに与えたセレクタのメソッドシグネチャをクラスに伝えることです。アイテムに不適切なセレクタを指定したため、クラスは署名を知らず、nilを返します。メニュー項目は、アクションを実行するにはNSInvocationオブジェクトを作成しようとしますが、その呼び出しはnil署名では作成できないため失敗します。

タイプミスを修正してください。すべて正常に動作するはずです。

+0

私はそれを観察しなかった、thx –

関連する問題