我想以更有序,更清晰的方式设置我的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()
}
}
但物理机构没有应用,我无法弄清楚为什么会这样。
在我将物理主体添加到精灵节点后,我希望节点从屏幕上掉下来。但这不会发生,我无法理解为什么。
有没有人知道我如何在课堂上应用物理身体?
答案 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
}
它将解决您的问题并正确应用物理体。