COCOS2D-JS入门-官网template源码解析
首先介绍几个概念:
导演:
导演 (Director)是Cocos2d-JS引擎抽象的一个对象,Director是整个Cocos2d-JS引擎的核心,是整个游戏的导航仪,游戏中的一些常用操作就是由Director来控制的,比如OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点(游戏元素)的控制等,还有一些游戏数据的保存调用,屏幕尺寸的获取等都要由Director类来管理控制的。
场景:
场景(Scene)是Cocos2d-JS引擎抽象的一个对象,用Cocos2d-JS制作游戏就如同拍电影,事实上所有东西都必须放置到一个场景容器中才能最终被显示出来。游戏中我们通常需要构建不同的场景(至少一个),游戏里关卡、界面的切换其实就是一个一个场景的切换,就像在电影中变换舞台或场地一样。
层:
层(Layer)通常包含的是直接在屏幕上呈现的内容,并且可以接受用户的输入事件,包括触摸,加速度计和键盘输入等。每个游戏场景都可以有多个层,每一层都有各自负责的任务,比如专门负责背景显示的层,或显示敌人的层,或UI控件的层等等。一个场景至少有一个层(Layer)作为孩子节点。
了解了cocos游戏是由在以上三种概念的基础上建立后,我们再看源码:
首先看project.json:
我这里因为引入的是合并压缩后的cocos文件,所以把不相干的去掉了,功能如下:

这个文件没什么好说的,就是一些配置,没有功能控制类的代码,还有加载loading.js主要是在游戏资源加载完成之前显示loading的js库我们,所有主要的文件只有:main.js,resource.js,myApp.js
我们先看resource.js文件,从名字看,顾名思义是加载资源的列表,没有控制代码:

之后是main.js:
 cc.game.onStart = function(){
     /**
      * 判断资源是否加载完毕
      * 这里的cc.sys.isNative判断如果只是写web端游戏,其实可以去掉,看API说的是判断时候是Native应用
      */
     if(!cc.sys.isNative && document.getElementById("cocosLoading")) // del: !cc.sys.isNative &&
         document.body.removeChild(document.getElementById("cocosLoading"));
     var designSize = cc.size(480, 800); //辅助功能,创建一个尺寸
     var screenSize = cc.view.getFrameSize(); //获取视图的大小,即画布的尺寸
     /**
      * 判断是PC设备还是移动设备(这里通过视图尺寸判断)
      */
     if(!cc.sys.isNative && screenSize.height < 800){  // del: !cc.sys.isNative &&
         designSize = cc.size(320, 480);
         /**
          *  此属性通过官方API没有找到,可能是还没有更新
          *  通过查看源码可以看出cc.loader返回一个对象,此对象带有一个resPath属性,这个属性即设置资源的加载配置目录
          * @type {string}
          */
         cc.loader.resPath = "res/Normal";
     }else{
         cc.loader.resPath = "res/HD";
     }
     /**
      *cc.view.setDesignResolutionSize(width, height, resolutionPolicy) 主要用途为设置设计视图点大小的分辨率策略
      * width 设计分辨率宽度
      * height 设计分辨率高度
      * resolutionPolicy 分辨率策略
      *分辨率策略包括:
      *0 ResolutionExactFit 通过拉伸适配填充屏幕:如果设计分辨率的宽高比与屏幕分辨率的宽高比不相同,那么你的游戏视图将被拉伸
      *1 ResolutionNoBorder 全屏无黑边:如果设计分辨率的宽高比与屏幕分辨率的宽高比不相同,那么你的游戏视图的两个区域会被裁剪
      *2 ResolutionShowAll 全屏带黑边框:如果设计分辨率的宽高比与屏幕分辨率的宽高比不相同,那么将显示两个黑边框
      *3 ResolutionFixedHeight 按内容和屏幕的高度比,缩放内容的宽高
      *4 ResolutionFixedWidth 按内容和屏幕的宽度比,缩放内容的宽高
      *5 cc.ResolutionPolicy [仅限于Web功能]自定义分辨率策略,通过cc.ResolutionPolicy构建
      *
      * 通过源码可知cc.ResolutionPolicy所有常量属性代表数为下:
      * cc.ResolutionPolicy.EXACT_FIT = 0;
      * cc.ResolutionPolicy.NO_BORDER = 1;
      * cc.ResolutionPolicy.SHOW_ALL = 2;
      * cc.ResolutionPolicy.FIXED_HEIGHT = 3;
      * cc.ResolutionPolicy.FIXED_WIDTH = 4;
      * cc.ResolutionPolicy.UNKNOWN = 5;
      */
     cc.view.setDesignResolutionSize(designSize.width, designSize.height,cc.ResolutionPolicy.SHOW_ALL);
     /**
      * cc.LoaderScene.preload(resources, cb, target)
      * 加载资源文件,当所有资源都加载完毕后会调用target的 call function函数
      */
     cc.LoaderScene.preload(g_resources, function () {
         /**
          * cc.director.runScene(scene)
          * 运行一个场景。替换一个新的正在运行的场景或者输入第一个需要显示的场景。
          * 这里我们new一个新的场景
          */
         cc.director.runScene(new MyScene());
     }, this);
 };
 /**
  * cc.game.run()
  * 运行游戏
  */
 cc.game.run();
