2016-07-24 11 views
2

Ich brauche deinen Rat, ich bin neu in SpriteKit Ich muss Animationsstreifen machen. Ich habe 3 Lösungen, um es zu machen, aber ich brauche einen besseren und weniger kostspieligen Rat für die CPU.SpriteKit Animation

  • 1 Lösung: jeder Streifen - SKSpriteNode mit Animation und Textur
  • 2 Lösung: Hintergrundvideo
  • 3 Lösung: jeder Streifen - SKShapeNode mit Animation

enter image description here

+1

Die höchste Leistung in Bezug auf CPU-Auslastung wäre die Verwendung einer Reihe von PNG-Bildern, die vor der Hand decodiert und dann mit SKAction animiert werden. Der Nachteil bei diesem Ansatz ist viel Speicherverbrauch. Ein Hintergrundvideo wird wahrscheinlich nicht in der Lage sein, 60 FPS-Framerate zu verarbeiten. Der SKShapeNode-Ansatz kann eine Menge CPU verbrauchen, da jeder Frame gerendert werden muss. – MoDJ

+1

einfache farbige Sprites sind schneller als texturierte Sprites und können beliebig dimensioniert werden. – BadgerBadger

+0

@MoDJ Ich würde zustimmen, dass in diesem Fall keine Texturen benötigt werden ... – Whirlwind

Antwort

2

Dies ist Eine einfache Aufgabe, Sie müssen keine Atlas-Animation erstellen oder SKShapeNode verwenden, können Sie SKSpriteNode als diesen Code verwenden:

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

Erstellen Sie n Bars mit zufälliger Größe, und verwenden Sie SKAction, um sie zu verschieben.

Mit diesem Ansatz wird Ihre Animation jedes Mal anders sein, wenn Sie es starten.

-Code in Details:

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

Okay, danke. Ich denke skspitenode ist es ein besserer Weg, aber ich bezweifle es –

+0

Was sind deine Zweifel? –

+0

Über die Leistung. Ich hatte eine Menge Probleme mit CPU-Leistung, und ich möchte die besten Lösungen für diese finden –

0

Ihre Frage zu beantworten, Lösung 3 ist die kostengünstigste Methode für Ihre CPU. Here're mehr Gründe, warum dies der Fall ist:

1. Die erste Lösung, die Sie SKSpriteNode mit Animation und Textur“benötigen Sie die Computer sind darauf hindeutet, die Textur der Ansicht zu laden Wenn Sie mehr .png Dateien haben. Das würde bedeuten, dass der Computer alle diese Dateien laden müsste, aber wenn Sie SKShapeNode verwenden würden, würden Sie dies vermeiden, und Sie würden billig das gleiche Aussehen erzeugen, da die SKShapeNode nicht auf einem Bild basiert.

2. Lösung 2 ist am teuersten für Ihre CPU, weil Sie ein Video laufen lassen, das benötigt viel Platz in Ihrem Speicher, der sogar Verzögerungen verursachen könnte, wenn Sie es auf Ihrem Telefon ausführen.

Auch, nur eine andere Sache zu beachten: Wenn Sie Lösung 1 und 2 ausgiebig verwenden würden Sie am Ende so viel Speicher verwenden. Aber wenn Sie die Lösung 3 verwenden, werden Sie nicht damit umgehen.

+0

Eigentlich ist 'SKShapeNode' hier die schlechteste Lösung. Es erfordert einen Zeichenaufruf pro Knoten und wird die Leistung stark beeinträchtigen, wenn es nicht sparsam verwendet wird. Übrigens, warum würden Sie jemals "SKShapeNode" für diesen speziellen Fall anstelle eines farbigen "SKSpriteNode" verwenden, der im Gegensatz zu "SKShapeNode" kann in Chargen gerendert werden? IMO, 'SKShapeNode' ist nicht einmal erwähnenswert für das aktuelle Problem. – Whirlwind

1

Wenn Ihre Streifen nur einfache Rechtecke sind, können Sie SKSpriteNodes verwenden und ihnen nur Abmessungen und eine Farbe geben und dann Aktionen verwenden, um sie zu animieren. Sie können die Rechtecke drehen, um den Effekt zu erzielen, den Sie im Bild zeigen.

Sie könnten tatsächlich die gesamte Animation in Xcode mit dem Editor erstellen, speichern Sie es in einer eigenen SKS-Datei und laden Sie die Animation mit einem SKReferenceNode.

0

Eine andere Option, zusätzlich zu den bereits beschriebenen, wäre es, einen GLSL-Shader für den Hintergrund zu schreiben. Wenn du nur einen coolen Hintergrund haben möchtest, der nicht mit dem Rest deines Spiels interagiert, wäre dies wahrscheinlich die performanteste Option, da dies alles auf der GPU passieren würde.

Sie könnten sogar die Rechtecke rendern, ohne irgendwelche Bilder zu benötigen, da sie nur Farbflächen sind.

Es gibt eine anständige Einführung in das Thema hier: Battle of Brothers GLSL Introduction.