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
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