【发布时间】:2017-07-15 19:20:49
【问题描述】:
我正在尝试使用 SpriteKit 制作一款蛇游戏(就像旧诺基亚手机中的游戏)。问题是,当蛇的方向改变时,蛇在一个静止的垂直块中移动,并没有得到 L 形(如图所示)。为了进入上下文,我有一个名为SKDSpriteNode 的类,它是同一个SKSpriteNode,还有一个额外的direction 属性; Snake 类具有 direction 和 length 属性。有一个snakeBody 属性,类型为[SKDSpriteNode],包含蛇体的节点。
Snake 的方向在游戏开始时分配给.up,然后由用户滑动分配。
顺便说一句,changeDirection 方法在蛇的方向改变时被调用(使用didSet)。这是代码和图片:
extension ClassicLevelScene {
func startGame() { snake.direction = .up; moveSnake() }
func checkPlacement(for node: SKDSpriteNode) -> SKAction {
return SKAction.run({
if !(node.isInsideFrame(of: self)) { self.gameOver() }
})
}
func getMovement(for node: SKDSpriteNode) -> (once: SKAction, repetitive: SKAction) {
let movement = SKAction.move(by: node.direction.getVector(withIntensity: movementSpeed), duration: 0.5)
let moveAction = SKAction.sequence([movement, checkPlacement(for: node)])
let repetitiveMoveAction = SKAction.repeatForever(moveAction)
return (moveAction, repetitiveMoveAction)
}
func moveSnake() {
for node in snakeBody {
node.removeAllActions()
node.run(getMovement(for: node).1)
}
}
func moveOnce() {
for node in snakeBody {
node.removeAllActions()
node.run(getMovement(for: node).0)
}
}
func changeDirection() {
for i in 0..<snake.length {
if i == 0 {
snakeBody[i].direction = snake.direction
snakeBody[i].run(SKAction.move(by: snakeBody[i].direction.getVector(withIntensity: movementSpeed), duration: 0.5))
} else {
snakeBody[i].direction = snakeBody[i-1].direction
snakeBody[i].run(SKAction.move(to: snakeBody[i-1].oldPosition, duration: 0.5))
}
}
}
【问题讨论】:
-
我不确定你为什么要在代码中执行所有这些计算属性,一个简单的 = 就足够了
-
好吧,我认为你是对的。我对这个应用程序中需要计算属性感到厌烦
-
我真的希望我能帮助你,但是你的代码中发生了很多事情,而且它比它需要的复杂得多。我将专注于清理您的代码,以使其更有意义。据我所知,您添加了很多操作,但您从未显示方向是如何计算的,其中任何一个都可能导致问题
-
我马上编辑
-
发生这种情况是因为您在 else 中将所有蛇的方向设置为相同的东西。
标签: swift animation sprite-kit