关闭

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

标签: 游戏CocosCreator教程实战
2908人阅读 评论(0) 收藏 举报
分类:

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

    },
});

看一下效果

这里写图片描述

0
0
查看评论

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

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

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

获取和加载资源 Cocos Creator 有一套统一的资源管理机制 ,在本篇教程,我们将介绍 资源的分类如何在 属性检查器 里设置资源动态加载 Asset动态加载 Raw Asset 资源的分类 目前的资源分成两种,一种叫做 Asset,一种叫做 R...
  • alpha_xiao
  • alpha_xiao
  • 2016-08-03 11:54
  • 12448

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

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

Cocos Creator 使用对象池(摘自官方文档)

使用对象池 在运行时进行节点的创建(cc.instantiate)和销毁(node.destroy)操作是非常耗费性能的,因此我们在比较复杂的场景中,通常只有在场景初始化逻辑(onLoad)中才会进行节点的创建,在切换场景时才会进行节点的销毁。如果制作有大量敌人或子弹需要反复生成和被消灭的动作类游...
  • alpha_xiao
  • alpha_xiao
  • 2016-08-03 11:54
  • 2636

Cocos2d creator js 使用javascript制作扑克游戏

1.前言           最近想做一个游戏,想起以前做安卓游戏的时候,ios他就运行不了,所以跨平台是一个目标,然后大概有二种语言备选,lua和js,其实我只是个写java的,都二种语言都不太熟悉,但是js的框架还是用了一些,就选择了js,目前只...
  • current_person
  • current_person
  • 2016-08-02 16:27
  • 5374

cocos Creator学习 二

node.active 就是 true,可见?,  false:不可见? 在构造函数里面 带下划线的变脸前面_  : 私有变量
  • W_han__
  • W_han__
  • 2017-01-24 12:32
  • 1050

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

Cocos Creator 有一套统一的资源管理机制 ,在本篇教程,我们将介绍资源的分类如何在 属性检查器 里设置资源动态加载 Asset动态加载 Raw Asset资源的分类目前的资源分成两种,一种叫做 Asset,一种叫做 Raw Asset。AssetC...
  • likendsl
  • likendsl
  • 2016-12-01 12:37
  • 5494

【CocosCreator】场景onLoad中动态初始化数据

cocoscreator 数据动态初始化
  • LIUHUAN0520
  • LIUHUAN0520
  • 2016-11-17 16:33
  • 2081

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

我们先来考虑一下这个PrefabManager是干什么的,我们的游戏中有重复出现的水管和老公,所以PrefabManager要能够动态管理他们,理所当然要有创建和销毁的方法,创建很简单,我们只需要每隔一段距离往pipeLayer添加子节点就行了,但销毁它们还是需要一些技巧的,从逻辑角度来说,当水管和...
  • potato47
  • potato47
  • 2016-08-29 07:56
  • 2908

Unity3D学习笔记之三Prefab组件的使用

本次教程,我们来创建一个简单的Prefab组件。 教程参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》。 说到Prefab,中文翻译为预设体,在Unity官方的书本《Unity4.X从入门到精通》中的解释是:可以理解为是一个游戏对象及其组件的集合,目的是使游戏对象及资...
  • u012200908
  • u012200908
  • 2015-01-01 10:41
  • 8071
    个人资料
    • 访问:205922次
    • 积分:2770
    • 等级:
    • 排名:第15372名
    • 原创:70篇
    • 转载:8篇
    • 译文:0篇
    • 评论:176条
    最新评论