Cocos2d Cant выбрать пункты меню после их перемещения - PullRequest
0 голосов
/ 12 февраля 2012

Я пытаюсь создать иллюзию выпадающего меню, но после перемещения пунктов подменю я больше не могу их выбрать?

вот мой весь код:

#import "HelloWorldLayer.h"


CCMenuItem *playDown;
CCMenuItem *playUp;
CCMenuItemToggle *play;
CCMenuItem *help;
CCMenuItem *options;
int down;

// HelloWorld implementation
@implementation HelloWorldLayer

+(id) 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;
}

// 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])) 
    {
        self.isTouchEnabled = TRUE;

        [CCMenuItemFont setFontSize:70];
        playDown = [CCMenuItemFont itemFromString:@"Play" target:self selector:@selector(playDown:)];
        playUp = [CCMenuItemFont itemFromString:@"Play" target:self selector:@selector(playUp:)];
        play = [CCMenuItemToggle itemWithTarget:self selector:@selector(playDown:) items:playDown,playUp, nil];

        help = [[CCMenuItemFont itemFromString:@"Help" target:self selector:@selector(help:)] retain]; 
        help.position = ccp(512,350);

        CCMenu *menu = [CCMenu menuWithItems:play,help, nil];
        [self addChild:menu];
        play.position = ccp(0,300);

        down = 0;

        [self schedule:@selector(itemSelected) interval:0.01];

    }
    return self;
}
    -(void) playDown: (id) sender {
        if (down == 0) {
            if ([help parent] != self) {
                help = [[CCMenuItemFont itemFromString:@"Help" target:self selector:@selector(help:)] retain];
                [self addChild:help];
                help.position = ccp(512,350);
                [help runAction:[CCMoveTo actionWithDuration:1 position:ccp(512,500)]];
                NSLog(@"Added Help");
            }
            if ([options parent] != self) {
                options = [[CCMenuItemFont itemFromString:@"Options" target:self selector:@selector(options:)] retain];
                [self addChild:options];
                options.position = ccp(512,650);
                [options runAction:[CCMoveTo actionWithDuration:1 position:ccp(512,600)]];
                NSLog(@"Added Options");
                down = 1;
            }
            return;
        }

        if (down == 1) {
            if ([options parent] == self) {
                [self removeChild:options cleanup:YES];
            }
            if ([help parent] == self) {
                [self removeChild:help cleanup:YES];
                down = 0;
            }
            return;
        }
    }

    -(void) playUp: (id) sender {

    }

    -(void) help: (id) sender {
        NSLog(@"Help Selected");
    }
    -(void) options: (id) sender {
        NSLog(@"Options Seleted");
    }

    -(void) itemSelected {
        if (help.isSelected) {
            [self runAction:[CCCallFunc actionWithTarget:self selector:@selector(help:)]];
        }
        if (options.isSelected) {
            [self runAction:[CCCallFunc actionWithTarget:self selector:@selector(options:)]];
        }
    }

- (void) dealloc
{

    [super dealloc];
}
@end

все остальное работает как добавление спрайтов и перемещение пунктов меню, я использую переключатель, чтобы сигнализировать погоду, чтобы отправить выпадающее меню, чтобы показать, чтобы не показывать

1 Ответ

1 голос
/ 13 февраля 2012

CCMenuItem предназначен для того, чтобы быть дочерним элементом CCMenu (не CCScene), и не предлагает никакой сенсорной обработки как таковой.Таким образом, вам нужно создать одно из нескольких CCMenu, к которому вы добавите один или несколько CCMenuItem.Это объект CCMenu, который будет обрабатывать обработку касания и вызывать menuItems в зависимости от ситуации, в зависимости от того, с каким menuItem происходит касание (я), и от текущего состояния menuItem во время события касания.

Я также вижу некоторые потенциалы утечки памяти в вашем коде.Когда вы добавляете Child к любому кокосовому объекту, добавляемый вами объект сохраняется, поэтому вам не нужно его сохранять (в большинстве случаев).Когда вызывается метод очистки родителя, оставшиеся объекты освобождаются.Так как они являются объектами autorelease'd, они в конечном итоге будут освобождены без вашего дополнительного внимания.Если вы хотите сохранить их, убедитесь, что вы освободили эти сохраненные объекты в методе dealloc (или cleanup).

...