Cocos-js快速上手

1.访问节点和组件

节点(active):在层级管理器中创建UI组件,空节点等。
组件(enabled):资源管理器上创建的TS,JS脚本,物理材质,动画片段(不仅限于脚本)

节点本身没有类型,显示的类型由组件实现

this.node 获得组件所在的节点
getComponent 获取同一个节点上的其他组件

2.常用节点和组件API

2.1 节点API

说明API
激活关闭节点this.node.active
更改节点父节点this.node.parent=parentNode / parentNode.addChild(this.node)
索引节点的子节点this.node.children / this.node.childrenCount
更改节点的位置this.node.x this.node.y / this.node.setPostion(x,y)
旋转this.node.rotation / this.node.setRotation
更改节点缩放this.node.scaleX this.node.scaleY / this.node.setScale(2, 2)
更改节点尺寸this.node.width this.node.height / this.node.setContentSize(100, 100)
更改节点锚点位置this.node.anchorX this.node.anchorY /this.node.setAnchorPoint(1, 0)
颜色和不透明度this.node.color this.node.opacity

3.生命周期回调

依赖于节点(active):__preload、onLoad、onDestroy
依赖于组件(enabled):onEnable、start、update、lateUpdate、onDisable

再到最终销毁的完整生命周期函数调用顺序为:onLoad -> onEnable -> start -> update -> lateUpdate -> onDisable -> onDestroy

onLoad:节点首次激活时触发

onEnable:当组件的 enabled 属性从 false 变为 true 时,或者所在节点的 active 属性从 false 变为 true 时激活。倘若节点第一次被创建且 enabledtrue,则会在 onLoad 之后,start 之前被调用。

start:组件第一次激活前,update之前触发 (初始化一些需要经常修改的数据)

update:每一帧渲染前更新物体的行为

lateUpdate:动效(如动画、粒子、物理等)更新之后才进行一些额外操作

onDisable:当组件的 enabled 属性从 true 变为 false 时,或者所在节点的 active 属性从 true 变为 false 时,会激活 onDisable 回调

onDestroy:当组件或者所在节点调用了 destroy(),则会调用 onDestroy 回调,并在当帧结束时统一回收组件。

4.创建和销毁节点

创建新节点:new cc.Node('Sprite')

克隆节点:cc.instantiate

销毁节点:node.destroy(),可以通过 cc.isValid 判断当前节点是否已经被销毁

destroy和removeFromParent的区别:后者不会从内存中释放,导致内存泄漏

API获取节点

this.node:当前节点

this.node.parent:父节点

this.node.children:子节点

cc.find():全局查找节点

cc.find(’’,someNode):查找子节点

API获取组件

node.getComponent()

5.加载和切换场景

//加载切换场景
cc.director.loadScene("MyScene");
//预加载
cc.director.preloadScene("table", function () {
    cc.log("Next scene preloaded");
});
//v2.4以后增加了新的加载方式
bundle.loadScene('MyScene', function (err, scene) {
    cc.director.runScene(scene);
});

6.监听事件

6.1事件的监听与关闭
//参数1:事件名称 参数2:方法 参数3:this指向

//开启监听
this.node.on('click',function(event){
    this.enabled = false
},this)

//关闭监听
this.node.off('click', function(event){
    this.enabled = false
}, this);
6.2 触摸事件

触摸事件在移动平台和桌面平台都会触发,只需要监听触摸事件即可同时响应移动平台的触摸事件和桌面端的鼠标事件

枚举对象定义对应的事件名事件触发的时机
cc.Node.EventType.TOUCH_STARTtouchstart当手指触点落在目标节点区域内时
cc.Node.EventType.TOUCH_MOVEtouchmove当手指在屏幕上目标节点区域内移动时
cc.Node.EventType.TOUCH_ENDtouchend当手指在目标节点区域内离开屏幕时
cc.Node.EventType.TOUCH_CANCELtouchcancel当手指在目标节点区域外离开屏幕时

触摸事件的重要API如下

