SKSpriteNode를 하위 클래스로 지정하여 게임에 대해 서로 다른 속성을 가진 다른 캐릭터를 만드는 데 사용할 수 있습니다. 이것은 사소한 작업이어야한다는 것을 알고 있지만 인스턴스가 생성 될 때 변수를 초기화하는 방법을 이해하는 데 어려움을 겪고 있습니다. 헤더에는 다음이 있습니다.
#import <SpriteKit/SpriteKit.h>
@interface MyClass : SKSpriteNode
@property int myVariable;
@end
그리고 구현에서 :
#import "MyClass.h"
@interface MyClass ()
@end
@implementation MyClass
@synthesize myVariable;
- (id)init {
if (self = [super init]) {
myVariable = 100;
}
return self;
}
장면에서 노드를 만들 때 :
@implementation GameScene
{
MyClass *mySprite;
}
- (void)didMoveToView: (SKView *) view
{
mySprite = [MyClass spriteNodeWithImageNamed:@"image.png"];
}
myVariable의 값은 0이며, 이는 spriteNodeWithImageNamed가 init 메서드를 실행하지 않는다는 것을 의미한다고 가정합니다. 내가 사용하는 경우 :
mySprite = [[MyClass alloc] init]; // or mySprite = [MyClass new];
mySprite = [MyClass spriteNodeWithImageNamed:@"image.png"];
변수 이름이 100으로 올바르게 설정되었지만 spriteNodeWithImageNamed에 의해 0으로 되돌려졌습니다.
나는 또한 시도했다 :
mySprite = [[MyClass alloc] init]; // or mySprite = [MyClass new];
[mySprite setTexture:[SKTexture textureWithImageNamed:@"image.png"]];
이 경우 myVariable의 값은 정확하지만 장면에 노드를 추가 할 때 이미지가 나타나지 않습니다. spriteNodeWithImageNamed를 사용할 때 어떤 init 메서드가 호출됩니까? SKSpriteNode init 메서드를 부적절하게 재정의하고 있습니까?
클래스 생성으로 모든 작업을 올바르게 수행했지만 팩토리 메서드를 호출 spriteNodeWithImageNamed
한 다음 자체적으로 초기화하고 할당 한다는 점을 명심해야 합니다. 따라서 사용자 지정 init
메서드 를 사용 하려면 팩토리 메서드도 재정의해야합니다.
MyClass 구현 내에서 이니셜 라이저를 호출하도록 메서드를 재정의합니다.
+ (instancetype) spriteNodeWithImageNamed:(NSString *)imageName{
MyClass *newClass = [[MyClass alloc] init];
SKTexture *spriteTexture = [SKTexture textureWithImageNamed:imageName];
newClass.size = spriteTexture.size;
newClass.texture = spriteTexture;
return newClass;
}
도움이 되었기를 바랍니다. 궁금한 점이 있으면 알려주세요.
* 편집 : 실제로 SKSpriteNode에 init
메서드 가 없기 때문에 (또는 적어도 우리가 알고있는) 이것을 버리고 싶었습니다 . 따라서 Apple의 미스터리에 깊이 빠져들고 싶지 않다면 다음과 같이하십시오.
+ (instancetype) spriteNodeWithImageNamed:(NSString *)imageName{
MyClass *newClass = [[MyClass alloc] initWithImageNamed:imageName];
newClass.myVariable = 100;
return newClass;
}
대신 initWithImage
myVariable에 넣도록 재정의 할 수 있지만 요점은 init
SKSpriteNode와 함께 이니셜 라이저 를 사용하지 않으려는 것 입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다