Html5 Egret游戏开发 成语大挑战(四)选关界面
通过前面的开始界面基本上了解了eui的使用方法,可以简单快速的制作一个UI界面,本篇使用第二界面选关界面展示更为难一点的代码控制,来展现关卡地图的内容,请确保素材和资源完整,可以在前面的教程中找到下载。
选关界面和开始界面不太一样,请参考开篇的结构图,需要一个推进式上下拉动的地图界面,创建基本的exml和开始界面是一样的,这里的名字叫“SceneLevelsSkin”,在组件库中把Scroller组件拖进去并给其下属内容命名group_levels,用来承载地图内容,最后加一个返回按钮。

<?xml version='1.0' encoding='utf-8'?>
<e:Skin class="SceneLevelsSkin" width="720" height="1136" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing" >
<e:Scroller top="0" bottom="0" right="0" left="0">
<e:Group id="group_levels"/>
</e:Scroller>
<e:Button id="btn_back" x="607" y="1047">
<e:skinName>
<e:Skin states="up,down,disabled">
<e:Image width="100%" height="100%" source="BackBtn_png" source.down="BackBtn1_png"/>
<e:Label id="labelDisplay" horizontalCenter="0" verticalCenter="0"/>
</e:Skin>
</e:skinName>
</e:Button>
</e:Skin>
下面准备制作关卡图标,关卡图标对应的有主要的两种状态:开启和未开启,正好可以使用Button组件来实现,通过控制enabled实现开启和未开启状态对应,按照之前的做法拖拽的创建一个按钮,然后输入数字就可以当成关卡按钮了,可是问题来了,本游戏中有400多关,一个一个摆放累死不偿命的,所以,有几种做法是:分页、分组、用代码生成,分页的方式不能实现地图的拖拽效果,所以本项目中,我们用代码控制去管理创建按钮。
为了更快的控制和更好的理解教程,在这里,使用自定义的button皮肤来实现LevelIcon的效果,先创建一个基于eui.Button组件的LevelIconSkin皮肤,大小设置为77x77,

然后为各种状态添加图片和显示设置,在所有状态中增加一个Label用来显示关卡的数字,具体拖拽细节不再啰嗦,效果如下:


<?xml version='1.0' encoding='utf-8'?>
<e:Skin class="LevelIconSkin" states="up,down,disabled" width="77" height="77"
xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing">
<e:Image source="gs_select_1_png" horizontalCenter="0" verticalCenter="0" includeIn="up,down"/>
<e:Image source="gs_select_dis_png" includeIn="disabled" horizontalCenter="0" verticalCenter="0"/>
<e:Label id="lb_level" text="100" horizontalCenter="0" verticalCenter="0"/>
</e:Skin>
保存一下,然后可以在界面中拖进去一个button组件,直接在皮肤中选择就可以看到显示效果了,

