2015-02-22 34 views
7

Tôi đã không thành công trong việc có được một SKSpriteNode để đúc một bóng và cũng được thực hiện để biến mất khi đi vào một bóng tối từ cùng một nguồn ánh sáng. Tôi có thể làm một trong hai nhưng không phải cả hai.SKLightNode đổ bóng vấn đề

Theo tài liệu: Nếu sprite nằm trong bóng đổ bởi ánh sáng và sprite có vị trí z thấp hơn ánh sáng, bóng sẽ ảnh hưởng đến cách sprite sáng. Tất cả những gì tôi đã làm. SKLightNode của tôi có zPosition là 100 và tất cả các nút khác có zPosition thấp hơn.

Tôi đã thử bất kỳ và tất cả các kết hợp cài đặt cho chiếu sángBitMask, shadowCastBitMask và shadowedBitMask nhưng không có gì hoạt động.

Tôi đang đăng mã bị cô lập tái tạo sự cố của tôi. Hộp màu xanh tạo thành một cái bóng nhưng không bị che phủ bởi bóng của bức tường. Hộp màu tím không có bóng và được bao phủ bởi bóng tường.

Đèn phản ứng với cử động chạm để cảm thấy tự do di chuyển xung quanh màn hình. Dự án đang ở chế độ ngang.

Tôi đang thiếu gì hoặc không thấy?

#import "GameScene.h" 

@implementation GameScene { 
    SKSpriteNode *lightBulb; 
} 

-(void)didMoveToView:(SKView *)view { 

    typedef NS_OPTIONS(uint32_t, Level1LightCategory) 
    { 
     CategoryLightPlayer   = 1 << 0, 
    }; 

    SKSpriteNode *worldNode = [SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(1136, 640)]; 
    worldNode.zPosition = 10; 
    //worldNode.position = CGPointMake(self.size.width/2, self.size.height/2); 
    [self addChild:worldNode]; 

    lightBulb = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(20, 20)]; 
    lightBulb.zPosition = 100; 
    lightBulb.position = CGPointMake(50, 50); 
    [worldNode addChild:lightBulb]; 

    SKLightNode *light = [[SKLightNode alloc] init]; 
    //light.zPosition = 100; // <- tried setting this again but to no effect 
    light.categoryBitMask = CategoryLightPlayer; 
    light.falloff = 0.3; 
    light.ambientColor = [UIColor whiteColor]; 
    light.lightColor = [[UIColor alloc] initWithRed:1.0 green:1.0 blue:1.0 alpha:1.0]; 
    light.shadowColor = [[UIColor alloc] initWithRed:0.0 green:0.0 blue:0.0 alpha:1.0]; 
    [lightBulb addChild:light]; 

    SKSpriteNode *wall = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(10, 300)]; 
    wall.zPosition = 50; 
    wall.position = CGPointMake(500, 200); 
    wall.lightingBitMask = CategoryLightPlayer; 
    wall.shadowCastBitMask = CategoryLightPlayer; 
    wall.shadowedBitMask = 0x00000000; 
    [worldNode addChild:wall]; 

    SKSpriteNode *box0 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(30, 30)]; 
    box0.zPosition = 40; 
    box0.position = CGPointMake(800, 200); 
    box0.lightingBitMask = CategoryLightPlayer; 
    box0.shadowCastBitMask = CategoryLightPlayer; 
    box0.shadowedBitMask = CategoryLightPlayer; 
    [worldNode addChild:box0]; 

    SKSpriteNode *box1 = [SKSpriteNode spriteNodeWithColor:[SKColor purpleColor] size:CGSizeMake(30, 30)]; 
    box1.zPosition = 40; 
    box1.position = CGPointMake(800, 300); 
    box1.lightingBitMask = CategoryLightPlayer; 
    //box1.shadowCastBitMask = CategoryLightPlayer; 
    //box1.shadowedBitMask = CategoryLightPlayer; 
    [worldNode addChild:box1]; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInNode:self.scene]; 

    lightBulb.position = touchLocation; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInNode:self.scene]; 

    lightBulb.position = touchLocation; 
} 

-(void)update:(CFTimeInterval)currentTime { 
    // 
} 

@end 

Trả lời

9

Tôi vừa nghe từ hỗ trợ kỹ thuật của nhà phát triển Apple xác nhận đây là lỗi trong SpriteKit (SKLightNode). Hiện tại họ không biết cách giải quyết vấn đề này nhưng sẽ cập nhật cho tôi nếu có.

Theo yêu cầu của họ, tôi đã gửi báo cáo lỗi.

CẬP NHẬT ngày 22 tháng tư năm 2015

SK kỹ thuật xác nhận rằng SpriteKit không hỗ trợ bóng casting và shadowed trên cùng một đối tượng. Hiện tại không có cách giải quyết nào. Vấn đề này sẽ được giải quyết tại một số điểm.

CẬP NHẬT 15 tháng 12 năm 2015

nhận một phản ứng mới từ Apple về vấn đề này.

của Apple Developer Relations 14-Dec-2015 13:35

Không có kế hoạch để giải quyết này.

Chúng tôi hiện đang đóng báo cáo này.

+1

Tôi đã thử nghiệm điều này bằng Xcode 8.3.2 và dường như đã được sửa. Tôi đặt mã của bạn vào một dự án mẫu và đúc một bóng từ bức tường trên hộp màu xanh ẩn nó như mong đợi. Hộp màu xanh dương vẫn tạo ra cái bóng của chính nó khi không được che phủ bởi bóng của bức tường. Có lẽ điều này đã được sửa trong bản cập nhật SK gần đây hoặc có thể tôi hiểu nhầm vấn đề của bạn. – Jonathan

-1

I'v tìm thấy một số cách giải quyết (không chắc chắn đó là hữu ích cho tất cả các tình huống, nhưng trong một số): Bạn có thể thực hiện hai (hoặc nhiều hơn - lên đến 32 như chúng ta biết) các nguồn ánh sáng khác nhau và chỉ định cho bạn sprites để từng cái một (hoặc theo một số nhóm). Sau đó, bóng sẽ kết hợp khi chúng ta cần - chính xác.

SKLightNode* light1 = [SKLightNode new]; 
SKLightNode* light2 = [SKLightNode new]; 

... // init them equally 

light1.categoryBitMask = 1; 
light2.categoryBitMask = 2; 
... 

SKSpriteNode* sprite1 = ... 
SKSpriteNode* sprite2 = ... 

sp1.shadowCastBitMask = 1; 
sp1.shadowedBitMask = 1; 
sp2.shadowCastBitMask = 2; 
sp2.shadowedBitMask = 2; 
+0

Đó không phải là giải pháp. Vấn đề là cho một nút để đổ bóng, nó không thể bị che khuất cùng một lúc. Việc tạo 2 nút không giải quyết được khi nút tạo bóng sẽ không biến mất thành bóng. – sangony

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