2013-09-08 5 views
0

Im здесь, чтобы задать какой-то вопрос noobish, Im учиться кататься с cocos2d.Cocos2D - Общение между слоями

Мой вопрос: как наилучшим образом (и как) общаться между слоями со сценой?

Например.

У меня есть слой, где у меня есть спрайт с кнопкой, есть слой со строкой.

Каждый раз, когда я нажимаю кнопку, строка должна идти +1. (Так что если Вы нажимаете 3 раза, то строка будет равна 3.)

У меня это так:

Scene.m

-(id)init { 
self = [super init]; 
if(self != nil){ 
    //button Layer 
    buttonLayer *buttonLayer = [buttonLayer node]; 
    [self addChild:buttonLayer z:0]; 

    //Gameplay Layer :D 

    stringLayer *numberStringLayer = [stringLayer node]; 
    [self addChild:numberStringLayer z:2]; 
    } 
} 

buttonLayer.m

-(id)init { 
int xPosition = 385; 
int yPosition = 75; 


_button = [CCMenuItemImage itemWithNormalImage:@"button.png" 
           selectedImage:@"button.png" 
             target:self selector:@selector(checkButton:)]; 
_button.tag =0; 


_button.position = ccp(xPosition,yPosition); 


_buttonMenu = [CCMenu menuWithItems:_button, nil]; 
_buttonMenu.position = CGPointZero; 
[self addChild:_buttonMenu]; 
} 



-(void)checkButton:(id)sender { 
NSLog(@"Button Pressed"); 

    buttonPressedCount =+; 

//Here goes algorithm that interacts with scene/layer 
} 

stringLayer.m

-(id)init { 

self = [super init]; 
if (self != nil) { 



    _numberString = [CCLabelTTF labelWithString:@"0" fontName:@"Marker Felt" fontSize:18.0]; 
    _numberString.color = ccc3(0,0,0); 
    _numberString.position = ccp(125,300); 
    [self addChild:_numberString]; 
} 

return self; 

}

-(void)updateStringWithNumber:(int)tempNumb { 
_numberString.string = tempNumb; //or something like that.... 
    } 

Итак ... где/как я могу использовать переменные и как/где я могу их получить или вызвать?

Спасибо за ваше время! : D Отличный день!

+0

http://www.learn-cocos2d.com/files/cocos2d-essential-reference-sample/Strategies_for_Accessing_Other_Nodes.html – LearnCocos2D

+0

Какой из этих вариантов вы бы выбрали? UILayer * tempLayer = [scene sharedGameScene] .stringLayer; [tempLayer updateString]; ??? Если да, то где/как его использовать? – user1876553

+0

@ LearnCocos2D Я пробовал делать теги ChildBy, но я просто не знал, как это сделать. Пробовал это на сцене.m "stringLayer * numberStringLayer = [узел stringLayer]; [self addChild: numberStringLayer z: 2 tag: 113];" и это, когда пользователь нажимает кнопку: «CCNode» otherNode = [stringLayer.parent_ getChildByTag: 113]; [otherNode updateLabel]; " – user1876553

ответ

0

Как кнопка, так и метка должны управляться кем-то для желаемого взаимодействия, поэтому логично реализовать нажатие кнопки в управляющем объекте, который в вашем случае является объектом сцены (я рекомендую вам иметь основной слой, а не сцену, поскольку это облегчит управление другими слоями, если вам нужно будет)

Таким образом, один из вариантов - передать сцену в качестве цели для нажатия кнопки. Сцена реализует метод нажатия кнопки и может легко модифицировать метку по мере необходимости, поскольку у вас есть прямой доступ к ней в объекте сцены.

Так ваша кнопка слой метод инициализации может измениться на:

-(id)initWithTarget:(id)btnTtarget { 
. 
. 
_button = [CCMenuItemImage itemWithNormalImage:@"button.png" 
           selectedImage:@"button.png" 
             target:btnTtarget selector:@selector(checkButton:)]; 
. 
. 
} 

И в сцене создать слой с кнопкой, используя этот метод инициализации. Убедитесь, что ваша сцена реализует селектор btnTtarget, и теперь вы можете легко получить доступ и вызвать метод на слое этикеток.