2012-12-14 3 views
0

에서다른 클래스 나 구현에서 다음이</p> <pre><code>@interface A { CCSprite *loadingSprite; } - (void)getTag; @property (nonatomic, retain) CCSprite *loadingSprite; @end </code></pre> <p>같은 물품 아 다른 클래스

@synthesize loadingSprite 

- (id)init 
{ 
loadingSprite = [CCSprite spriteWithSpriteFrameName:@"loading-icon1.png"]; 
[loadingSprite setTag:111]; 
[self addChild:loadingSprite]; 
} 

- (void)getTag 
{ 
NSLog(@"%@ tag %d",[loadingSprite getChildByTag:111] , [loadingSprite getChildByTag:111].tag) 
} 

을 ccsprite 오전 액세스, 비엠 제가

A *a = [[A alloc] init]; 
[a getTag]; 

방법 GetTag의 액세스에 쓸 하지만 유감스럽게도 getTag의 NSLog는 다음을 보여줍니다.

(null) tag 0 

다른 클래스에서 ccsprite에 액세스하는 적절한 방법은 무엇입니까? 감사합니다

+0

가장 좋은 방법은 일반적인 스프라이트에 대해 싱글 톤 클래스를 만드는 것입니다. 다시 말하면 다시 초기화 할 필요가 없으며 원하는 곳에서 스프라이트에 할당 된 모든 속성을 가져 오거나 설정할 수도 있습니다 . – spider1983

+0

예, 결국 싱글 톤을 사용합니다. 그것은 너무 많이하지만 싱글 톤으로 스프라이트를 사용하는 것 외에 어떤 단서도 가지고 있지 않다. – user1606616

답변

2

체크 아웃 "장면 계층에서 액세스 기타적인 Cocos2D 노드를위한 전략"내 튜토리얼 : http://www.learn-cocos2d.com/2012/09/strategies-accessing-cocos2d-nodes-scene-hierarchy/

+0

와우, 고마워. 나는 그것을 읽을 것이다. 아마도 주제가 없습니다. 하지만 당신 덕분에, 내가 cocos2d를 배웠던 첫 번째 일은 당신의 책, ​​매우 유용한 책을 읽는 것입니다. 어쨌든 고마워. – user1606616

1

태그를 사용하여 스프라이트에서 자식을 가져 오려고합니다. 그리고 당신은이 스프라이트를 원합니다. 당신이 getChildByTag:를 사용 싶은 경우 self에 스프라이트를 추가 그래서,

[self getChildByTag: tag]; 

대신

[yourSprite getChildByTag: tag]; 

의 사용합니다. 태그는 부모로부터 만 가져올 수 있습니다.

아, init 메소드를 변경하십시오. 부모의 init를 오버라이드 할 때 부모의 메소드를 먼저 호출해야합니다.

- (id) init 
{ 
    self = [super init]; 

    if(self != nil) 
    { 
     // do your initialization here 
    } 

    return self 
} 
+0

아아 네, 클래스 A의 init 메소드 끝 부분에 로그를 배치하면 로그에 스프라이트와 태그가 표시됩니다. 하지만 여전히 클래스 B에서 getTag 메서드를 호출하면 여전히 null과 0이 표시됩니다. 어디에서 잘못 되었습니까? – user1606616

+0

initializing에서 loadingSprite 대신 self.loadingSprite를 사용하십시오. 그리고 그것을 유지라고 선언 할 필요는 없습니다. retain로 선언하면 dealloc 메소드에서 self.loadingSprite = nil을 호출하는 것을 잊지 마십시오. – Morion

+0

so change loadingSprite = [CCSprite spriteWithSpriteFrameName : @ "loading-icon1.png"]; [loadingSprite setTag : 111]; 을 으로 self.loadingSprite = [CCSprite spriteWithSpriteFrameName : @ "loading-icon1.png"]; [self.loadingSprite setTag : 111]; 아직 행운 – user1606616

1

또 다른 한가지 -적인 Cocos2D를 자동으로 유지하기 때문에, 당신은 당신의 클래스에 추가 노드를 유지할 필요가 없습니다 노드 당신이 당신의베이스 노드를 해제 할 때 그렇게 잘 @property (nonatomic, assign) CCSprite *loadingSprite;

를 사용 [self addChild:node] 해제를 사용하고 다른 클래스에서 노드를 액세스하기 위해 해당 속성을 사용할 수있을 때 - 당신의 예에서 a.loadingSprite를 사용합니다. 태그를 사용하는 것은 노드에 액세스하는 최상의 솔루션이 아닙니다. 많은 노드와 많은 태그가있을 때 쉽게 잃어 버릴 수 있기 때문입니다.

+0

예, 그처럼 거친 태그를 사용하고 있습니다. 고마워. 나는 그것을 줄 것이다. – user1606616