无法将 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 接触检查