将物理应用于自定义SKSpriteNode类

时间:2016-12-19 18:18:57

标签: sprite-kit swift3 skspritenode

我想以更有序,更清晰的方式设置我的SpriteKit游戏,所以我决定为每种类型的精灵节点使用类。

在我的情况下,我在swift中创建了一个单独的Player类,看起来像这样

import SpriteKit

class Player: SKSpriteNode {

func initializePlayer() {        
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
    self.physicsBody?.affectedByGravity = true
}


func moveLeft () {
    print("left")
}

func moveRight () {
    print("right")
}   
}

我正确地在场景编辑器的自定义类检查器中引用了这个Sprite节点,我可以毫无问题地触发类方法 - 所以这很有效。

我在GameScene中引用了Player类,如下所示:

class GameplayScene: SKScene {   
var player: Player = Player()   
let myNode = SKSpriteNode(imageNamed: "player")   
override func didMove(to view: SKView) {       
    player.initializePlayer()           
}
}

但物理机构没有应用,我无法弄清楚为什么会这样。

在我将物理主体添加到精灵节点后,我希望节点从屏幕上掉下来。但这不会发生,我无法理解为什么。

有没有人知道我如何在课堂上应用物理身体?

2 个答案:

答案 0 :(得分:2)

我可以使用除initializePlayer之外的其他名称调用您的函数,这与实现的代码更相关:

func setPhysics() {        
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
    self.physicsBody?.affectedByGravity = true
}

之后,如果你想从场景编辑器中检索你的精灵,你可以使用:

if let node = self.childNode(withName:"//mySpriteNodeName") as? Player {
            // Set up your sprite here
            node.setPhysics()
}

P.S。:我还添加了//:这指定搜索应该从根节点开始,并在整个节点树中递归执行。否则,它会从当前位置执行递归搜索。

答案 1 :(得分:1)

问题是您没有在init函数内置的SKSpriteNode中初始化播放器节点。

使用以下代码:

init() {
    let texture = SKTexture(imageNamed: "Spaceship")
    super.init(texture: texture, color: UIColor.blue, size: texture.size())
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
    self.physicsBody?.affectedByGravity = true
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    fatalError("init(coder:) has not been implemented")
}

而不是:

func initializePlayer() {        
    self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
    self.physicsBody?.affectedByGravity = true
}

它将解决您的问题并正确应用物理体。