Я пытался объединить код из двух онлайн-уроков для 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>"
Хорошо, пока метод синглтона работает, вот более простой метод, который достиг моей цели:
Для всех сцен, для которых требуется слой HUD (включая Hello World), в их интерфейсе я добавляю переменную для слоя HUD и метод initwithHUD:
CCLayer * _hud;
(id) initWithHUD: (CCLayer *) hud;
Затем я добавляю HUD к сцене этого слоя:
HudLayer * hud = [узел HudLayer];
[сцена addChild: hud z: 5];
Затем в методе initWithHud этого слоя я объявляю переменную _hud
_hud = hud;
Также в методе 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» для метода обратного вызова.
Теперь в слое / сцене HUD создайте обратный вызов для кнопки выше
(void) plusMinusButtonTapped: (id) отправитель {
//Сделай что-нибудь
}