博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Egret消灭星星
阅读量:5945 次
发布时间:2019-06-19

本文共 6945 字,大约阅读时间需要 23 分钟。

前言

  • 目的:是为了熟悉Egret引擎
  • 这款小游戏还是个半成品。

一些常用方法、技巧

*官网的一些常用方api版本多,隐藏的较深,比较不好找,所以总结下一些常用的。

描述
DisplayObject 显示对象基类,所有显示对象均继承自此类
Bitmap 位图,用来显示图片
Shape 用来显示矢量图,可以使用其中的方法绘制矢量图形
DisplayObjectContainer 显示对象容器接口,所有显示对象容器均实现此接口
Sprite 与DisplayObjectContainer类似,多一些功能
Stage 舞台类
TextField 文本类
TextInput 输入文本类

Bitmap

这应该是最常用到的

//创建一个图片精灵    let sky = new egret.Bitmap();      sky.texture = RES.getRes("game_scene_bg"); //RES.getRes获取资源      sky.width = 100;      skt.height = 100;      this.addChild(sky);          //九宫格位图,改变长宽而不改变圆角处,见下图。    let sky = new egret.Bitmap();      sky.texture = RES.getRes("game_scene_bg"); //RES.getRes获取资源      this.addChild(sky);      let rect:egret.Rectangle = new egret.Rectangle(30,31,40,41);      sky.scale9Grid = rect;

image

除了宽高还有许多属性,可以设置也可以获取,游戏中会有许多逻辑判断,都将会用到这些数据。

alpha:1anchorOffsetX:0anchorOffsetY:0blendMode:"normal"cacheAsBitmap:falsefilters:nullhashCode:40height:456mask:nullmatrix:MatrixmeasuredHeight:456 measuredWidth:326name:""numChildren:3parent:MainplatingPage:playingPage {$hashCode: 46, $EventDispatcher: {…}, $children: Array(0), $parent: null, $stage: null, …}rotation:0scaleX:1scaleY:1scrollRect:nullskewX:0skewY:0stage:StagetouchChildren:truetouchEnabled:falsevisible:truewidth:326x:0y:0

Shape

let shp:egret.Shape = new egret.Shape();    shp.x = 100;    shp.y = 100;    shp.graphics.lineStyle( 10, 0x00ff00 );    shp.graphics.beginFill( 0xff0000, 1);    shp.graphics.drawCircle( 0, 0, 50 ); //圆 x,y,r    //shp.graphics.drawRect( 0, 0, 100, 200 ); 矩形    //shp.graphics.moveTo( 50, 50); 移动,不划线    //shp.graphics.curveTo( 100,100, 200,50);  曲线    //shp.graphics.lineTo( 100, 20 ); 直线    shp.graphics.endFill();    this.addChild( shp );

TextField

let label:egret.TextField = new egret.TextField();   label.text = "这是一个文本";   label.textColor = 0xff0000; //颜色  label.fontFamily = "KaiTi"; //字体  label.textAlign = egret.HorizontalAlign.RIGHT; //布局默认LEFT  //描边属性  label.strokeColor = 0x0000ff;  label.stroke = 2;  this.addChild( label );

TextInput

let txInput:egret.TextField = new egret.TextField;  txInput.type = egret.TextFieldType.INPUT;  txInput.width = 282;  txInput.height = 43;  txInput.x = 134;  txInput.y = 592;  txInput.textColor = 0x000000;  /// 注意_container是事先建立好的一个显示容器,即 egret.Sprite,并且已经添加到显示列表中  this._container.addChild(txInput);

Tween

let delay = 200, during = 100;egret.Tween.get(sprite)  .to({alpha: 0}, 1)  //动画类型常用的有alpha、ritation、scaleX、scaleY、  .to({alpha: 1, y: during}, delay)            ...  .wait(400)  .call(()=>{    ...  });

添加、移除精灵

  • parent.addChild(); //添加
  • parent.removeChild(); //单个对象
  • parent.removeChildren() ;//移除所有子对象
  • parent.numChildren //获取parent容器子对象的数量
  • parent.getChildIndex(); //获取精灵深度(叠放次序)
  • parent.getChildAt(); //通过index获取子对象(效率高)
  • parent.getChildByName(); //通过name属性获取子对象(效率低)
  • child.parent //获取父级对象

Demo 部分代码

/** *  结构Main - >startPage -> playingPage -> 结束页? *  还有一种方案就是编写自定义监听事件,在每个页面结束之后触发自定义事件,通知Main移除前页面进入下一个页面,结构: Main -> startPage, Main -> playingPage, Main -> 结束页 */

Main.ts

/**     *  加载资源     *  添加两个子对象:背景、游戏开始页     */    private startPage = new StartPage(); //游戏开始页    private onResourceLoadComplete(event: RES.ResourceEvent) {    if (event.groupName == "startPage") {        ...        ...        ...      //背景      let sky = new egret.Bitmap();      sky.texture = RES.getRes("game_scene_bg");      this.addChild(sky);      sky.width = this.stage.stageWidth;      sky.height = this.stage.stageHeight;      this.addChild(this.startPage);    }  }

