居然使用 TyptScript...

  先贴手册地址:http://www.typescriptlang.org/docs/tutorial.html

先要接受一个诡异的写法:

private loadingView:LoadingUI;
  • 首先支持了 private、public
  • 类的对象名在前:loadingView
  • 类的类型名在后:LoadingUI(在JS上封装出了强类型?)

TyptScript 的特性:

  • 类 Classes
  • 接口 Interfaces
  • 模块 Modules
  • 类型注解 Type annotations
  • 编译时类型检查 Compile time type checking
  • Arrow 函数 (类似 C# 的 Lambda 表达式)

  只能说微软的人硬是要用 C# 的语法特性重新封装一下 JS 让自己更顺手么 - -。

Module:

  略微看了下 Modules 的作用,提供了 export 与 import 关键字,那就很明白了:模块与模块之间是不透明的,允许其他模块使用的资源需要用 export 声明,引用其他模块资源时需要用 import 进口。

Function:

  function 函数名:参数列表:返回值类型 { 函数内容 }

function add(x: number, y: number): number {
return x + y;
}
let myAdd = function(x: number, y: number): number { return x+y; };

开始 Egret 之旅:

  先上 API 参考:http://edn.egret.com/cn/index.php/apidoc/egret243/

第一个 demo - createGameScene():

    private createGameScene():void {
console.log("Runtime start."); this.stage.width = 480;
this.stage.height = 960; var bg: egret.Shape = new egret.Shape(); // Shape 绘制块状区域
bg.graphics.beginFill(0x0000ff);
bg.graphics.drawRect(0, 0, this.stage.width, this.stage.height);
bg.graphics.endFill();
this.addChild(bg); // 刷新到屏幕 var tx: egret.TextField = new egret.TextField(); // TextField 控制文本块
tx.text = "I'm Jack, I will use Egret create a fantasy mobile game!";
tx.x = 20;
tx.y = 20;
tx.width = this.stage.width - 40;
this.addChild(tx); tx.touchEnabled = true; //激活 touch
tx.addEventListener(egret.TouchEvent.TOUCH_TAP, this.touchHandler, this); //增加事件监听 console.log("Runtime end.");
}


private touchHandler(evt:egret.TouchEvent):void{ //事件处理API
var tx:egret.TextField = evt.currentTarget;
tx.textColor = 0x00ff00;
}

资源配置:

  Resoure 目录下的 default.res.json 是资源清单文件,每一项资源都包含 name、type、url 三个属性。

  • name:表示这个资源的唯一标识符。注意资源比较多的项目应确定一套命名规则,避免不同资源命名之间重复或太接近而易混淆。

  • type:表示资源类型。紧跟着会进一步讲解其含义及取值规则。

  • url:表示当前资源文件的路径。通常我们约定配置类型的资源置于config子目录下;其他类型置于assets子目录下。

    •   每个”resource”单位中的type,是Egret约定好的若干类型,最常用的有以下类型:

      •     image:表示各种常见的图片类型,包括PNG和JPG格式,载入后将解析为egret.Texture对象;

      •     text:表示文本类型,即文本文件,载入后将解析为string对象;

      •     json:也是一种文本类型,不过内容是json格式的,载入后将直接解析为json对象;

  我们在某种游戏场合,需要同时加载若干资源,用以准备后续的游戏流程显示。我们可以将若干项资源定义为一个资源组。需要时,只需加载这个资源组即可。 “groups”是预加载资源组的配置,每项是一个资源组。 每一个资源组须包含两个属性:

  • name:表示资源组的组名

  • keys:表示这个资源组包含哪些资源,里面的逗号分隔的每一个字符串,都与”resource”下的资源name对应。

白鹭的这张图还是具有代表性的:

资源加载:

  非常简单明了的逻辑:清单加载监听 -- 加载清单 -- 关闭清单监听 -- 开启资源组加载监听 -- 按需加载资源组 -- 加载完资源后关闭监听

        RES.addEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this);   //加载配置清单事件监听
