如何精确设置SpriteKit精灵的物理体PhysicsBody ,首先要开启精灵的物理体外框显示,
可以直观的在模拟器或者真机上看清楚精灵的物理体外观(精灵周围有一圈兰色的细线)!
精灵周围有一圈兰色的细线
开启精灵的物理体外框显示
精灵物理体
精灵物理体脚+手
在Scene中的尺寸大小
直接使用rectangleOf
rectangleOf碰撞不精准
碰撞不精准
使用精灵物理体本身的texture 当反重力向上时
精灵物理体的脚还在走动,碰撞到天空后会站立不稳
四处漂浮 Floating Everywhere
如何解决这个问题呢?就是自定义物理体texture
自定义物理体texture
脚的底部采用底座形式
去除物理体脚还有手
精确站立
精确碰撞
以下是PlayerNode的代码
// MARK:-玩家
func initPlayer(){
/// Ninja.atlas名称 (位于目录Resources->Images)
playerTextureAtlas = SKTextureAtlas(named: "Ninja")
/// 把atlas里的图片append到PlayerTextures数组内
for i in 1...playerTextureAtlas.textureNames.count {
let imageName = "t1000\(i)"
playerTextures.append(SKTexture(imageNamed: imageName))
}
/// 节点的物理特性
/// 1.调用rectangleOf矩形物理外框
/// self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
///2.调用物理体本身的图片 因为头重脚轻 上升到顶部时导致站不稳;
// self.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "t10001"), size:CGSize(width: SKTexture(imageNamed: "t10001").size().width * 0.7, height: SKTexture(imageNamed: "t10001").size().height * 0.7))
///3.精确定制物理体t1Mask
let playerMask = SKTexture(imageNamed: "t1Mask")
self.physicsBody = SKPhysicsBody(texture: playerMask, size: CGSize(width: playerMask.size().width * 0.7, height: playerMask.size().height * 0.7)) /// 0.7 的意思是缩小0.7倍
self.physicsBody?.restitution = 0 // bounciness物体落下时反弹跳力不会消减
self.physicsBody?.categoryBitMask = PhysicsCategory.Player
self.physicsBody?.contactTestBitMask = PhysicsCategory.Bomb | PhysicsCategory.Coin | PhysicsCategory.SkyLine | PhysicsCategory.GroudLine
self.physicsBody?.collisionBitMask = PhysicsCategory.GroudLine | PhysicsCategory.SkyLine
}
完整游戏代码传送门:https://github.com/apiapia/SkyNinjaGameSpriteKitTutorial