Swift 蛇在垂直块中移动
我正在尝试使用SpriteKit制作一个蛇游戏(就像旧诺基亚手机中的蛇一样)。问题是,当蛇的方向改变时,蛇在一个静止的垂直块中移动,不会得到L形(如图所示)。为了进入上下文,我有一个名为Swift 蛇在垂直块中移动,swift,animation,sprite-kit,Swift,Animation,Sprite Kit,我正在尝试使用SpriteKit制作一个蛇游戏(就像旧诺基亚手机中的蛇一样)。问题是,当蛇的方向改变时,蛇在一个静止的垂直块中移动,不会得到L形(如图所示)。为了进入上下文,我有一个名为SKDSpriteNode的类,它与SKSpriteNode相同,还有一个额外的direction属性;Snake类具有direction和length属性。有一个蛇身属性,类型为[SKDSpriteNode],包含蛇身的节点 当游戏开始时,蛇的方向被分配给.up,然后由用户的滑动来分配。 顺便说一句,当snak
SKDSpriteNode
的类,它与SKSpriteNode相同,还有一个额外的direction
属性;Snake
类具有direction
和length
属性。有一个蛇身
属性,类型为[SKDSpriteNode]
,包含蛇身的节点
当游戏开始时,蛇的方向被分配给.up
,然后由用户的滑动来分配。
顺便说一句,当snake的方向改变时,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))
}
}
}
扩展ClassicLevelScene{
func startGame(){snake.direction=.up;moveSnake()}
func checkPlacement(用于节点:SKDSpriteNode)->SKAction{
返回SKAction.run({
if!(node.isInsideFrame(of:self)){self.gameOver()}
})
}
func getMovement(对于节点:SKDSpriteNode)->(一次:SKAction,重复:SKAction){
让movement=SKAction.move(by:node.direction.getVector(withIntensity:movementSpeed),持续时间:0.5)
让moveAction=SKAction.sequence([movement,checkPlacement(for:node)])
让repetitiveMoveAction=SKAction.repeatForever(moveAction)
返回(移动动作,重复移动动作)
}
func moveSnake(){
对于snakeBody{
node.removeAllActions()
运行(getMovement(for:node.1)
}
}
func moveOnce(){
对于snakeBody{
node.removeAllActions()
运行(getMovement(for:node).0)
}
}
func changeDirection(){
对于0中的i..我需要发布一个答案来向您展示代码,但是您应该只移动头部,让尾部拖到后面。现在有更好的方法来做到这一点,但是为了简化您已经编写的代码,下面是它的外观
extension ClassicLevelScene {
func startGame() { snake.direction = .up; moveSnake() }
func checkPlacement(for node: SKSpriteNode) -> 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 moveTail = SKAction.run({self.moveTail()})
let moveAction = SKAction.sequence([movement, moveTail,checkPlacement(for: node)])
let repetitiveMoveAction = SKAction.repeatForever(moveAction)
return (moveAction, repetitiveMoveAction)
}
func moveTail()
{
for i in 1..<snake.length {
snakeBody[i].direction = snakeBody[i-1].direction
snakeBody[i].position = snakeBody[i-1].oldPosition
}
}
func moveSnake() {
let head = snakeBody[0] {
head.removeAllActions()
head.run(getMovement(for: head).1)
}
}
func moveOnce() {
let head = snakeBody[0] {
head.removeAllActions()
head.run(getMovement(for: head).0)
}
}
func changeDirection() {
let head = snakeBody[0] {
head.removeAllActions()
head.direction = snake.direction
head.run(SKAction.move(by: head.direction.getVector(withIntensity: movementSpeed), duration: 0.5))
}
}
扩展ClassicLevelScene{
func startGame(){snake.direction=.up;moveSnake()}
func checkPlacement(用于节点:SKSpriteNode)->SKAction{
返回SKAction.run({
if!(node.isInsideFrame(of:self)){self.gameOver()}
})
}
func getMovement(对于节点:SKDSpriteNode)->(一次:SKAction,重复:SKAction){
让movement=SKAction.move(by:node.direction.getVector(withIntensity:movementSpeed),持续时间:0.5)
让moveTail=SKAction.run({self.moveTail()})
让moveAction=SKAction.sequence([movement,moveTail,checkPlacement(for:node)])
让repetitiveMoveAction=SKAction.repeatForever(moveAction)
返回(移动动作,重复移动动作)
}
func moveTail()
{
我不知道你为什么要在你的代码中使用所有这些计算属性,一个简单的=就足够了,我想你是对的。我对这个应用程序中的计算属性的需求很着迷,我真的希望我能帮你,但是你的代码中有这么多的东西,而且比它需要的要复杂得多。我会专注于清理你的代码,使其更有意义。据我所知,你添加了很多动作,但你从来没有显示方向是如何计算的,这两种情况中的任何一种都可能会导致问题。我将在一个部分中进行编辑,这是因为你在else中将所有蛇的方向设置为相同的东西。非常感谢。代码d我不工作,但是其他部分移动的想法帮助了我。我终于找到了一种方法。