Связь между HUD-слоем и HelloWorldLayer Cocos2d - PullRequest
0 голосов
/ 27 января 2012

Я пытался объединить код из двух онлайн-уроков для Cocos2d (Toggle Buttons и HUD Layer). Это вроде работает, но не совсем так, как я хочу ...

Я хочу, чтобы слой HUD управлял парой логических кнопок управления; например аналогично приглушению / включению фоновой музыки, изменению режима активного слоя с A на B (то есть, если A Mode -> doThis, если B Mode -> doThat), включению отображения спецэффектов в слое Hud и т. д.

Я использовал (id) initWithHUD: (CCLayer *) hud; в HelloWorldLayer, как объяснено в учебном пособии, и кнопку Toggle (объяснено в отдельном учебном пособии). Затем я добавил инструкцию CCMenuItemToggle (в HelloWorldLayer), которая вызывает метод, расположенный на уровне HUD, следующим образом:

CCMenuItemToggle *toggleItem = [CCMenuItemToggle itemWithTarget:_hud
selector:@selector(plusMinusButtonTapped:) items:_plusItem, _minusItem, nil];

Это работает (то есть кнопка появляется в слое HUD и переключается с - на + при касании. Однако метод (plusMinusButtonTapped - находится в файле реализации HUD Layer) работает так же, как в учебнике, если я не не использовать слой HUD. Используя CCLog, я определил, что метод вызывается, то есть

// в файле реализации HUD

- (void)plusMinusButtonTapped:(id)sender {

CCLOG(@"Info Mode Particle System17 Is Active."); //this message appears when init
CCMenuItemToggle *toggleItem = (CCMenuItemToggle *)sender;
CCLOG(@"toggleItem is %@ OR %@ ???",_plusItem, _minusItem); //this message appears when the button is touched

//the problem is that the CCLog says "toggleItem is (null) OR (null) ???" which means it doesn't have _plusItem or _minusItem (i.e. not sent when button is touched)...why does it work at all then???

//hence the following never gets called

if (toggleItem.selectedItem == _plusItem) {

//set the Bool statement here, etc.

}

Я также пытался использовать настройки image.tag, но CCLog показывает "<CCMenuItemImage = 003959D0 | Tag = -1061138431>"

Хорошо, пока метод синглтона работает, вот более простой метод, который достиг моей цели:

  1. Для всех сцен, для которых требуется слой HUD (включая Hello World), в их интерфейсе я добавляю переменную для слоя HUD и метод initwithHUD:

    CCLayer * _hud; (id) initWithHUD: (CCLayer *) hud;

  2. Затем я добавляю HUD к сцене этого слоя:

    HudLayer * hud = [узел HudLayer]; [сцена addChild: hud z: 5];

  3. Затем в методе initWithHud этого слоя я объявляю переменную _hud

    _hud = hud;

  4. Также в методе initWithHud я отображаю свои кнопки и фоны HUD (примечание: это повторяется для всех сцен / слоев):

    CCMenuItemToggle *toggleItem = [CCMenuItemToggle itemWithTarget:_hud   selector:@selector(plusMinusButtonTapped:) items:_plusItem, _minusItem, nil];
    CCMenu *toggleMenu = [CCMenu menuWithItems:toggleItem, nil];
    toggleMenu.position = ccp(22, 22);
    [_hud addChild:toggleMenu z:4];
    

Обратите внимание, что целью кнопки является "_hud". Это в основном говорит «когда я нажму, перенеси меня на уровень HUD» для метода обратного вызова.

  1. Теперь в слое / сцене HUD создайте обратный вызов для кнопки выше

    (void) plusMinusButtonTapped: (id) отправитель {
    //Сделай что-нибудь }

...