startPage.ts

public create(): void{    //舞台宽高    let stageW = this.stage.stageWidth;    let stageH = this.stage.stageHeight;    //开始按钮    let starBtn = this.createBitmapByName("play_btn");    this.addChild(starBtn);    starBtn.width = 110;    starBtn.height = 110;    starBtn.anchorOffsetX = 55;    starBtn.x = stageW * .5;    starBtn.y = stageH * .6;    starBtn.touchEnabled = true;    starBtn.addEventListener(egret.TouchEvent.TOUCH_TAP, ()=> {      this.removeChildren(); //移除所有子对象      this.addChild(tip);      }, this);        //游戏提示    let tip = this.createBitmapByName("help_info");    tip.width = stageW * .9;    tip.height = stageH * .55;    tip.x = stageW * .05;    tip.y = 120;    tip.touchEnabled = true;    tip.addEventListener(egret.TouchEvent.TOUCH_TAP, ()=>{      this.removeChild(tip);      this.addChild(this.platingPage);  //添加游戏页    }, this);        //音乐按钮    let sound = this.createBitmapByName("sound_on_btn");    let soundSwitch = true;    this.addChild(sound);    sound.width = 60;    sound.height = 60;    sound.anchorOffsetX = 60;    sound.x =  stageW - 12;    sound.y =  17;    sound.touchEnabled = true;    //点击切换开关状态    sound.addEventListener(egret.TouchEvent.TOUCH_BEGIN, ()=>{      if(soundSwitch){        egret.Tween.get(sound)          .to({scaleY: 1.1, scaleX: 1.1}, 150)          .to({scaleY: 1, scaleX: 1}, 150);        sound.texture = RES.getRes("sound_off_btn"); //替换资源        soundSwitch = !soundSwitch;      }      else{        egret.Tween.get(sound)          .to({scaleY: 1.1, scaleX: 1.1}, 150)          .to({scaleY: 1, scaleX: 1}, 150);        sound.texture = RES.getRes("sound_on_btn");        soundSwitch = !soundSwitch;      }    }, this);  }

playingPage.ts

private createBlock():void{    ...    ...    let matrix = []; //位置矩阵    let Matrix = new egret.Sprite(); //新建一个容器,存放方块,方便整体操作    //初始化9*8方块,    this.addChild(Matrix);    for(let j = 0; j<9; j++){      matrix[j] = [];      alreadyRet[j] = [], retrievalOk[j] = [];      for(let i = 0; i<8; i++){        let index = Math.floor(Math.random() * 5);        let bl = this.createBitmapByName(`bl${index}`);        matrix[j].push(bl);        retrievalOk[j][i] = false;        bl.name = index.toString();        bl.width = 41;        bl.height = 41;        bl.x = 4 + 41 * j;        bl.y = stageH - 3 - 41 * (i+1);        Matrix.addChild(bl);      }    }    //把点击事件绑定到背景层    let bg = this.parent.parent.getChildAt(0); //获取背景精灵    bg.touchEnabled = true;    bg.addEventListener(egret.TouchEvent.TOUCH_BEGIN, click, this);    function click(e) {      position = this.getPosition(e); //通过点击坐标确定点击的方块,避免了对每个方块都绑定点击事件,提高效率      ...      ...      //达到30分,进入下一关      if(this.totalScore>=30){        this.totalScore = 0;        egret.Tween.get(Matrix)  //所有滑块,下滑出屏幕          .to({y:stageH},500)          .call(()=>{            //移除点击事件,否则会造成重复绑定,后果很严重。            bg.removeEventListener(egret.TouchEvent.TOUCH_BEGIN, click ,this);            this.removeChild(Matrix);            this.createBlock();          });        }    }  }      /**   * 几乎每个游戏都要用到数字,复用率高,写一个创建数字的方法   * num:要显示的数字   * sprite:精灵(Sprite),把所有的数字都加入到他的子对象,方便整体 操作   * width:单个数字的宽度   * height:单个数字的宽度   * x:数字x坐标,锚点为width/2,就是中间点横坐标。   * y:最上方点的纵坐标,为了与其他元素保持一致,方便计算。   */  private createNumber(num: number, sprite, width: number, height: number, x: number, y: number) {    let number = num.toString();    let len = number.length;    let anchorX = width / 2 * len;    sprite.removeChildren();    for(let i = 0; i

       以上代码都没有涉及逻辑部分并删除了许多相似内容,每个不同的游戏逻辑都不一样,参考价值不大,附上完整代码:

转载地址:http://xuzxx.baihongyu.com/

你可能感兴趣的文章
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
度量时间差
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
crontab执行shell脚本日志中出现乱码
查看>>
Shell编程基础
查看>>
Shell之Sed常用用法
查看>>
3.1
查看>>