最近听说Cocos2d JS官方在组织写新的代码例子。并且林顺同学在开会时说,Cocos2d JS接口将回归JS风格,成员变量访问方式用“.”,以及初始化时用对象字面量{}。非常不错啊。

如果之前是Cocos2d-x的C++程序员,在使用Cocos2d JS时很容易沿用C++的思路来写脚本。这种方式不容易发挥出脚本语言的快速开发优势。

在Cocos2d-x 的例子代码中有一些写法,尤其是在Test中,有许多代码是按照C++例子原样翻译过来的。里面应用了很多继承与组合等代码组织方式。并且,很多静态强类型语言的写法(类型强迫症),在脚本语言中对于开发速度是有很大影响的。

一、继承VS动态添加成员

继承,是一种最重量级的代码复用方式(他有自己的优势但是也有非常多的副作用)。但是问题在于,很多编辑器和运行库是既不支持协变又不支持各种动态绑定。这种情况下会让你的继承代码毫无作用。你只能选择组合,而组合差不多是一种最罗嗦的代码复用方式。他会很大程度抵消你的脚本语言开发速度优势。从这种情况看来CocosBuilder的设计无疑比CocoStudio要先进许多。

那么怎么做呢?因为脚本语言的优势可以在运行时动态给一个实例添加成员。 (Dynamic addition of methods and attributes to instances.)使用这种特性就可以跳过繁琐的继承+组合复用方式来构建代码。并且Cocos2d-x作为游戏引擎,因为存在UI等显示系统,也就是说存在一个全局节点树,可以用来递归遍历所有显示对象,使用类型判定然后直接调用相应的扩展函数直接在对象实例上进行扩展。

上面说的是指基于Cocos2d JS的二次开发代码的使用方法。在编写功能代码时也可以应用这种特性。

这么做的坏处是会破坏JS内部的类型系统(构造器与对象行为不匹配)。如果库的编写者和使用者没有充分沟通,可能会遇到无法理解的代码。让对象行为变得不可控,因为JS本身就是动态弱类型的。所以一定要严格限制功能代码中被扩展的对象的作用范围和使用范围,必要时使用文档规范,避免其他人接手莫名其妙的代码。

而对于自带运行库的编辑器来说,还有第二种选择——直接扩展插件。这是完全按照强类型的路子走了。

二、装载时执行OR装载时注册启动时初始化

代码在加载时可以执行,这是脚本语言的又一个特色。因此我们可以在代码文件被装载时自动做很多初始化工作。

但是这么搞也是存在一定问题的,如果初始化代码散落在不同的文件中,对debug是不利的。需要在多个调用点去来回查找。

不过凡事都有例外,如果你把很多代码当成资源加载,就不存在这种问题。比如,加载一些AI脚本、动画脚本、UI脚本的时候,就不存在这种问题。因为这些代码的接口规范都很统一,而且一定会有一个外部装载机制和管理机制。先通过读取文件将启动函数绑定好,再统一启动。

三、具名索引And有限状态机FSM

访问一个对象的成员,可以用[]内嵌名字(具名索引access attribute by name),也可以用.后面加名字。我建议动态获得的成员名进行访问时使用前一种方式,普通的成员访问时候使用后一种,以示区别。

尤其是通过[]内嵌名字方式,可以直接调用函数这种方式,可以非常好的同游戏中的各种状态机制和脚本指令结合。比状态模式(基于对象和接口)与状态变量(基于switch-case)要简便许多。

四、文件访问域And模块化

JavaScript的函数级作用域其实是很讨厌的。有几条原因:

1.一不小心很容易就污染了全局变量和全局函数

2.因为1的原因如果你选择对象构造方式来避免污染全局作用域又会遇到另外一个问题就是this。这个this不但罗嗦,每句都得写。还常常乱变,例如:bind callback的时候,在回调函数启动的时候,你常常无法确定当前this到底是哪个对象。(当然,在JS中也有一种叫bind this的技术,但有句话是:与其每次都解决问题,不如根本没问题)

Coffee是用闭包方式构造一个“文件访问域”的,还有很多库也有这种功能。这可以让你:

1.省掉写this

2.不会污染全局

当然如果你能支持module require还可以做更多的功能模块化开发(这对于前后端统一JS开发也很有好处)。官方介于闭包的性能和兼容性问题(都要考虑浏览器),应该不会添加CommonJS支持。

五、匿名回调函数

在bind callback时,直接通过匿名函数方式打入回调函数,是一种不错的方式,能够少写很多代码。

但是很多时候,如果遇到复杂流程控制,多种状态切换时,这种原地展开的callback,就会让代码可读性和错误查找变得困难起来,并且由于这种写法的上下文非常隐晦,还会引入this问题。

