2016-02-17 7 views
5

मैं चारों ओर तेजी से साथ खेल रहे हैं और एक स्क्रॉल दृश्य के साथ एक टाइल आधारित खेल बनाने के लिए तो खिलाड़ी केंद्रीय है कोशिश कर रहे हैं। मैं प्रबंधक है जिस तरह का काम करने के लिए इसे पाने के लिए, लेकिन मैं क्या वर्तमान में है की चोटी पर सभी नोड्स redrawing जा करने के लिए, तो मैं 1000 से अधिक नोड्स है और इस खेल को एक रोकने के लिए grinds कुछ चलता रहता है के बाद लग रहे हैं। मुझे लगता है कि नए ड्राइंग करने से पहले मुझे सभी पुराने नोड्स को हटाने की ज़रूरत है? मैंने बच्चों को हटाने की तरह इसे करने के तरीकों पर एक नज़र डाली है, लेकिन फिर मैं आगे बढ़ने के बाद तैयार नहीं हुआ।बेसिक तेज/SpriteKit खेल - मुसीबत redrawing

मैं भागों है कि नीचे स्प्राइट ड्राइंग से जुड़े हैं शामिल किया है।

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

क्या मैं खिलाड़ी के आसपास टाइल आकर्षित करने के लिए उपयोग कर रहा हूँ, और अगर मैं क्या खिलाड़ी स्थिति बदलने के लिए और उसके बाद फोन placeAllTiles2D() फ़ंक्शन का उपयोग कर रहा नीचे तो नई स्थिति के आधार पर पुनः बनाने का है ।

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

    } 
} 

किसी भी मदद की वास्तव में बहुत सराहना की जाएगी। कृपया नम्र रहो, यह मेरा पहला कदम तेजी से कुछ भी है!

+1

आप केवल नए स्प्राइट बनाने रखने के लिए तो हाँ अंततः आप प्रदर्शन छत मारा जाएगा। या तो नए बनाने के साथ अनियंत्रित sprites को हटा दें, या केवल नए बनाने के बजाय उन्हें स्थानांतरित/समायोजित करें। – courteouselk

+0

@ एंटोनब्रोनिकोव उत्तर के लिए धन्यवाद, ऐसा लगता है कि मुझे पुराने sprites को हटाने की जरूरत है, मैं बस यह सोच रहा हूं कि यह कैसे करें, अगर मैं self.removeAllChildren() – James

+0

कुछ ऐसा करता हूं तो नए sprites को रखने से पहले कुछ भी नहीं चलने के बाद जब मैं ऐप चलाता हूं – James

उत्तर

3

आप SKCameraNode का उपयोग कर सकता है और व्यूपोर्ट के बजाय चारों ओर स्पॉन टाइल्स चलती है और उन्हें हर फ्रेम redrawing के रूप में इसके बारे में सोचने की जरूरत। तब

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

, अपने didMoveToView समारोह में: Here's a good example

मूल रूप से यह इस प्रकार काम करता

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) 

अब, जब आप अपने खिलाड़ी चारों ओर ले जाने के लिए, बस के रूप में एक ही स्थिति के लिए कैमरा सेट खिलाड़ी, और आपके पास स्क्रोलिंग दृश्य होगा। मैं टिप्पणियों से सहमत हूं। आप आप स्प्राइट किट की बुनियादी बातों में से कुछ की समीक्षा करते हैं इस पर एक बहुत अच्छा समय है करने के लिए जा रहे हैं - सामग्री के बारे में यह सब के साथ आता है जानने के लिए, और आप SKCameraNode जैसी चीजों की ओर मुख से बच सकते हैं। खेल को तेज़ी से और आसानी से बनाने में मदद करने के लिए, इस कैमरे की अवधारणा की तरह, स्प्राइटकिट आपके लिए बहुत सी चीजें करता है।