我正在嘗試使用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