swift, как добавить SKEmitterNode в качестве дымового следа за SKSpriteNode?

Я пытаюсь оставить след дыма за своим космическим кораблем. У меня есть дымовая дорожка в качестве узла-излучателя, но я не могу прикрепить излучатель к космическому кораблю.

Я не могу понять, почему это не работает. т.е. эмиттер вообще не отображается на экране:

    var spaceShip: SKSpriteNode?
    spaceShip = SKSpriteNode(imageNamed: "ship1.png")
    spaceShip!.position = CGPoint(x: Int(arc4random_uniform(UInt32(self.size.width))), y: Int(arc4random_uniform(UInt32(self.size.height))))

    let trailEmmiter = SKEmitterNode(fileNamed: "trailParticle.sks")
    trailEmmiter!.name = "trailNode"
    trailEmmiter!.position = CGPointMake(((plane?.size.width)!/2), ((plane?.size.height)!/2))
    trailEmmiter!.zPosition = 100 //much over everything else
    spaceShip!.addChild(trailEmmiter!)
    self.addChild(spaceShip!)

но это работает. т.е. он помещает мой след дыма в случайное место на экране.

    let trailEmmiter2 = SKEmitterNode(fileNamed: "trailParticle.sks")
    trailEmmiter2!.name = "trailNode"
    trailEmmiter2!.position = CGPoint(x: Int(arc4random_uniform(UInt32(self.size.width))), y: Int(arc4random_uniform(UInt32(self.size.height))))
    trailEmmiter2!.zPosition = 100 //much over everything else
    self!.addChild(trailEmmiter2!)

Как я могу оставить след дыма позади космического корабля?


person user594883    schedule 11.06.2016    source источник
comment
напечатайте trailEmitter.position после этой строки: trailEmmiter!.position = CGPointMake(((plane?.size.width)!/2),((plane?.size.height)! и вставьте сюда результат. Также обратите внимание, что вы не должны использовать принудительную развертку таким образом. Это небезопасно. Вместо этого лучше использовать необязательную привязку.   -  person Whirlwind    schedule 13.06.2016
comment
@Whirlwind У меня есть три спрайта, поэтому print("trailEmitter!.position: \(trailEmitter!.position)") выполняется три раза со следующими результатами: trailEmitter!.position: (263.0, 213.0) trailEmitter!.position: (374.0, 155.0) trailEmitter!.position: (209.0, 74.0)   -  person user594883    schedule 13.06.2016
comment
Обратите внимание, что когда вы добавляете дочерний узел к его родителю, он будет добавлен в систему координат родителей. Итак, что вам нужно, так это установить местоположение его эмиттеров относительно его родителя... Просто для теста установите CGZeroPoint для положения эмиттеров. Это поместит их в точное положение, где находится их родитель.   -  person Whirlwind    schedule 13.06.2016
comment
@Whirlwind результат: trailEmitter!.position: (0.0, 0.0) trailEmitter!.position: (0.0, 0.0) trailEmitter!.position: (0.0, 0.0)но эмиттеры по-прежнему не видны на экране.   -  person user594883    schedule 13.06.2016
comment
Ну это странно. Хорошо, можно увидеть, видны ли родительские узлы? Потому что, если вы видите родителя, вы должны видеть узел эмиттера, если его позиция равна (0,0).   -  person Whirlwind    schedule 13.06.2016
comment
@Whirlwind Да, родительские узлы, то есть spaceShip: SKSpriteNode?, видны на экране.   -  person user594883    schedule 13.06.2016
comment
Вы можете загрузить репозиторий на GitHub, который может воспроизвести проблему, о которой вы говорите, поэтому, надеюсь, кто-нибудь (или я, позже сегодня) взглянет на нее и найдет, в чем проблема.   -  person Whirlwind    schedule 13.06.2016
comment
@Whirlwind спасибо за вашу помощь, но мне удалось понять это. Я установил масштаб спрайта на 0,1, что сделало эмиттер практически невидимым.   -  person user594883    schedule 13.06.2016
comment
Нет проблем, пожалуйста, рад слышать, что вы разобрались.   -  person Whirlwind    schedule 13.06.2016
comment
Если вы хотите добавить след позади корабля. Сначала вы делаете zPosition вашего корабля. Во-вторых, вы добавляете рельсы на корабль, делая корабль родителем следа! Например, ship.addChild(trailEmmiter2). Однозначно решит вашу проблему.   -  person Raksha Saini    schedule 14.06.2016


Ответы (1)


Сначала создайте глобальный объект SKEmitterNode! Для XCode 6

var sparkEmmiter:SKEmitterNode!

Создать функцию узла эмиттера!

func addTrailToTwinkle(){
    let sparkEmmitterPath               =   NSBundle.mainBundle().pathForResource("PierrePath", ofType: "sks")!
    // PierrePath is the EmitterNode name!
    sparkEmmiter                        =   NSKeyedUnarchiver.unarchiveObjectWithFile(sparkEmmitterPath) as SKEmitterNode
    sparkEmmiter.position               =   CGPointMake(15, -15.0)
    sparkEmmiter.name                   =   "PierrePath"
    sparkEmmiter.zPosition              =   22.0
    sparkEmmiter.targetNode             =   self.scene 
    ship.addChild(sparkEmmiter)
    //Here ship is the Target node. where Trail Added.
}

Теперь используйте функцию addTrailToTwinkle(), чтобы создать след позади корабля. Когда хотите создать след.

addTrailToTwinkle()

Вот свойство эмиттерного узла!

Вот изображение свойств EmitterNode

person Raksha Saini    schedule 14.06.2016