对于简单的UI显示控制,纯显示效果调用,匿名函数这种方式还是可以的。但是如果遇到复杂流程,并且牵扯到上下文,逻辑控制,函数复用,还是老老实实写实现,然后再bind callback时bind 函数比较好一点。

最后

都说JS的代码编写很多时候是基于函数的。卡哥的名言——“很多时候需要的仅仅是一个函数”。

写功能代码的时候。相对于OO,很多时候,你需要的是一个有用的对象,而不是类。对于类使用,在倾向于封装代码和类型约定(这个便于review和debug),但是如果说为了复用,明显有点太扯了(离需求太近,专门定制化的类,复用一定成问题)。当然关心代码质量和复用是好事,但是搞成项目改得精疲力尽就得不偿失了。

【cocos2d-x从c++到js】20:脚本语言风格的JS代码相关推荐

  1. 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

  2. 【前端灵魂脚本语言JavaScript①】——JS引入方式

  3. js 调用c语言函数看,JS函数调用的四种方法

    js的函数调用会免费奉送两个而外的参数就是 this 和 arguments .arguments是参数组,他并不是一个真实的数组,但是可以使用.length方法获得长度. 书上有说4中调用方式: 方 ...

  4. JavaScript——基于原型编程、多范式的动态脚本语言

    目录 JavaScript 01 关于JavaScript 1.1 JS的发展历史 1.2 JS的特性 1.3 JS的组成 1.4 JSP和JS的区别 02 在HTML中嵌入JS代码的三种方式 2.1 ...

  5. 脚本语言【JavaScript基础】JavaScript函数:声明+调用

    文章目录 在javaScript脚本语言当中:函数使用也是分为两部分:声明+调用 数组 在javaScript脚本语言当中:函数使用也是分为两部分:声明+调用 函数在JS当中声明方式有两种 关键字fu ...

  6. CC js----android 平台 java与js互调 , ios平台 Objective-c与js互调的例子

    android平台 java 调用 js java调用 js 很简单. cocos 封装了一个 Cocos2dxJavascriptJavaBridge import org.cocos2dx.lib ...

  7. 脚本语言和编程语言的区别和定义

    脚本语言和编程语言的比较 先说点大白话,没读懂得,看一下面官方的说法可能会理解更深入 我们经常用到的脚本语言有shell,js,python等,编程语言有java,c,c++,Go语言等 脚本语言比较 ...

  8. 将PHP作为Shell脚本语言使用

    我们都知道.PHP是一种非常好的动态网页开发语言(速度飞快.开发周期短--).可是仅仅有非常少数的人意识到PHP也能够非常好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并 ...

  9. 【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi )  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iph ...

最新文章

  1. [吴恩达机器学习笔记]12支持向量机3SVM大间距分类的数学解释
  2. 使用tf.print()打印tensor内容
  3. 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 4 章 答案
  4. code删除前两个_听说用python来批量删除说说也挺快乐的呢~
  5. php函数声明提前,php的日期处理函数及uchome的function_coomon中日期处理函数的研究...
  6. java 网格布局管理器,Java使用网格组布局管理器
  7. Win-MASM64汇编语言-LEA指令
  8. ViolinMemory上市遇低迷 唱衰闪存为哪般?
  9. C++ 基类和派生类的virtual虚析构函数
  10. 新手上路:在利用爬取中国知网(下载报纸)的诸多问题
  11. 嵌入式与物联网的关系还是挺复杂的,去同存异分析一波
  12. 2022数学建模国赛A题赛后总结
  13. 传统营销与网络营销的整合
  14. 说说你平时怎么优化mysql的_面试:给我说说你平时是如何优化MySQL的?
  15. JVM调优之参数配置: -Xms -Xmx -Xmn -XX:+PrintGCDetails -XX:UseSerialGC -XX:SurvivorRadio -XX:NewRadio
  16. 台式计算机没有声音怎么办,台式电脑没有声音了怎么恢复(在家用这两个方法轻松解决)...
  17. 关于学生课程分数的SQL查询
  18. matlab中画圆圈,如何在Matlab中绘制圆圈?
  19. 6年Java老鸟聊聊新人到底要不要学Java,从事互联网《打工人的那些事》
  20. 步进电机运动八大算法

热门文章

  1. 新一代软件工程的标配:持续集成
  2. 7-26晚上实现mystring
  3. java token生成和验证_java生成定长度的随机验证码
  4. python画切片图_python切片操作
  5. “星斗奖”九大类奖项揭晓:好未来、四川航空,瑞幸咖啡杨飞、中青旅张晓磊等入选...
  6. 数据之“星”冉冉升起,“星斗奖”申报正式启动!
  7. python生成式、生成器和迭代器
  8. 社交网络+大数据真的用来可以模拟一个活人吗?
  9. Google API 设计指南 - 前言
  10. Gartner: 2016年十大安全预测