贪吃蛇游戏运动问题 Spritekit
Snake game movement issue Spritekit
我正在尝试使用 Swift 和 Spritekit 创建一个基本的贪吃蛇游戏。我有一个精灵在屏幕上移动,当我滑动时它开始向滑动方向移动。我在更新方法中执行此操作,我根据滑动方向、设定速度和固定持续时间更改精灵的位置。
例如direction.x * blockMovePerSecond * CGFloat(actionDuration)
我让 sprite 彼此跟随,但是,一旦我滑动并且第一个 sprite 改变方向,跟随它的那个就沿对角线移动,而不是像正常情况下先在 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)
}
有人可以帮忙吗?
谢谢
术赤
你的问题是 runAction 方法不等待完成。因此,如果您在精灵已经 运行 一个动作时调用另一个 runAction 方法,新动作将立即开始。
您可以使用序列首先完成 x 轴:SKAction:sequence
我认为这里最简单的事情是保留一组蛇精灵组件(让我们称这些精灵为 "Rib")。
每 5 秒向数组末尾添加一个新的肋骨,使蛇生长。
然后,在 update() 方法中每半秒(或者您希望它有多长):
检查自上次更新以来发生的任何滑动,并在滑动方向上更改第一个肋骨(蛇头)的方向。
现在运行反向遍历snake数组,将节点(n)的位置设置为节点(n-1)的节点位置。
还有其他方法可以做到,但我认为这是最简单的方法。
我正在尝试使用 Swift 和 Spritekit 创建一个基本的贪吃蛇游戏。我有一个精灵在屏幕上移动,当我滑动时它开始向滑动方向移动。我在更新方法中执行此操作,我根据滑动方向、设定速度和固定持续时间更改精灵的位置。
例如direction.x * blockMovePerSecond * CGFloat(actionDuration)
我让 sprite 彼此跟随,但是,一旦我滑动并且第一个 sprite 改变方向,跟随它的那个就沿对角线移动,而不是像正常情况下先在 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)
}
有人可以帮忙吗?
谢谢 术赤
你的问题是 runAction 方法不等待完成。因此,如果您在精灵已经 运行 一个动作时调用另一个 runAction 方法,新动作将立即开始。
您可以使用序列首先完成 x 轴:SKAction:sequence
我认为这里最简单的事情是保留一组蛇精灵组件(让我们称这些精灵为 "Rib")。
每 5 秒向数组末尾添加一个新的肋骨,使蛇生长。
然后,在 update() 方法中每半秒(或者您希望它有多长):
检查自上次更新以来发生的任何滑动,并在滑动方向上更改第一个肋骨(蛇头)的方向。
现在运行反向遍历snake数组,将节点(n)的位置设置为节点(n-1)的节点位置。
还有其他方法可以做到,但我认为这是最简单的方法。