2016-02-17 31 views
5

Hızla dolaşıyorum ve oyuncu merkezi olması için kaydırma görünümü ile karo tabanlı bir oyun yapmaya çalışıyorum. Çalışmak için yöneticim var, ama şu anda orada olan tüm düğümleri yeniden çiziyor gibi görünüyorum, bu yüzden birkaç hamle yaptıktan sonra 1000+ düğümüm var ve oyun durma noktasına geliyor. Sanırım yenilerini çizmeden önce tüm eski düğümleri kaldırmam gerekiyor mu? Bunu yapmanın bir yolunu gördüm, çocukları kaldırmak gibi, ama sonra hareket ettikten sonra çizilen hiçbir şeyle sonuçlanmam.Temel swift/spritekit oyunu - sorun giderme

Aşağıdaki hareketli çizimine bağlı parçaları dahil ettik.

func placeTile2D(tile:Tile, direction:Direction, position:CGPoint) { 
    let tileSprite = SKSpriteNode(imageNamed: textureImage(tile, direction: direction, action: Action.Idle)) 
    if (tile == hero.tile) { 
     hero.tileSprite2D = tileSprite 
     hero.tileSprite2D.zPosition = 1 
    } 
    tileSprite.position = position 
    tileSprite.anchorPoint = CGPoint(x:0,y:0) 
    view2D.addChild(tileSprite) 

} 
func placeAllTiles2D() { 
    let playerPosCur = playerPosition 
    let playerPCX: Int = (Int(playerPosCur.x)) 
    let playerPCY: Int = (-Int(playerPosCur.y)) 
    var w = 1 
    var h = 1 
    for i in (playerPCY - 4) ..< (playerPCY + 4){ 
     let row = tiles[i]; 
     w = 1 
     for j in playerPCX - 4 ..< playerPCX + 4 { 
      let tile = Tile(rawValue: row[j].0)! 
      let direction = Direction(rawValue: row[j].1)! 

      let point = CGPoint(x: (w*tileSize.width), y: -(h*tileSize.height)) 

      if w == 5 { 
       if h == 5 { 
        self.placeTile2D(Tile.Player, direction: .n, position: point) 
       } 
      } 

      w = w + 1 

      placeTile2D(tile, direction : direction, position : point) 
     } 
     h = h + 1 
    } 
} 

Ben oynatıcının etrafında fayans çizmek kullanıyorum, sonra placeAllTiles2D() işlevini oyuncu konumunu değiştirmek ve sonra aramaya kullanıyorum ne olur altına yeni konumuna dayalı redraw'ı ne olduğunu .

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    if let touch = touches.first { 
     let location = touch.locationInNode(view2D) 
     let touchPos2D = location 
     let moveXR = CGPoint(x:1,y:0) 
     let moveXL = CGPoint(x:-1,y:0) 
     let moveYU = CGPoint(x:0,y:1) 
     let moveYD = CGPoint(x:0,y:-1) 
     let beforeMove = playerPosition 
     var afterMove = CGPoint(x:0,y:0) 

     if touchPos2D.x > self.size.width*3/4 { 
      //Move player to right 
      afterMove = beforeMove + moveXR 
     } 
     if touchPos2D.x < self.size.width*1/4 { 
      //Move Player to left 
      afterMove = beforeMove + moveXL 
     } 
     if touchPos2D.y > -self.size.height/2 { 
      if touchPos2D.x < self.size.width*3/4 && touchPos2D.x > self.size.width*1/4 { 
       //Move PLayer Up 
       afterMove = beforeMove + moveYU 
      } 
     } 
     if touchPos2D.y < -self.size.height/2 { 
      if touchPos2D.x < self.size.width*3/4 && touchPos2D.x > self.size.width*1/4 { 
       //Move Player Down 
       afterMove = beforeMove + moveYD 
      } 
     } 


     playerPosition = afterMove 
     placeAllTiles2D() 

    } 
} 

Herhangi bir yardım gerçekten çok takdir edilecektir. Lütfen nazik ol, hızlı bir şekilde ilk seferde!

+1

Sadece yeni sprite oluşturmaya devam ederseniz, o zaman evet, performans tavanına vuracaksınız. Gereksiz sprite'ları yenilerini oluşturmakla birlikte silin ya da sadece yenilerini oluşturmak yerine hareket ettirin/ayarlayın. – courteouselk

+0

@AntonBronnikov cevabınız için teşekkürler, eski sprite'ları silmem gerekecek kadar adil gözüküyor, sadece bunu nasıl yapacağımı merak ediyorum, eğer bir şey yaparsam, self.removeAllChildren() – James

+0

Yeni spritelar yerleştirmeden önce Ben app – James

cevap

3

SKCameraNode kullanıyor olmanız ve bunları fayans oluşturmak ve her kareyi yeniden çizmek yerine görünümü taşıyabilmek için düşünmeniz gerekiyor. Here's a good example

Temel olarak bu gibi çalışır:

var sceneCam: SKCameraNode! //declare your camera variable in your scene class 

Ardından, didMoveToView işlevinde:

sceneCam = SKCameraNode() //initialize your camera 
//scaleAsPoint lets you zoom the camera in and out 
sceneCam.scaleAsPoint = CGPoint(x: 0.25, y: 0.25) 

camera = sceneCam //set the scene's camera 
addChild(sceneCam) //add camera to scene 

//position the camera on the gamescene. 
sceneCam.position = CGPoint(x: frame.center.x, y: frame.center.y) 

Şimdi, sadece aynı pozisyonda olarak kamerayı ayarlayın etrafında çalarınızı taşıdığınızda oyuncu ve senin kayma sahnesine sahip olacaksın. Yorumlara katılıyorum. Sprite kitinin bazı temellerini gözden geçirirseniz, daha iyi bir zaman geçireceksiniz - birlikte geldiği tüm şeyleri öğrenin ve SKCameraNode gibi şeylere bakmaktan kaçınabilirsiniz. SpriteKit'in, bu kamera konsepti gibi, oyunları hızlı ve kolay bir şekilde yapmanıza yardımcı olacak pek çok şeyi var.

İlgili konular