Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 蛇在垂直块中移动_Swift_Animation_Sprite Kit - Fatal编程技术网

Swift 蛇在垂直块中移动

Swift 蛇在垂直块中移动,swift,animation,sprite-kit,Swift,Animation,Sprite Kit,我正在尝试使用SpriteKit制作一个蛇游戏(就像旧诺基亚手机中的蛇一样)。问题是,当蛇的方向改变时,蛇在一个静止的垂直块中移动,不会得到L形(如图所示)。为了进入上下文,我有一个名为SKDSpriteNode的类,它与SKSpriteNode相同,还有一个额外的direction属性;Snake类具有direction和length属性。有一个蛇身属性,类型为[SKDSpriteNode],包含蛇身的节点 当游戏开始时,蛇的方向被分配给.up,然后由用户的滑动来分配。 顺便说一句,当snak

我正在尝试使用SpriteKit制作一个蛇游戏(就像旧诺基亚手机中的蛇一样)。问题是,当蛇的方向改变时,蛇在一个静止的垂直块中移动,不会得到L形(如图所示)。为了进入上下文,我有一个名为
SKDSpriteNode
的类,它与SKSpriteNode相同,还有一个额外的
direction
属性;
Snake
类具有
direction
length
属性。有一个
蛇身
属性,类型为
[SKDSpriteNode]
,包含蛇身的节点

当游戏开始时,蛇的方向被分配给
.up
,然后由用户的滑动来分配。 顺便说一句,当snake的方向改变时,
changeDirection
方法被调用(使用
didSet
)。以下是代码和图片:

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))
        }
    }
}
扩展ClassicLevelScene{
func startGame(){snake.direction=.up;moveSnake()}
func checkPlacement(用于节点:SKDSpriteNode)->SKAction{
返回SKAction.run({
if!(node.isInsideFrame(of:self)){self.gameOver()}
})
}
func getMovement(对于节点:SKDSpriteNode)->(一次:SKAction,重复:SKAction){
让movement=SKAction.move(by:node.direction.getVector(withIntensity:movementSpeed),持续时间:0.5)
让moveAction=SKAction.sequence([movement,checkPlacement(for:node)])
让repetitiveMoveAction=SKAction.repeatForever(moveAction)
返回(移动动作,重复移动动作)
}
func moveSnake(){
对于snakeBody{
node.removeAllActions()
运行(getMovement(for:node.1)
}
}
func moveOnce(){
对于snakeBody{
node.removeAllActions()
运行(getMovement(for:node).0)
}
}
func changeDirection(){

对于0中的i..我需要发布一个答案来向您展示代码,但是您应该只移动头部,让尾部拖到后面。现在有更好的方法来做到这一点,但是为了简化您已经编写的代码,下面是它的外观

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))
    }
}
扩展ClassicLevelScene{
func startGame(){snake.direction=.up;moveSnake()}
func checkPlacement(用于节点:SKSpriteNode)->SKAction{
返回SKAction.run({
if!(node.isInsideFrame(of:self)){self.gameOver()}
})
}
func getMovement(对于节点:SKDSpriteNode)->(一次:SKAction,重复:SKAction){
让movement=SKAction.move(by:node.direction.getVector(withIntensity:movementSpeed),持续时间:0.5)
让moveTail=SKAction.run({self.moveTail()})
让moveAction=SKAction.sequence([movement,moveTail,checkPlacement(for:node)])
让repetitiveMoveAction=SKAction.repeatForever(moveAction)
返回(移动动作,重复移动动作)
}
func moveTail()
{

我不知道你为什么要在你的代码中使用所有这些计算属性,一个简单的=就足够了,我想你是对的。我对这个应用程序中的计算属性的需求很着迷,我真的希望我能帮你,但是你的代码中有这么多的东西,而且比它需要的要复杂得多。我会专注于清理你的代码,使其更有意义。据我所知,你添加了很多动作,但你从来没有显示方向是如何计算的,这两种情况中的任何一种都可能会导致问题。我将在一个部分中进行编辑,这是因为你在else中将所有蛇的方向设置为相同的东西。非常感谢。代码d我不工作,但是其他部分移动的想法帮助了我。我终于找到了一种方法。