2012-02-20 10 views
1

私はcocos2dでアプリケーションを開発しています。 CCMenuクラスを使用してコントロールを作成することをお勧めします。そこで、ボタンとターゲットとセレクターを設定しました。セレクターは私のボタンを押していないときにのみ鳴った。私はボタンを押した瞬間にそれを呼び出すことができますか?CCMenuItemを押すと処理が実行されます。 unpressではない

#import "Button.h" 

@implementation Button 

+ (id)buttonWithImage:(NSString*)file atPosition:(CGPoint)position target:(id)target selector:(SEL)selector { 
    CCMenu *menu = [CCMenu menuWithItems:[ButtonItem buttonWithImage:file target:target selector:selector], nil]; 
    menu.position = position; 
    return menu; 
} 
@end 

@implementation ButtonItem 

+ (id)buttonWithImage:(NSString*)file target:(id)target selector:(SEL)selector { 
    return [[[self alloc] initWithImage:file target:target selector:selector] autorelease]; 
} 


- (id)initWithImage:(NSString*)file target:(id)target selector:(SEL)selector { 
    if(self = [super initWithTarget:target selector:selector]) { 

     back = [[CCSprite spriteWithFile:@"DPad_BG.png"] retain]; 
     back.anchorPoint = ccp(0,0); 
     backPressed = [[CCSprite spriteWithFile:@"DPad_BG.png"] retain]; 
     backPressed.anchorPoint = ccp(0,0); 
     [self addChild:back]; 

     self.contentSize = back.contentSize; 

     CCSprite* image = [CCSprite spriteWithFile:file]; 
     [self addChild:image z:1]; 
     image.position = ccp(self.contentSize.width/2, self.contentSize.height/2); 

    } 
    return self; 
} 

-(void) selected { 
    [self removeChild:back cleanup:NO]; 
    [self addChild:backPressed]; 
    [super selected]; 
} 

-(void) unselected { 
    [self removeChild:backPressed cleanup:NO]; 
    [self addChild:back]; 
    [super unselected]; 
} 

// this prevents double taps 
- (void)activate { 
    [super activate]; 
    [self setIsEnabled:NO]; 
    [self schedule:@selector(resetButton:) interval:0.5]; 
} 

- (void)resetButton:(ccTime)dt { 
    [self unschedule:@selector(resetButton:)]; 
    [self setIsEnabled:YES]; 
} 

- (void)dealloc { 
    [back release]; 
    [backPressed release]; 
    [super dealloc]; 
} 

@end 
+0

CCMenuクラスを修正してください、それ以外の方法はありません。 CCMenuは、「押された」状態を使用して、視覚的フィードバックのために指の下の項目をズームインする。 – LearnCocos2D

答えて

0

私は必要な唯一のものは-(void) selectedに場所[super activate];である。ここで- (void)activate

+0

2つのもの、[super activate]; [invocation_ invoke]に変わりました。第二に、私はこの行を両方とも選択して活性化させておき、それに応じてboolを設定しました---そうだとすれば、私はそれをnoに設定します。(これを使ってjumpを作成しました私のゲームの効果) – tyler53

1

メソッドは、ボタンのリリース上で実行されているという事実は、それが一部の人がボタンを押した可能性として使用するユーザーのためのよりよい、それは彼らが押したかったボタンではなかったことに気づいなり、その後、解放する前に画面の別の領域に移動します。したがって、実際には、ボタン・プレス上でメソッドを実行することはお勧めできません。

+0

私はゲームのコントロールボタンを作ろうとしています。私は本当にボタンプレスで何らかのアクションを行う必要があります。 – SentineL

+1

on-press vs on-releaseが必要な理由はまだあります。たとえば、ボタンを押しながらファンが回転し、一度リリースすると再び停止するのが遅くなります。私はボタンを押すための方法を持つ必要があることをお勧めします。私は見続けるだろう。 – JLust

+0

@LeeIIIその場合、スプライトを作成し、そのスプライトでタッチが検出されるたびに、選択した方法(ファンの回転するアニメーションなど)を呼び出します。 – akuritsu

3

から削除するには、私はあなたがしようとメニューを作成するCocos2dのメニューアイテム

CCMenuItemSprite* btn = [CCMenuItemSprite itemWithNormalSprite:sprite1 selectedSprite:sprite2 block:^(id sender) { 
    //TODO: do stuff on release 
}]; 
[btn setPressBlock:^(id sender) { 
    //TODO: do stuff on press 
}]; 

Link to a Github commit with additional block copy for a on-press action

0

に追加する方法でありますこのコード..

CCMenuItemImage *Item = [CCMenuItemImage itemWithNormalImage:@"yourImage.png" selectedImage:@"yourSelectedImage.png" target:self selector:@selector(clicked)]; 
CCMenu *Menu = [CCMenu menuWithItems:Item, nil]; 
[self addChild:Menu]; 
関連する問題