设为首页 加入收藏

TOP

iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计(三)
2019-09-03 02:41:13 】 浏览:512
Tags:iFIERO 宇宙 大战 Space Battle SpriteKit 无限 循环 背景 Endless 物理 碰撞 CoreMotion 加速
deA及哪个是nodeB为好,因为接下来的游戏都要运用到。

我们之前定义的struct如下:

struct PhysicsCategory { // static let BulletRed :UInt32 = 0x1 << 1 // Alien的子弹 static let BulletBlue:UInt32 = 0x1 << 2 static let Alien :UInt32 = 0x1 << 3 static let SpaceShip :UInt32 = 0x1 << 4 static let None :UInt32 = 0 } 

根据上面的struct,物理标识 PhysicsCategory.BulletBlue < PhysicsCategory.Alien,即在didBegin:

func didBegin(_ contact: SKPhysicsContact) { let bodyA:SKPhysicsBody let bodyB:SKPhysicsBody if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { bodyA = contact.bodyA bodyB = contact.bodyB }else{ bodyA = contact.bodyB bodyB = contact.bodyA } /// bodyA.categoryBitMask == PhysicsCategory.BulletBlue ///返回true /// bodyB.categoryBitMask == PhysicsCategory.Alien ///返回true } 
 if bodyA.categoryBitMask == PhysicsCategory.BulletBlue && bodyB.categoryBitMask == PhysicsCategory.Alien { /// print("执行代码") } 

于是,我们就可以根据categoryBitMask物理标识来获得碰撞中的物理体了。
我们继续函数bulletHitAlien()和alienHitSpaceShip()的代码:


     // MARK: 子弹vs外星人 func bulletHitAlien(nodeA:SKSpriteNode,nodeB:SKSpriteNode){ /// 判断哪个是子弹节点bulletNode,碰撞didBegin没有比较大小时,则会相互切换,也就是A和B互相切换; if nodeA.physicsBody?.categoryBitMask == PhysicsCategory.BulletBlue { nodeA.removeAllChildren() /// 移除所有子效果 粒子效果emitter(非常重要) nodeA.isHidden = true // 子弹隐藏 nodeA.physicsBody?.categoryBitMask = 0 // 设置子弹不会再发生碰撞 nodeB.removeFromParent() // 移除外星人 }else if nodeB.physicsBody?.categoryBitMask == PhysicsCategory.BulletBlue { nodeA.removeFromParent() // 移除外星人 nodeB.removeAllChildren() nodeB.isHidden = true nodeB.physicsBody?.categoryBitMask = 0 } } 
// MARK: 外星人Alien撞击到飞船 func alienHitSpaceShip(nodeA:SKSpriteNode,nodeB:SKSpriteNode){ if (nodeA.physicsBody?.categoryBitMask == PhysicsCategory.Alien || nodeB.physicsBody?.categoryBitMask == PhysicsCategory.Alien) && (nodeA.physicsBody?.categoryBitMask == PhysicsCategory.SpaceShip || nodeB.physicsBody?.categoryBitMask == PhysicsCategory.SpaceShip) { nodeA.removeFromParent() nodeB.removeFromParent() } } 

很棒,我们完成了物理体碰撞,现在运行一下COMMAND+R(请用真机噢,你才可以躲避外星敌机),你就可以看到当二个物理体发生碰撞后,它们都从场景Scene中移除了。

在接下来的下一节,我们就学习当玩家飞船被敌机击中后,游戏结束时如何进行场景切换,记录击中外星敌机的架次了(游戏的分数),还用使用UserDefaults记录游戏最高分 ,当然,还有使用Particle粒子效果给游戏增加酷酷的效果 _。

更多游戏教程:http://www.iFIERO.com
Github游戏代码传送门:https://github.com/apiapia/SpaceBattleSpriteKitGame

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目