为了控制和便于操作,增加一个LevelIcon.ts ,这里使用了get和set创建了一个属性来标记关卡数字
class LevelIcon extends eui.Button{
private lb_level:eui.Label;
public constructor() {
super();
this.skinName = "src/Game/LevelIconSkin.exml";
}
public get Level():number{
return parseInt(this.lb_level.text);
}
public set Level(value:number){
this.lb_level.text = value.toString();
}
}
下面就是SceneLevels.ts的代码,会用上前面的SceneLevelsSkin.exml,请确保已经准备完成了SceneLevelsSkin.exml和LevelIcon:
class SceneLevels extends eui.Component {
private btn_back: eui.Button;
private group_levels:eui.Group;
public constructor() {
super();
this.skinName = "src/Game/SceneLevelsSkin.exml";
this.btn_back.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onclick_back,this);
//创建地图选项
var row = 20;
var col = 10;
var spanx = 720 / col; //计算行x间隔
var spany = 1136 / row; //计算列y间隔
var group = new eui.Group();//地图背景
group.width = 720;
group.height = (spany * 400 );//算出最大尺寸
//填充背景
for(var i = 0;i <= (group.height / 1138) ;i++) {
var img = new eui.Image();
img.source = RES.getRes("GameBG2_jpg");
img.y = i * 1138;
img.touchEnabled = false;
this.group_levels.addChildAt(img,0);
}
//以正弦曲线绘制关卡图标的路径
for(var i = 0; i<400;i++){
var icon = new LevelIcon();
icon.Level = i + 1;
icon.y = spany * i /2;
icon.x = Math.sin(icon.y / 180 * Math.PI) * 200 + group.width / 2;
icon.y += spany * i /2;
icon.y = group.height - icon.y - spany;
group.addChild(icon);
icon.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onclick_level,this);
}
//开启位图缓存模式
group.cacheAsBitmap = true;
this.group_levels.addChild(group);
//卷动到最底层
this.group_levels.scrollV = group.height - 1100;
}
private onclick_back() {
}
private onclick_level(e:egret.TouchEvent){
var icon = <LevelIcon>e.currentTarget;
console.log(icon.Level);
}
}
为了看起来好看,上面代码中没有使用简单的代码排列关卡,而是使用了正弦曲线描绘,当然细节上仍需要调整,要知道另外一个《疯狂猜歌名》的关卡按钮可是一个一个摆放的,200多关呢。现在所有的按钮都是开启状态,点击一下输出里看到点到的按钮数字,上下可以拖动,已经达到了我们的目的

