本节任务:

  • 随机生成障碍物,且一对障碍物上下相距距离固定,但位置随机。

几种情况:

y position = 0的情况:

y position = playableStart的情况:

y position = playableStart - 障碍物.size.height/2的情况:

推导一般情况下的公式:y position = playableStart - 障碍物.size.height/2 + (10%~60%)playgroundHeight:

上下两个障碍物之间距离固定为3.5倍的Player尺寸的高度:

注意推导公式:y position = playableStart - 障碍物.size.height/2此时障碍物的顶部刚好与地面齐平,而(10%~60%)playgroundHeight是一个浮动范围,表明障碍物超出地面的高度。显然我们的障碍物的层级关系是在背景上面但是在Foreground的下面,因此修改早前的Layer:

enum Layer: CGFloat {case Backgroundcase Obstacle   //添加障碍物层级关系case Foregroundcase Player
}

01.产生障碍物的构造方法

我们需要增添一个方法用于实例化一个纹理(图片)为仙人掌的精灵(SpriteNode),设置其zPositionObstacle,请在flapPlayer()方法上方新增如下方法:

func createObstacle()->SKSpriteNode{let sprite = SKSpriteNode(imageNamed: "Cactus")sprite.zPosition = Layer.Obstacle.rawValuereturn sprite
}

注意到实例方法生成一个纹理为Cactus的精灵并返回,这是之后源源不断生成障碍物的基础。

紧接着我们要有一个实例方法,作用是随机产生成对的障碍物到场景中,步骤如下:

  1. 使用createObstacle()得到下方障碍物的实例,并将其放置紧贴右侧屏幕边线。
  2. 障碍物y轴上的放置位置范围为10%~60%,分别计算最小与最大的y轴点位,通过随机函数得到两者之间的一个数作为y值,设置障碍物的position,最后添加到worldNode节点中。
  3. 同理实例化上方障碍物,将其旋转180°后放置距离下方障碍物3.5倍Player尺寸的地方,添加到worldNode节点中。
  4. 给上下障碍物增添一个移动Action,已一定速度自右向左移动,倘若超出屏幕,则从父节点中移除。
//新增三个常量
let kBottomObstacleMinFraction: CGFloat = 0.1
let kBottomObstacleMaxFraction: CGFloat = 0.6
let kGapMultiplier: CGFloat = 3.5// 在createObstacle()实例方法下方增添新方法
func spawnObstacle(){//1let bottomObstacle = createObstacle()    //实例化一个精灵let startX = size.width + bottomObstacle.size.width/2//x轴位置为屏幕最右侧//2let bottomObstacleMin = (playableStart - bottomObstacle.size.height/2) + playableHeight * kBottomObstacleMinFraction //计算障碍物超出地表的最小距离let bottomObstacleMax = (playableStart - bottomObstacle.size.height/2) + playableHeight * kBottomObstacleMaxFraction //计算障碍物超出地表的最大距离bottomObstacle.position = CGPointMake(startX, CGFloat.random(min: bottomObstacleMin, max: bottomObstacleMax))    // 随机生成10%~60%的一个距离赋值给positionworldNode.addChild(bottomObstacle)   //添加到世界节点中//3let topObstacle = createObstacle()   //实例化一个精灵topObstacle.zRotation = CGFloat(180).degreesToRadians()//翻转180°topObstacle.position = CGPoint(x: startX, y: bottomObstacle.position.y + bottomObstacle.size.height/2 + topObstacle.size.height/2 + player.size.height * kGapMultiplier)//设置y位置 相距3.5倍的Player尺寸距离worldNode.addChild(topObstacle)//添加至世界节点中//4 给障碍物添加动作let moveX = size.width + topObstacle.size.widthlet moveDuration = moveX / kGroundSpeedlet sequence = SKAction.sequence([SKAction.moveByX(-moveX, y: 0, duration: NSTimeInterval(moveDuration)),SKAction.removeFromParent()])topObstacle.runAction(sequence)bottomObstacle.runAction(sequence)
}

倘若你迫不及待想看看成果,将spawnObstacle方法添加至didMoveToView()最下方,点击运行。一对障碍物“呼啸而过”,然后就没有然后了…确实目前这个方法仅仅只是产生一对罢了,为此我们还需要新增一个方法用于源源不断的产生障碍物。请添加如下内容到spawnObstacle()方法下方

func startSpawning(){//1let firstDelay = SKAction.waitForDuration(1.75)//2let spawn = SKAction.runBlock(spawnObstacle)//3let everyDelay = SKAction.waitForDuration(1.5)//4let spawnSequence = SKAction.sequence([spawn,everyDelay])//5let foreverSpawn = SKAction.repeatActionForever(spawnSequence)//6let overallSequence = SKAction.sequence([firstDelay,foreverSpawn])runAction(overallSequence)
}
  1. 第一个障碍物生成延迟1.75秒
  2. 生成障碍物的动作,用到了先前的实例方法spawnObstacle.
  3. 之后生成障碍物的间隔时间为1.5秒
  4. 之后障碍物的生成顺序是:产生障碍物,延迟1.5秒;产生障碍物,延迟1.5秒;产生障碍物,延迟1.5秒…可以看出[产生障碍物,延迟1.5秒]为一组重复动作。
  5. 使用SKAction.repeatActionForever重复4中的动作。
  6. 将延迟1.75秒和重复动作整合成一个SKAction的数组,然后让场景来执行该动作组。

