Typescript

有可选参数的函数

函数有两个形参,假设第一个必传、第二个可传可不传

function add (n1: number,n2?:number):number{
}
add();   //报错,参数个数不匹配
add(1);  //正确
add(1,2);   //正确
有默认参数的函数
//当函数有可选参数时,我们必须检测参数是否被传递,我们还可以使用默认参数来解决参数不确定的情况
function add(n1: number, n2: number = 3): number{
    return n1 + n2
}
add() //报错
add(1)  // 4
add(1,2) //3
有剩余参数的函数
function add(...num:number[]): number{//number[]表示数组类型,数组里面为number
  var sum = 0;
  for(var i:number = 0;i<num.length;i++){
      sum + = num[i]
  }
  return sum;
}
add() //正确
add(1) //正确
add(2) //正确
认识类与对象
  • 类是一种复杂的数据结构,他是将不同类型的数据和这些数据相关的操作封装在一起的集合体
  • 对象是类的实例,是类描述的具体事物(类是对象的抽象化,对象是类的实体化)


属性:静态特性,例如姓名,年龄,身高
行为:动态行为,例如走路,跑步

  • 创建一个狗的类
class Dog{
    name: string;
    age: number;
    sex: string;
    constructor(n: string,a: number,sex: string){
        this.name = n;
        this.age = a;
        this.sex = s;
    }
    run(){
         console.log(this.name + '在跑')
    }
}
  • 创建Dog类的对象
var d1 = new Dog('旺财',3,'男');
//直接访问旺财的属性
console.log(d1.name) // '旺财'
  • egret run -a 实时编译
  • 可访问修饰符
    很多情况下,我们不希望一些属性在类外被访问到,我们可以借助属性访问修饰符:
    public 公有修饰符,可以在类外使用修饰的属性或行为
    protected 受保护的修饰符,可以在类(子类)内使用修饰的属性和行为
    private 私有修饰符,只可以在当前类使用修饰的属性和行为
注意:如果不用修饰符,默认为public修饰
  • 只读属性修饰符
    使用readonly修饰符将属性设置为只读的,即只读的属性不可被修改,只读属性必须在声明时或者构造函数里被初始化。
class Person{
    public readonly name: string = '张三';
    constructor(){  
    }
}
var p1 = new Person;
p1.name = '李四' //报错
游戏基础知识
  • 显示对象
    在egret渲染架构设计中,我们将能够参与渲染的对象抽象为显示对象。
    egret引擎中所有的显示对象类型表格


  • 坐标系
    egret游戏中的坐标原点位于舞台的左上角
  • 显示列表与容器类
    所有容器全部继承于DisplayObjectContainer
    DiaplayObjectContainer类中封装了显示列表常用的功能:
    • 添加/删除 子对象
    • 访问子对象
    • 检测子对象
    • 设置叠放次序
      添加显示对象到显示列表:
      this.addChild(shape)
      删除显示对象:
      this.removeChild(shape)
  • Shape矢量图和TextField文本类
    shape可以用来绘制一些简单图形,可是使用Graphic类中封装好的绘图方法
    TextField文本类可以用它来显示文本
//定义一个矢量图
var circle: egret.Shape = new egret.Shape();
//开始绘制图形,设置颜色
circle.graphic.beginFill(0x00FFFF);
//绘制图形
circle.graphic.drawCircle(200,200,200);
//结束绘制
circle.graphic.endFill();
//添加到显示列表中去
this.addChild(circle);

//定义个TextField文件对象
var msg: egret.TextField = new egret .TextField();
//添加到显示列表中去
this.addChild(msg);
//设置文本内容 
msg.text = '这是一段文本'
事件与用户交互
  • egret引擎中提供了与js一样的事件处理系统,并且在此基础上还提供了一个事件处理对象,通过一整套的事件处理机制,可以方便的响应用户交互输入与系统事件。
public constructor() {
    super();      
 this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
}
private onAddToStage(event: event.Event){
    console.log('舞台加载完毕')
}

