我正在尝试使用sprite工具包为spriteNode(在本例中为其命名的背景)着色,但无法改变颜色.我有一个我想要着色的精灵.我正在改变精灵的颜色属性以及颜色混合因子.当我运行应用程序时,没有任何反应.颜色保持不变(现在是黑色).下面是我用来改变颜色的代码:
background.anchorPoint = CGPointMake(0, .5);
background.position = position;
// ...
// this does not seems to be doing anything at all
background.color = [SKColor redColor];
background.colorBlendFactor = 1.0f;
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我仔细阅读了文档,这似乎是一个非常简单的过程.我相信我需要的只是那两条线,但它没有任何效果.有谁知道为什么这不起作用?纹理图像有很多透明度,可能导致问题吗?我在不同的精灵上试过这个,它永远不会奏效.
如何使用场景工具包中的SCNCamera获得鱼眼镜头对视图的失真?
像这种图像的"鞠躬":

//正如里克斯特所指出的那样,这种失真被称为"桶形失真".
从文档中,这是让我对使用相机进行这种失真的可能性感兴趣的部分:
如果您计算自己的投影变换矩阵,则可以使用此方法直接设置它,覆盖从相机的几何属性合成的变换.
不幸的是,我对计算自己的投影变换矩阵的能力和可能性一无所知.我希望通过它可以做到这种失真......但是不知道,因此这个问题.
通过相机的任何其他方式是理想的.太.想要避免后期处理技巧,并在相机旋转并在场景中移动时获得更加"有机"的这种失真外观.
查看任何滑板视频,了解它在现实生活中的表现.
我对泛型的认识是,他们可以帮助我简化我的汇集,但无法弄清楚如何.
我的汇集系统简约,但很混乱.而现在变得笨拙和凌乱,还有MESSY.它不能很好地扩展......
我的FXDistribrutor.cs类是附加到初始场景中的对象的组件,旨在永久存在于游戏的所有场景中.它有自己的静态引用,所以我可以轻松地从任何地方调用它.更多关于最后的设计.我甚至不确定这是否是"正确"的方式.但它很好用.
FXDistributor为它能够分发的每种类型的FX单元都有一个公共插槽,为这种类型的FX池提供一个数组,以及一个数组的索引和池的大小.
这是两个例子:
public BumperFX BmprFX;
BumperFX[] _poolOfBumperFX;
int _indexBumperFX, _poolSize = 10;
public LandingFX LndngFX;
LandingFX[] _poolOfLndngFX;
int _indexLndngFX, _poolSizeLndngFX = 5;
Run Code Online (Sandbox Code Playgroud)
在Unity Start调用中,我填写每个FX单元的池:
void Start(){
_poolOfBumperFX = new BumperFX[_poolSize];
for (var i = 0; i < _poolSize; i++) {
_poolOfBumperFX[i] = Instantiate(BmprFX, transform );
}
_poolOfLndngFX = new LandingFX[_poolSizeLndngFX];
for ( var i = 0; i < _poolSizeLndngFX; i++ ) {
_poolOfLndngFX[i] = Instantiate( LndngFX, transform );
}
}
Run Code Online (Sandbox Code Playgroud)
在课程的主体中,我为每种FX类型提供了一系列方法,以便在需要的地方提供它们:
public LandingFX GimmeLandingFX ( ){
if …Run Code Online (Sandbox Code Playgroud) 当兄弟姐妹重叠时,错误 - 命中测试无法正常工作:
场景中有2个重叠节点具有相同的父节点(即兄弟节点)
最顶层的节点具有
userInteractionEnabled = NO另一个节点userInteractionEnabled = YES.如果触摸了重叠,则在最顶层节点被命中测试并且失败(因为
userInteractionEnabled = NO)之后,而不是底部节点是下一个被命中测试的节点,它被跳过并且2个兄弟节点的父节点被命中测试.应该发生的是,下一个兄弟(底部节点)是经过重击测试而不是命中测试跳到父节点.
根据Sprite Kit文档:
"在场景中,当Sprite Kit处理触摸或鼠标事件时,它会遍历场景以找到想要接受事件的最近节点.如果该节点不想要事件,Sprite Kit会检查下一个最近的节点,所以处理命中测试的顺序基本上与绘制顺序相反.对于在命中测试期间要考虑的节点,其userInteractionEnabled属性必须设置为YES.除场景外的任何节点的默认值为NO节点."
这是一个错误,因为节点的兄弟姐妹在他们的父母之前呈现 - 兄弟姐妹应该是下一个被测试的,而不是它的父母.此外,如果一个节点有userInteractionEnabled = NO,那么肯定它应该是'透明'的关于命中测试 - 但是这不是因为它导致行为的改变,因为在测试中跳过了一个节点.
我在网上搜索过,但找不到任何人报告或发布此错误.我应该报告这个吗?
然后我在这里发布这个的原因是因为我想要一个关于这个bug的'修复'的建议(即建议在某处实现某些代码,以便SpriteKit以'预期'方式工作-testing)
复制错误:
使用在Xcode中启动新的"游戏"项目时提供的"Hello World"模板(它具有"Hello World"并在您单击时添加火箭精灵).
可选:[我还从项目中删除了火箭精灵图像,因为
X当找不到图像时出现的矩形更容易用于调试,可视化]将SKSpriteNode添加到场景中
userInteractionEnabled = YES(我将从现在开始将其称为节点A).运行代码.
您会注意到,当您单击节点A时,不会生成火箭精灵.(自命中测试成功后应该停止的预期行为 - 它在节点A上成功时停止)
但是,如果你在节点A旁边产生一些火箭,然后点击节点A和火箭重叠的地方,那么就有可能在节点A上产生另一个火箭 - 但这不可能.这意味着在最顶层节点(
userInteractionEnabled = NO默认情况下为火箭)上的命中测试失败后,它不再测试下一个节点A,而是测试火箭的父节点,而不是场景.
注意:我使用的是Xcode 7.3.1,Swift,iOS - 我还没有测试过这个bug是否具有通用性.
额外的细节:我做了一些额外的调试(上面的复制有轻微的复杂性),并确定命中测试后来发送给父母,因此不一定是场景.
如何关闭子节点的交互?
我在精灵下面为一堆精灵添加标签,描述它们是什么.精灵本身是可触摸的,并且具有在触摸Bebeun等时响应的代码.
标签在视觉上不与精灵重叠,它们完全在精灵的视觉表现之下,但它们是各自精灵的孩子,我想保持这种方式.
但我不希望标签响应触摸.
我将标签设置为
myLabel.isUserInteractionEnabled = false
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) 我猜这是用单个CATextLayers制作一个字符串,然后根据需要在曲线上定位它们,然后制作动画.因为那就是我现在的工作,但它失去了科宁.这是如何做:
但是核心文本是否更具高效性并且能够避免整个"绘制成上下文"的废话,与精简,平均核心动画的做事方式相比,减慢一切,并尊重字距?即避免使用drawRect:以及所有其他方面都会大大减慢速度,例如以这种方式绘制到屏幕上:
https://github.com/darcyliu/CocoaSampleCode/tree/master/CoreTextArcCocoa
想象一下200个字符的字符串,围绕一个圆圈弯曲,能够动画字符之间的间距,希望稳定在60fps.这可以通过Core Animation实现,但这可以通过将字符串分解为单个字符并将它们以相等的间距放置在圆周围,这会导致字距调整信息完全丢失.
我希望有一种方法可以做到这一点,而不会丢失字距调整信息,仍然能够动态调整60fps的间距.
在玩UIKit Dynamics时是否可以不使用UIViews,而是将物理属性,锚点,力等等绑定到一个UIView中的CALayers?
根据Ash Farrow的这个页面:
UIDynamicItem是一种定义中心,边界和变换的协议(仅使用二维变换).UIView符合此协议,是UIDynamicBehaviour最常用的用法.您也可以将UICollectionViewLayoutAttributes与UIDynamicBehaviours一起使用,但我们今天不打算介绍它.
这似乎表明任何事情都可以符合协议UIDynamicItem,但我找不到任何关于制作CALayers的其他人.
可以比这种方法更直接地完成:
https://www.invasivecode.com/weblog/uikit-dynamics-layer-constraint/
我很好奇今天遇到的一种情况,当我试图将一个人SKSpriteNode从一个人复制SKScene到另一个人时.在下面的游乐场的输出中,您可以看到复制后都维护linearDamping和/ angularDamping或不维护(它们似乎都回退到默认值)
// PLAYGROUND_SW1.2 - SKSpriteNode Copy
import UIKit
import SpriteKit
// ORIGINAL
let spriteNode = SKSpriteNode()
spriteNode.name = "HAPPY_NODE"
let size = CGSize(width: 55.0, height: 150.0)
let physics = SKPhysicsBody(rectangleOfSize: size)
physics.linearDamping = 0.123
physics.angularDamping = 0.456
spriteNode.physicsBody = physics
// COPY
let spriteCopy = spriteNode.copy() as! SKSpriteNode
// ORIGINAL
spriteNode.name
spriteNode.physicsBody?.linearDamping
spriteNode.physicsBody?.angularDamping
spriteNode.physicsBody?.area
// COPY
spriteCopy.name
spriteCopy.physicsBody?.linearDamping
spriteCopy.physicsBody?.angularDamping
spriteCopy.physicsBody?.area
Run Code Online (Sandbox Code Playgroud)
游乐场输出

