Swift 中 Sprite Kit SKAction 的问题
Posted
技术标签:
【中文标题】Swift 中 Sprite Kit SKAction 的问题【英文标题】:Trouble with Sprite Kit SKAction in Swift 【发布时间】:2014-12-04 19:09:55 【问题描述】:我设置的 SKAction 序列存在问题。
这个序列的目标是获取一个包含 9 个精灵节点的数组并一次显示一个。然后,此序列将根据按下哪个按钮(右键或左键)将节点显示在当前节点的右侧或左侧。
我在这里遇到了一些有趣的事情。它似乎像现在一样工作,但是如果我快速按下左键或右键多次,它似乎无法跟上并且过程失败。我没有收到错误,精灵节点只是不显示或不正确显示。
我在下面附上了我的代码。因为当我缓慢循环时它正在工作,我认为这是一个时间问题,也许我需要添加一个完成块。我尝试这样做但没有成功。
我的问题是,这里有什么明显的问题吗?你认为完成块可以解决问题吗?
func pressedButtonRight()
if currentDisplayedWorld < 8
var currentWorld:SKSpriteNode = worldArray[currentDisplayedWorld] as SKSpriteNode
var nextWorld:SKSpriteNode = worldArray[currentDisplayedWorld + 1] as SKSpriteNode
nextWorld.position = CGPointMake(self.frame.size.width, 50)
self.addChild(nextWorld)
let move = SKAction.moveByX(-self.frame.size.width, y: 0,
duration: 1.0, delay: 0,
usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5)
//currentWorld.runAction(move)
nextWorld.runAction(move)
currentWorld.removeFromParent()
currentDisplayedWorld++
else if currentDisplayedWorld == 8
func pressedButtonLeft()
if currentDisplayedWorld > 0
var currentWorld:SKSpriteNode = worldArray[currentDisplayedWorld] as SKSpriteNode
var previousWorld:SKSpriteNode = worldArray[currentDisplayedWorld - 1] as SKSpriteNode
previousWorld.position = CGPointMake(-self.frame.size.width, 50)
self.addChild(previousWorld)
let moveBack = SKAction.moveByX(self.frame.size.width, y: 0,
duration: 1.0, delay: 0,
usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5)
//currentWorld.runAction(moveBack)
previousWorld.runAction(moveBack)
currentWorld.removeFromParent()
currentDisplayedWorld--
else if currentDisplayedWorld == 0
【问题讨论】:
有一个名为移动的类属性布尔值。如果移动为假,则仅移动节点。在您将节点集移动为 true 之前。使用完成处理程序在节点上运行移动操作,该处理程序再次将移动设置为 false。 所以代码实际上并没有停止任何已经运行的动作。如果您快速按下按钮,您可能会同时运行多个移动动作。其行为未定义。运行“带键”操作,以便运行该操作自动停止任何其他已经运行且具有相同键的操作。 好吧,这是有道理的。我今天会试试这个,让你知道它是否成功。谢谢。 【参考方案1】:工作完美。我在下面发布了我的最终代码供所有人查看。再次感谢您的帮助。
func pressedButtonRight()
if currentDisplayedWorld < 8
if self.moving == false
self.moving = true
var currentWorld:SKSpriteNode = self.worldArray[currentDisplayedWorld] as SKSpriteNode
var nextWorld:SKSpriteNode = self.worldArray[currentDisplayedWorld + 1] as SKSpriteNode
nextWorld.position = CGPointMake(self.frame.size.width, 50)
self.addChild(nextWorld)
let move = SKAction.moveByX(-self.frame.size.width, y: 0, duration: 1.0, delay: 0,usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5)
//currentWorld.runAction(move)
nextWorld.runAction(move, completion:
self.moving = false
)
currentWorld.removeFromParent()
currentDisplayedWorld++
else if currentDisplayedWorld == 8
func pressedButtonLeft()
if currentDisplayedWorld > 0
if self.moving == false
self.moving = true
var currentWorld:SKSpriteNode = self.worldArray[currentDisplayedWorld] as SKSpriteNode
var previousWorld:SKSpriteNode = self.worldArray[currentDisplayedWorld - 1] as SKSpriteNode
previousWorld.position = CGPointMake(-self.frame.size.width, 50)
self.addChild(previousWorld)
let moveBack = SKAction.moveByX(self.frame.size.width, y: 0, duration: 1.0, delay: 0,
usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5)
//currentWorld.runAction(moveBack)
previousWorld.runAction(moveBack, completion:
self.moving = false
)
currentWorld.removeFromParent()
currentDisplayedWorld--
else if currentDisplayedWorld == 0
【讨论】:
以上是关于Swift 中 Sprite Kit SKAction 的问题的主要内容,如果未能解决你的问题,请参考以下文章
游戏中的三角学——Sprite Kit 和 Swift 教程
游戏中的三角学——Sprite Kit 和 Swift 教程