2017-07-15 31 views
2

我正在嘗試使用SpriteKit製作一款蛇遊戲(就像舊諾基亞手機中的那種)。問題是,當蛇的方向發生變化時,蛇會在一個垂直的塊中移動,並且不會變成L形(如圖所示)。爲了進入上下文,我有一個名爲SKDSpriteNode的類,它是相同的SKSpriteNode,具有額外的direction屬性; Snake類具有directionlength屬性。有一個snakeBody屬性,類型爲[SKDSpriteNode],包含蛇體的節點。蛇在垂直塊中移動

當遊戲開始時,蛇的方向被分配給.up,然後它被用戶的滑動分配。 順便說一下,changeDirection方法被調用時,蛇的方向改變(與didSet)。下面的代碼和PIC:我需要張貼作爲回答,以顯示你的代碼

extension ClassicLevelScene { 

func startGame() { snake.direction = .up; moveSnake() } 

func checkPlacement(for node: SKDSpriteNode) -> SKAction { 
    return SKAction.run({ 
     if !(node.isInsideFrame(of: self)) { self.gameOver() } 
    }) 
} 

func getMovement(for node: SKDSpriteNode) -> (once: SKAction, repetitive: SKAction) { 
    let movement = SKAction.move(by: node.direction.getVector(withIntensity: movementSpeed), duration: 0.5) 
    let moveAction = SKAction.sequence([movement, checkPlacement(for: node)]) 
    let repetitiveMoveAction = SKAction.repeatForever(moveAction) 
    return (moveAction, repetitiveMoveAction) 
} 

func moveSnake() { 
    for node in snakeBody { 
     node.removeAllActions() 
     node.run(getMovement(for: node).1) 
    } 
} 

func moveOnce() { 
    for node in snakeBody { 
     node.removeAllActions() 
     node.run(getMovement(for: node).0) 
    } 
} 

func changeDirection() { 
    for i in 0..<snake.length { 
     if i == 0 { 
      snakeBody[i].direction = snake.direction 
      snakeBody[i].run(SKAction.move(by: snakeBody[i].direction.getVector(withIntensity: movementSpeed), duration: 0.5)) 
     } else { 
      snakeBody[i].direction = snakeBody[i-1].direction 
      snakeBody[i].run(SKAction.move(to: snakeBody[i-1].oldPosition, duration: 0.5)) 
     } 
    } 
} 

screenshot

+0

我不知道爲什麼你正在做的所有這些計算性能在你的代碼,簡單=就足夠了 – Knight0fDragon

+0

好吧,我認爲你是對的。我在這個應用程序中得到了計算屬性的需求cz – Fayyouz

+0

我真的希望我能幫助你,但是代碼中有太多的事情要做,而且它需要更復雜。我會專注於清理代碼,以便更好地理解。從我所知道的情況來看,你正在增加很多動作,並且你從不顯示方向是如何計算的,並且其中任何一個都可能導致問題 – Knight0fDragon

回答

2

,但你應該只動的人頭,並讓尾巴拖後面。現在有更好的方法來做到這一點,但對於簡化代碼,你已經寫了,這裏是它應該是什麼樣子

extension ClassicLevelScene { 

    func startGame() { snake.direction = .up; moveSnake() } 

    func checkPlacement(for node: SKSpriteNode) -> SKAction { 
     return SKAction.run({ 
      if !(node.isInsideFrame(of: self)) { self.gameOver() } 
     }) 
    } 

    func getMovement(for node: SKDSpriteNode) -> (once: SKAction, repetitive: SKAction) { 
     let movement = SKAction.move(by: node.direction.getVector(withIntensity: movementSpeed), duration: 0.5) 
     let moveTail = SKAction.run({self.moveTail()}) 
     let moveAction = SKAction.sequence([movement, moveTail,checkPlacement(for: node)]) 
     let repetitiveMoveAction = SKAction.repeatForever(moveAction) 
     return (moveAction, repetitiveMoveAction) 
    } 

    func moveTail() 
    { 
     for i in 1..<snake.length { 
       snakeBody[i].direction = snakeBody[i-1].direction 
       snakeBody[i].position = snakeBody[i-1].oldPosition 
     } 
    } 

    func moveSnake() { 
     let head = snakeBody[0] { 
      head.removeAllActions() 
      head.run(getMovement(for: head).1) 
     } 
    } 

    func moveOnce() { 
     let head = snakeBody[0] { 
      head.removeAllActions() 
      head.run(getMovement(for: head).0) 
     } 
    } 

    func changeDirection() { 
      let head = snakeBody[0] { 
      head.removeAllActions() 
      head.direction = snake.direction 
      head.run(SKAction.move(by: head.direction.getVector(withIntensity: movementSpeed), duration: 0.5)) 
    } 
} 
+0

非常感謝。該代碼無效,但移動其他部分的想法有所幫助。我終於找到了一個辦法。 – Fayyouz