2016-02-17 9 views
5

Grałem szybko i próbowałem stworzyć grę opartą na kafelkach z przewijanym widokiem, więc gracz jest w centrum. Mam menedżera, który ma go do roboty, ale wydaje mi się, że przerysowuję wszystkie węzły nad tym, co jest obecnie, więc po kilku ruchach mam ponad 1000 węzłów, a gra się zatrzymuje. Zgaduję, że muszę usunąć wszystkie stare węzły przed rysowaniem nowych? Spojrzałem na to, jak to zrobić, na przykład usuwając dzieci, ale w końcu nie mam nic po narysowaniu.Podstawowa gra szybka/spritekit - problemy z przerysowaniem

Dołączyłem części, które są połączone z rysunkiem ikonki poniżej.

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 
    } 
} 

to co używam do rysowania płytek wokół odtwarzacza, a następnie poniżej jeśli co używam, aby zmienić pozycję gracza, a następnie wywołać funkcję placeAllTiles2D() do przerysowywania na podstawie nowej pozycji .

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() 

    } 
} 

Każda pomoc będzie bardzo ceniona. Proszę, bądźcie łagodni, to moja pierwsza wizyta we wszystkim, co szybkie!

+1

Jeśli będziesz tworzyć tylko nowe duszki, to tak, ostatecznie osiągniesz pułap wydajności. Usuń niepotrzebne sprite'y razem z tworzeniem nowych lub po prostu przesuń/dostosuj je zamiast tworzyć nowe. – courteouselk

+0

@AntonBronnikov dziękuję za odpowiedź, wydaje się być na tyle fair, że muszę usunąć stare sprite'y, po prostu zastanawiam się, jak to zrobić, jeśli zrobię coś takiego jak self.removeAllChildren() – James

+0

Przed umieszczeniem nowych duszków, a następnie po przeniesieniu niczego jest rysowany po uruchomieniu aplikacji – James

Odpowiedz

3

Musisz użyć SKCameraNode i pomyśleć o tym, jak przesuwać widok, zamiast odradzania się płytek i przerysowywania każdej klatki. Here's a good example

zasadzie to działa tak:

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

Następnie w funkcji didMoveToView:

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) 

Teraz, po przeniesieniu odtwarzacza dookoła, wystarczy ustawić aparat w tej samej pozycji co odtwarzacz, a będziesz mieć scenę przewijania. Zgadzam się z komentarzami. Będziesz mieć o wiele lepszy czas, jeśli przejrzysz niektóre z podstaw zestawu ikonek - dowiedz się o wszystkich rzeczach, z którymi jest on wyposażony, i unikaj takich rzeczy, jak SKCameraNode. Jest wiele rzeczy, które SpriteKit robi dla Ciebie, takich jak ta koncepcja aparatu, aby pomóc w tworzeniu gier szybko i łatwo.