platform下的js分析_3

2023-11-16

主要包含 CCSAXParser.js

CCSAXParser.js

主要用于 解析 xml
如: cocos2d/tilemap/CCTMXXMLParser.js 文件中解析 tilemap的方法.
具体解析方式见 其中的 parseXMLString (xmlStr, tilesetFirstGid) 方法.

preprocess-class.js

增加预处理属性这个步骤的目的是降低 CCClass 的实现难度,将比较稳定的通用逻辑和一些需求比较灵活的属性需求分隔开。
主要方法是 preprocessAttrs(properties, className, cls, es6) 这个方法.

  1. SerializableAttrs
    表示可序列话的属性

  2. parseNotify (val, propName, notify, properties)
    处理 properties 中, 属性为 propName 中的 notify 参数.
    参见 https://docs.cocos.com/creator/2.1/manual/zh/scripting/reference/attributes.html

  3. checkUrl (val, className, propName, url)
    检查 url 属性

  4. parseType (val, type, className, propName)
    检查 type 属性

  5. postCheckType (val, type, className, propName)
    type属性的后置 检查

  6. getFullFormOfProperty (options, propname_dev, classname_dev)
    获得 properties[propname_dev] 的描述. 是一个对象,包含各种属性参数.

  7. preprocessAttrs(properties, className, cls, es6)
    解析 CCClass() 参数中 properties属性时调用.

  8. validateMethodWithProps(func, funcName, className, cls, base)
    检查 CCClass() 参数中 extends properties statics ctor是否正确.

CCClass.js

这是creator里面比较复杂的一个类. 这里简单过一次处理过程.
处理流程如下:

function CCClass (options) {
    options = options || {};

    var name = options.name;
    var base = options.extends/* || CCObject*/;
    var mixins = options.mixins;

    // create constructor
    var cls = define(name, base, mixins, options);
    if (!name) {
        name = cc.js.getClassName(cls);
    }

    cls._sealed = true;
    if (base) {
        base._sealed = false;
    }

    // define Properties
    var properties = options.properties;
    if (typeof properties === 'function' ||
        (base && base.__props__ === null) ||
        (mixins && mixins.some(function (x) {
            return x.__props__ === null;
        }))
    ) {
        if (CC_DEV && options.__ES6__) {
            cc.error('not yet implement deferred properties for ES6 Classes');
        }
        else {
            deferredInitializer.push({cls: cls, props: properties, mixins: mixins});
            cls.__props__ = cls.__values__ = null;
        }
    }
    else {
        declareProperties(cls, name, properties, base, options.mixins, options.__ES6__);
    }

    // define statics
    var statics = options.statics;
    if (statics) {
        var staticPropName;
        if (CC_DEV) {
            for (staticPropName in statics) {
                if (INVALID_STATICS_DEV.indexOf(staticPropName) !== -1) {
                    cc.errorID(3642, name, staticPropName,
                        staticPropName);
                }
            }
        }
        for (staticPropName in statics) {
            cls[staticPropName] = statics[staticPropName];
        }
    }

    // define functions
    for (var funcName in options) {
        if (BUILTIN_ENTRIES.indexOf(funcName) >= 0) {
            continue;
        }
        var func = options[funcName];
        if (!preprocess.validateMethodWithProps(func, funcName, name, cls, base)) {
            continue;
        }
        // use value to redefine some super method defined as getter
        js.value(cls.prototype, funcName, func, true, true);
    }


    var editor = options.editor;
    if (editor) {
        if (js.isChildClassOf(base, cc.Component)) {
            cc.Component._registerEditorProps(cls, editor);
        }
        else if (CC_DEV) {
            cc.warnID(3623, name);
        }
    }

    return cls;
}
  1. define(name, base, mixins, options)
    此函数会调用 doDefine(className, baseClass, mixins, options) 函数,
    返回我们创建的 类的 constructor, 记作 cls.

  2. declareProperties(cls, name, properties, base, options.mixins, options.__ES6__)
    此函数会使用 preprocess-class.js 里面的 preprocessAttrs(properties, className, cls, es6)方法,
    对 properties 进行处理. 然后将 properties 里面的属性 放到 cls.__props__ 数组里.

  3. 处理 statics 变量和函数.

  4. 处理普通 属性和函数.
    注意,这里面处理的普通属性是放到 cls.prototype 上.

  5. 处理 editor
    参考: https://docs.cocos.com/creator/2.1/manual/zh/scripting/class.html

CCClass.js中 使用较多的函数.

  1. fastDefine
_fastDefine (className, constructor, serializableFields)

/*
此函数给 constructor 添加上__values__,__props__, __attrs__属性.
并且还会给 constructor.prototype 加上__classname__和__cid__ 属性.

Q1: 我们通过 cc.Class 创建的类,属性中__values__和__props__ 区别和用途.
__values__ 属性是 __props__ 的一个子集,__props__中包含所有的属性, __values__ 中包含所有可序列化的属性.
*/

转载于:https://www.cnblogs.com/daihanlong/p/10328638.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