上面例子描述了当舞台被加载入场景时触发的事件机制,当程序侦听到有显示对象加入舞台后,创建·egret.event对象派发egret.Event.ADD_TO_STAGE事件,我们在类中定义了一个私有函数onAddToStage(),用于执行事件触发后的相关操作。

  • 事件类:每个事件都有关联的事件类型

    • 事件类型以字符串的形式存储在Egret.Event.type属性中
    • 常见的事件对象,有如下:
      • 触摸事件 egret.TouchEvent
      • 声音事件 egret.SoundEvent
      • 定时事件 egret.TimeEvent
      • 文本事件 egret.TextEvent
      • 网络加载状态事件 egret.HTTPstatusEvent
      • I/O错误事件 egret.IOEvent
  • 创建侦听器

    • 要想使一个对象侦听某个事件,首先使用addEventListener方法来注册事件侦听器
    • 事件接受对象.addEventListener(事件类.事件类型,事件处理函数,事件处理函数的this对象)
    • 事件的发送者必须是 egret.EventDispatcher 类或者子类的实例。只有事件发送者才能侦听事件,并且可以 注册侦听器。
//设置circle可被点击
circle.touchEnabled = true;
var num:number = 0;
//监听点击事件
circle.addEventListener(egret.TouchEvent.TOUCH_TAP,function(){
    //console.log('点了我'+num+'次')
    msg.text = num
},this)

//移除监听事件(及时回收内存)

circle.addEventListener(egret.TouchEvent.TOUCH_TAP,this.touchHandler,this);
private touchHandler(e:egret.TouchEvent){
    var c: egret.Shape = <egret.Shape>e.target;
    console.log('被点击了');
// 要确保移除侦听器的对象,已经绑定了监听器,否则会报错
if(c.hasEventListener(egret.TouchEvent.TOUCH_TAP)){
        c.removeEventListener(egret.TouchEvent.TOUCH_TAP,this.touchHandler,this)
    }
//从舞台移除显示对象,要确定其已经在显示列表中,否则会报错
if(c.parent){
    this.removeChild(c)
    }
}
  • 加载头像出来:
    • 拖动头像图片到资源preload里
    • 自己定义一个Bitmap来放到舞台上显示该头像
    //定义一个bitmap
    var portrait: egret.Bitmap = new egret.Bitmap();
    //加载图片效果
    portrait.texture = RES.getRes('yu_jpg');
    //添加到显示列表中
    this.addChild(portrait);
    
    • 设置图片的一些属性
    //设置头像宽高
    portrait.width = stageW/2;
    portrait.height = stageW/2;
    //设置锚点的方式来实现水平居中
    portrait.anchorOffsetX = portrait.width/2;
    portrait.anchorOffsetY = portrait.height/2;
    portrait.x = stageW/2;
    portrait.y = portrait.height / 2;
    
  • 定义文本并添加内容
//定义文本
var text: egret.TextField = new egret.TextField();
//直接添加到显示列表中去
this.addChild(text);
//设置内容
    //es6字符串模板会保留格式
text.text = `《乡愁》 余光中

小时候,

乡愁是一枚小小的邮票`
//设置文本的宽度是屏幕(舞台)的宽度
 text.width = stageW;
//设置文本背景色
text.background = true;
text.backgroundColor = 0xe8fff5;

//设置文本的位置,距离头像底部10
text.y = portrait.height + 10;
//设置字体颜色
text.textColor = 0x199fc2;
//设置文本的高度(文本内容上下留10)
text.height = text.height + 20;
//设置文本居中(水平/垂直)
text.textAlign = egret.HorizontalAlign.CENTER;
text.verticalAlign = egret.VerticalAlign.MIDDLE;

//声明滚动视图
var scroll: egret.ScrollView = new egret.ScrollView();
//直接添加到显示列表中去
this.addChild(scroll);
//设置可滚动范围
scroll.width = stageW;
scroll.height = stageH;
  • 设置滚动容器
//定义一个容器
var content: egret.Sprite = new egret.Sprite();
//设置容器可以滚动
scroll.setContent(content);
//需要滚动的部分都要添加到可滚动容器中去
content.addChild(portrait);
content.addChild(text);
  • 添加缓动动画
var change = () => {
    //默认portrait的旋转角度为0
    portrait.rotation = 0;
    //使用Tween动画库实现,激活portrait
    egret.Tween.get(portrait).to({
          rotation : 360 
    //动画执行完执行call回调函数
    },5000).call(change,this)
}
//调用change函数
change();
  • EUI高级制作
    • EUI是一套基于Egret核心显示列表的UI扩展库,它封装带大量的UI常用组件,可以实现快速的开发需要
    • 新建EUI项目
  • 点击文字变色

