2016-02-17 17 views
5

Tôi đã chơi thử một cách nhanh chóng và cố gắng tạo một trò chơi xếp hình bằng chế độ xem cuộn để người chơi là trung tâm. Tôi đã quản lý để có được nó để loại công việc, nhưng tôi dường như được vẽ lại tất cả các nút trên đầu trang của những gì hiện đang có, vì vậy sau một vài di chuyển tôi có 1000 + nút và trò chơi xay để dừng lại. Tôi đoán tôi cần phải loại bỏ tất cả các nút cũ trước khi vẽ các nút mới? Tôi đã xem xét cách để làm điều này, như loại bỏ trẻ em, nhưng sau đó tôi kết thúc với không có gì rút ra sau khi di chuyển.Trò chơi swift/spritekit cơ bản - gặp khó khăn khi vẽ lại

Tôi đã bao gồm các phần được kết nối với bản vẽ sprite bên dưới.

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

là những gì tôi đang sử dụng để vẽ các gạch xung quanh các cầu thủ, và sau đó dưới đây nếu những gì tôi đang sử dụng để thay đổi vị trí cầu thủ và sau đó gọi các placeAllTiles2D() để vẽ lại dựa trên vị trí mới .

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

    } 
} 

Mọi trợ giúp sẽ được đánh giá rất nhiều. Hãy nhẹ nhàng, lần đầu tiên tôi đi bất cứ điều gì nhanh chóng!

+1

Nếu bạn chỉ tiếp tục tạo sprites mới thì có thì cuối cùng bạn sẽ đạt trần hiệu suất. Xóa các sprites không cần thiết cùng với việc tạo các ảnh mới hoặc chỉ di chuyển/điều chỉnh chúng thay vì tạo các ảnh mới. – courteouselk

+0

@AntonBronnikov cảm ơn câu trả lời, có vẻ đủ công bằng mà tôi cần phải xóa các hình ảnh cũ, tôi chỉ tự hỏi làm thế nào để làm điều này, nếu tôi làm một cái gì đó như self.removeAllChildren() – James

+0

Trước khi đặt sprites mới sau đó sau khi di chuyển không có gì được vẽ khi tôi chạy ứng dụng – James

Trả lời

3

Bạn cần sử dụng SKCameraNode và suy nghĩ về nó khi di chuyển khung nhìn xung quanh thay vì gạch sinh sản và vẽ lại chúng mỗi khung. Here's a good example

Về cơ bản nó hoạt động như thế này:

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

Sau đó, trong chức năng didMoveToView của bạn:

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) 

Bây giờ, khi bạn di chuyển máy nghe nhạc của bạn xung quanh, chỉ cần đặt máy ảnh đến vị trí tương tự như người chơi và bạn sẽ có cảnh cuộn của mình. Tôi đồng ý với ý kiến. Bạn sẽ có một thời gian tốt hơn ở đây nếu bạn xem xét một số nguyên tắc cơ bản của bộ kit ma - tìm hiểu về tất cả những thứ mà nó đi kèm, và bạn có thể tránh nhìn những thứ như SKCameraNode. Có rất nhiều thứ SpriteKit làm cho bạn, giống như khái niệm máy ảnh này, để giúp làm cho trò chơi nhanh chóng và dễ dàng.

Các vấn đề liên quan