- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的场景中有几个 Sprite 节点正在转换阴影。我还有一个 Sprite 在其中一个阴影中。我希望能够判断用户是否将 Sprite 从阴影中移到光线中。无论如何要 swift 做到这一点?谢谢。
最佳答案
不幸的是,这个功能仍然没有包含在 SpriteKit 中,但是有可能实现一个像样的解决方案,但有一些注意事项。
要确定 Sprite 是否转换阴影,它的 shadowCastBitMask
属性“通过执行逻辑 AND 运算针对灯的 categoryBitMask
属性进行测试。”根据 shadowColor
文档中给出的描述,SpriteKit 似乎为光照和物理体计算生成了完全相同的 mask 数据。 SKLightNode
上定义的属性:
When lighting is calculated, shadows are created as if a ray was cast out from the light node's position. If a sprite casts a shadow, the rays are blocked when they intersect with the sprite's physics body. Otherwise, the sprite's texture is used to generate a mask, and any pixel in the sprite node's texture that has an alpha value that is nonzero blocks the light.
SKPhysicsWorld
有一个方法,enumerateBodies(alongRayStart:end:using:)
,用于高效地执行这种光线相交测试。这意味着我们可以测试一个 Sprite 是否被任何具有物理体的 Sprite 遮挡。所以我们可以写一个这样的方法来扩展SKSpriteNode
:
func isLit(by light: SKLightNode) -> Bool {
guard light.isEnabled else {
return false
}
var shadowed = false
scene?.physicsWorld.enumerateBodies(alongRayStart: light.position, end: position) { (body, _, _, stop) in
if let sprite = body.node as? SKSpriteNode, light.categoryBitMask & sprite.shadowCastBitMask != 0 {
shadowed = true
stop.pointee = true
}
}
if shadowed {
return false
} else {
return true
}
}
我们还可以检索场景中的哪些灯正在照亮特定的 Sprite :
func lights(affecting sprite: SKSpriteNode) -> [SKLightNode] {
let lights = sprite.scene?.children.flatMap { (node) -> SKLightNode? in
node as? SKLightNode
} ?? []
return lights.filter { (light) -> Bool in
sprite.isLit(by: light)
}
}
如果 SpriteKit 提供一种方法来检索此信息而不将其耦合到物理 API,或者要求开发人员滚动他们自己的光线转换实现,那就太好了。
关于iOS 8 检测 SKSpriteNode 是否被 SKLightNode 点亮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30762191/
我正在尝试点亮 STM32F103C8T6 上的 LED(在端口 c,引脚 13 上)。我没有使用 IDE。代码: #include "include/stm32f10x.h" int main()
我写了一个小的 fetchmail 脚本,它检查远程服务器并在我有新邮件时播放音频文件。我还想在邮件可用时点亮我的键盘灯之一,但我遇到了问题。我可以用这个点亮滚动锁定灯: /usr/bin/xset
我想用Java编写一个GUI,其中会有一个按钮。按下按钮将点亮连接到 Arduino 的二极管。我正在使用 RXTXcomm.jar 库。 现在,我编写了显示 COM21 端口的代码,因为这就是我的
我的场景中有几个 Sprite 节点正在转换阴影。我还有一个 Sprite 在其中一个阴影中。我希望能够判断用户是否将 Sprite 从阴影中移到光线中。无论如何要 swift 做到这一点?谢谢。 最
我不太了解PHP,但我想问一下我应该如何改进这个脚本。 添加我现有代码的截图,我简单描述一下。 当第一次按下网络按钮时,该程序会导致 LED 点亮。 必须满足条件,即文件大小必须等于 2 个字节。当执
我刚刚开始使用 Unity 3d 进行照明,现在有一个功能可以逐渐加深我这里场景的照明。我已经通过渲染设置完成了这项工作,并尝试了 3 种不同的光照方法,我都收到了相同的结果:
我是一名优秀的程序员,十分优秀!