Как переместить узел из разных мест?

102
8

Я хочу перенести узел дерева влево сначала с центра экрана, а затем справа налево. Он должен выглядеть как бесконечное количество деревьев. У меня нет проблем с первой частью. Вот код:

let tree = SKSpriteNode (imageNamed: "oak")
tree.position = CGPointMake(self.size.width / 2, self.size.height / 2)
self.addChild(tree)
var move = SKAction.moveToX(150, duration: 1)
tree.runAction(move)

Но как сделать вторую часть? Единственное, что я подумал, - это сделать еще один SKSpriteNode с тем же изображением и дать ему еще одну начальную позицию.

Но я чувствую, что должно быть лучшее решение!

Я понял. Может быть, не элегантный, но он работает!

func newPlace() {
tree.position = CGPointMake(self.size.width + 100, self.size.height / 2)
}

override func didMoveToView(view: SKView) {

tree.position = CGPointMake(self.size.width / 2, self.size.height / 2)
self.addChild(tree)

var move = SKAction.moveToX(150, duration: 1)
var place = SKAction.runBlock(newPlace)
var moveAlong = SKAction.moveToX(100, duration: 2)
var seq = SKAction.sequence([place, moveAlong])
var repeat = SKAction.repeatActionForever(seq)
var sequence = SKAction.sequence([move, place, moveAlong, seq, repeat])
tree.runAction(sequence)

}

Может быть, это поможет кому-то.

спросил(а) 2021-01-19T17:20:30+03:00 9 месяцев, 1 неделя назад
1
Решение
66

Я вообще не использую Swift, но этот простой пример должен объяснить, как переместить спрайт с одной стороны на другую сторону экрана и сделать все бесконечным:

import SpriteKit

class GameScene: SKScene {

let tree = SKSpriteNode(color: SKColor .greenColor(), size: CGSizeMake(20,30))

override func didMoveToView(view: SKView) {

println(self.frame.size)

tree.position = CGPointMake(self.frame.size.width + self.tree.size.width, CGRectGetMidY(self.frame))

var move = SKAction.moveToX(-tree.size.width, duration: 3)
var reset = SKAction.runBlock(){
self.tree.position = CGPoint(x: self.frame.size.width+self.tree.size.width, y: self.tree.position.y)
}

var wait = SKAction.waitForDuration(0.5) // Here you can randomize. This will make animation to wait before starts

var sequence = SKAction.sequence([wait,move,reset])

self.tree.runAction(SKAction.repeatActionForever(sequence))

self.addChild(tree)

}

}

Я предполагаю, что размеры вашей сцены установлены правильно, поэтому, когда вы копируете/вставляете и запускаете этот код, вы должны видеть желаемые результаты (он работает для меня). О рандомизации между двумя номерами поиск SO сайта, есть много сообщений, описывающих эту тему.

ответил(а) 2021-01-19T17:20:30+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема