TOP

iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计(三)
2019-09-03 02:41:13 】 浏览:486
Tags:iFIERO 宇宙 大战 Space Battle SpriteKit 无限 循环 背景 Endless 物理 碰撞 CoreMotion 加速

幕的height),把bgNode2
移到之间当前红色框(bgNode1)的位置,代码如下

/// 第二个背景node
if bgNode2.position.y < -bgNode2.size.height {
bgNode2.position.y = bgNode1.position.y + bgNode1.size.height
}

完整的代码如下:

override func update(_ currentTime: TimeInterval) { // 每Frame的时间差 if lastUpdateTimeInterval == 0 { lastUpdateTimeInterval = currentTime } deltaTime = currentTime - lastUpdateTimeInterval lastUpdateTimeInterval = currentTime updateBackground(deltaTime: deltaTime) // endless 无限循环星空背景 } 
/// command + option + <- (箭头) 折叠 || command + option + -> (箭头) 打开 func updateBackground(deltaTime:TimeInterval){ // 下移 bgNode1.position.y -= CGFloat(deltaTime * 300) bgNode2.position.y -= CGFloat(deltaTime * 300) // 第一个背景node if bgNode1.position.y < -bgNode1.size.height { bgNode1.position.y = bgNode2.position.y + bgNode2.size.height } // 第二个背景node if bgNode2.position.y < -bgNode2.size.height { bgNode2.position.y = bgNode1.position.y + bgNode1.size.height } } 

三、SpriteKit物理碰撞

物理碰撞发生在:玩家飞船发射子弹击中外星敌机、发星敌机撞到玩家飞船

SpriteKit SKPhysicsBody类物理体的属性图表:
http://www.ifiero.com/index.php/archives/166

1.Spritekit物理节点categoryBitMask属性

/// 玩家飞船 playerNode.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "Player"), size: SKTexture(imageNamed: "Player").size()) playerNode.physicsBody?.affectedByGravity = false // 不受物理世界的重力影响 playerNode.physicsBody?.isDynamic = true playerNode.physicsBody?.categoryBitMask = PhysicsCategory.SpaceShip playerNode.physicsBody?.contactTestBitMask = PhysicsCategory.Alien ///碰撞时发出通知 playerNode.physicsBody?.collisionBitMask = PhysicsCategory.None 
/// 子弹; bulletNode.physicsBody = SKPhysicsBody(circleOfRadius: bulletNode.size.width / 2) bulletNode.physicsBody?.affectedByGravity = false // 子弹不受重力影响; bulletNode.physicsBody?.categoryBitMask = PhysicsCategory.BulletBlue bulletNode.physicsBody?.contactTestBitMask = PhysicsCategory.Alien bulletNode.physicsBody?.collisionBitMask = PhysicsCategory.None 
/// 外星飞船 // 1.设置物理身体 alien.physicsBody = SKPhysicsBody(circleOfRadius: alien.size.width / 2) // 不受重力影响,自定义飞船移动速度; alien.physicsBody?.affectedByGravity = false // 2.设置唯一属性 alien.physicsBody?.categoryBitMask = PhysicsCategory.Alien // 3.和哪些节点Node发生碰撞后发出通知 alien.physicsBody?.contactTestBitMask = PhysicsCategory.BulletBlue | PhysicsCategory.SpaceShip alien.physicsBody?.collisionBitMask = PhysicsCategory.None 

2.用didBegin来监测碰撞:

 

 
物理体发生碰撞

didBegin接收playerNode.physicsBody.contactTestMask的碰撞通知:

playerNode.physicsBody?.contactTestBitMask = PhysicsCategory.Alien

//MARK:- 发生碰撞时接收到通知 func didBegin(_ contact: SKPhysicsContact) { let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask switch contactMask { /// 子弹vs外星人 case PhysicsCategory.Alien | PhysicsCategory.BulletBlue: bulletHitAlien(nodeA: contact.bodyA.node as! SKSpriteNode,nodeB: contact.bodyB.node as! SKSpriteNode) /// 外星人Alien撞击到飞船 case PhysicsCategory.Alien | PhysicsCategory.SpaceShip: alienHitSpaceShip(nodeA: contact.bodyA.node as! SKSpriteNode, nodeB: contact.bodyB.node as! SKSpriteNode) default: break } } 

我们在函数bulletHitAlien()和alienHitSpaceShip()不用判断标识的大小,即判断 PhyscisCategory.Alien < PhysicsCategory.BulletBlue或者PhyscisCategory.Alien > PhysicsCategory.BulletBlue,但还是要了解一下哪个是no

请关注公众号获取更多资料


iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计(三) https://www.cppentry.com/bencandy.php?fid=89&id=246445

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇swift为什么不是do while? 下一篇Swift 在UIWindow 上添加并移除 v..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: