2016-07-24 2 views
2

Мне нужен ваш совет, я новичок в SpriteKit Мне нужно сделать анимационные полосы. У меня есть 3 решения, чтобы сделать это, но мне нужен совет, который лучше и дешевле для CPU.анимация SpriteKit

  • 1 решение: каждая полоса - SKSpriteNode с анимацией и текстуры
  • 2 Решение: фон видео
  • 3 раствора: каждая полоса - SKShapeNode с анимацией

enter image description here

+1

Наивысшая производительность с точки зрения использования ЦП будет заключаться в использовании серии изображений PNG, которые декодируются перед началом работы, а затем анимируются с помощью SKAction. Недостатком такого подхода является использование памяти. Фоновое видео, вероятно, не сможет обрабатывать 60 кадров в секунду FPS. Подход SKShapeNode может потреблять много CPU, потому что каждый кадр должен быть визуализирован. – MoDJ

+1

простые цветные спрайты быстрее, чем текстурированные, и их можно сделать в любом измерении. – BadgerBadger

+0

@MoDJ Я бы согласился, что в этом случае не нужны текстуры ... – Whirlwind

ответ

2

Это простая задача, вам не нужно создавать анимацию атласа или использовать SKShapeNode, вы можете использовать SKSpriteNode в качестве этого кода:

var bar = SKSpriteNode(color: SKColor.greenColor(), size: CGSizeMake(40, 200)) 
barra.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
self.addChild(barra) 

Постройте n баров произвольного размера и используйте SKAction, чтобы переместить их.

При таком подходе ваша анимация будет отличаться при каждом запуске.

Код в деталях:

class GameScene: SKScene { 
    var bars: [SKSpriteNode]! 
    var totBars : Int = 50 
    override func didMoveToView(view: SKView) { 
     self.backgroundColor = SKColor(red: 131/255, green: 190/255, blue: 177/255, alpha: 1) 
     let redBarColor = SKColor(red: 204/255, green: 75/255, blue: 75/255, alpha: 1) 
     let yellowBar = SKColor(red: 253/255, green: 242/255, blue: 160/255, alpha: 1) 
     // add here your colors 
     var colorSelected:SKColor = redBarColor 
     bars = [SKSpriteNode]() 
     for i in 0..<totBars-1 { 
      let colorNum = randomNumber(1...2) 
      switch (colorNum) { 
      case 1: 
       colorSelected = redBarColor 
      case 2: 
       colorSelected = yellowBar 
      default: 
      break 
      } 
      let randomWidth = randomCGFloat(5,max:40) 
      let randomHeight = randomCGFloat(30,max:400) 
      let bar = SKSpriteNode.init(color: colorSelected, size: CGSizeMake(randomWidth, randomHeight)) 
      bar.zRotation = -45 * CGFloat(M_PI/180.0) 
      bar.name = "bar\(i)" 
      self.addChild(bar) 
      bars.append(bar) 
     } 
     animateBars() 
    } 
    func animateBar(bar:SKSpriteNode) { 
     print("- \(bar.name) start!") 
     let deltaX = self.randomCGFloat(0,max:self.frame.maxX) 
     let deltaY:CGFloat = self.frame.maxY/2 
     let rightPoint = CGPointMake(self.frame.maxX + deltaX,self.frame.maxY + deltaY) 
     let leftPoint = CGPointMake(-self.frame.maxX + deltaX,-self.frame.maxY + deltaY) 
     bar.position = rightPoint 
     let waitBeforeExit = SKAction.waitForDuration(Double(self.randomCGFloat(1.0,max:2.0))) 
     let speed = self.randomCGFloat(150,max:300) 
     let move = SKAction.moveTo(leftPoint, duration: self.getDuration(rightPoint, pointB: leftPoint, speed: speed)) 
     bar.runAction(SKAction.sequence([waitBeforeExit,move]), completion: { 
      print("\(bar.name) reached position") 
      self.animateBar(bar) 
     }) 
    } 
    func animateBars() { 
     for bar in bars { 
      animateBar(bar) 
     } 
    } 
    func getDuration(pointA:CGPoint,pointB:CGPoint,speed:CGFloat)->NSTimeInterval { 
     let xDist = (pointB.x - pointA.x) 
     let yDist = (pointB.y - pointA.y) 
     let distance = sqrt((xDist * xDist) + (yDist * yDist)); 
     let duration : NSTimeInterval = NSTimeInterval(distance/speed) 
     return duration 
    } 
    func randomCGFloat(min: CGFloat, max: CGFloat) -> CGFloat { 
     return CGFloat(Float(arc4random())/Float(UINT32_MAX)) * (max - min) + min 
    } 
    func randomNumber(range: Range<Int> = 1...6) -> Int { 
     let min = range.startIndex 
     let max = range.endIndex 
     return Int(arc4random_uniform(UInt32(max - min))) + min 
    } 
} 
+0

Хорошо, спасибо. Я думаю skspitenode это лучший способ, но я сомневаюсь в этом –

+0

В чем ваши сомнения? –

+0

О производительности. У меня было много проблем с производительностью cpu, и я хочу найти лучшие решения для этого –

0

Чтобы ответить на ваш вопрос, решение 3 является наименее дорогостоящим методом для вашего процессора. Here're несколько причин, почему это так:

1. Первое решение, которое вы предлагаете SKSpriteNode с анимацией и текстурой»требуют компьютер, чтобы загрузить текстуру зрения Если у вас есть несколько .png файлов. это означало бы, что компьютеру придется загружать все эти файлы. Но если вы должны были использовать SKShapeNode, вы бы этого не сделали, и вы бы дешево создавали те же взгляды, что и у SKShapeNode не на основе изображения.

2. Решение 2 является самым дорогостоящим для вашего ЦП, поскольку выполняется видео. Это занимает много места в вашем память, которая может даже создавать задержки, если вы запустите ее на своем телефоне.

Кроме того, еще одно замечание: если вы должны широко использовать решения 1 и 2, вы в конечном итоге используете так много памяти. Но если вы используете Решение 3, вы не будете иметь дело с этим.

+0

Собственно, 'SKShapeNode' - самое худшее решение здесь, несмотря ни на что. Для этого требуется один призыв на один узел и сильно ухудшит производительность, если не будет использоваться экономно ... Кстати, зачем вам когда-либо использовать «SKShapeNode» для этого конкретного случая вместо цветного «SKSpriteNode», который, в отличие от «SKShapeNode», может выставляться партиями? IMO, «SKShapeNode» даже не стоит упоминать о текущей проблеме. – Whirlwind

1

Если ваши полосы - это просто простые прямоугольники, вы можете использовать SKSpriteNodes и давать только их размеры и цвет, а затем использовать действия для их анимации. вы можете поворачивать прямоугольники, чтобы дать эффект, который вы показываете на картинке.

Вы можете создать всю анимацию в Xcode с помощью редактора, сохранить ее в своем собственном файле SKS и загрузить анимацию с помощью SKReferenceNode.

0

Еще один вариант, помимо уже выдвинутых, заключался бы в написании шейдера GLSL для фона. Если вам просто нужен прохладный фон, который не будет взаимодействовать с остальной частью вашей игры, это, вероятно, будет самым эффективным вариантом, поскольку все это произойдет на графическом процессоре.

Вы могли бы даже, возможно, визуализировать прямоугольники, не требуя каких-либо изображений вообще, так как они являются только областями цвета.

Существует приличное введение в тему здесь: Battle of Brothers GLSL Introduction.

Смежные вопросы