API名类型意义
touchcc.Touch与当前事件关联的触点对象
getIDNumber获取触点的 ID,用于多点触摸的逻辑判断
getLocationObject获取触点位置对象,对象包含 x 和 y 属性
getLocationXNumber获取触点的 X 轴位置
getLocationYNumber获取触点的 Y 轴位置
getPreviousLocationObject获取触点上一次触发事件时的位置对象,对象包含 x 和 y 属性
getStartLocationObject获取触点初始时的位置对象,对象包含 x 和 y 属性
getDeltaObject获取触点距离上一次事件移动的距离对象,对象包含 x 和 y 属性

注意:触摸事件支持多点触摸,每个触点都会有发送一次事件给事件监听器

触摸事件的冒泡过程与普通事件的冒泡过程并没有区别,可以调用event.stopPropagation()可以主动停止冒泡过程。

6.3 鼠标事件

枚举对象定义对应的事件名事件触发的时机
cc.Node.EventType.MOUSE_DOWNmousedown当鼠标在目标节点区域按下时触发一次
cc.Node.EventType.MOUSE_ENTERmouseenter鼠标移入目标节点区域时,不论是否按下
cc.Node.EventType.MOUSE_MOVEmousemove当鼠标在目标节点在目标节点区域中移动时,不论是否按下
cc.Node.EventType.MOUSE_LEAVEmouseleave当鼠标移出目标节点区域时,不论是否按下
cc.Node.EventType.MOUSE_UPmouseup当鼠标从按下状态松开时触发一次
Node.EventType.MOUSE_WHEELmousewheel当鼠标滚轮滚动时

鼠标事件( cc.Event.EventMouse )的重要API如下( cc.Event 标准事件 API 之外):

枚举对象定义返回值类型意义
getScrollYNumber获取滚轮滚动的 Y 轴距离,只有滚动时才有效
getLocationObject获取鼠标位置对象,对象包含 x 和 y 属性
getLocationXNumber获取鼠标的 X 轴位置
getLocationYNumber获取鼠标的 Y 轴位置
getPreviousLocationObject获取鼠标事件上次触发时的位置对象,对象包含 x 和 y 属性
getDeltaObject获取鼠标距离上一次事件移动的距离对象,对象包含 x 和 y 属性
getButtonNumbercc.Event.EventMouse.BUTTON_LEFT 或 cc.Event.EventMouse.BUTTON_RIGHT 或 cc.Event.EventMouse.BUTTON_MIDDLE

6.4 键盘事件与重力传感事件

键盘,设备重力传感器此类全局事件是通过函数cc.systemEvent.on(type, callback, target)注册

  1. cc.SystemEvent.EventType.KEY_DOWN(键盘按下)
  2. cc.SystemEvent.EventType.KEY_UP(键盘释放)
  3. cc.SystemEvent.EventType.DEVICEMOTION(设备重力传感)

6.5 自定义事件

注意:emit只能传给自己,dispatchEvent可以向上冒泡

1.发送事件

//发射事件(性能考虑,最多只支持传递 5 个事件参数)
cc.Class({
  extends: cc.Component,
  onLoad () {
    // args are optional param.
    this.node.on('say-hello', function (msg) {
      console.log(msg);
    });
  },

  start () {
    // At most 5 args could be emit.
    this.node.emit('say-hello', 'Hello, this is Cocos Creator');
  },
});

bubble-event

//派送事件(采用冒泡派送的方式,不断传给上一级节点直至遇到event.stopPropagation()中断处理)

// 节点 c 的组件脚本中
this.node.dispatchEvent( new cc.Event.EventCustom('foobar', true) );
// 节点 b 的组件脚本中
this.node.on('foobar', function (event) {
  event.stopPropagation();
});

7.缓动系统

cc.Action
cc.tween:链式调用,更简洁

API说明
to绝对值计算(直接设置属性为结果)
by相对值计算(累加属性为结果)
then插入其他的缓动到队列中
repeat重复执行
delay延迟执行
sequenceaction队列,按顺序执行
repeatForever停止stopAllByTarget
parallel并行执行
call回调函数(动作执行完毕后调用)

8.使用计时器

//开始一个计时器
component.schedule(function() {
     // 这里的 this 指向 component
     this.doSomething();
 }, 5);

