2015-05-28 15 views
8

Sürekli olarak bir cgpath oluşturmam gerekiyor.Çerçevelenmiş dosyalar olmadan sonsuz cgpath oluşturma

func createLine(){ 
     var rand = randomBetweenNumbers(1, 2) 
     currentY-- 
     if rand < 1.5{ 
      currentX-- 
      CGPathAddLineToPoint(leftPath, nil, currentX, currentY) 
     }else{ 
      currentX++ 
      CGPathAddLineToPoint(leftPath, nil, currentX, currentY) 
     } 
     CGPathAddLineToPoint(rightPath, nil, currentX+tileSize, currentY) 
     lineNode.path = leftPath 
     rightNode.path = rightPath 

} 

Ve böyle diyoruz: Şu anda böyle yapmak

NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: Selector("startTile"), userInfo: nil, repeats: true) 

Ama sorun çerçeveleri zamanla alt ve alt damla olmasıdır. Çerçevelemenin artık düşmemesi için değiştirmem gereken bir şey var mı?

Amacım rastgele bir sonsuz yol oluşturmaktır.

+0

ben size yolunun eski parçalarını dökümü gerektiğini tahmin ediyorum. Aksi halde, giderek artan sayıda yol segmentine sahip olursunuz. Alternatif olarak, mevcut yolun sonuna her ulaşıldığında neden yeni bir yol oluşturulmaz? – sangony

+0

Gerçekten yeni bir yol oluşturamıyorum, çünkü sonsuz olması gerekiyor ya da en azından oyuncu için yeni bir yol görünmüyor. – Christian

+2

Bu, [satır önbelleğe alma] konusunda yardımcı olur (http://stackoverflow.com/questions/24553245/poor-performance-with-skshapenode-in-sprite-kit) – 0x141E

cevap

4

Sürekli olarak artan sayıda çizgi çizerken yüksek bir FPS sayımını sürdürmenin anahtarı, sahneye daha fazla çizgi eklemenin kare hızını çok az veya hiç etkilemediği bir duruma hızla ulaşmaktır. Bunu başarmanın en az iki yolu vardır.

Bu iki yöntemden en basit olanı, önceden çizilmiş çizgilerin periyodik olarak SKTexture sürümüne dönüştürülmesi ve sonuçları SKSpriteNode'un dokuları olarak görüntülemektir. İşte adımlar şunlardır:

  1. yeni çizgiler
  2. çizmek için kullanılacak
  3. bir SKShapeNode Oluştur çizgi tuval olarak kullanılacak bir SKSpriteNode Oluştur hat kap olarak kullanılmak üzere bir SKNode oluştur
  4. şekil düğümün path özelliğini kullanarak, bağlı çizgi parçaları bir dizi çizim kap
  5. için sahne ve tuval ve şekil düğüme kabı ekleyin
  6. Satır sayısı önceden belirlenen bir değere ulaştığında, kapsayıcının içeriğini bir 'SKTexture' haline dönüştürün
  7. Tuvalin doku özelliğini SKTexture'a ayarlayın. İşte 7

çizer Swift örnek bir uygulama var - tuval ayrıca kabın bir çocuk olduğu için, içeriği de doku

  • Lather eklenecektir olduğunu, durulama Not tekrarlayın 5. adımları iPhone 6 cihazda 60 FPS hızında çizgilerin sonsuz kümesi (sen değil simülatörü olan bir cihazda performansını test etmelidir):

    class GameScene: SKScene { 
        // 1. Create container to hold new and old lines 
        var lineContainer = SKNode() 
        // 2. Create canvas 
        var lineCanvas:SKSpriteNode? 
        // 3. Create shape to draw new lines 
        var lineNode = SKShapeNode() 
    
        var lastDrawTime:Int64 = 0 
        var lineCount = 0 
        var timeScan:Int64 = 0 
        var path = CGPathCreateMutable() 
    
        var lastPoint = CGPointZero 
    
        override func didMoveToView(view:SKView) { 
         scaleMode = .ResizeFill 
    
         // 4. Add the container to the scene and the canvas to the container 
         addChild(lineContainer) 
         lineCanvas = SKSpriteNode(color:SKColor.clearColor(),size:view.frame.size) 
         lineCanvas!.anchorPoint = CGPointZero 
         lineCanvas!.position = CGPointZero 
         lineContainer.addChild(lineCanvas!) 
         lastPoint = CGPointMake(view.frame.size.width/2.0, view.frame.size.height/2.0) 
        } 
    
        // Returns a random value in the specified range 
        func randomInRange(minValue:CGFloat, maxValue:CGFloat) -> CGFloat { 
         let r = CGFloat(Double(arc4random_uniform(UInt32.max))/Double(UInt32.max)) 
         return (maxValue-minValue) * r + minValue 
        } 
    
        func drawLine() { 
         if (CGPathIsEmpty(path)) { 
          // Create a new line that starts where the previous line ended 
          CGPathMoveToPoint(path, nil, lastPoint.x, lastPoint.y) 
          lineNode.path = nil 
          lineNode.lineWidth = 1.0 
          lineNode.strokeColor = SKColor.blueColor() 
          lineNode.zPosition = 100 
          lineContainer.addChild(lineNode) 
         } 
         // Add a random line segment 
         let x = randomInRange(size.width*0.1, maxValue: size.width*0.9) 
         let y = randomInRange(size.height*0.1, maxValue: size.height*0.9) 
         CGPathAddLineToPoint(path, nil, x, y) 
         lineNode.path = path 
         // Save the current point so we can connect the next line to the end of the last line 
         lastPoint = CGPointMake(x, y) 
        } 
    
        override func update(currentTime: CFTimeInterval) { 
         let lineDrawTime = timeScan/10 
         // 5. Draw a new line every 10 updates. Increment line count 
         if (lineDrawTime != lastDrawTime) { 
          drawLine() 
          ++lineCount 
         } 
         // 6. and 7. Add all newly and previously drawn lines to the canvas 
         if (lineCount == 8) { 
          addLinesToTexture() 
          lineCount = 0 
         } 
         lastDrawTime = lineDrawTime 
         ++timeScan 
        } 
    
        func addLinesToTexture() { 
         // Convert the contents of the line container to an SKTexture 
         let texture = self.view!.textureFromNode(lineContainer) 
         // Display the texture 
         lineCanvas!.texture = texture 
         // Start a new line 
         lineNode.removeFromParent() 
         path = CGPathCreateMutable() 
        } 
    } 
    
  • +0

    Çizginin "kaybolması" nı isterseniz, her kısmi segmentin öncekinden biraz daha alfa olması gibi bir şey varsa ne olur? Bu cevap hala geçerli mi? Ne ima ettiğin alternatif yöntemden ne haber? – Andrew

    +0

    @Gelişmiş bu yaklaşım, devam eden çok sayıda çizgi çizen oyunlar içindir.Zamanla değişebilen ('strokeColor' özelliğini değiştirerek) solgun bir SKShapeNode dizisi oluşturmanızı öneririm. – 0x141E