RES.loadConfig("resource/default.res.json", "resource/"); //加载配置清单
    private onConfigComplete(event:RES.ResourceEvent):void {                                        //回调 -- 加载清单完成时
RES.removeEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this); //移除加载清单监听
RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onResourceLoadComplete, this); //资源组加成完成监听
RES.addEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR, this.onResourceLoadError, this); //资源组加载错误监听
RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS, this.onResourceProgress, this); //资源组加载进度监听
RES.addEventListener(RES.ResourceEvent.ITEM_LOAD_ERROR, this.onItemLoadError, this);
RES.loadGroup("preload");
}
    private onResourceLoadComplete(event:RES.ResourceEvent):void {  //回调 -- 资源组加载完成时
if (event.groupName == "preload") {
this.stage.removeChild(this.loadingView); //删除进度条
RES.removeEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onResourceLoadComplete, this); //移除各类监听
RES.removeEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR, this.onResourceLoadError, this);
RES.removeEventListener(RES.ResourceEvent.GROUP_PROGRESS, this.onResourceProgress, this);
RES.removeEventListener(RES.ResourceEvent.ITEM_LOAD_ERROR, this.onItemLoadError, this);
this.createGameScene();
}
}

  资源管理的统一入口是全局的 “RES” 命名空间里的 API。

  Stage 可通过设置子项的“显示优先级”来控制层次:

this.setChildIndex( captain, 2);

来做一个官网 超级英雄的例子:

1. 先把4个超级英雄P出来做成资源,放入 Resource 目录的 asserts 文件夹下。

2. 配置 default.res.json,新增一个资源组。

3. 在 Main 中,将加载 preload 改成加载 heroes 资源组。

    private createGameScene():void {

        var bg:egret.Shape = new egret.Shape();
bg.graphics.beginFill(0x336699);
bg.graphics.drawRect(0, 0, this.stage.stageWidth, this.stage.stageHeight);
bg.graphics.endFill();
this.addChild(bg); var batman:egret.Bitmap = new egret.Bitmap(RES.getRes("hero1_png"));
batman.x = 10;
batman.y = 20;
this.addChild(batman); var captain:egret.Bitmap = new egret.Bitmap(RES.getRes("hero2_png"));
captain.x = 130;
captain.y = 20;
this.addChild(captain); var superman:egret.Bitmap = new egret.Bitmap(RES.getRes("hero3_png"));
superman.x = 250;
superman.y = 20;
this.addChild(superman); var hulk:egret.Bitmap = new egret.Bitmap(RES.getRes("hero4_png"));
hulk.x = 370;
hulk.y = 20;
this.addChild(hulk); console.log("Display indexes:", this.getChildIndex(bg), this.getChildIndex(batman), this.getChildIndex(captain), this.getChildIndex(superman), this.getChildIndex(hulk));
this.swapChildren(superman, hulk);
console.log("Display indexes:", this.getChildIndex(bg), this.getChildIndex(batman), this.getChildIndex(captain), this.getChildIndex(superman), this.getChildIndex(hulk)); hulk.anchorOffsetX = 30; //设置锚点 -- 将图片上的某个点设置为原点,可用作为该图标的代表将其部署在一个相对于画布原点的坐标上
hulk.anchorOffsetY = 40;
hulk.x += 30; //修正设置锚点带来的偏移
hulk.y += 40; this.times = -1;
var self = this;
this.stage.addEventListener(egret.TouchEvent.TOUCH_TAP,() => { //蛮做了一个测试,可以用类似C#的匿名函数写法,也可以用 function() 代替 () =>
switch(++self.times % 3){
case 0:
egret.Tween.get(batman).to({x:superman.x}, 300, egret.Ease.circIn); //get:激活一个对象为其添加动画,x:修改其横坐标属性
egret.Tween.get(superman).to({x:batman.x}, 300, egret.Ease.circIn); //to:修改其属性 - para1:目标状态,param2:持续时间,param3:补间方程
break;
case 1:
egret.Tween.get(captain).to({alpha:0.3}, 300, egret.Ease.circIn).to({alpha:1}, 300, egret.Ease.circIn); //alpha:修改其透明通道属性
break;
case 2:
egret.Tween.get(hulk).to({scaleX:0.4, scaleY:0.4}, 500, egret.Ease.circIn).to({scale:1, scaleY:1}, 500, egret.Ease.circIn); //scaleX、scaleY:修改其缩放比例属性
break;
}
}, this);
}