//更灵活的计时器
 // 以秒为单位的时间间隔
 var interval = 5;
 // 重复次数
 var repeat = 3;
 // 开始延时
 var delay = 10;
 component.schedule(function() {
     // 这里的 this 指向 component
     this.doSomething();
 }, interval, repeat, delay);

//只执行一次的计时器
 component.scheduleOnce(function() {
     // 这里的 this 指向 component
     this.doSomething();
 }, 2);
API
schedule开始一个计时器
scheduleOnce开始一个只执行一次的计时器
unschedule取消一个计时器
unscheduleAllCallbacks取消这个组件的所有计时器

9.音频播放

AudioEngineAudioSource 都能播放音频,它们的区别在于 AudioSource 是组件,可以添加到场景中,由编辑器设置。而 AudioEngine 是引擎提供的纯 API,只能在脚本中进行调用。

//this.audioSource
  cc.Class({
      extends: cc.Component,

      properties: {
          audioSource: {
              type: cc.AudioSource,
              default: null
          },
      },

      play: function () {
          this.audioSource.play();
      },

      pause: function () {
          this.audioSource.pause();
      },
  });
// cc.AudioEngine
 cc.Class({
     extends: cc.Component,

     properties: {
         audio: {
             default: null,
             type: cc.AudioClip
         }
     },

     onLoad: function () {
         this.current = cc.audioEngine.play(this.audio, false, 1);
     },

     onDestroy: function () {
         cc.audioEngine.stop(this.current);
     }
 });

10.CCClass进阶

1.原型对象参数说明
cc.Class({
	//类名,用于序列化
    //值类型:string
    name:"Character",
    
    //基类,可以是任意创造好的cc.Class
    //值类型:Function
    extends:cc.Component,
    
    //构造函数
    //值类型:Function
    ctor:function(){},
    
    //属性定义
    properties:{},
    
    //实例方法
    print:function(){
        cc.log(this.text)
    }
    
    //静态成员定义
    statics:{}
         
    // 提供给 Component 的子类专用的参数字段
    // 值类型:Object
    editor: {
        disallowMultiple: true
    }
})
2.构造函数

ctor:定义构造函数,为了保证反序列化能始终正确运行,不允许定义构造参数

__ctor__:允许定义构造参数,并且不会自动调用父构造函数(无特殊情况使用ctor)

3.判断类型

JavaScript原生instanceof

cc.isChildClassOf判断类的继承关系

4.继承

请注意,不论子类是否有定义构造函数,子类实例化前父类的构造函数都会被自动调用

重写方法:

var Shape = cc.Class({
    getName: function () {
        return "shape";
    }
});

var Rect = cc.Class({
    extends: Shape,
    getName: function () {
        return "rect";
    }
});
5.GetSet方法

设定了get以后,这个属性就不能被序列化,也不能指定默认值,但仍然可以附带除了defaultserializable外的大部分参数

如果没有和 get 一起定义,则 set 自身不能附带任何参数。和 get 一样,设定了 set 以后,这个属性就不能被序列化,也不能指定默认值。

前端模块化说明
AMD并行加载,提前执行(define return)
CMD并行加载,延迟执行(define moudle export)
Common.js后端NODE使用,同步加载 拷贝
ES6import 引用 必须在模块顶级

11.资源管理:Asset Bundle

AB包作为资源模块化工具,允许开发者按照项目需求将贴图,脚本,场景等资源划分在多个AB包中,然后在游戏运行过程中,按照需求去加载不同的AB包,以减少启动时需要加载的资源数量,从而减少首次下载和加载游戏时所需的事件,同时可以减少内存占用

AB包可以按照需求随意放置(远程服务器,本地,小游戏平台分包,跨项目服用,加载子项目中的AB包)

AB包是以文件夹为单位进行配置的,并且不支持嵌套不允许同名

AB包配置项功能说明
internal存放所有内置资源以及其依赖资源
main存放所有构建发布面板的参与构建场景中勾选的场景以及其依赖资源
resources存放resources目录下的所有资源以及其依赖资源
start-scene如果在构建发布面板中勾选了初始场景分包,则首场景将会被构建到 start-scene 中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值