我没有成功地让SKSpriteNode投射阴影,并且在从同一光源进入阴影时也会消失.我可以做到两个中的一个但不是两个.
根据文档:如果精灵位于由光投射的阴影内并且精灵的z位置低于光,则阴影会影响精灵的点亮方式.我所做的一切.我的SKLightNode的zPosition为100,所有其他节点的zPosition都较低.
我已经尝试了lightingBitMask,shadowCastBitMask和shadowedBitMask的任何和所有设置组合,但没有任何效果.
我发布了孤立的代码,重现了我的问题.蓝色的盒子投下阴影但没有被墙影覆盖.紫色的盒子没有阴影,被墙影覆盖.
灯光响应触摸运动,因此可以随意在屏幕上移动.该项目处于横向模式.
我错过了什么或没看到什么?
#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 …Run Code Online (Sandbox Code Playgroud) 我一直在使用SKLightNodeSpriteKit(iOS8中的新功能)进行实验,即使是在一个非常简单的测试用例中,我的性能也非常糟糕.例如,在纯色的单个光源上,我在第3代iPad上获得13.2 FPS.如果我添加第二个光源,它会下降到一个非常糟糕的7.7 FPS.SKSpriteNode
WWDC会话视频SpriteKit中的新功能提到如果你在同一个精灵上有多个灯光,你可能会得到低于60 FPS,但我甚至不能得到60 FPS.这是相关部分.
这是我在swift中的测试场景(它从一个光源开始,可以通过点击添加更多):
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
let center = CGPointMake(size.width / 2.0, size.height / 2.0)
let background = SKSpriteNode(color: SKColor.lightGrayColor(), size: size)
background.position = center
background.lightingBitMask = 1
addChild(background)
let light = SKLightNode()
light.position = center
light.falloff = 1.0
light.lightColor = SKColor(hue: 0.62 , saturation: 0.89, brightness: 1.0, alpha: 0.4) …Run Code Online (Sandbox Code Playgroud) 我遇到了SpriteKit的问题(在OS X 10.11 beta上尝试过Xcode 7 beta和Xcode 6.4),如果我从图像创建SKTextureAtlas并且单独使用时可以正常工作的普通文件,那么法线贴图会崩溃.看这个例子:
从左到右:
该图集是在运行时使用SKTextureAtlas atlasWithDictionary创建的:它包含以下纹理:
creating atlas with files: {
"shield-normal.png" = "shield-normal.png";
"shield.png" = "shield.png";
"swords-normal.png" = "swords-normal.png";
"swords.png" = "swords.png";
}
Run Code Online (Sandbox Code Playgroud)
注意:如果我在Xcode中创建Atlas并通过atlasNamed加载它,我会得到完全相同的问题: - 所以问题肯定不在于如何或何时创建地图集,而是因为纹理是从第一个地图集中获得的地点.
如果我使用单个文件创建精灵,则照明工作(最右边的图像):
tex = [SKTexture textureWithImageNamed:@"shield.png"];
normal = [SKTexture textureWithImageNamed:@"shield-normal.png"];
test2 = [SKSpriteNode spriteNodeWithTexture:tex normalMap:normal];
test2.position = CGPointMake(580, 400);
test2.lightingBitMask = 0xffffffff;
[self addChild:test2];
Run Code Online (Sandbox Code Playgroud)
我对atlas文件执行完全相同的操作,上面的屏幕截图证明我确实为精灵纹理获取了正确的图像(左起第3和第4个),并且从图集中获得正常的纹理.然而结果是左边的第一个图像,一个没有法线贴图的点亮的精灵.
我想知道,普通纹理是否需要一种SKTextureAtlas不适用的后处理形式?或者其他人在地图集中是否有正常纹理问题?
或许这可能是一个错误?
更新:我已在一个新的SpriteKit应用程序(OS X,在此下载并自行尝试)中使用以下代码重现此行为:
-(void)didMoveToView:(SKView *)view {
SKLightNode* light = [SKLightNode node];
light.position = CGPointMake(0, …Run Code Online (Sandbox Code Playgroud) 我正在使用 SKLightNodes 并尝试让一个物体(太阳)照亮它周围的任何东西。问题是,当我将 SKLightNode 添加到太阳节点时,SKLightNode 仅出现在太阳的正中心。我尝试过缩放 SKLightNode,但它似乎对 SKLightNode 的大小或范围没有影响。以下是 SKLightNode 的实现方式。
let light = SKLightNode()
light.categoryBitMask = 1;
light.falloff = 1;
light.ambientColor = UIColor.whiteColor();
light.setScale(50)
star!.addChild(light)
Run Code Online (Sandbox Code Playgroud)
如果有人对我如何提高光源的效率有任何意见,我肯定会很感激。
sklightnode ×4
sprite-kit ×3
ios ×2
swift ×2
bump-mapping ×1
ios8 ×1
lighting ×1
shadow ×1
skspritenode ×1