我正在尝试使用SpriteKit制作一款蛇游戏(就像旧诺基亚手机中的那种)。问题是,当蛇的方向发生变化时,蛇会在一个垂直的块中移动,并且不会变成L形(如图所示)。为了进入上下文,我有一个名为SKDSpriteNode
的类,它是相同的SKSpriteNode,具有额外的direction
属性; Snake
类具有direction
和length
属性。有一个snakeBody
属性,类型为[SKDSpriteNode]
,包含蛇体的节点。蛇在垂直块中移动
当游戏开始时,蛇的方向被分配给.up
,然后它被用户的滑动分配。 顺便说一下,changeDirection
方法被调用时,蛇的方向改变(与didSet
)。下面的代码和PIC:我需要张贴作为回答,以显示你的代码
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))
}
}
}
我不知道为什么你正在做的所有这些计算性能在你的代码,简单=就足够了 – Knight0fDragon
好吧,我认为你是对的。我在这个应用程序中得到了计算属性的需求cz – Fayyouz
我真的希望我能帮助你,但是代码中有太多的事情要做,而且它需要更复杂。我会专注于清理代码,以便更好地理解。从我所知道的情况来看,你正在增加很多动作,并且你从不显示方向是如何计算的,并且其中任何一个都可能导致问题 – Knight0fDragon