2015-02-22 17 views
7

Ich war nicht erfolgreich, einen SKSpriteNode zu bekommen, um einen Schatten zu werfen UND auch gemacht zu werden, wenn man in den Schatten von der gleichen Lichtquelle geht. Ich kann einen der beiden machen, aber nicht beides.SKLightNode Schattenwurf Problem

Gemäß der Dokumentation: Wenn sich das Sprite innerhalb eines von einem Licht geworfenen Schattens befindet und das Sprite eine niedrigere z-Position als das Licht hat, beeinflusst der Schatten, wie das Sprite leuchtet. Alles was ich getan habe. Mein SKLightNode hat eine zPosition von 100 und alle anderen Knoten haben niedrigere zPositions.

Ich habe alle Kombinationen von Einstellungen für LightingBitMask, ShadowCastBitMask und ShadowedBitMask versucht, aber nichts hat funktioniert.

Ich poste den isolierten Code, der mein Problem neu erstellt. Die blaue Box wirft einen Schatten, ist aber nicht vom Wandschatten bedeckt. Die violette Box wirft keinen Schatten und ist vom Wandschatten bedeckt.

Das Licht reagiert auf Berührungsbewegung, also fühlen Sie sich frei, es um den Bildschirm zu bewegen. Das Projekt befindet sich im Querformat.

Was vermisse ich oder sehe ich nicht?

#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 

Antwort

9

Ich habe gerade vom Apple Developer Technical Support gehört, dass dies ein Fehler in SpriteKit (SKLightNode) ist. Momentan kennen sie keine Problemumgehung für dieses Problem, aber sie werden mich aktualisieren, wenn eines gefunden wird.

Nach ihrer Anfrage habe ich einen Fehlerbericht eingereicht.

UPDATE 22. April 2015

SK Engineering bestätigt, dass SpriteKit nicht Schattenwurf und auf demselben Objekt abgeschattet unterstützt. Es gibt derzeit keine Problemumgehung. Dieses Problem wird irgendwann angesprochen.

UPDATE 15. Dezember 2015

eine neue Antwort von Apple erhalten diese Frage in Bezug auf.

Apple Developer Relations 14-Dec-2015 13.35

Es gibt keine Pläne, diese Adresse.

Wir schließen jetzt diesen Bericht.

+1

Ich habe dies mit Xcode 8.3.2 getestet und es scheint, dass es behoben wurde. Ich stecke deinen Code in ein Beispielprojekt und verbirge einen Schatten von der Wand über der blauen Box wie erwartet. Die blaue Box wirft immer noch ihren eigenen Schatten, wenn sie nicht vom Wandschatten bedeckt ist. Vielleicht wurde dies in einem kürzlich erschienenen SK-Update behoben oder ich verstehe dein Problem möglicherweise falsch. – Jonathan

-1

I'v fand einige Abhilfe (nicht sicher, ob es für alle Situation nützlich ist, aber in etwas): Sie zwei machen können (oder mehr - bis zu 32, wie wir wissen) verschiedene Lichtquellen und weisen Sie Sprites sie einzeln (oder von einigen Gruppen). Dann werden die Schatten so kombiniert, wie wir brauchen - richtig.

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

Das ist keine Lösung. Das Problem besteht darin, dass ein Knoten einen Schatten wirft und nicht gleichzeitig schattiert werden kann. Das Erstellen von 2 Knoten löst es nicht, da der Knoten, der einen Schatten wirft, nicht in einem Schatten verschwindet. – sangony