2013-10-29 16 views

Trả lời

3

Kobold Kit thêm phương thức gọi lại didMoveToParentwillMoveFromParent cho tất cả các lớp Nút KK *.

Điều này đạt được bằng cách phân lớp tất cả các lớp nút SK * và ghi đè các phương thức addChildremoveChild tương ứng và các biến thể của chúng. Sau đó, họ gọi các phương thức danh mục ở trên trên nút, tùy thuộc vào việc nút đã được thêm hay xóa.

Thật không may chúng tôi không thể phân lớp SKNode để thêm phương thức cho tất cả các lớp SKNode - tất cả nút SK * khác sẽ vẫn có SKNode ban đầu làm cha mẹ của nó. Bên cạnh lớp con, bạn cũng có thể thêm các phương thức addChild/removeChild tùy chỉnh (giả sử addNode/removeNode) trong một danh mục SKNode và chỉ sử dụng chúng. Sau đó, họ sẽ gửi một thông báo willAdd/didRemove đến nút trước khi gọi thực hiện addChild/removeChild gốc.

Về mặt lý thuyết, điều này cũng có thể được thực hiện bằng cách làm lộn xộn các phương thức addChild/removeChild trên lớp SKNode. Nhưng nếu tôi nhớ chính xác đó là những gì ban đầu tôi đã thử, và nó không hiệu quả - tôi không nhớ tại sao chính xác, một trong những lý do có thể là các lớp con của SKNode có thể thực hiện các phiên bản addChild/removeChild của riêng chúng mà không cần gọi thực hiện, hoặc gọi thực hiện siêu đơn giản là không chạy các phương thức bị xáo trộn. Một lý do khác có thể là các phương thức addChild/removeChild trong nội bộ được chuyển tiếp trực tiếp đến công cụ C++ Sprite Kit bên dưới chứ không phải được chuyển lên trên trong phân cấp lớp SKNode.

+0

Dòng dưới cùng, Bộ công cụ Sprite có thể lớn và tuyệt vời nhưng những gì nó thiếu là cộng đồng nguồn mở ... – Jonny

+3

Bạn có thể nói điều tương tự về SDK iOS ... @Jonny –

4

Nếu không cần Kobold Kit, bạn có thể phân lớp SKSpriteNode (hoặc bất kỳ SKNode nào cho thực tế) và mở rộng hàm removeFromParent mà SKNodes sở hữu.

Ví dụ:

FLSprite.m:

#import "FLSprite.h" 

@implementation FLSprite 

-(void)removeFromParent { 
    [super removeFromParent]; 
    NSLog(@"I print when I'm Removed"); 
    //here's where you'll add your hooking functions 
} 

@end 

MyScene.m:

-(id)initWithSize:(CGSize)size {  
    if (self = [super initWithSize:size]) { 
    FLSprite* sprite = [FLSprite spriteNodeWithColor:[UIColor blackColor] size:CGSizeMake(200, 100)]; 
     [sprite setPosition:CGPointMake(100.0, 50.0)]; 
     [self addChild:sprite]; 
     [sprite removeFromParent]; 

    } 
    return self; 
} 

Như để thêm một đứa trẻ, kể từ khi bạn thêm một đứa trẻ như vậy (trong hầu hết các trường hợp) [self addChild:node]; bạn cần mở rộng addChild trong chế độ xem bạn thêm vào. Ví dụ, bạn sẽ thêm dòng sau vào MyScene.m của bạn, vì chúng tôi có thêm sprite để xem rằng

-(void)addChild:(SKNode *)node { 
    [super addChild:node]; 
    NSLog(@"added child"); 
} 

này là khá nhiều những gì Steffen Itterheim đã làm để đạt được chức năng này, như ông giải thích trong gửi bài của mình .

+0

Vấn đề ở đây có thể là một vài các biến thể khác như insertChild và các công cụ khác như removeChild của cha mẹ. Nó có thể nhận được khó khăn để nắm bắt tất cả những người. Dù sao làm công cụ như một lớp trong trò chơi tạm dừng bật lên (có thể là một sknode hoặc skspritenode) là khó khăn để có được quyền. – Jonny

+0

không phải nếu bạn đang phân lớp SKNode/SKSpriteNode, nó sẽ không phức tạp. nhưng tbh, nếu bạn đang dựa vào một cái móc với addChild, bạn có thể đi về những điều sai đường. –

Các vấn đề liên quan