cocos2d study #07

스프라이트 연구


1. 부모와 자식 관계

스프라이트는 부모와 자식 관계를 가질 수 있다.

addChild를 이용하여 현재의 스프라이트를 자식으로 만든다.

CCSprite *parent = [CCSprite spriteWithFile:@”parent.png”
parent.position = ccp(240,160);
[self addChild:parent];
 
CCSprite *child = [CCSprite spriteWithFile:@”child.png”
CGSize parentSize; // 부모 사이즈
parentSize = parent.contentSize; // 부모 스프라이트의 너비와 높이를 얻는다
child.position = ccp(parent.width/2.0, parent.height/2.0); // 자식의 위치는 부모와 겹치게 된다.
[parent addChild:child]; //여기서는 addChild를 하는 것이 parent이므로 self를 적으면 안 됨.


2. 자식 노드

(1) 자식 노드를 얻는 방법

태그를 이용하여 얻는 방법이 쉽고 간단하다.

[부모노드 getChildByTag:자식노드의 태그번호];

(2) 자식을 삭제하는 방법

① removeChild를 이용하여 삭제하는 방법
노드포인터 = [부모노드 getChildByTag:자식노드의 태그번호];
[부모노드 removeChild:자식노드 cleanup:YES];

② removeChildByTag를 이용하여 바로 삭제하는 방법
[부모노드 removeChildByTag:자식태그번호];

3. 메뉴와 자식을 이용한 예제

3개의 버튼을 만들어 각각 동작하게 하는 코드이다.

-(id)init
{
    if ((self=[super init]))
    {
        CCMenuItem *item1=[CCMenuItemImage itemFromNormalImage:@"menu1.png" 
                                           selectedImage:@"menu1.png"
                                           target:self
                                           selector:@selector(buttonPushed:)];
        CCMenuItem *item2=[CCMenuItemImage itemFromNormalImage:@"item2.png"
                                           selectedImage:@"item2.png"
                                           target:self
                                           selector:@selector(buttonPushed:)];
        CCMenuItem *item3=[CCMenuItemImage itemFromNormalImage:@"menu3.png"
                                           selectedImage:@"menu3.png"
                                           target:self
                                           selector:@selector(buttonPushed:)];
        
        item1.tag=1;
        item2.tag=2;
        item3.tag=3;
 
        CCMenu *menu=[CCMenu menuWithItems:item1,item2,item3,nil];
        menu.position=CGPointZero;    
        [self addChild:menu];
 
        CCSprite *sprite=[CCSprite spriteWithFile:@"parent.png"]; // 부모
        sprite.position=ccp(80,80); // 위치는 (80,80)
        sprite.tag=10;              // 부모 태그 10
        [self addChild:parent];
    }
    return self;
}
 
// 메뉴 버튼을 누르면 동작하는 buttonPushed 메소드
-(void)buttonPushed:(id)sender
{
    CCMenuItem *item=(CCMenuItem *)sender;    // sender를 캐스팅하여 받는다.
    CGSize parentSize;
 
    // 태그로 parent 스프라이트를 얻는 방법이다.
    // 여기서의 parent는 buttonPushed: 메소드의 로컬 변수 parent이다.
    // (init의 parent와 이름만 같은 로컬 변수이기 때문에 =를 써서 대입한 것)
    CCSprite *parent=(CCSprite *) [self getChildByTag:10];
    
    parentSize=parent.contentSize;
 
    // 메뉴1을 누르면 부모의 위치를 위로 이동시킨다.
    if (item.tag==1) {
        parent.position=ccp(80,280);
    }
    // 메뉴2를 누르면 부모 위에 자식 스프라이트를 만든다.
    if (item.tag==2) {
        CCSprite *child=[CCSprite spriteWithFile:@"child.png"];
        child.position=ccp(parentSize.width/2.0, parentSize.height/2.0);
        child.tag=11;
        [parent addChild:child];
    }
    // 메뉴3을 누르면 만들었던 자식을 제거한다.
    // 태그로 차일드를 얻고, 삭제한다.
    if (item.tag==3) {
        CCSprite *child=(CCSprite *)[parent getChildByTag:11];
        [parent removeChild:child cleanup:YES];
    }
}


PS

부모와 자식, 메뉴를 조합했을 뿐인데 이렇게 복잡한 코드가 되어 버렸다.

나중에는 얼마나 더 복잡해질지… :(

'개발 > Cocos2d' 카테고리의 다른 글

cocos2d study #09  (0) 2012.10.26
cocos2d study #08  (0) 2012.10.25
cocos2d study #06  (0) 2012.10.23
cocos2d study #05  (0) 2012.10.23
cocos2d study #04  (0) 2012.10.23

+ Recent posts