这里面setDesignResolutionSize()函数的第三个参数的6个效果如下:






还有一个地方要说的是cc.loader.resPath设置的就是resource.js里面加载资源的相对路径设置。
而第58行new的MyScene()对象就是接下来要说的内容:
myApp.js:
 var MyLayer = cc.Layer.extend({
     helloLabel:null,
     sprite:null,
     init:function () {
         /**
          * 首先执行this._super()调用父类(cc.layer)原有的init
          */
         this._super();
         /**
          * cc.director.getWinSize()
          * 返回画布视图大小
          * @type {*|cc.Size}
          */
         var size = cc.director.getWinSize();
         /**
          * 添加一个图片菜单项
          * cc.MenuItemImage(普通状态时的图像, 选中状态时的图像, 不可用状态时的图像, 回调函数, target)
          * 此方法返回一个cc.menu对象
          * 尽量将所有状态的图像都控制在同一个尺寸大小
          */
         var closeItem = new cc.MenuItemImage(
             s_CloseNormal,
             s_CloseSelected,
             function () {
                 cc.log("close");
             },this);
         /**
          * 设置图片菜单项的描点为中心点
          * 设置锚点,用百分比表示.
          * 锚点是所有的转换和定位操作的基点.
          * 它就像节点附加到其父节点的大头针.
          * 锚点是格式化(normalized)点,就像百分比一样.。(0,0)表示左下角,(1,1)表示右上角.
          * 但是你可以使用比(1,1)更大的值或者比(0,0)更小的值.
          * 默认的锚点是(0.5,0.5),因此它开始于节点的中心位置
          */
         closeItem.setAnchorPoint(0.5, 0.5);
         /**
          * 创建一个菜单对象
          */
         var menu = new cc.Menu(closeItem);
         /**
          * 设置原点(0,0)为左下角.即菜单对象所有子元素对应的的原点为左下角
          */
         menu.setPosition(0, 0);
         /**
          * 把图像菜单项对象添加到菜单对象中,层级设置为1
          */
         this.addChild(menu, 1);
         /**
          * 设置按钮显示在视图中的最右下角
          */
         closeItem.setPosition(size.width - 20, 20);
         /**
          * 添加标签
          * cc.LabelTTF(text, fontName, fontSize, dimensions, hAlignment, vAlignment)
          * cc.LabelTTF是cc.TextureNode的子类,此类可以使用系统字体或者指定的ttf字体文件在游戏中显示文本。
          * 所有cc.Sprite的特性都可以在cc.LabelTTF中使用。
          * cc.LabelTTF对象在使用js-binding方式编译的移动设备app上运行比较缓慢,可以考虑使用cc.LabelAtlas或者cc.LabelBMFont来代替。
          * 你在创建cc.LabelTTF的时候可以指定字体名称、字体对齐方式、字体尺寸和字体大小,或者使用cc.FontDefinition对象来创建。
          */
         this.helloLabel = new cc.LabelTTF("Hello World", "Impact", 38);
         /**
          * 设置标签在视图中的位置
          */
         this.helloLabel.setPosition(size.width / 2, size.height - 40);
         /**
          * 把此标签作为此层的子元素添加到层中,层级设置为5
          */
         this.addChild(this.helloLabel, 5);
         /**
          * 添加一个背景精灵
          * 创建二维一个精灵
          */
         this.sprite = new cc.Sprite(s_HelloWorld);
         this.sprite.setAnchorPoint(0.5, 0.5);
         this.sprite.setPosition(size.width / 2, size.height / 2);
         /**
          * 设置节点的缩放比例.默认的缩放比例是1.0.该函数可以同时修改X轴跟Y轴的缩放比例.
          * this.sprite.getContentSize()
          * 返回一个新的cc.size实例表示节点,为未进行变换之前的大小.
          *
          * 即这里以高度为比例因子,说明这里背景图片永远显示完整,不会被剪裁
          */
         this.sprite.setScale(size.height / this.sprite.getContentSize().height);
         /**
          * 把此图片作为此层的子元素添加到层中,层级设置为0
          */
         this.addChild(this.sprite, 0);
     }
 });
 var MyScene = cc.Scene.extend({
     onEnter:function () {
         /**
          * 首先执行this._super()调用父类(cc.scene)原有的onEnter
          */
         this._super();
         /**
          * 创建一个MyLayer层对象
          */
         var layer = new MyLayer();
         /**
          * 把新建的层对象添加到此场景中
          */
         this.addChild(layer);
         /**
          * 执行层对象的init方法
          */
         layer.init();
     }
 });