Egret 入门的更多相关文章

  1. Egret入门学习日记 --- 第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容)

    第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容) 既然选好了Egret,那我就要想想怎么学了. 开始第一步,先加个Q群先,这不,拿到了一本<E ...

  2. Egret入门了解

    0.前言 这个星期没有什么事做,就想找点技术了解一下.前段时间看过Egret,用来开发HTML5小游戏.一开始以为很麻烦的,但是经过这两天了解了一下,如果用这个游戏引擎来开发一些简单的游戏,还是蛮方便 ...

  3. Egret入门(一)--简介

    关于Egret 构建2D游戏,开源. TS + JS 完成打包后可以转换成HTML5的游戏(跨平台) Egret特点 1. 优秀的设计思想 2. 高效的渲染模块 3. 完善的配套工具 4. 灵活的工作 ...

  4. Egret入门(三)--创建HelloWorld项目(4.0-使用Egret Wing)

    准备 编辑器: Egret Wing3(4.0.3) 需要下载安装 语言: TepyScript(JS的超集,参考手册http://bbs.egret.com/thread-1441-1-1.html ...

  5. Egret入门(二)--windows下环境搭建

    准备材料 安装Node.js TypeScript编辑器 HTTP服务器(可选) Chorme(可选) Egret 安装Node.js 打开www.nodejs.org 下载安装(全部next,全默认 ...

  6. Egret入门学习日记 --- 第四篇

    第四篇(学习篇) 好了,今天继续把昨天的问题解决了. 今天见鬼了. 现在界面又出来了.唯一我动过的地方,应该就是这里: 是的,我点了一下刷新.之后,不管我怎么创建新的EXML文件,放在src目录,还是 ...

  7. Egret入门学习日记 --- 第二十篇(书中 9.1~9.3 节 内容 组件篇)

    第二十篇(书中 9.1~9.3 节 内容 组件篇) 第八章中的内容. 以上都是基本的Js知识,我就不录入了. 直接来看 第9章. 开始 9.1节. 以上内容告诉你,Egret官方舍弃了GUI,使用了E ...

  8. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

  9. Egret入门学习日记 --- 第十八篇(书中 8.5~8.7 节 内容)

    第十八篇(书中 8.5~8.7 节 内容) 其实语法篇,我感觉没必要写录入到日记里. 我也犹豫了好久,到底要不要录入. 这样,我先读一遍语法篇的所有内容,我觉得值得留下的,我就录入日记里. 不然像昨天 ...

随机推荐

  1. 从git上下载代码并导入eclipse

    主要分为两步: 1.先从git下载代码到本地git仓库 2.eclipse import导入存在的maven项目

  2. Beautiful Numbers

    http://codeforces.com/problemset/problem/300/C 题意:给你三个数a,b,n;求满足由a,b组成的n位的个数,且每个位置上的数之和也是用a,b组成; 解析: ...

  3. 详解udev

    如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...

  4. Solr使用solr4J操作索引库

    Solrj是Solr搜索服务器的一个比较基础的客户端工具,可以非常方便地与Solr搜索服务器进行交互.最基本的功能就是管理Solr索引,包括添加.更新.删除和查询等.对于一些比较基础的应用,用Solj ...

  5. C语言学习_从VC++6.0开始

    前言: C语言是一门博大精深的语言,C语言往往是程序员以及所有软件行业从业者的第一门编程语言. 编程环境: 对于初学者来说,我一开始学习C语言,其实是用的turboc 2.0版本,这个很有历史感,但是 ...

  6. 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)

    群里看到这道题,用python做了做, def find(array): v_sum = greatest = 0 for a in array: v_sum += a v_sum = 0 if v_ ...

  7. 雅虎NCP:网络黄页的终结者

    雅虎NCP是什么,NCP能做什么,为什么NCP能够成为网络黄页的终结者.NCP在颠覆既有市场格局的同时,其真实目的时什么?是成为网络化操作系统还是图谋最大化长尾广告.笔者相信,过不了多久,市场将会告诉 ...

  8. Qt 学习之路:QFileSystemModel

    上一章我们详细了解了QStringListModel.本章我们将再来介绍另外一个内置模型:QFileSystemModel.看起来,QFileSystemModel比QStringListModel要 ...

  9. Android系统移植与驱动开发--第四章

    第四章 源代码的下载和编译 一个android内核相当于4G,而一个Linux内个只有几百M,Linux内核相对于android内核来说实在是小巫见大巫.了解android源代码不一定要详细了解,只去 ...

  10. verilog之task用法实例

    该用法的代码源自夏宇闻老师的教材. 源代码: module traffic_lights; reg clock, red, amber, green; , off = , red_tics = , a ...