我正在尝试使用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)
}
答案 0 :(得分:0)
在followTheLeader
功能中,您正在使用持续0.5秒的SKAction移动snakeHead
。然后每次更新调用,你将蛇的每个部分移动到它前面的那个位置。这会导致您在几次更新后在评论中描述的堆积。我建议根本不使用SKAction,只是移动snakeHead
函数中update
的位置。以下是一个示例实现:
创建场景的xSpeed
和ySpeed
属性。
var xSpeed = 1
var ySpeed = 0
然后使用它们移动snakeHead
函数中的update
。
snakeHead.position = CGPointMake(snakeHead.position.x + xSpeed, snakeHead.position.y + ySpeed);
然后,如果你想改变蛇的方向,你可以改变xSpeed
和ySpeed
。
func moveUp(sender:UISwipeGestureRecognizer)
{
ySpeed = 1
xSpeed = 0
}