Swift:SKEmitterNode受PhysicsWorld引力影响?

8aqjt8rx  于 2023-04-04  发布在  Swift
关注(0)|答案(2)|浏览(105)

我试图有一个雨粒子,这是受风又名物理世界引力。
我可以看到重力确实对我的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

qoefvg9y

qoefvg9y1#

SpriteKit中的粒子不是由对象表示的。这意味着您不能对粒子执行与节点相关的任务,也不能将物理实体与粒子关联以使其与其他内容交互。尽管没有表示发射器节点添加的粒子的可见类,但您可以将粒子视为具有与任何其他对象一样的属性。
这直接来自SKEmitterNode文档。粒子不会从场景的physicsWorld获得任何重力加速度。此外,rainParticles.physicsBody指的是SKEmitterNode physicsBody,而不是它的粒子。
如果只是想让粒子模拟当前physicsWorld的重力:

rainParticles.xAcceleration = self.physicsWorld.gravity.dx
rainParticles.yAcceleration = self.physicsWorld.gravity.dy
xytpbqjk

xytpbqjk2#

默认情况下,粒子不受物理场的影响,但您可以使用fieldBitMask更改此设置。
我添加了一个径向重力场(你可以使用线性的)

let fieldNode = SKFieldNode.radialGravityField();
    fieldNode.position = center
    fieldNode.falloff = 0;
    fieldNode.strength = -0.03;
    fieldNode.animationSpeed = 5;
    fieldNode.categoryBitMask = 1

然后在发射器节点中,我简单地设置fieldBitMask = 1

class MyNode:SKEmitterNode{
    
    override init() {
  
        super.init()

        //Snip   

        fieldBitMask = 1
    }

}

相关问题