请将didMoveToView()方法中的spawnObstacle替换成startSpawning(),点击运行。

倘若觉得不错,请点击喜欢并关注我吧.^.^

用Swift做个游戏Lecture04 —— 仙人掌的狙击相关推荐

  1. Swift版iOS游戏框架Sprite Kit基础教程下册

    Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C  介绍:本教程是国内唯一的Swift版的Spritekit教程 ...

  2. Python也有做大型游戏的潜力?原来我们小看了Python,无所不能!!

    前言 在小编以前还没怎么接触很多编程语言时,都是认为游戏(端游,手游)都是用C做出来了!不知道大家有没有这么想过,反正我是这样的.后来慢慢接触多了,才知道并不是所有的都是这个样子的! 学习python ...

  3. c语言编程数独游戏,编程做数独游戏

    数独游戏非常好玩,可以训练玩家的逻辑推理能力.数独游戏的规则是: 1.在9×9的大九宫格内,已给定若干数字,其他宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 2.必须满足的条件:每一行 ...

  4. python做的大型游戏_Python有做大型游戏的潜力吗?

    由于最近我要考试忙不过来没修改回答,谢谢评论区大们的指正,我认识到的pygame库确实可以做游戏,但是pygame限制很多,特别是做大型游戏方面,3D还没有相关的优化方法等(3D游戏,pygame表示 ...

  5. 关于javaswing做的游戏的一点小总结x

    之前看了几个swing小游戏,也动手敲了下,比如俄罗斯方块,小鸟,"是男人就坚持30秒",射击游戏等,有点小总结: 所有swing做的游戏,无非是一种页面,一种可以与人交互,可以控 ...

  6. 十种做Flash游戏赚钱的方法

    如果你做Flash游戏纯粹是为了兴趣或者是好玩,那为什么不一边玩一边赚钱呢?我曾做过很多Flash游戏并因此赚了不少钱.下面我就要公开我总结的十条做Flash游戏赚钱的秘笈. 好了,现在我们切入正题, ...

  7. java做小游戏扫雷(附源码)

    下载解压即可玩:扫雷 项目代码下载:java代码 目录 图片 怎么自己也能做 代码细节 感受 全部代码 GameWin.java类 : MapBottom.java类: GameUtil.java类: ...

  8. Python 用pygame 做一个游戏的开始界面(小白第一篇博客)

    Python 用pygame 做一个游戏的开始界面(小白第一篇博客) 主要功能实现 本篇文章主要是实现了一个游戏开始界面的两个功能: 1,将鼠标放到"开始游戏"或"结束游 ...

  9. 【CSDN英雄会】囯炬CEO张代浩:做写架构的人,做制定游戏规则的人

    英雄会是CSDN旗下针对国内IT技术领域专家展示和交流的平台.通过线下线上的互动形式,为CSDN社区专家提供更多学习.合作.宣传的机会.英雄会后续将在北上广深等国内一二线城市建立分会,各个分会后期将组 ...

最新文章

  1. linux 用户态 隐藏进程 简介
  2. 二维矩阵中的最大矩形面积--java实现
  3. HIT 2060 Fibonacci Problem Again
  4. php curl http2,用php做ios http2推送服务遇到的坑
  5. 2018一季度app Top500榜单,谁在抢线上最后的流量?
  6. python 面试题 -------------- get 和 post 请求的 区别
  7. Linux定时删除过期日志文件
  8. 用汇编语言实现itoa函数
  9. RK3288_Android7.1平台基于DRM框架的LCD开发
  10. SQLyog安装使用教程
  11. DDCTFMulTzor-xoortol的使用
  12. 肺腑之言-写给喜欢单片机的初学者
  13. powerdesign导出表结构
  14. 【Unreal Engine探索实践】第一个ARPG游戏的探索实践——ACT类第三人称3D动作游戏的简单实现
  15. 破解第三课 关键跳和关键CALL
  16. Linux -- snmp v3开通、认证、加密及其他
  17. iOS 自定义相机功能
  18. 新手Mac需要了解哪些内容?Mac小白基础教程
  19. Unity中一些小技巧
  20. 【MySQL】警告: 1681 - XXX is deprecated and will be removed in a future release.

热门文章

  1. 【转】FET场效应晶体管扫盲
  2. 二进制代码保护和混淆
  3. H5获取wifi列表及当前wifi
  4. 微信小程序 页面传参(url)参数过长报错解决办法
  5. c语言输出1028以上的小数,《小数点位置移动引起小数的大小变化》教学设计
  6. LXD使用踩过的坑1——网络配置(后续遇到坑再更新......)
  7. 庆生二十年 2018爱普生创新大会在京举行
  8. 数学表达式转换成python_简单数学表达式_清华尹成python入门教程_少儿编程视频-51CTO学院...
  9. 长尾关键词是什么意思?
  10. 性能调优攻略:完整地讲述了一些代码级别的技术和方法