我们先来考虑一下这个PrefabManager是干什么的,我们的游戏中有重复出现的水管和老公,所以PrefabManager要能够动态管理他们,理所当然要有创建和销毁的方法,创建很简单,我们只需要每隔一段距离往pipeLayer添加子节点就行了,但销毁它们还是需要一些技巧的,从逻辑角度来说,当水管和老公移动到屏幕外时我们就要将他们销毁,这里我们用一个普通班不会教的方法——利用碰撞检测系统

我们先给PrefabManager添加一个碰撞组件,编辑如图

给水管兄弟添加碰撞组件,设置tag为333

给水管哥哥添加碰撞组件,设置tag为3331

给水管弟弟添加碰撞组件,设置tag也为3331

给老公添加碰撞组件,设置tag为666

PrefabManager.js

cc.Class({extends: cc.Component,properties: {pipeGroupPre:cc.Prefab,starPre:cc.Prefab,pipeLayer:cc.Node,//上下管子之间距离范围spacingRange: cc.p(0,0),// 下面管子Y轴偏移量范围botYRange: cc.p(0,0),// 左右管子之间距离pipeSpace:0,//第一个管子位置oPipeX:0,//星星位置范围starYRange:cc.p(0,0),},init: function (game) {this.game = game;this.pipePool = new cc.NodePool();this.starPool = new cc.NodePool();for(var i=0;i<4;i++){this.pipePool.put(cc.instantiate(this.pipeGroupPre));this.starPool.put(cc.instantiate(this.starPre));}this.curPipeX = this.oPipeX;//当前管子位置this.spawnPipe();this.spawnPipe();cc.director.getCollisionManager().enabled = true;},onCollisionEnter: function(other,self){if(other.tag === 333){this.desPipe(other.node);}else if(other.tag === 666){this.desStar(other.node);}},spawnPipe: function(){var pipeGroup = this.pipePool.get();var pipeTop = pipeGroup.getChildByName("PipeTop");var pipeBot = pipeGroup.getChildByName("PipeBot");var botYPos = this.botYRange.x + Math.random() * (this.botYRange.y - this.botYRange.x);var space = this.spacingRange.x + Math.random() * (this.spacingRange.y - this.spacingRange.x);var topYPos = botYPos + space;pipeTop.y = topYPos;pipeBot.y = botYPos;pipeGroup.x = this.curPipeX;this.pipeLayer.addChild(pipeGroup);this.spawnStar();this.curPipeX += this.pipeSpace;},desPipe: function(node){this.pipePool.put(node);this.spawnPipe();},spawnStar: function(){if(Math.random() < 0.8){var star = this.starPool.get();star.y = this.starYRange.x + Math.random()*(this.starYRange.y - this.starYRange.x);star.x = this.curPipeX + this.pipeSpace/2;this.pipeLayer.addChild(star);}},desStar: function(node){this.starPool.put(node);},});

按照惯例,我们从上往下看

在属性中我们定义了需要用到的两个Prefab和一个pipeLayer节点,还有一些随机设置Prefab的参数(这里用二维的点来表示范围,x是最小值,y是最大值)

第一个管子的位置要在屏幕外

在init方法里我们定义了两个cc.NodePool,分别存放pipeGroup和star

最后排的那位同学问了一个问题”为什么要用NodePool,直接用instantiate复制和destroy销毁不就行了么?”

老师很表扬这种勇于提问的表现,但也要批评这位同学不好好预习的行为

现在我们来翻一下官方文档

“记住了吗”

“记住了”

屏幕里最多出现两个水管,因为人生难免有意外,所以我们在pool里放四个,

当prefab滚到屏幕外的回收区时,我们就把它放回pool里,这样就可以实现一个良性循环,毕竟全球变暖了,话说今年好像比去年热了,话说我好像跑题了。。。

每添加一个pipeGroup我们就要调用一次spawnStar方法,但老公不是一个随便的人,所以我们要给他添加一个出现的概率,0.8吧,毕竟老公是我们这个游戏的唯一吸引力。。。

最后我们要在Game.js里初始化PrefabManager

var Player = require("Player");
var CameraManager = require("CameraManager");
var PrefabManager = require("PrefabManager");
cc.Class({extends: cc.Component,properties: {player:Player,cameraManager:CameraManager,prefabManager:PrefabManager,},onLoad: function () {//返回键返回菜单cc.eventManager.addListener({event: cc.EventListener.KEYBOARD,onKeyPressed: function(keyCode, event) {if(keyCode == cc.KEY.back){cc.director.loadScene('Menu');}}}, this.node);this.startGame();},startGame: function(){this.cameraManager.init(this);this.prefabManager.init(this);this.player.init(this);},stopGame: function(){},gainScore: function(){},gainEnergy:function(){},
});

看一下效果

【用Cocos Creator给暗恋的女生写一个游戏(8)】——(Run Game) Prefab的动态管理相关推荐

  1. 【用Cocos Creator给暗恋的女生写一个游戏(3)】——游戏加载界面

    恰好今天Creator1.2发布,我们紧跟潮流,就用1.2开始做吧 X给游戏起了一个名字47-21,其中深意自己体会. (其实就是思琪名字的谐音,并且今年是她21岁的生日...当然你也可以理解为思琪爱 ...

  2. 全套源码丨Cocos Creator 轻松玩转 3D 策略对战游戏,创意拉满!

    又一款 Cocos Demo Team 的作品<疯狂打群架>上线了!<疯狂打群架>是一款 3D 策略对战小游戏,具有丰富的关卡.兵种等元素,项目完整开源,含工程源码.美术资源. ...

  3. 有没有测试女生暗恋的软件,判断一个女生有多喜欢你?有一套专门的“测试方法”,一试便知...

    原标题:判断一个女生有多喜欢你?有一套专门的"测试方法",一试便知 如何判断一个女生有多喜欢你? 在追女生的过程中,如果你能了解到女生对你的真实想法,那就可以判断正确的表白时机. ...

  4. Cocos Creator 一步一步实现重力球游戏

    「获取源码」 点击上方蓝字关注公众号「游戏开发小白变怪兽」,回复「重力球」获取源码及美术资源. 「游戏玩法」 通过手机陀螺仪,调整手机,让球从上一层的间隔中落到下一层,楼层会不断上涨,如果球碰到上方或 ...

  5. Cocos Creator一步一步实现重力球游戏,附完整代码

    『 游戏玩法 』 通过手机陀螺仪,调整手机,让球从上一层的间隔中落到下一层,楼层会不断上涨,如果球碰到上方或者下方的火焰,游戏结束. 『 游戏预览 』 『 开发工具 』 1. CocosCreator ...

  6. 用c语言给心仪的女生写一个电子钢琴

    导火线 2020/3/26 周四的晚上,上完公选课的我跑去打了几局排位,还遇到对面开挂.我心里那个气啊,就差2颗星了,还让不让人玩了.直接举报! 完了之后.某某人给我发了一条微信,说某某人其实比较喜欢 ...

  7. 判断奇偶microsoft visual basic_#梅园# 在心理学上面如何判断一个男生暗恋你的表现...

    都知道暗恋其实是比较痛苦的一件事情,因为暗恋只有自己一个人知道对方并不知道,但是有时候可以通过一个人的表现看出他是不是暗恋你,那一个男生暗恋你的表现都有哪些呢?如果一个男生暗恋你的话,你会发现他总会在 ...

  8. json list格式_来来来,一文让你读懂Cocos Creator如何读写JSON文件

    前言 在游戏开发过程中,读取配置文件是必不可少的,而使用JSON做配置文件又比较常见,本文重点给大家讲述如何在Cocos Creator开发中读取和解析JSON数据文件以及如何写JSON文件. 一.J ...

  9. Cocos Creator入职学习日记——篇1(KeyWord:艺术字、渐变色、透明过渡特效)

    刚入职,事情不是特别多,看到了之前一直在找的Cocos Creator的一些使用技巧,简做记录 目录 一.艺术字 二.渐变色 三.透明过渡特效 四.分享时间 一.艺术字 Cocos Creator的艺 ...

最新文章

  1. Oracle 12c因bug导致ORA-04031问题处理过程 | 云和恩墨技术通讯精选
  2. python和c 的区别-Python与C语言有什么区别?
  3. RDS数据订阅服务使用说明
  4. 看透网络执法官的本质
  5. java 中文转gb2312_Java将GB2312编码转化为汉字
  6. php实现微信第三方登录
  7. 教你使用SQLite Autoincrement(自动递增)
  8. 服务器淘汰cpu组装的电脑,从服务器淘汰下来的至强cpu还可以用多久
  9. 苹果电脑的计算机系统在哪里,苹果电脑切换系统按哪个键【方法介绍】
  10. Linuxnbsp;下摄像头驱动支持情况(…
  11. 2019年8月23日 星期五(韩天峰的swoole)
  12. 区分统一社会信用代码、组织机构代码、注册号
  13. centOS之php-fpm不可用
  14. 大三,请问现在自学Java还来得及吗?
  15. 识图在线识图_三个图片无损放大在线工具分享,把模糊图片变清晰
  16. Java 获取指定日期
  17. 美团C++软件开发笔试题
  18. c语言平台答案,C语言平台答案.docx
  19. (12)RabbitMQ的TTL(消息有效期)和DLX(死信交换机/队列)
  20. cordic sinh matlab,利用FPGA进行基本运算及特殊函数定点运算

热门文章

  1. 手机APP远程温湿度监控系统(连上公网、阿里云)
  2. 计算机保研英语面试问题,计算机保研面试英文自我介绍
  3. eigrp的负载均衡(等价负载均衡与非等价负载均衡)
  4. 利用VS2019:基于MFC对话框编写多功能计算器:0基础教程(应该是CSDN中代码最全的教程了)
  5. 2018 BDAC中国大数据应用大会7月成都举行!
  6. js调用php和php调用js的方法
  7. 分享5个免费的Python学习网站,新手小白赶紧收藏起来吧!
  8. 《疯狂宇宙》阅读笔记
  9. 几本.Net的经典书籍(转载)
  10. java 跳转deeplink链接_Deeplink(深度链接)唤起App,怎样实现无缝跳转