至此我们对于cocos的template模板就分析完了,这个只是对第一篇入门环境的补充,毕竟光搭建环境不知道运作原理还是无从下手的。此篇意在介绍和增强cocos web端的开发的总体认识,如果上面的模板代码明白所以然了,我想再通过网上的资料进行自我学习,还是可以写出一些自娱自乐的小游戏的,只要理解好cocos是面相对象的并且常常翻阅API,写个微信小游戏还是不成问题的,那么就到这了,大家努力吧,如果以后再cocos上有什么特别的见解,希望也能通过发表博文的形式来帮助更多的人入门,毕竟授人以鱼不如授人以渔,还需大家一起学习。
COCOS2D-JS入门-官网template源码解析的更多相关文章
- redhat7.4安装git(按照官网从源码安装)
		按照官方文档建议使用源码安装 1.为什么不用yum安装 yum安装确实简单,只用一行命令就可以了,但是yum安装的版本太低. //安装前使用info查看git版本信息等 yum info git yu ... 
- java官网门户源码 SSM框架 自适应-响应式 freemarker 静态模版引擎
		来源:http://www.fhadmin.org/webnewsdetail3.html 前台:支持(5+1[时尚单页风格])六套模版,可以在后台切换 官网:www.fhadmin.org 系统介绍 ... 
- vue系列---Mustache.js模板引擎介绍及源码解析(十)
		mustache.js(3.0.0版本) 是一个javascript前端模板引擎.官方文档(https://github.com/janl/mustache.js) 根据官方介绍:Mustache可以 ... 
- Flink 源码解析 —— 源码编译运行
		更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ... 
- Dubbo源码解析(一)服务发现
		一.Dubbo源码模块 官网地址 源码地址 1.1 源码模块组织 Dubbo工程是一个Maven多Module的项目,以包结构来组织各个模块. 核心模块及其关系,如图所示: 1.2 模块说明 dubb ... 
- Flink 源码解析 —— 如何获取 ExecutionGraph ?
		https://t.zsxq.com/UnA2jIi 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭建 Flink 1.6. ... 
- Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?
		前言 如今,许多用于分析大型数据集的开源系统都是用 Java 或者是基于 JVM 的编程语言实现的.最着名的例子是 Apache Hadoop,还有较新的框架,如 Apache Spark.Apach ... 
- Flink 源码解析 —— 如何获取 JobGraph?
		JobGraph https://t.zsxq.com/naaMf6y 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭建 F ... 
- Flink 源码解析 —— Flink JobManager 有什么作用?
		JobManager 的作用 https://t.zsxq.com/2VRrbuf 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ... 
随机推荐
- 获得WCF Client端的本地端口
			获得WCF Client端的本地端口 最近需要做个小功能,当WCF调用远程服务时,显示该调用的网速或流量.其中比较关键的一步就是需要获得WCF Client端的本地端口,原来以为是个简单的事情,结果 ... 
- 工作经常使用的SQL整理
			工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战 ... 
- Oracle 10g的空间管理
			一.表空间(包含表.字段.索引) 1.定义:表空间是一个逻辑概念,实质是组织数据文件的一种途径. 2.创建表空间 --创建表空间 create tablespace myspace datafile ... 
- Linux环境进程间通信(四):信号灯
			linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ... 
- ACM 位运算
			的幂 boolean power2(int x) { return((x&(x-1))==0)&&(x!=0): } For example: #include<stdi ... 
- WCF服务承载
			WCF服务承载(笔记) 自托管(也做自承载) 承载 WCF 服务最灵活.最便捷的方法就是进行自承载.要能够自承载服务,必须满足两个条件.第一,需要 WCF 运行时:第二,需要可以承载 Servic ... 
- Web API 的安全性
			Web API 的安全性 ASP.NET Web API 可非常方便地创建基于 HTTP 的 Services,这些服务可以非常方便地被几乎任何形式的平台和客户端(如浏览器.Windows客户端.An ... 
- linux 下 openssl 编译和交叉编译
			此随便记录一下编译openssl时遇到的各种问题以及解决办法. 点击此处下载 OpenSSL(version-1.0.1e) linux 64位系统编译32位版本: setarch i386 ./Co ... 
- javascript操作写入txt文件及消息: Automation 服务器不能创建对象问题
			简单的写入txt代码: function WriteTxt() { var fso, tf; fso = new ActiveXObject("Scripting.Fil ... 
- MTD设备驱动
			MTD(memory technology device):内存技术设备 是linux用于描述ROM,NAND,NOR等内存设备的子系统的抽象 MTD设备可以按块读写也可以按字节读写,也就是说MTD设 ... 
