我试图有一个雨粒子,这是受风又名物理世界引力。
我可以看到重力确实对我的SKSpriteNodes有影响,但我不能在SKEmitterNode上实现相同的影响。
我只是在想有没有可能。
这是我一直在尝试的
override func didMove(to view: SKView) {
if let rainParticles = SKEmitterNode(fileNamed: "Rain.sks") {
rainParticles.position = CGPoint(x: size.width/2, y: size.height)
rainParticles.name = "rainParticle"
rainParticles.targetNode = scene
rainParticles.particlePositionRange =
CGVector(dx: frame.size.width, dy: frame.size.height)
rainParticles.zPosition = -1
// I don't think this is right
rainParticles.physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
rainParticles.physicsBody?.affectedByGravity = true
addChild(rainParticles)
}
physicsWorld.contactDelegate = self
// gravity is pushing to the right here
physicsWorld.gravity = CGVector(dx: 20, dy: 0)
physicsWorld.speed = 0.85
}
是的,我已经添加了SKPhysicsContactDelegate
。
显然,我想忽略碰撞,所以我没有设置collisionBitMask
,我也不想让雨反弹到contactTestBitMask
的任何东西上。我不相信我需要设置categoryBitMask
。
2条答案
按热度按时间qoefvg9y1#
SpriteKit中的粒子不是由对象表示的。这意味着您不能对粒子执行与节点相关的任务,也不能将物理实体与粒子关联以使其与其他内容交互。尽管没有表示发射器节点添加的粒子的可见类,但您可以将粒子视为具有与任何其他对象一样的属性。
这直接来自
SKEmitterNode
文档。粒子不会从场景的physicsWorld
获得任何重力加速度。此外,rainParticles.physicsBody
指的是SKEmitterNodephysicsBody
,而不是它的粒子。如果只是想让粒子模拟当前
physicsWorld
的重力:xytpbqjk2#
默认情况下,粒子不受物理场的影响,但您可以使用
fieldBitMask
更改此设置。我添加了一个径向重力场(你可以使用线性的)
然后在发射器节点中,我简单地设置
fieldBitMask = 1