游戏页面
皮肤文件 gameScene.exml
构建皮肤文件 构建方法参照 loading 页面构建方法
<?xml version="1.0" encoding="utf-8"?>
<e:Skin class="gameSceneSkin" width="640" height="1136" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing" xmlns:ns1="*" >
<w:Config id="16e6ddba53c" ></w:Config>
<e:Image source="GameBG3_jpg" x="0" width="640" locked="true"/>
<e:Button id="btn_return" label="" x="15" y="14" anchorOffsetX="0" width="81" anchorOffsetY="0" height="61" locked="true">
<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:Image source="WordFrame_png" x="0" y="98" anchorOffsetX="0" width="642" anchorOffsetY="0" height="447" locked="true"/>
<e:Image id="img" width="389" height="261" x="123" y="164" anchorOffsetX="0" anchorOffsetY="0" locked="true"/>
<e:Group id="gp_answer" width="365" height="78" x="134" y="442" anchorOffsetX="0" anchorOffsetY="0" locked="true">
</e:Group>
<e:Group id="gp_select" width="565" height="512" x="41" y="581" anchorOffsetX="0" anchorOffsetY="0" locked="true">
</e:Group>
<e:Group id="gp_win" width="584" height="388" x="31.5" y="672" anchorOffsetX="0" anchorOffsetY="0" locked="true" visible="false">
<e:Image source="Result_png" x="0" y="0" anchorOffsetX="0" width="584" anchorOffsetY="0" height="388"/>
<e:Label id="label_tip" text="成语提示" x="84" y="102" textColor="0x000000"/>
<e:Label id="libel_content" text="成语出处" x="84" y="194" textColor="0x000000"/>
<e:Button id="btn_next" label="" x="413" y="308" anchorOffsetX="0" width="107" anchorOffsetY="0" height="52">
<e:skinName>
<e:Skin states="up,down,disabled">
<e:Image width="100%" height="100%" source="ResultBtn_png" source.down="ResultBtn1_png"/>
<e:Label id="labelDisplay" horizontalCenter="0" verticalCenter="0"/>
</e:Skin>
</e:skinName>
</e:Button>
</e:Group>
<e:Group id="gp_message" width="584" height="300" x="28" y="672" locked="true" visible="false">
<e:Image source="Dialog_png" x="40"/>
<e:Label id="label_word" text="提示信息" x="81" y="73" textColor="0x000000"/>
<e:Button id="btn_msg" label="" x="447.5" y="197" anchorOffsetY="0" height="49" anchorOffsetX="0" width="70">
<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:Group>
</e:Skin>
效果图
gameScene.ts
class gameScene extends eui.Component implements eui.UIComponent {
public constructor() {
super();
}
private cur_lev:number
private signboard:number //标识
public btn_return:eui.Button;
public img:eui.Image;
public gp_answer:eui.Group;
public gp_select:eui.Group;
public gp_win:eui.Group;
public label_tip:eui.Label;
public libel_content:eui.Label;
public btn_next:eui.Button;
public gp_message:eui.Group;
public label_word:eui.Label;
public btn_msg:eui.Button;
private curData:any;
public answerArr:any = [];
public selectArr:any = [];
// 单例
private static shared:gameScene
public static getInstance(){
if(!gameScene.shared){
gameScene.shared = new gameScene()
}
return gameScene.shared
}
protected partAdded(partName:string,instance:any):void
{
super.partAdded(partName,instance);
}
protected childrenCreated():void
{
super.childrenCreated();
}
// 初始化
public initLvdata(lev:number){
console.log("lev:",lev)
this.removeAnswerSelect()
this.btn_return.addEventListener(egret.TouchEvent.TOUCH_TAP,this.btnreturn,this)
this.btn_next.addEventListener(egret.TouchEvent.TOUCH_TAP,this.btnNext,this)
this.btn_msg.addEventListener(egret.TouchEvent.TOUCH_TAP,this.btnMsg,this)
// 记录单前关卡
this.cur_lev = lev
// 获取数据
this.curData = levelDatamanager.Shared().getLevelData(lev);
console.log(this.curData)
// 设置问题图片
this.img.source = "resource/assets/data/" + this.curData.img
// 设置问题字
let words:string = this.curData.answer + this.curData.word
// 拼接二十个字符 插入选择区域
while(words.length == 10){
let i = Math.floor(Math.random()*levelDatamanager.Shared().levNumber);
if(i != lev){
let random_levdata:any = levelDatamanager.Shared().getLevelData(i);
words += random_levdata.answer + random_levdata.word
}
}
let wordsArr = words.split('')
this.setAnswer();
this.setSelect(wordsArr);
// this.gp_answer.addEventListener(egret.TouchEvent.TOUCH_TAP,this.answerClick,this)
}
// 清空 答案区域、选择区域
private removeAnswerSelect(){
let anLen:number = 0;
let seLen:number = 0;
if(this.gp_answer.$children){
anLen = this.gp_answer.$children.length;
}
if(this.gp_select.$children){
seLen = this.gp_select.$children.length;
}
for(let i:number = anLen; i > 0; i--){
this.gp_answer.removeChild(this.answerArr[i-1].word)
delete this.answerArr[i-1]
}
for(let j:number = seLen; j > 0; j--){
this.gp_select.removeChild(this.selectArr[j-1].word)
delete this.selectArr[j-1]
}
this.answerArr = []
this.selectArr = []
}
// 点击答案区 没有发现事件源对象 事件委托不了
// private answerClick(e){//:egret.TouchEvent
// console.log("answerClick",e)
// }
// 插入答案区域
private setAnswer(){
let arr:number[] = [2,97,192,287]
for(let i:number=0; i < 4; i++){
let wordEle:word = new word();
wordEle.x = arr[i];
this.gp_answer.addChild(wordEle)
wordEle.answertext = '';//要在addChild后面
wordEle.signboard = i;
wordEle.addEventListener(egret.TouchEvent.TOUCH_TAP,this.answerClick,this)
this.answerArr.push({
word:wordEle,
text:'',
signboard:i,
select:null
})
}
}
private answerClick(e:egret.TouchEvent){
musicManager.getMusic().playBtnMusic()
let word = <word>e.currentTarget;
let obj:any = this.getAnswerWord(word.signboard)
// 文字原路返回
if(obj.sta && this.answerArr[obj.index].select){
this.answerArr[obj.index].select.visible = true;
this.answerArr[obj.index].select = null;
this.answerArr[obj.index].text = '';
word.answertext = '';
}
}
// 辨别点击那个答案文字
private getAnswerWord(num:number){
let len:number = this.answerArr.length;
for(let i:number = 0; i < len; i++){
if(this.answerArr[i].signboard == num){
return {sta:true,index:i}
}
}
return {sta:false,index:null}
}
// 插入选择区域
private setSelect(arr){
let len:number = arr.length;
let randomArr = this.radomNumber(len);
let wordX:number = 0
for(let i:number = 0; i < len; i++){
let wordEle:word = new word();
let num = i%5
if(num == 0){
wordX++
}
wordEle.width = 77;
wordEle.height = 77;
wordEle.signboard = i
wordEle.x = num * ((this.gp_select.width/5 - wordEle.width)*5/4 + wordEle.width);
wordEle.y = wordX * ((this.gp_select.height/5 - wordEle.height)*5/4 +wordEle.height);
this.gp_select.addChild(wordEle)
wordEle.answertext = arr[randomArr[i]];//要在addChild后面
wordEle.addEventListener(egret.TouchEvent.TOUCH_TAP,this.selectClick,this)
this.selectArr.push({
word:wordEle,
select:false,
AnswerArrIndex:null,
signboard:i
})
}
}
private selectClick(e:egret.TouchEvent){
musicManager.getMusic().playBtnMusic()
let word = <word>e.currentTarget;
let obj:any = this.getAnswerSelect();
if(obj.sta){
this.answerArr[obj.index].text = word.answertext
this.answerArr[obj.index].word.answertext = word.answertext
this.answerArr[obj.index].select = word;
word.visible = false;
}else{
this.showWin()// 文字选择完毕 第5个字
}
}
// 区分答案文字选到了第几个
private getAnswerSelect(){
let len:number = this.answerArr.length;
for(let i:number = 0; i < len; i++){
if(this.answerArr[i].select == null){
return {sta:true,index:i}
}
}
// 4个文字已选完
return {sta:false,index:null}
}
// 获取选择的文字
private getSelectText(){
let len:number = this.answerArr.length;
let str:string = "";
for(let i:number = 0; i < len; i++){
str += this.answerArr[i].text
}
return str
}
private showWin(){
// console.log("文字选择完毕",this.getSelectText(),this.curData)
if(this.getSelectText() === this.curData.answer){
this.label_tip.text = this.curData.tip;
this.libel_content = this.curData.content;
this.gp_win.visible = true;
musicManager.getMusic().playSucc_music()
}else{
this.label_word.text = this.curData.word;
this.gp_message.visible = true;
musicManager.getMusic().playErr_music()
}
}
// 产生20个不重复数字
private radomNumber(len:number){
let arr:number[] = [];
for(let i:number = 0; i<len; i++){
arr.push(i)
}
arr.sort(function(a,b){
return Math.random()-0.5
})
return arr
}
// 返回
private btnreturn() {
musicManager.getMusic().playBtnMusic()
this.parent.addChild(ChooseLevels.Shared())
ChooseLevels.Shared().init()
this.parent.removeChild(this)
}
// 关闭消息提示
private btnMsg(){
musicManager.getMusic().playBtnMusic()
this.gp_message.visible = false;
}
// 下一关 刷新单前页面
private btnNext(){
musicManager.getMusic().playBtnMusic()
this.gp_win.visible = false;
// 单前游戏关卡 = 全局游戏进度 ->下一关 更新全局游戏进度
if(this.cur_lev === levelDatamanager.Shared().progress){
levelDatamanager.Shared().progress ++
}
this.initLvdata(this.cur_lev+1)
}
}
字块EUI组件 word
皮肤文件 word.exml
构建皮肤文件 构建方法参照 loading 页面构建方法
<?xml version="1.0" encoding="utf-8" ?>
<e:Skin class="wordSkin" states="up,down,disabled" minHeight="50" minWidth="100" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing" width="77" height="77">
<e:Rect width="77" height="77" x="0" y="0" fillColor="0xffffff" strokeWeight="4" strokeColor="0x0276d0" ellipseWidth="20" ellipseHeight="20" locked="true"/>
<e:Label id="lab_btn" text="字" x="7" y="7" anchorOffsetX="0" width="64" anchorOffsetY="0" height="64" textColor="0x000000" size="60" textAlign="center" verticalAlign="middle" locked="true"/>
<w:Config id="16e6de6f64b" ></w:Config>
</e:Skin>
word.ts
class word extends eui.Button implements eui.UIComponent {
public constructor() {
super();
}
public lab_btn:eui.Label;
public signboard:number //标识
protected partAdded(partName:string,instance:any):void
{
super.partAdded(partName,instance);
this.skinName = "resource/game/word.exml"
}
protected childrenCreated():void
{
super.childrenCreated();
}
public set answertext(val:string){
this.lab_btn.text = val
}
public get answertext(){
return this.lab_btn.text
}
}