Cocos2d CCMenuItemSprite в сложенных меню не работает - PullRequest
0 голосов
/ 24 августа 2011

Я пытаюсь смоделировать модальное представление в cocos2d, отображая несколько спрайтов над моей сценой и показывая пункт меню в качестве кнопки продолжения.В приведенном ниже коде я показываю свою игру поверх модальной и настраиваю меню с помощью CCMenuItemSprite;который не реагирует на прикосновения, и CCMenuItemImage;который работает.

    -(void) gameOver {

    CGSize size = [[CCDirector sharedDirector] winSize];
    self.menu.isTouchEnabled = NO;
    CCLayer *modalLayer = [[CCLayer alloc] init];
    [self addChild:modalLayer z:20];

    CCSprite *spriteGameOver = [CCSprite spriteWithFile:@"game_over.png"];
    spriteGameOver.position = ccp( size.width/2,size.height/2);

    CCLabelTTF *lblGameOver = [CCLabelTTF labelWithString:[NSString stringWithFormat:@"Game Over!\nScore %d/%d",numCorrect,questionIdx] dimensions:CGSizeMake(380, 300) alignment:CCTextAlignmentCenter fontName:@"Trebuchet MS" fontSize:50.0f];
    // position the label on the center of the screen

    lblGameOver.position =  ccp(size.width/2-200, size.height/2-100);
    lblGameOver.color = ccc3(20, 20, 20);
    lblGameOver.opacity = 0;
    // add the label as a child to this Layer
    [spriteGameOver addChild: lblGameOver];
    spriteGameOver.opacity = 0;
    [modalLayer addChild:spriteGameOver];

    CCSprite *spriteGameOverBtn = [CCSprite spriteWithFile:@"mainButton.png" rect:CGRectMake(0,0,300,60)];
    spriteGameOverBtn.position = ccp( size.width/2,size.height/2-100);
    CCLabelTTF *lblGameOverBtn = [CCLabelTTF labelWithString:@"Continue" dimensions:CGSizeMake(300, 60) alignment:CCTextAlignmentCenter fontName:@"Trebuchet MS" fontSize:40.0f];
    //lblGameOverBtn.position =  ccp(size.width/2-200, size.height/2-300);
    [lblGameOverBtn setAnchorPoint:ccp(0.0f,0.1f)];
    lblGameOverBtn.color = ccc3(20, 20, 20);
    lblGameOverBtn.opacity = 0;
    // add the label as a child to this Layer
    [spriteGameOverBtn addChild: lblGameOverBtn];
    spriteGameOverBtn.opacity = 0;

    CCMenuItemImage *itemH = [CCMenuItemImage itemFromNormalImage:@"backArrow.png" selectedImage:@"backArrowS.png" target:self selector:@selector(goToMain:)];
    itemH.position = ccp( size.width/2,size.height/2-100);

    CCMenuItemSprite *mGameOverBtn = [CCMenuItemSprite itemFromNormalSprite:spriteGameOverBtn selectedSprite:nil disabledSprite:nil target:self selector:@selector(goToMain:)];

    CCMenu *menuGO = [CCMenu menuWithItems: itemH,mGameOverBtn, nil];
    menuGO.position = ccp( 0, 0);

    [modalLayer addChild:menuGO z:21]; 




    [lblGameOverBtn runAction:[CCSequence actions:[CCDelayTime actionWithDuration: 1.75f],[CCFadeIn actionWithDuration: 1.75f],nil]];

    [spriteGameOverBtn runAction:[CCSequence actions:[CCDelayTime actionWithDuration: 1.75f],[CCFadeIn actionWithDuration: 1.75f],[CCDelayTime actionWithDuration: 3.75f],nil]];


    [lblGameOver runAction:[CCSequence actions:[CCDelayTime actionWithDuration: 1.75f],[CCFadeIn actionWithDuration: 1.75f],[CCDelayTime actionWithDuration: 3.75f],nil]];

    [spriteGameOver runAction:[CCSequence actions:[CCDelayTime actionWithDuration: 1.75f],[CCFadeIn actionWithDuration: 1.75f],[CCDelayTime actionWithDuration: 3.75f],nil]];

    //[self runAction:[CCSequence actions:[CCDelayTime actionWithDuration: 2.75f],[CCCallFunc actionWithTarget:self selector:@selector(goToMain:)], nil]];

}

Ответы [ 2 ]

1 голос
/ 22 января 2013

У меня такая же проблема с CCMenuItemSprite. Похоже, класс CCMenuItemSprite немного глючит. В моем случае это не реагирует на прикосновения. Но я обнаружил, что это как-то связано с многослойными спрайтами внутри CCMenuItemSprite. Поэтому, когда я использую однослойный Sprite, он работает, но когда я использую Sprite, который содержит несколько встроенных спрайтов, это не так.

Мое решение «еще не готово» прямо сейчас устанавливает для contentSize соответствующий размер CCMenuItemSprite сразу после его инициализации:

        CCMenuItemSprite * menuItem = [CCMenuItemSprite itemWithNormalSprite:multiLayeredSprite selectedSprite:nil target:self selector:@selector(clickHandler:)];
    [s setContentSize:backgroundSprite.contentSize];
    CCMenu * menu = [CCMenu menuWithItems:
            menuItem,
            nil];

Теперь он получает сенсорные события. Единственная проблема, которая у меня сейчас есть, это расположение прямоугольника ... он все еще находится в верхнем правом углу. Я постараюсь выяснить, как это исправить сейчас. Надеюсь, это немного прояснит проблему.

0 голосов
/ 24 августа 2011

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

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...