2014-07-16 4 views
0

나는 objective-C가있어서 매우 새롭고 CCSprite라는 cocos2D 클래스를 확장하는 'factory'스타일 클래스를 구현하려고합니다.초급 목표 -C : 클래스 확장?

생성 된 스프라이트를 나중에 호출하고 조작 할 수 있도록 고유 ID로 스프라이트를 만들고 발행하는 CCSprite를 확장하는 클래스 Monster가 있어야합니다. 나는 CCSprite를 확장하여 instance_id 속성과 static global_id 변수를 추가한다.

나는 CCSprite가 가지고있는 다른 모든 함수들과 함께 spriteWithImageNamed와 같은 모든 CCSprite 생성자를 사용할 수 있기를 원한다. 문제는 내 instance_id가 적절하게 할당/증가되지 않는다는 것이다. (항상 0이다. 이 문제를 해결하기 위해 어디서부터 시작해야할지 정말로 압니다.

Monster.h :

#import "CCSprite.h" 

@interface Monster : CCSprite 

@property (nonatomic, readonly) int instance_id; 

@end 

Monster.m : 때마다 호출 초기화 함수가 생성자라고

#import "Monster.h" 

static int global_id = 0; 

@implementation Monster:CCSprite 

@synthesize instance_id; 


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

    if(self){ 
     instance_id = global_id; 
     global_id++; 
    } 
    return self; 
} 

@end 

가 여기

내가 가진 무엇인가? (예 : spriteWithImageNamed)?

부모 클래스의 함수를 호출 할 때 확장 속성과 변수가 적용되는지 어떻게 확인합니까?

+0

참고 불필요한 @synthesize입니다 , Xcode는 속성과 같은 이름으로 당신을 위해 자동으로 아이어를 만듭니다. 밑줄이 붙습니다.이 경우 _instance_id – LearnCocos2D

답변

1

Objective-C에서 클래스의 지정 초기화 프로그램은 다른 초기화 프로그램에서 호출해야하는 클래스입니다. 많은 수업에서 이것은 실제로 init입니다. 그러나 Cocos2D 문서에 따르면 init은 CCSprite의 지정된 초기화 프로그램이 아닙니다. 대신 지정된 이니셜 라이저는 다음과 같습니다.

- (id)initWithTexture:(CCTexture *)texture rect:(CGRect)rect rotated:(BOOL)rotated 

다른 모든 초기화 도구가 사용자 버전을 호출하도록하려면이 메서드를 재정의해야합니다.

(이 작동하는지 직접 확인하려면 다음 다른 초기화를 호출하고 지정된 초기화가 호출되어 있는지 확인, 지정 초기화의 구현에 로그 문 또는 중단 점을 넣을 수 있습니다.)

0

init 메소드는 이러한 팩토리 메소드가 내부적으로 사용중인 초기화에 따라 호출되거나 호출되지 않을 수 있습니다. 예를 들어 initWithFileself = [self init] 대신 self = [super init]을 호출 할 수 있습니다.이 경우 구현이 호출되지 않습니다. 모든 수퍼 클래스의 모든 init 메소드를 무시하고 필요한 설정을 수행하여 초기화가 항상 수행되도록 할 수 있습니다. 또한 super를 호출하지 않고 객체를 가져올 수있는 팩토리 메소드를 재정의 한 다음 반환하기 전에 id 속성을 할당 할 수도 있다는 점도 기억하십시오.

+0

오래된 메서드를 덮어 쓰면 오래된 특성을 유지합니까? 예 : SpriteWithImage를 재정의하고 instance_ID를 할당하는 코드 만 추가하면 여전히 부모 클래스의 메서드처럼 동작합니까? – Aeisys

+0

네,'self = [super init]'와 같이 자기 자신을 초기화하고 있습니다. 이것들은 init 구현을 계속하기 전에 수퍼 클래스에서 init 메소드를 호출 할 것이다. –

0

CCSprite보고는 + (ID) spriteWith 같은 모든 공장 ​​방법 * initWith * 방법

모든 initWith를 호출 것 같다 * 체인 호출의 끝 [자체 초기화] 당신이를 오버라이드 (override) 그래서 만약

의 방법 init 메소드를 사용하면됩니다. 괜찮습니다!당신이 전화하지 않는 공장 방법을 사용하여 스프라이트를 만들려면 그런데

, [CCSprite spriteWith *]를 호출 [몬스터 spriteWith은 *] 대신

안부