博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Html5 Egret游戏开发 成语大挑战(六)游戏界面构建和设计
阅读量:6487 次
发布时间:2019-06-23

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

本篇将主要讲解游戏界面的构建和设计,会应用到egret.eui的自定义组件,可以很直观的构建一个游戏整体,这里我们仍然只需要使用EgretWing就可以达到目的,本篇可能是篇幅最少的一个,但是涉及自定义组件和类继承,希望能够读者能够看明白,这对将来的游戏开发的思维帮助非常大。

自定义控件布局

首先先创建一个名为SceneGameSkin的exml皮肤,直接在这里面拖拖拽拽拼出初步的界面:

上面是题目区,下面是回答区,此时,找了了一下资源,发现字的方块没有放进资源文件,没关系,我们可以直接使用eui.Rect这个基本空间创造一个字块出来,exml描述如下:

看看是不是和图片上的很像,在编辑器里的基本面板属性中是没有ellipseWidth、ellipseHeight等等这些属性的,需要点属性栏右上角的所有属性标签才能显示,然后微调即可。

可是,只有这个字块背景是没用的,还需要增加Label来显示文字,但如果一个一个的匹配就很麻烦了,能不能使用skin来自己做一个自定组件自己管理并处理逻辑呢?这个很简单,先构造一个skin然后配上一个自定义组件的代码就可以实现了。

新建一个基于eui.Component的皮肤,大小设置为80x80:

新建一个typescript类,这里的名字就叫Word,继承自eui.Component,处理代码如下:

//普通的一个字,用来做问题的字块使用class Word extends eui.Component {    protected lb_text:eui.Label;    public constructor() {          super();          this.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onclick_tap,this);    }    protected onclick_tap(){        console.log(this.lb_text.text);    }    //这里没有做成属性的原因是因为当应用到eui的时候,Skin还未指定,运行时候会出现报错,如果指定了SkinName,那么就会产生两次eui的构建浪费内存    public setWordText(value:string){        this.lb_text.text = value;    }    public getWordText():string{        return this.lb_text.text;    }}

保存编译一下,然后在UI设计器的组件里就能看到一个Word自定义组件,然后将它拖进SceneGameSkin里,奇怪,怎么什么都没有呢,因为还没有指定皮肤:

 

指定好皮肤后,就会显示正确了,下面开始进行布局操作,拖放摆好Group到SceneGameSkin的界面中,这里就可以用上Group的布局特性,比如下面的回答字里一共是20个汉字,可以使用Tile的方式排列成一个有序的阵列:

同样上面的问题栏中,可以使用Group的横向排列,调整你的界面直到满意。

继承的方式扩展自定义组件

那么好了,自此基本上已经完成,一般来说,后面就可以完全靠代码控制来实现字块的显示和处理了,但这还不够,因为下面的字和上面的字虽然样子一样,但处理的逻辑不一样,比如说,下面的字是一点就自己消失,同时将文本放置到上面的答案中,而上面的字点击就会移除自己的文本显示,同时将下面的对应字块显示出来,如果用比较笨的方法,就是在代码中加一个字典对应起来,然后增加一大堆,看起来很绕圈的代码,其实这里的游戏逻辑很简单,一个答案字只会对应一个回答字,如果在组件上带上回答字块的对象,不就好处理了吗?如果每个Word控件都增加一个变量保存选定太显得暴力,这里可以使用继承增加一个SelectWord变量,而其他的逻辑可以通过重载方法来保持代码的简洁性,下面就是实现了一个继承自Word的AnswerWord类,这个类同样在保存编译后,也会出现在自定义组件中,

//继承自“问题字”,“答案字”是放在上面回答区域,//由于当答案字点击的时候,答案字会消失并将对应的问题字还原显示class AnswerWord extends Word{    public SelectWord:Word = null;    public constructor() {        super();    }    protected onclick_tap() {        if(this.SelectWord != null){            this.SelectWord.visible = true;            this.SelectWord = null;            this.setWordText("");        }        console.log("AnswerWord");    }    //当一个问题字被选择添加到回答的时,设置不可见,并保存到本对象中以后使用    public SetSelectWord(word:Word){        word.visible = false;        this.setWordText(word.getWordText());        this.SelectWord = word;    }}

那么我们将上面的四个汉字都给替换成AnswerWord,点击一下试试看看命令栏里的输出,不明白的可以参看上面的注释。

最终的SceneGameSkin.exml代码如下:

SceneGameSkin.exml

本篇已经结束,这里学习使用了自定义组件、类继承(或说组件继承),来搭建和设计游戏的主界面,将基础做好,后面的开发工作就容易很多了。

本篇项目源码:(由于博客园的文件大小限制,resource资源方面请到) 

posted on
2016-01-26 10:07 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/nowpaper/p/5155012.html

你可能感兴趣的文章
ENode 2.0 - 深入分析ENode的内部实现流程和关键地方的幂等设计
查看>>
【日常小记】linux中强大且常用命令:find、grep
查看>>
[Java Plasterer] Java Components 3:Java Enum
查看>>
Ajax
查看>>
Netty框架整体架构及源码知识点
查看>>
【木头小开发】-iOS小小里程总结一二
查看>>
vue-router思维导图
查看>>
JavaScript 发布-订阅模式
查看>>
搬了十次家,总算搬进了自己的家
查看>>
快速了解Python并发编程的工程实现(下)
查看>>
社区团购到底是什么?
查看>>
绥化a货翡翠,拉萨a货翡翠
查看>>
为什么Node约定,回调函数的第一个参数必须是err(如果没有错误该参数就是null)?...
查看>>
这个微型机器人可以在人体内“游泳”
查看>>
Javascrip—拷贝对象(13)
查看>>
[Wrong Answer] Leetcode 805 JavaScript 解决方案 数组的均值分割
查看>>
蚂蚁金服开源自动化测试框架 SOFAACTS
查看>>
在同一基准下对前端框架进行比较(2019年更新)
查看>>
降低成本,提高生产力—8句话讲清RPA的部署
查看>>
作用域、执行环境、作用域链
查看>>