我正在使用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的物理主体?
答案 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)
}
}
}
在世界存在之前推迟创造身体。
如果它有效,那么你需要在世界存在之后想出一种更优雅的方式来创造身体。