无法将 PhysicsBody 添加到 SKSpriteNode(游戏崩溃)

Posted

技术标签:

【中文标题】无法将 PhysicsBody 添加到 SKSpriteNode(游戏崩溃)【英文标题】:Can't add PhysicsBody to SKSpriteNode (game crashes) 【发布时间】:2015-03-06 21:54:17 【问题描述】:

我一直在玩弄 XCode/Swift 的一些功能并构建了一个简单的游戏。我很难将physicsBody 添加到SKSpriteNode。 我创建了一个“Bullet”类和一个“Tank”类(它的属性之一是一个包含 10 个“Bullets”的数组)。

精灵属性被正确分配了纹理。但是,physicsBody 以“nil”的形式返回。

class Tank 
var position = CGPoint()
var speed = CGPoint(x: 0, y: 0)
var sprite = SKSpriteNode()
var viewSize = CGPoint()    // width, height
var bullets: [Bullet] = []
var bulletNumber = 0
let TOTAL_BULLETS = 10

// ***Tank class constructor
init(playerNum: Int, filename: NSString, tankName: NSString) 
    var spaceshipTexture = SKTexture(imageNamed: "Spaceship")
    self.sprite = SKSpriteNode(texture: spaceshipTexture, size: spaceshipTexture.size())
    self.sprite.physicsBody? = SKPhysicsBody(texture: spaceshipTexture, size: spaceshipTexture.size())
    println(self.sprite.physicsBody)

// ****Bullet class 
class Bullet 
var position = CGPoint(x: -50, y: -50)
var speed = CGPoint(x: 0, y: 0)
var sprite = SKSpriteNode()
var viewSize = CGPoint()    // width, height
var isBeingFired = false

init () 
    //self.sprite = SKSpriteNode(imageNamed: "Bullet")
    var spaceshipTexture = SKTexture(imageNamed: "Spaceship")
    self.sprite = SKSpriteNode(texture: spaceshipTexture, size: spaceshipTexture.size())
    self.sprite.xScale = 0.04
    self.sprite.yScale = 0.04
    self.sprite.physicsBody? = SKPhysicsBody(texture: spaceshipTexture, size: spaceshipTexture.size())
    self.sprite.physicsBody?.affectedByGravity = false
    println(self.sprite.physicsBody)



// *** GameScene
class GameScene: SKScene 
var tank1 = Tank(playerNum: 1, filename: "Spaceship", tankName: "Tank1")
let myLabel = SKLabelNode(fontNamed:"Chalkduster")

override func didMoveToView(view: SKView) 

    self.addChild(tank1.sprite)

    for i in 0 ..< tank1.TOTAL_BULLETS 
        self.addChild(tank1.bullets[i].sprite)
    

为简单起见,我对 Tank 和 Bullet 使用相同的图像(只是大小不同)来创建 SKSpriteNode。

我不确定这是否有帮助,但我将 Tank 的一个实例及其所有 10 个子弹作为一个子项添加到 GameScene。

【问题讨论】:

【参考方案1】:

您的问题是,您没有将SKTexture 添加到您的SKSpriteNode,而是添加一个图像。如果你想访问SKTexture,你需要像这样将它添加到你的节点:

var spaceshipTexture = SKTexture(imageNamed: "Spaceship")

var sprite = SKSpriteNode(texture: spaceshipTexture, size: spaceshipTexture.size())

然后你就可以访问你的精灵的纹理来创建你的SKPhysicsBody

【讨论】:

这是有道理的,但它不能解释为什么我不必为“坦克”类添加纹理(我可以应用物理体)。此外,当我添加代码并 println() 为“Bullet”的物理体时,我得到“nil”返回。我尝试了不同的图像,但无论出于何种原因,我都可以添加图像并使其可见,但我无法附加physicsBody。 您不需要添加可以设置物理体的纹理。您可以将物理体设置为空的 skspritenode。但是你试图访问你的精灵的 .texture ,因为没有设置,所以它是 nil 。 感谢您的帮助,Chrisitan,但我一定遗漏了一些东西。我已经修改了上面的代码,但我仍然无法添加physicsBody 你还没有在 Tank 类中更改它。 我已经修改了上面的代码来显示新的 Tank 类。但是,现在我的 Tank 类的 sprite 的物理体为“nil”,而在它实际工作之前?纹理已正确分配给精灵,但无论出于何种原因,它都没有根据纹理创建物理体。

以上是关于无法将 PhysicsBody 添加到 SKSpriteNode(游戏崩溃)的主要内容,如果未能解决你的问题,请参考以下文章

PhysicsBody 内的 Swift SpriteKit 接触检查

Spritekit 碰撞检测无法正常工作

Swift:尝试添加一个已经有父节点的 SKNode:

PhysicsBody 使用 SpriteKit 和 Swift 为零

SKSpriteNode 没有落入根场景

如何通过physicsBody获取SKSpriteNode?