//对文字加上响应操作:
tx.touchEvent = true;  //允许该显示对象响应touch事件,egret中所有的显示对象默认不响应touch事件,这是处于对性能的考虑;
tx.addEventListener(egret.touchEvent.TOUCH_TAP , this.touchHandler , this); //事件处理函数
//然后在Main.ts文件中,还要声明touchHandler函数:
private  touchHandler(evt : egret.TouchEvent):void{
  var tx:egret.TextField = evt . currentTarget();
  tx.textColor = 0x00ff00;
}

此处的事件处理函数是用一个类方法实现的,还可以使用匿名函数实现:

tx.addEventListener(egret.TouchEvent.TOUCH_TAP,function(evt : egret.TouchEvent):void{
  tx.textColor= 0x00ff00;
},this);

资源加载:

egret中所有资源都是动态加载的;

资源加载清单:
Egret资源加载是以资源加载清单为基础的,资源好比是要购买的物品,资源加载配置就是购物清单;先把物品列在清单上,然后再去买物品;
Egret中使用json格式作为RES资源加载配置文件的格式。这种格式使用方便,甚至可以在记事本上边写,javascript也支持json,便于解析;
Egret中资源加载配置文件位于项目目录中的resource文件夹中,取名default.res.jsonEgret项目在创建时已经包含该文件;
注意:Egret版本2.5之前的版本中,该文件的名字为resource.json

  • 单例类
    一个类里只有一个对象(待考虑),单例 类不会被销毁,会一直存在内存中
    声明单例类:
class SceneManager extends egret.{
    //游戏开始场景的实例
    public gameBegin: GameBegin;
    //游戏中的场景实例
    public gamePlay: GamePlay;
    public constructor(){
        this.gameBegin = new GameBegin();
        this.gamePlay = new GamePlay();
        //默认显示开始场景
        // 只有容器才有addChild
        this
    }
    //static表示只能通过类来访问,不能通过类的实例和对象来访问
    private static shared: SceneManager;
    public static Shared(): ScenceManager{
        if(SceneManager.shared == null){
            SceneManager.shared = new SceneManager();
        }
        return SceneManager.shared
    }
}
  • ts编译成js:
//ts
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

let greeter: Greeter;
greeter = new Greeter("world");
console.log(greeter.greet());
//js
let Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
})();

let greeter;
greeter = new Greeter("world");
console.log(greeter.greet());
  • 在GameBegin.ts中拿到GameBegin.exml中的按钮,在exml中给按钮设置id(属性面板 - 通常 - ID)
    在GameBegin.ts中定义begin_btn;
public begin_btn:eui.button;
  • 所有的容器全部继承自 DisplayObjectContainer 类,这个名称为 DisplayObjectContainer 的类又继承自 DisplayObject 。在Egret中, DisplayObjectContainer 封装了一些显示列表中常用的功能。这些常用操作主要分为四类:

    添加、删除子对象 
    访问子对象 
    检测子对象 
    设置叠放次序 
    
  • egret中的addChild顺序不一样结果也不一样,在一个页面中添加两个tabbar因为顺序颠倒导致其中一个监听不了事件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容

  • 安装 使用 在命令行上,运行TypeScript编译器:输出结果为一个a.js文件,它包含了和输入文件中相同的Ja...
    woow_wu7阅读 2,437评论 0 1
  • 概述 TypeScript本质上是向JavaScript语言添加了可选的静态类型和基于类的面向对象编程,同时也支持...
    oWSQo阅读 8,525评论 1 45
  • 在ES6之前,JS没有class关键字,JS的面向对象和继承也是面试中常见的问题.之前接触过PHP面向对象的话,在...
    殷灬商阅读 948评论 0 2
  • 1.纹理集实际上就是将一些零碎的小图放到一张大图当中。游戏中也经常使用到纹理集。使用纹理集的好处很多,我们通过将大...
    别人家的程序员阅读 8,077评论 1 21
  • 经常使用ArcMap的同学,应该有过这样的经历。由于某些原因双击打开mxd文件后,在软件左侧的内容列表(Table...
    华德小书阅读 4,821评论 0 0