尝试使用Swift制作基本的蛇游戏

时间:2014-12-16 01:23:49

标签: ios swift sprite-kit

我正在尝试使用Swift创建一个类似蛇的基本游戏,但是我很难让蛇的尾巴跟着头部。我知道传统的方法是删除尾部,并在蛇的顶部放置一个新的蛇部分以模拟运动,只改变蛇(阵列)的第一部分和最后部分。我遇到的问题是,因为我的游戏不是基于网格的,所以运动更连续/流畅,而且我在调整蛇体运动方面遇到了麻烦。

下面是我的蛇运动方法之一,以及相应调整身体的方法。我的逻辑是移动头部,然后相应地调整所有身体部位,但是它没有按计划工作。我是SpriteKit的新手,这是我第一次尝试游戏。如果有人可以解释给定流体蛇运动和无网格环境的逻辑,我会非常感激。谢谢!

func moveUp(sender:UISwipeGestureRecognizer)
{
    dir = "U"
    snakeHead.removeAllActions()
    let moveUp = SKAction.moveByX(0.0, y: snakeHead.size.height, duration: 0.5)
    snakeHead.runAction(SKAction.repeatActionForever(moveUp))
}

func followTheLeader()
{
    for var i=0;i<snake.count-1;i++
    {
        var snakeToFollow = snake[i]
        var moveToX = snakeToFollow.position.x
        var moveToY = snakeToFollow.position.y

        var moveTo = CGPointMake(moveToX, moveToY)
        var snakeToMove = snake[i+1]
        snakeToMove.position = moveTo
    }
}

override func update(currentTime: CFTimeInterval)
{
    followTheLeader()        
}

编辑 - 种植蛇法

func growSnake()
{
    var length = snake.count
    var last:SKSpriteNode = snake[length-1]

    var lastX = last.position.x
    var lastY = last.position.y

    var body = SKSpriteNode(texture: nil, color: UIColor(red: (255/255.0), green: (102/255.0), blue: (102/255.0), alpha: 1.0), size: CGSizeMake(20.0, 20.0))
    body.position = CGPointMake(lastX, lastY-22.0)
    body.physicsBody = SKPhysicsBody(rectangleOfSize: snakeHead.size)
    body.physicsBody?.dynamic = true
    body.physicsBody?.categoryBitMask = PhysicsCategory.Snake
    body.physicsBody?.contactTestBitMask = PhysicsCategory.Wall | PhysicsCategory.Food
    body.physicsBody?.collisionBitMask = PhysicsCategory.Wall
    body.physicsBody?.restitution = 1.0

    addChild(body)

    snake.append(body)
}

1 个答案:

答案 0 :(得分:0)

followTheLeader功能中,您正在使用持续0.5秒的SKAction移动snakeHead。然后每次更新调用,你将蛇的每个部分移动到它前面的那个位置。这会导致您在几次更新后在评论中描述的堆积。我建议根本不使用SKAction,只是移动snakeHead函数中update的位置。以下是一个示例实现:

创建场景的xSpeedySpeed属性。

var xSpeed = 1
var ySpeed = 0

然后使用它们移动snakeHead函数中的update

snakeHead.position = CGPointMake(snakeHead.position.x + xSpeed, snakeHead.position.y + ySpeed);

然后,如果你想改变蛇的方向,你可以改变xSpeedySpeed

func moveUp(sender:UISwipeGestureRecognizer)
{
    ySpeed = 1
    xSpeed = 0
}