我正在尝试使用Swift和Spritekit创建一个基本的蛇游戏。我有一个精灵在屏幕上移动,当我滑动它开始在滑动方向移动。我在更新方法中这样做,我根据滑动方向,设定速度和固定持续时间更改精灵的位置。
e.g。 direction.x * blockMovePerSecond * CGFloat(actionDuration)
我有精灵跟随,但是,一旦我滑动并且第一个精灵改变方向,跟随它的那个随后移动而不是第一个在x轴上,然后y轴像正常的蛇游戏一样。
我尝试了以下选项:
这是我在第一个精灵(蛇头)之后的精灵的移动方法代码:
{
var temp:NSValue = lastNodeLocation // the lastnodelocation is from first sprite location
var tempNodeDirection = lastNodeDirection
let actionDuration = 1.0
let distanceToMoveThisFrame = tempNodeDirection.CGPointValue() * blockMovePerSecond * CGFloat(actionDuration)
var currentPosition = NSValue(CGPoint: blocksOfAlphabets[i].position)
let beforeDistance = CGPoint(x: temp.CGPointValue().x - currentPosition.CGPointValue().x, y: temp.CGPointValue().y - currentPosition.CGPointValue().y)
lastNodeLocation = NSValue(CGPoint: blocksOfAlphabets[i].position)
// move node to new location
var moveAction = SKAction.moveTo(temp.CGPointValue(), duration: 1.0)
node.runAction(moveAction)
}
有人可以帮忙吗?
由于 术赤
答案 0 :(得分:0)
你的问题是runAction方法不等待完成。因此,如果在sprite已经运行动作时调用另一个runAction方法,则会立即启动新操作。
您可以使用序列首先完成x轴:SKAction:sequence
答案 1 :(得分:0)
我认为这里最简单的方法是保留一组蛇精灵组件(让这些精灵称为" Rib")。
每隔5秒钟在阵列的末尾添加一个新的Rib,以使蛇长大。
然后,在update()方法中每半秒(或者你希望它多长时间):
检查自上次更新以来发生的任何滑动,并在滑动方向上更改第一个肋骨(蛇头)的方向。
现在反向运行snake数组,并将node(n)的位置设置为节点(n-1)的节点位置。
还有其他方法可以做到,但我认为这将是最简单的。