但是,细节上仍然可以再处理一下,当我们点击那个按钮时候,就会有个指示来标记当前的选定,在正式游戏中,都是 选定=>进入 这样的体验流程,所以,增加一个arrow,这里正好当初的素材中多了一个本来用来做关卡翻页效果的废弃资源,直接用它来做素材,声明类里一个对象:
private img_arrow:eui.Image;
在构造方法里增加:
//跟踪箭头
this.img_arrow = new eui.Image();
this.img_arrow.source = RES.getRes("PageDownBtn_png");
this.img_arrow.anchorOffsetX = 124 / 2 - group.getChildAt(0).width / 2;
this.img_arrow.anchorOffsetY = 76;
this.img_arrow.touchEnabled = false;
this.img_arrow.x = group.getChildAt(0).x;
this.img_arrow.y = group.getChildAt(0).y;
group.addChild(this.img_arrow);
在onclick_level方法里增加:
private onclick_level(e:egret.TouchEvent){
var icon = <LevelIcon>e.currentTarget;
console.log(icon.Level);
this.img_arrow.x = icon.x;
this.img_arrow.y = icon.y;
}
最后看看效果怎么样?打开Main.ts,在修改startCreateScene方法,然后运行看看吧。
/**
* 创建场景界面
* Create scene interface
*/
protected startCreateScene(): void {
this.addChild(new SceneLevels());
}
本篇中使用了eui创建自定义按钮组件,卷动视图的应用,并通过代码方式来控制界面元素。
本篇项目源代码:源代码下载 (由于资源过大,没有resource文件夹,请参考之前的文章单独下载素材)
Html5 Egret游戏开发 成语大挑战(四)选关界面的更多相关文章
- Html5 Egret游戏开发 成语大挑战(五)界面切换和数据处理
经过前面的制作,使用Egret的Wing很快完成了开始界面和选关卡界面,下面通常来说就是游戏界面,但此时界面切换和关卡数据还没有准备好,这次讲解界面的切换和关卡数据的解析.前面多次修改了Main.ts ...
- Html5 Egret游戏开发 成语大挑战(一)开篇
最近接触了Egret白鹭引擎,感觉非常好用,提供了各种各样的开发工具让开发者和设计者更加便捷,并且基于typescript语言开发省去了很多学习成本,对于我们这种掉微软坑许久的童鞋来说,确实很有吸引力 ...
- Html5 Egret游戏开发 成语大挑战(二)干净的eui项目和资源准备
现在我们使用egret来起步开发一个名叫<成语大挑战>的小游戏,关于egret的开发环境就不在这里啰嗦了,直接去官方下载安装就可,egret是我见过开发环境部署最简单的解决方案,这个系列教 ...
- Html5 Egret游戏开发 成语大挑战(六)游戏界面构建和设计
本篇将主要讲解游戏界面的构建和设计,会应用到egret.eui的自定义组件,可以很直观的构建一个游戏整体,这里我们仍然只需要使用EgretWing就可以达到目的,本篇可能是篇幅最少的一个,但是涉及自定 ...
- Html5 Egret游戏开发 成语大挑战(八)一般性二级页面处理
在游戏中,我们一般会有各种各样的二级页面,比如游戏暂停界面或者游戏结束界面,这些界面组成了对玩家交互主要手段,在游戏开发中,对于这些界面的coding组织是非常有学问的,如果倒退到十年前,游戏开发的老 ...
- Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理
在上一篇中,简单的使用界面元素快速实现了一个游戏中的二级页面,这种直接在游戏页面上做UI的做法并不太好,原因是,UI会让游戏的压力变大,即使它是隐蔽的,如果同样的功能在其它的地方也是一样的,那么就要写 ...
- Html5 Egret游戏开发 成语大挑战(七)游戏逻辑和数据处理
本篇在前面的基础上,将进行逻辑的编码开发让游戏能够正式的玩起来,这里没有注重太多的体验细节,而是直接实现游戏的规则逻辑,将分成两个部分说明:数据处理和游戏逻辑. 初始化游戏数据 在前面的第五篇中,我们 ...
- Html5 Egret游戏开发 成语大挑战(三)开始界面
本篇需要在前面的素材准备完毕,才可以开始,使用egret的eui结合代码编辑,快速完成基本的界面搭建,这里写的可能比较细,目的是减少大家对于其中一些操作疑问,我去掉了很多无用的步骤,以最精简的流程来完 ...
- Unity3D_(游戏)卡牌03_选关界面
启动屏界面.主菜单界面.选关界面.游戏界面 卡牌01_启动屏界面 传送门 卡牌02_主菜单界面 传送门 卡牌03_选关界面 传送门 卡牌04_游戏界面 传送门 选关界面效果 (鼠标放在不同关 ...
随机推荐
- 不修改Xcode项目加载Reveal
关 于iOS UI调试工具Reveal的配置,很多初学者朋友可能在网上搜索到一些文章,这些文章大部分都是讲述了如何通过配置Xcode项目,通过加入一些库文件, 并且在程序中编写额外的代码来调用Reve ...
- react学习笔记1
# 1.hello world 学习一个语言,最好的方式,我们需要去官网去查看文档(https://facebook.github.io/react),通过JSFiddle,便可以看到最简单的demo ...
- BIEE11G常用函数及使用说明
BIEE常用函数使用手册 1.AGGREGATE AT 此函数根据指定的级别聚合列.使用AGGREGATE AT 可确保始终在关键字AT 之后指定的级别执行度量聚合,而无论WHERE 子句如何. 语法 ...
- JavaScript Patterns 5.2 Declaring Dependencies
It’s a good idea to declare the modules your code relies on at the top of your function or module. T ...
- 十五天精通WCF——第七天 Close和Abort到底该怎么用才对得起观众
一:文起缘由 写这一篇的目的源自于最近看同事在写wcf的时候,用特别感觉繁琐而且云里雾里的嵌套try catch来防止client抛出异常,特别感觉奇怪,就比如下面的代码. public void S ...
- 使用vs2010生成SQL Server 随机数据
前几天做测试数据,偶然发现vs2010中有一个生成随机数据的功能,记录下来,方便以后使用,确实非常的好用灵活快捷. 为了简单扼要的说明,下面我用一个实例来说明如何快捷使用: 在VS2010创建数据库项 ...
- visual studio 2015 搭建python开发环境,python入门到精通[三]
在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...
- [整]SQL执行顺序
SQL的执行顺序: 第一步:FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate ...
- Linux信号
信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...
- 禁止用户选定文本: user-select
双击文本 select,会被选定,如下 但有时点击元素时不想要被选定的状态,有一个尚未成为标准的 CSS 属性: user-select,它有 4 个值: text 可以选择文本 element 可以 ...