我有一个SKSpriteNode我希望在它的边缘有蓝色光晕以突出显示目的.我猜我需要让我的精灵成为a的孩子,SKEffectNode然后创建/应用某种过滤器.
更新:我已经使用所选答案的方法调查了这一点,并发现SKEffectNode即使你已经设置为shouldRasterize"无过滤器"定义,它也会有相当大的性能.我的结论是,如果你的游戏一次需要10个以上的移动物体,SKEffectNode即使是光栅化也不会涉及到它们.
我的解决方案可能涉及预渲染的发光图像/动画,因为SKEffectNode不会根据我的要求削减它.
如果有人对我失踪的任何事情有所了解,我会很感激你所知道的一切!
我接受了答案,因为它确实实现了我的要求,但是想要将这些笔记添加到任何想要走这条路线的人,这样你就可以了解使用中的一些问题SKEffectNode.
我在黑暗的屏幕上有一个移动的黑色图像,以便更容易看到我想为图像添加白色光晕.这是我的动态图像代码:
Ghost = SKSpriteNode(imageNamed: "Ghost1")
Ghost.size = CGSize(width: 50, height: 50)
Ghost.position = CGPoint(x: self.frame.width / 2 - Ghost.frame.width, y: self.frame.height / 2)
Ghost.physicsBody = SKPhysicsBody(circleOfRadius: Ghost.frame.height / 1.4)
Ghost.physicsBody?.categoryBitMask = PhysicsCatagory.Ghost
Ghost.physicsBody?.collisionBitMask = PhysicsCatagory.Ground | PhysicsCatagory.Wall
Ghost.physicsBody?.contactTestBitMask = PhysicsCatagory.Ground | PhysicsCatagory.Wall | PhysicsCatagory.Score
Ghost.physicsBody?.affectedByGravity = false
Ghost.physicsBody?.isDynamic = true
Ghost.zPosition = 2
self.addChild(Ghost)
Run Code Online (Sandbox Code Playgroud)
我不知道如何或如何使用添加发光,如果您需要更多信息,请询问.
- [MTLDebugRenderCommandEncoder setScissorRect:]:2028:断言失败`(rect.x(0)+ rect.width(1080))(1080)必须<= 240'
使用以下代码将简单的SKSpriteNode添加到SKEffectNode时,我遇到此崩溃
SKSpriteNode *warpSprite = [SKSpriteNode spriteNodeWithImageNamed:@"art.scnassets/symbol.png"];
SKEffectNode *entryEffectsNode = [[SKEffectNode alloc] init];
[entryEffectsNode addChild:warpSprite];
[self addChild:entryEffectsNode];
Run Code Online (Sandbox Code Playgroud)
我没有在我的项目中的任何其他位置触摸这些节点,当我更改精灵时,值(必须<=值)在错误内发生变化.
编辑:我用一个简单的spriteNodeWithColor替换了精灵图像:Size:并且(<= value)总是精灵的两倍大小.另外需要注意的是,SKScene被用作SceneKit场景中的叠加层.
我用以下代码创建了一个单独的SKScene,但仍会导致相同的错误.
@implementation testScene
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
SKSpriteNode *testSprite = [SKSpriteNode spriteNodeWithColor:[SKColor purpleColor] size:CGSizeMake(100, 100)];
SKEffectNode *testEffect = [[SKEffectNode alloc] init];
[testEffect addChild:testSprite];
[self addChild:testEffect];
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
编辑2:我刚刚测试了上面的场景作为默认SceneKit项目的叠加层,它崩溃了同样的错误.
编辑3:我使用swift重现了这一点.Bug报告登陆Apple.
我正在研究SpriteKit中的元球效果.我有一个带有着色器的SKEffectNode,它可以压缩缓冲区的颜色范围.这个effectnode有一百多个SKSpriteNode作为它的子节点.这种效果在几秒钟内效果很好,但突然间,在几帧的过程中,所有的spritenodes从屏幕上消失,并且nodecount从100-odd下降到2(我猜其余2个是效果节点)本身,以及形成容纳球的容器的边缘链?)
如果我将球spritenodes直接添加到场景的根节点,这不会发生.只有当他们成为效果节点的孩子时,他们才会在几秒钟之后被淘汰.
有趣的是,(如果帧速率非常低,这在模拟器中可见),SpriteNodes似乎以当前显示在屏幕上的垂直顺序被剔除,从屏幕顶部到底部.
如果视图的showsPhysics属性设置为true,我可以看到SKSpriteNode的物理实体仍在屏幕上,并且可以滚动.但他们的视觉表现已经消失,视图的节点数已经耗尽.根据文档showsNodeCount"显示在场景中可见的物理实体".因此,由于节点不再可见,节点计数已下降.
任何人都知道可能导致这种情况的原因,或者我可以使用哪些工具来调试它?
标准SpriteKit iOS Swift 2.2 Xcode 7模板,用以下代码替换GameScene文件:
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
// create walls to contain balls
let box = SKPhysicsBody(edgeLoopFromRect: CGRect(x: 0, y: 0, width: 800, height: 800))
let boxNode = SKNode()
boxNode.physicsBody = box
addChild(boxNode)
let radius: CGFloat = 5
let texture = createMetaballTexture(radius)
let centre = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
let rows = 12
let columns = 10 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下设置SpriteKit:
现在这里是问题,只要前景没有任何CIFilter或者具有shouldEnableEffects = NO,一切都很好.也就是说,我可以点击屏幕,我的游戏元素被实例化并添加到主场景中.但是当我尝试将CIGaussianBlur或CIBloom添加到前台时,我注意到两件事:
效果似乎是不断裁剪其内容或调整它的框架.也就是说,如果我有一个节点,"全屏"效果似乎试图不断裁剪或调整其边界到保持所有节点所需的最小区域.这适用于一个节点:

这适用于2个节点:

在OpenGL ES 2中,人们可以通过基本上将整个帧缓冲区(所有对象)渲染到纹理,然后在该纹理上至少再做一次模糊等传递,然后在附加到的帧缓冲区中呈现它来进行模糊/布局.显示或组合与原始渲染回到帧缓冲区.我希望SKEffectNode以类似的方式工作.然而,裁剪和糟糕的表现让我觉得我可能以错误的方式使用效果节点.有什么想法吗?
我正在尝试在游戏暂停屏幕上应用CIGaussianBlur效果。这是我的代码:
effectsNode = SKEffectNode();
let filter = CIFilter(name: "CIGaussianBlur");
let blurAmount = 10.0;
filter.setValue(blurAmount, forKey: kCIInputRadiusKey);
effectsNode.filter = filter;
effectsNode.blendMode = .Alpha;
Run Code Online (Sandbox Code Playgroud)
该代码可以正常工作,但是需要太多的处理能力,并且会大大降低FPS!我只想要暂停游戏时背景的静态模糊图像。
有解决此问题的方法吗?
在Sprite Kit中是否有一种方法可以捕获屏幕(所有当前SKScene渲染的节点),SKTexture以便我可以应用CIFilter然后将SKTexture分配给新的SKSpriteNode?
我知道我可以设置一个SKEffectNode,作为我的节点树的父节点,应用过滤器等并以这种方式获得结果,但我真的需要一个过滤的 SKTexture(或SKSpriteNode)我可以在以后重用?
可能的方法:
textureFromNode:
Renders and returns a Sprite Kit texture that contains the node’s contents.
Run Code Online (Sandbox Code Playgroud)
是的作品:
SKTexture *texture = [[self view] textureFromNode:[self scene]];
[blurSprite setTexture:texture];
Run Code Online (Sandbox Code Playgroud) 我正试图在我的程序中模糊SKShapenode.但是,我希望shapenode逐渐模糊,持续时间约为1秒.我如何实现这一目标?目前的代码立即模糊了它.
func generateAnimation() {
var blurAction : SKAction = SKAction.runBlock{
//the method below returns a shapeNode
var circle = self.generateImage()
var effect : SKEffectNode = SKEffectNode()
var filter : CIFilter = CIFilter(name:"CIGaussianBlur")
filter.setValue(10, forKey: "inputRadius")
effect.filter = filter
effect.addChild(circle)
self.addChild(effect)
}
Run Code Online (Sandbox Code Playgroud) 我有一个用SpriteKit编写的游戏,它使用带有模糊效果的SKEffectNode来模糊一组精灵,其中一个具有相当大的纹理,并且它们共同覆盖了屏幕的相当大的区域.iMac和Mac Book Pro非常高兴地应对这一点,但是在更加简陋的Mac Book上,添加效果节点的帧速率显着下降.由于效果对于游戏的功能并不重要,我可以简单地不为具有较低图形功能的计算机添加SKEffectNode.
那么接下来的问题是:在确定"GPU的强大功能"或"应用纹理效果时的性能"或[在此建议更好的指标]以及通过什么API时,我可以做出哪些好的编程检查?谢谢你的建议!
CIFilter在 iOS 上,您可以向 中添加多个吗SKEffectsNode?
CIFilterGenerator似乎是我想要的,但它在 iOS 上不可用。
我知道您可以通过将一个过滤器的输出作为下一个过滤器的输入来在图像上使用多个过滤器,但如果您想影响非图像节点,这没有帮助。
这是否意味着我必须创建一个人工层次结构SKEffectNode并向每个层次结构添加一个过滤器,而我的实际内容位于最底部?有没有更好的办法?
我正在尝试模糊多个SKNode对象。我这样做的目的是让父母SKEffectNode将CIFilter设置为@"CIGaussianBlur"。像这样:
- (SKEffectNode *)createBlurNode
{
SKEffectNode *blurNode = [[SKEffectNode alloc] init];
blurNode.shouldRasterize = YES;
[blurNode setShouldEnableEffects:NO];
[blurNode setFilter:[CIFilter filterWithName:@"CIGaussianBlur"
keysAndValues:@"inputRadius", @10.0f, nil]];
return blurNode;
}
Run Code Online (Sandbox Code Playgroud)
对于当前在屏幕上显示的一堆节点,这可以正常工作。但是,当我将这些音符彼此隔开(约3000像素)时,模糊不再发生,我得到了一个大黑匣子。无论SKNodes我模糊的是SKShapeNodes还是,都会发生这种情况SKSpriteNodes。这是有此问题的示例项目:Sample Project。(顺便说一句,感谢BobMoff在此处找到的初始版本):
这是快乐的模糊效果(当节点彼此之间的距离小于3000像素时):

悲伤模糊(当节点是多个比3000个像素彼此远离):

更新
只要an SKEffectNode是父项,就会发生此行为。启用效果,模糊等都无关紧要。如果父节点是SKNode,就可以了。即,即使像下面这样创建父模糊节点,您也会得到黑色:
- (SKEffectNode *)createBlurNode
{
SKEffectNode *blurNode = [[SKEffectNode alloc] init];
// blurNode.shouldRasterize = YES;
// [blurNode setShouldEnableEffects:NO];
// [blurNode setFilter:[CIFilter filterWithName:@"CIGaussianBlur" …Run Code Online (Sandbox Code Playgroud) skeffectnode ×11
sprite-kit ×11
ios ×10
swift ×4
cifilter ×3
core-image ×2
graphics ×1
ios7 ×1
iphone ×1
macos ×1
objective-c ×1
performance ×1
skspritenode ×1
sktexture ×1
swift3 ×1