我不确定我是否正确地复制了这两个SKSpriteNode并且SKPhysicsBody符合NSCopying如果你看看上面的输出area属性是在复制后维护的,据我所知这是基于创建size时指定的 …
我想创建一个比SpriteNode的touchesBe更高级别的SKShapeNode,所以当我想从这个sprite上的touchesBegun事件将SKShapeNode添加到屏幕时,形状已经存在,我只是从内部将它添加到屏幕touchesBegan覆盖.
TL; DR,在我的SKSpriteNode中,我正在尝试预先构建SKShapeNode,当触摸Sprite时,该SKShapeNode将用作动画环.
我想用变量/常量创建SKShapeNode,这样我就可以轻松编辑它的值了......
因此,在子类的根目录中,我有颜色,大小和线宽的变量,可以在创建SKShapeNode时使用...
class Balls: SKSpriteNode {
var ringSize: CGFloat = 64
var ringColor: SKColor = SKColor.white
var ringWidth: CGFloat = 16
....
Run Code Online (Sandbox Code Playgroud)
再往下,但仍然是班级的根,我创建我的戒指:
let ring = SKShapeNode(circleOfRadius: ringSize)
Run Code Online (Sandbox Code Playgroud)
我立即受到了深情的怀疑:
无法在属性初始化程序中使用实例成员'ringSize',属性初始化程序在'self'可用之前运行.
精细.好.我知道了.您希望在将值分配给self之前,应该在创建属性时对类进行函数调用.无论是在这里还是在那里,我认为我变得狡猾,并且可以通过将所有内容包装在函数中来解决这个问题:
class Balls: SKSpriteNode {
var ringSize: CGFloat = 64
var ringColor: SKColor = SKColor.white
var ringWidth: CGFloat = 16
var myRing = SKShapeNode()
func createRing() -> SKShapeNode{
let ring = SKShapeNode(circleOfRadius: ringSize)
ring.strokeColor = ringColor
ring.lineWidth = ringWidth
return ring
}
Run Code Online (Sandbox Code Playgroud)
这不会产生任何错误,我的兴奋也会增加.
所以我添加另一行,创建实际的戒指:....
myRing = createRing() …Run Code Online (Sandbox Code Playgroud)