【问题标题】:How to reset the alignment of physics bodies in SpriteKit?如何在 SpriteKit 中重置物理体的对齐方式?
【发布时间】:2018-06-10 10:48:24
【问题描述】:

我用 SpriteKit 制作了一个游戏,不同的砖块从山上掉下来。当这些物理身体掉下来时,它们通常会从山上反弹并改变它们的排列方式(它们会旋转几次)。如果我转换到 GameOver 场景并按下重放(回到 GameScene),物理体仍然像我离开场景时一样对齐。但我希望它们像一开始那样水平对齐。

游戏场景:

import SpriteKit
import GameplayKit

 let hillTexture = SKTexture(imageNamed: "HillIllustration")
 let hillIllustration = SKSpriteNode(texture: hillTexture)

 let brickTexture = SKTexture(imageNamed: "BrickIllustration")
 let brick = SKSpriteNode(texture: brickTexture)

 class GameScene: SKScene {

    //Hill

    hillIllustration.setScale(0.7)
    hillIllustration.position = CGPoint(x: self.size.width / 2, y: self.size.height * 0.16)
    hillIllustration.zPosition = 2
    hillIllustration.physicsBody = SKPhysicsBody(polygonFrom: clipPath)
    hillIllustration.physicsBody?.isDynamic = false
    hillIllustration.physicsBody?.categoryBitMask = CollisionBitMask.Hill
    hillIllustration.physicsBody?.affectedByGravity = false
    self.addChild(hillIllustration)

    //The brick is a child of the hill node

    brick.setScale(1)
    brick.position = CGPoint(x: -350, y: self.size.height * 0.5)
    brick.zPosition = 1
    brick.physicsBody = SKPhysicsBody(polygonFrom: clipPath2)
    brick.physicsBody?.isDynamic = true
    brick.physicsBody?.categoryBitMask = CollisionBitMask.Brick
    brick.physicsBody?.affectedByGravity = true
    hillIllustration.addChild(brick)

}

过渡到 GameOver:

let transition = SKTransition.crossFade(withDuration: 0)
let gameScene = GameOver(size: self.size)
self.view?.presentScene(gameScene, transition: transition)

转换回 GameScene:

let transition = SKTransition.crossFade(withDuration: 0)
    let gameScene = GameScene(size: self.size)
    self.view?.presentScene(gameScene, transition: transition)

不知何故,当我转换场景时,砖块如何对齐的信息被保存了。我该如何改变呢?

【问题讨论】:

  • 你如何在场景之间转换,我有 2 个答案可以给你,但我需要先知道你在做什么。
  • 我更新了我的问题。 @KnightOfDragon
  • 不,你怎么重播
  • 你的意思是我怎么回到GameScene? @Knight0fDragon
  • 是的,那是你的问题,不是吗?

标签: swift sprite-kit skphysicsbody gameplay-kit


【解决方案1】:

如果你想在重启游戏后让砖节点返回开始旋转而不是调用:

brick.zRotation = 0

如果您希望在游戏期间节点不旋转,则可以将此代码放入所有 spritekit 文件中已有的更新函数中:

override func update(_ currentTime: TimeInterval) {
 brick.zRotation = 0
}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    相关资源
    最近更新 更多