在SKSpriteNode自定义子类的初始化程序中设置物理主体不起作用

时间:2017-11-08 01:10:10

标签: ios sprite-kit

我正在使用SpriteKit构建游戏,我正在使用Xcode的场景编辑器来设置我的GameScene

该场景包含Player,我将其作为颜色精灵拖入场景中,并将Custom Class字段填入mygame.Player

我有一个名为Player的SKSpriteNode自定义子类,在这个类中,我在应用程序调用的初始化程序中设置了物理属性。

class Player: SKSpriteNode {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print(self)
        self.physicsBody = SKPhysicsBody(rectangleOf: self.size)
        self.physicsBody?.restitution = 0
        self.physicsBody?.isDynamic = true
        self.physicsBody?.affectedByGravity = true
        self.physicsBody?.velocity = CGVector(dx: 50, dy: 0)
        print(self.physicsBody)
    }

}

在我的GameScene.swift文件中,我可以引用播放器,因此这种链接可以正常工作。

override func didMove(to view: SKView) {
    player = childNode(withName: "player") as! Player
    print(player)
    print(player.physicsBody)
}

这实际上完全可以打印玩家和物理身体。

<SKSpriteNode> name:'player' texture:['nil'] position:{0, 0} scale:{1.00, 1.00} size:{100, 100} anchor:{0.5, 0.5} rotation:0.00
Optional(<SKPhysicsBody> type:<Rectangle> representedObject:[<SKSpriteNode> name:'player' texture:['nil'] position:{0, 0} scale:{1.00, 1.00} size:{100, 100} anchor:{0.5, 0.5} rotation:0.00])

然而,尽管我已将场景设置为具有重力,但玩家永远不会最终移动到场景中!为了让玩家实际移动,我需要在GameScene中为didMove(to :)函数添加另一行代码,再次设置PhysicsBody:

player.physicsBody = SKPhysicsBody(rectangleOf: player.size)

这里发生了什么?为什么不在初始化器中设置我的Player的物理主体?

1 个答案:

答案 0 :(得分:2)

因为有一个错误,当物理世界在物理世界存在之前被创建时,它在世界上没有正确设置。

作为临时解决方案,请尝试:

class Player: SKSpriteNode {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print(self)
        DispatchQueue.main.asyncAfter(deadline: .now() + 1)
        {
            self.physicsBody = SKPhysicsBody(rectangleOf: self.size)
            self.physicsBody?.restitution = 0
            self.physicsBody?.isDynamic = true
            self.physicsBody?.affectedByGravity = true
            self.physicsBody?.velocity = CGVector(dx: 50, dy: 0)
            print(self.physicsBody)
        }
    }

}

在世界存在之前推迟创造身体。

如果它有效,那么你需要在世界存在之后想出一种更优雅的方式来创造身体。