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

原创 2016年08月29日 07:56:52

我们先来考虑一下这个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(){

    },
});

看一下效果

这里写图片描述

版权声明:本文为博主原创文章,转载请保留原文链接blog.csdn.net/potato47

相关文章推荐

Cocos Creator 创建和销毁节点(摘自官方文档)

创建新节点 除了通过场景编辑器创建节点外,我们也可以在脚本中动态创建节点。通过 new cc.Node() 并将它加入 到场景中,可以实现整个创建过程。 以下是一个简单的例子: cc.Class(...

Cocos Creator中获取和加载资源(官方文档摘录)

Cocos Creator 有一套统一的资源管理机制 ,在本篇教程,我们将介绍资源的分类如何在 属性检查器 里设置资源动态加载 Asset动态加载 Raw Asset资源的分类目前的资源分成两种,一种...

【COCOS CREATOR 系列教程之三】PREFAB讲解&CC项目如何多开与分享

还有几天就要过年了,今天Himi就要坐车回老家了,这里提前祝福各位新年快乐、家庭和睦、万事如意。进入主题,今天讲解下的小伙伴比较在意的几点问题:(当前使用的版本 0.7.1)         1. 关...

【用Cocos Creator给暗恋的女生写一个游戏(12)】——跨场景访问节点、存储数据、添加音效音乐、打包发布

跨场景访问节点我们来看一下之前做的菜单场景中间有一个记录的label我们一直没理她,今天我们就来翻她的牌子我们每次游戏结束时都会有一个分数,这个分数变量在相应的游戏场景里,我们想要的效果时:当返回菜单...

数据结构JavaScript——双向链表、双向循环链表

双向链表的JS实现

【用Cocos Creator给暗恋的女生写一个游戏(6)】——(Run Game)主角逻辑

我们在Canvas节点的同级添加一个Game节点,并添加两个子节点如图新建一个脚本取名叫做“Game”并添加到Game节点上Game.jsvar Player = require("Player");...

【用Cocos Creator给暗恋的女生写一个游戏(5)】——(Run Game)场景搭建

先看图这个场景我们只用了两张小图片素材,分别是A1和B1对应的图片,而A2和B2是复制前面的,可以看出,A和B部分明显长出屏幕的宽,这是为了实现背景无限移动的效果(当图片滚动到一定距离,我们让它再重新...

【用Cocos Creator给暗恋的女生写一个游戏(9)】——(Run Game) 游戏逻辑与碰撞检测

至此为止,我们已经把主要的技术问题都解决了,现在我们给游戏添加 具体的逻辑给主角添加碰撞组件回顾一下我们已经添加的碰撞组件的节点管子兄弟:tag=333管子哥哥和管子弟弟:tag=3331大老公:t...

【用Cocos Creator给暗恋的女生写一个游戏(11)】——(Jump Game) 镜头跟随

上节自习大家是不是上的很开心啊。。。。大家是不是发现了两个游戏有辣么多相同的地方,就连很多节点的名字都一样但是有一个东西是第一游戏没有的,那就是中间的那个Camera我把Camera节点添加上颜色Ca...

【用Cocos Creator给暗恋的女生写一个游戏(13)】——整体回顾,工程文件

Load场景Load.jscc.Class({ extends: cc.Component, properties: { loadBar: cc.ProgressBar,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【用Cocos Creator给暗恋的女生写一个游戏(8)】——(Run Game) Prefab的动态管理
举报原因:
原因补充:

(最多只允许输入30个字)