2017-07-15 74 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