platform下的js分析_3 的相关文章

  • 【基于Cocos Creator实现的赛车游戏】9.实现汽车节点的控制逻辑

    转载知识星球 深度连接铁杆粉丝 运营高品质社群 知识变现的工具 项目地址 赛车小游戏 基于Cocos Creator 3 5版本实现 课程的源码 基于Cocos Creator 3 5版本实现 在上一节的课程中 您已经实现了通过触控给刚体施
  • 【Python小游戏】当当当当 万众瞩目得《滑雪大冒险》来啦~(附源码)

    前文 大家好 我是梨子同学 希望大家多多支持我 哈哈 为了感谢每一个关注我的小可爱 每篇文章的项目源码都是无偿分享滴 见文末 很多csdn的功能还在研究中 还有小编的文笔不好勿怪 会慢慢进步跟大家一起学习的 小编也一直在学习编程 如果代码小
  • unity期末作业-插针游戏

    unity期末作业 插针游戏 附下载链接 鼠标控制针的发射 圆盘可以显示接住的针数目 若两根针碰到则界面变红 游戏结束 详细情况如下动态图 点我下载 https download csdn net download weixin 43474
  • 3D游戏编程与设计作业4——使用skybox构建游戏场景

    步骤1 首先下载支持使用Fantacy Skybox FREE 的Unity版本 2021 3 步骤2 打开unity store 搜索Fantacy Skybox FREE 并进行下载 步骤3 下载成功后import对应的包到项目中 步骤
  • Unity小游戏-勇闯小岛(PC) 项目展示+完整项目源码

    游戏录像 游戏玩法 主角可以变换四种状态 玩家通过四种状态特有的技能来击败眼前的怪物闯关 切换到棕色 有一个一直围绕自己旋转的大摆斧攻击敌人 切换到绿色 可以抵挡一切的投掷物 但是无法攻击敌人 切换到粉色 切换瞬间可以发出飞镖 切换到蓝色
  • RAIN{INDIE} 自动寻路

    Unity游戏中有较多的自动寻路插件 看过几个 大同小异 而RAIN中的Behavior Tree感觉很好 听名字就知道很条理 下面 就用它做个简单的寻路小例子 首先 导入RAIN的包 结构如下 在使用的过程当中还会产生几个文件夹用来存放E
  • HTML5游戏实战(2):90行代码实现捕鱼达人

    捕鱼达人是一款非常流行的游戏 几年里赚取了数以千万的收入 这里借用它来介绍一下用Gamebuilder CanTK开发游戏的方法 其实赚钱的游戏未必技术就很难 今天我们就仅用90来行代码来实现这个游戏 CanTK Canvas ToolKi
  • Pygame 教程(4)拓展:使用 subsurface 方法

    原文 图像传输和绘制文本 在本拓展文章 将展示如何使用pygame Surface subsurface方法实现原文中的更改线条粗细步骤 pygame Surface subsurface将获取原Surface对象的子Surface它与原S
  • 游戏引擎:打造梦幻游戏世界的秘密武器

    介绍 游戏引擎是游戏开发中不可或缺的工具 它为开发者提供了构建游戏世界所需的各种功能和工具 本文将介绍游戏引擎的概念 使用方法以及一个完整的游戏项目示例 游戏引擎的概念 游戏引擎是一种软件框架 它提供了游戏开发所需的各种功能和工具 包括图形
  • 【Unity Shader】屏幕后处理1.0:调整亮度/饱和度/对比度

    1 Unity中实现屏幕特效的基本步骤 什么叫屏幕后处理 Screen post processing effects 渲染完整个场景得到屏幕图像后对图像进行一系列操作 实现各种屏幕特效 这一步我们可以添加很多例如景深 Depth of F
  • Unity中loading页加载的实现

    首先创建一个Global cs 使用单例用于存储场景的名字 便于后续脚本的调用 此脚本不必挂载在游戏物体上 using UnityEngine using System Collections public class Global Mon
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • visual studio 一直显示正在准备解决方案

    首先重启电脑 无法解决的情况下执行以下步骤 Kill Visual Studio Open Visual Studio without loading a solution Disable AnkhSvn as Source Control
  • cocos creator学习笔记 十分详细

    游戏系统 分辨率及适配 当屏幕分辨率与设计分辨率不同时会出现适配问题 widget 对节点实现自动定位 运行原理 生命期回调 onLoad 回调会在节点首次激活时触发 比如所在的场景被载入 或者所在节点被激活的情况下 通常我们会在 onLo
  • 秋招内推码汇总:2024届 游戏公司

    给24届秋招的同学整理了一批秋招内推码 有需要的同学请自取 PS 内推码来自 内推鸭小程序 完美世界 内推码 NTAHVOH 巨人网络 内推码 NTAX3AU 诗悦网络 内推码 NTANdQx 网龙 内推码 EVBMJ3 西山居 内推码 N
  • 探索元宇宙链游戏:一场数字世界的奇妙融合

    随着互联网的飞速发展 以及人们不断对互动娱乐体验的要求提高 元宇宙渐渐成为人们追求的目标 而区块链技术的出现给元宇宙链游开发带来了新的机遇和挑战 一 元宇宙链游定义 元宇宙链游全称为基于区块链技术的元宇宙游戏 是一种新型的网络互动娱乐形式
  • zkSend — — 在Sui上发红包像发电子邮件一样简单

    12月14日 知名区块链媒体平台The Block发表了这篇关于对Mysten Labs联合创始人Adeniyi Abiodun的采访 文中 我们 指代该媒体 数据均为截止撰写文章时数据 以下是正文 两年前 当五名前Facebook工程师创
  • 坦克大战(二)

    欢迎来到程序小院 坦克大战 二 玩法 键盘 A W S D 键来控制方向 空格键发射子弹 N 下一关 P 上一关 Enter 开始 赶紧去闯关吧 开始游戏 https www ormcc com play gameStart 221 htm
  • 游戏被攻击了要怎么办

    有客户反馈刚上线新款游戏 没两天就被攻击了 导致用户无法登录 来咨询到我们这边能不能帮他解决 今天就来分享下 怎么预防游戏攻击和已经被攻击的游戏服务器该怎么处理 服务器不管是个人还是企业 被攻击的都有 在所难免 特别是新上线时候要承受住外来
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste

随机推荐