showSuccessBox(){
console.log("本局结束")
var boxNode = new cc.Node()
var boxBgSp=boxNode.addComponent(cc.Sprite);
var texture = new cc.Texture2D;
var spriteFrame = new cc.SpriteFrame;
texture.initWithData(new Uint8Array([221, 221, 221]), cc.Texture2D.PixelFormat.RGB888, 1, 1, cc.winSize);
spriteFrame.setTexture(texture);
spriteFrame.setRect(cc.rect(0, 0,this._screenWidth*0.6,this._screenWidth*0.6*2/3));
boxBgSp.spriteFrame = spriteFrame
boxNode.position = cc.p(0,0)
boxNode.parent = this.node
var btn = new cc.Node()
var btnTxt = btn.addComponent(cc.Label)
btnTxt.string = "重新开始"
btn.color = new cc.Color(0,0,0,255)
btn.postion = cc.p(0,0)
btn.parent = boxNode
btn.on(cc.Node.EventType.TOUCH_START,
function(event){
cc.director.loadScene('study')
}
,this)
},
start () {},
loadCube(cubeSize,blocks,words){
console.log("显示矩阵")
//加载背景
this._words = words
this._blocks = []//增加一个状态
/*
pos 坐标
text 文字
status 状态
covered 是否掩码
inputedTxt 输入字
obj block实体
-1 已存在 -> 6
0 空白 ->1,2,3,4,5->6
1 当前焦点未输入 默认按顺序第一个空白方块 或者点击某个不是最终状态的方块
2 当前焦点已输入 焦点方块获得输入后,没有进行检查
3 非焦点已输入 焦点移动后,获得输入并且没有进行错误检查的方块
4 非焦点错误 检查出错的方块(当前不是焦点位置)
5 焦点错误 检查出错的方块(当前是焦点位置)
6 正确已保存 最终状态
*/
this._leftText = []
/*
text
status 0,1
obj
*/
//console.log("screenWidth:"+this._screenWidth)
var cubeBg = new cc.Node("cubeBg")
var G = this._screenWidth/8
var L = this._screenWidth-20
//console.log("矩阵背景长宽:"+L)
var cubeBgSp=cubeBg.addComponent(cc.Sprite);
var texture = new cc.Texture2D;
var spriteFrame = new cc.SpriteFrame;
texture.initWithData(new Uint8Array([221, 221, 221]), cc.Texture2D.PixelFormat.RGB888, 1, 1, cc.winSize);
spriteFrame.setTexture(texture);
spriteFrame.setRect(cc.rect(0, 0,L,L));
cubeBgSp.spriteFrame = spriteFrame
cubeBg.position = cc.p(0,this._screenHeight/2-L/2-G)
cubeBg.parent = this.node
//加载成语
var unitWidth = L/9
//console.log("矩阵/9背景长宽:"+unitWidth)
var blockWidth = unitWidth-6
//console.log("方块长宽:"+blockWidth)
//this.frame_empty = new cc.SpriteFrame(cc.url.raw('resources/block_empty.png'));
//this.frame_notEmpty = new cc.SpriteFrame(cc.url.raw('resources/block_notEmpty.png'));
//this.frame_focus = new cc.SpriteFrame(cc.url.raw('resources/block_focus.png'));
for(var i=0;i<blocks.length;i++){
var tmp = {}
var x = blocks[i]['pos']['x']
var y = blocks[i]['pos']['y']
tmp['pos']={'x':x,'y':y}//坐标
tmp['covered']=blocks[i]['covered']
tmp['inputedTxt']=''
var block = new cc.Node()
block.width = blockWidth
block.height = blockWidth
var sp = block.addComponent(cc.Sprite);
sp.sizeMode = 'CUSTOM'//支持缩放!
if(blocks[i]['covered']==1){
sp.spriteFrame = this.frame_empty
}else{
sp.spriteFrame = this.frame_notEmpty
}
block.position = cc.p(-L/2+unitWidth/2+x*unitWidth,L/2-unitWidth/2-y*unitWidth)
block.parent = cubeBg
//加载文字
var textNode = new cc.Node('text')
var textLabel = textNode.addComponent(cc.Label);
if(blocks[i]['covered']==1){
//textLabel.string = ""
tmp['status'] = 0
this._leftText.push({'text':blocks[i]['text']})
}else{
textLabel.string = blocks[i]['text']
tmp['status'] = -1//状态
}
tmp['text'] = textLabel.string//文本
textLabel.verticalAlign = cc.Label.VerticalAlign.CENTER
textNode.position = cc.p(0,0)
textNode.color = new cc.color(48,55,65,255);
block.addChild(textNode)
block.name = i+""
block.on(cc.Node.EventType.TOUCH_START,
function(event){
var blockIdx = event.target.name
this.clickBlock(blockIdx)
}
,this)
tmp['obj']=block//实体
//保存block信息队列
this._blocks.push(tmp)
/*
pos 坐标
text 文字
status 状态
obj block实体
*/
}
//加载填充的文字
var leftUnitWidth = L/7
var leftBlockWidth = leftUnitWidth-12
for(var i=0;i<this._leftText.length;i++){
var tmp={}
var leftBlock = new cc.Node()
leftBlock.width = leftBlockWidth
leftBlock.height = leftBlockWidth
var sp = leftBlock.addComponent(cc.Sprite);
sp.spriteFrame = this.frame_notEmpty
sp.sizeMode = 'CUSTOM'//支持缩放!
var lefTextNode = new cc.Node()
var lefTextLabel = lefTextNode.addComponent(cc.Label);
lefTextLabel.verticalAlign = cc.Label.VerticalAlign.CENTER
lefTextLabel.string = this._leftText[i]['text']
lefTextNode.position = cc.p(0,0)
lefTextNode.color = new cc.color(48,55,65,255);
leftBlock.addChild(lefTextNode)
leftBlock.name = i+""
leftBlock.position = cc.p(-L/2+leftUnitWidth/2+leftUnitWidth*(i%7),this._screenHeight/2-L-G*2-leftUnitWidth/2-leftUnitWidth*Math.floor(i/7))
leftBlock.parent = this.node
leftBlock.on(cc.Node.EventType.TOUCH_START,
function(event){
var leftBlockIdx = event.target.name
this.clickLeftBlock(leftBlockIdx)
}
,this)
this._leftText[i]['status']=0
this._leftText[i]['obj']=leftBlock
}
//设置第一个焦点在第一个空白位置(左上角)
//从左到右 从上到下 找到第1个空白方块
this.focusFirstBlock()
},
focusFirstBlock(){
console.log("设置第一个空白方块为焦点")
//先找出所有空白方块
var emptyBlocks = []
for(var i=0;i<this._blocks.length;i++){
var tmp = {}
var pos = this._blocks[i]['pos']
var covered = this._blocks[i]['covered']
if(covered == 1 && this._blocks[i]['status'] == 0){
tmp = {'idx':i,'x':pos['x'],'y':pos['y']}
emptyBlocks.push(tmp)
}
}
//找出最小的Y
var miny = emptyBlocks[0]['y']
var idx = emptyBlocks[0]['idx']
for(var j=1;j<emptyBlocks.length;j++){
if(emptyBlocks[j]['y'] < miny){
miny = emptyBlocks[j]['y']
idx = emptyBlocks[j]['idx']
}
}
console.log("空白方块的最小Y:"+miny)
//Y最小的前提下,X最小
var minx = this._blocks[idx]['pos']['x']
for(var j=0;j<emptyBlocks.length;j++){
if(emptyBlocks[j]['y'] == miny && emptyBlocks[j]['x'] < minx){
minx = emptyBlocks[j]['x']
idx = emptyBlocks[j]['idx']
}
}
console.log("空白方块的最小POS x:"+minx+" y:"+miny+" idx:"+idx)
//高亮显示
this.blockChangeStatus(idx,1,"")
this._nowFocusIdx = idx
},
clickBlock(idx){
console.log("点击方块:"+idx)
if(idx != this._nowFocusIdx){
//原来的焦点变化
if(this._blocks[this._nowFocusIdx]['status'] == 1){
this.blockChangeStatus(this._nowFocusIdx,0,"")
}else if(this._blocks[this._nowFocusIdx]['status'] == 2){
this.blockChangeStatus(this._nowFocusIdx,3,"")
}else if(this._blocks[this._nowFocusIdx]['status'] == 5){
this.blockChangeStatus(this._nowFocusIdx,4,"")
}
//被点击方块的变化
var l = [0,3,4,5]
//if(this._blocks[idx]['status'] == 0 ||this._blocks[idx]['status'] == 3){
if(l.indexOf(this._blocks[idx]['status']) > -1){
//把字放回下方
this.returnLeftText(this._blocks[idx]['inputedTxt'])
this.blockChangeStatus(idx,1,"")
}
this._nowFocusIdx = parseInt(idx)
}else{
console.log("重复点击,清除焦点输入内容")
//2,5->1
if(this._blocks[idx]['status'] == 2 || this._blocks[idx]['status'] == 5){
//把字放回下方
this.returnLeftText(this._blocks[idx]['inputedTxt'])
this.blockChangeStatus(idx,1,"")
}
}
/*
被点击的方块
0->1
1不变
2->1
3->1
4->1
5->1
原焦点方块
1->0
2->3
5->4
*/
/*
0 空白
1 当前焦点未输入 默认按顺序第一个空白方块 或者点击某个不是最终状态的方块
2 当前焦点已输入 焦点方块获得输入后,没有进行检查
3 非焦点已输入 焦点移动后,获得输入并且没有进行错误检查的方块
4 非焦点错误 检查出错的方块(当前不是焦点位置)
5 焦点错误 检查出错的方块(当前是焦点位置)
6 正确已保存 最终状态
-1 已存在
*/
},
returnLeftText(leftText){
console.log("放回:"+leftText)
for(var i=0;i<this._leftText.length;i++){
if(this._leftText[i]['text'] == leftText && this._leftText[i]['obj'].active == false){
this._leftText[i]['obj'].active = true
}
}
},
checkWord(idx){
/*
{"word":"俯首贴耳",
"startPoint":{"x":20,"y":20},
"direction":"x",
"blockIndex":[0,1,2,3]},
*/
var result = []//可能多个成语同时判断
for(var i=0;i<this._words.length;i++){
var list = this._words[i]['blockIndex']
if(list.indexOf(idx) > -1){
var tmp = {}
var list = this._words[i]['blockIndex']
tmp['targetWord'] = this._words[i]['word']
tmp['blockIndxList'] = list
var inpuWord = ""
for(var j=0;j<4;j++){
var blockIdx = list[j]
if(this._blocks[blockIdx]['covered']==1){
var inpuTxt = this._blocks[blockIdx]['inputedTxt']
if(inpuTxt == ""){
console.log(tmp['targetWord']+" 没有填完")
tmp['justify'] = 0 //未完成
inpuWord = ""//清空
break
}else{//空白方块 取输入的文字
inpuWord += inpuTxt
}
}else{//非空白方块 去显示的文字
inpuWord += this._blocks[blockIdx]['text']
}
}
if(inpuWord == tmp['targetWord']){
tmp['justify'] = 1 //正确
}else if(inpuWord != "" && inpuWord != tmp['targetWord']){
tmp['justify'] = 2 //不正确
}
tmp['inpuWord'] = inpuWord
result.push(tmp)
}
}
return result
/*
console.log("发现"+result.length+"个成语")
for(var k=0;k<result.length;k++){
console.log(result[k]['targetWord'])
console.log(result[k]['blockIndxList'])
console.log(result[k]['justify'])
console.log(result[k]['inpuWord'])
}
*/
},
clickLeftBlock(leftBlockIdx){
//隐藏
this._leftText[leftBlockIdx]['obj'].active = false;
var inTxt = this._leftText[leftBlockIdx]['text']
console.log("点击字:"+ inTxt)
//接受输入 只考虑1 2 5焦点状态
var status = [1,2,5]
if(status.indexOf(this._blocks[this._nowFocusIdx]['status']) > -1){
if(this._blocks[this._nowFocusIdx]['status'] == 1){
//1->2
this.blockChangeStatus(this._nowFocusIdx,2,inTxt)
}else if(this._blocks[this._nowFocusIdx]['status'] == 5){
//把字放回下方
this.returnLeftText(this._blocks[this._nowFocusIdx]['inputedTxt'])
//更新文字
this._blocks[this._nowFocusIdx]['obj'].getChildByName('text').getComponent(cc.Label).string = inTxt
this._blocks[this._nowFocusIdx]['inputedTxt'] = inTxt
}
//对错判断
var result = this.checkWord(this._nowFocusIdx)
//console.log("发现"+result.length+"个成语")
for(var k=0;k<result.length;k++){
var justify = result[k]['justify']
var blockIdxList = result[k]['blockIndxList']
if(justify == 0){
//没有输入完 pass
}else if(justify == 2){
//提示错误 2->5 3->4
for(var z=0;z<4;z++){
if(this._blocks[blockIdxList[z]]['status'] == 2){
//console.log("2->5")
this.blockChangeStatus(blockIdxList[z],5,"")
}else if(this._blocks[blockIdxList[z]]['status'] == 3){
//console.log("3->4")
this.blockChangeStatus(blockIdxList[z],4,"")
}
}
}else if(justify == 1){
//正确 2,3,5 ->6
for(var z=0;z<4;z++){
var l = [2,3,4,5]
if(l.indexOf(this._blocks[blockIdxList[z]]['status']) > -1){
//console.log("2->5")
this.blockChangeStatus(blockIdxList[z],6,"")
}
}
}
}
//判断是否结束
if(this.isEnd()){
console.log("完成本局挑战")
this.showSuccessBox()
return
}
if(result.length == 1){
if(result[0]['justify'] != 2){
//当前焦点是 2->3
if(this._blocks[this._nowFocusIdx]['status'] == 2){
//console.log("2->5")
this.blockChangeStatus(this._nowFocusIdx,3,"")
}
this.focusNext(result)
}
}else if(result.length == 2){
var jus = [result[0]['justify'],result[1]['justify']]
console.log(jus)
if(jus.toString() == [0,2].toString() || jus.toString() == [2,0].toString() || jus.toString() == [2,2].toString()){
}else{
//当前焦点是 2->3
if(this._blocks[this._nowFocusIdx]['status'] == 2){
//console.log("2->5")
this.blockChangeStatus(this._nowFocusIdx,3,"")
}
this.focusNext(result)
}
}
/*
(1)只有1个成语
2 错误 stop
(2)两个成语
0 2 stop
2 2 stop
*/
}
/*
text
status 0,1
obj
*/
},
focusNext(result){
/*移动规则
0、只能移动到未输入的方块 status = 0
1、当前成语下一个空白方块 按字顺序0->3
2、如果当前成语没有空白方块,跳转到相邻的成语(可能有多个,选择1个未完成的,
如果有多个未完成的,那么随机选1个)的最开始的空白方块;
3、如果当前成语相邻的其他成语都没有空白方块
找出所有中未填满的成语
找出每个成语第一个空白方块
先向下排列,到底后从头开始排列
*/
//console.log(result[k]['blockIndxList'])
//console.log(result[k]['justify'])
console.log("移动焦点")
//移动到属于的成语的下一个空白方块
for(var i=0;i<result.length;i++){
var blockIdxList = result[i]['blockIndxList']
if(result[i]['justify'] == 0){//没有填满
for(var j=0;j<4;j++){
var blockIdx = blockIdxList[j]
if(this._blocks[blockIdx]['status'] == 0){
this.blockChangeStatus(blockIdx,1,"")
this._nowFocusIdx = blockIdx
return
}
}
}
}
console.log("寻找相邻成语")
for(var i=0;i<result.length;i++){
var blockIdxList = result[i]['blockIndxList']
for(var k=0;k<this._words.length;k++){
//包含相同的block idx则为相连
for(var z=0;z<4;z++){
var blockIdx = blockIdxList[z]
if(this._words[k]['blockIndex'].indexOf(blockIdx) > -1 && this._words[k]['blockIndex'].toString() != blockIdxList.toString()){
console.log(this._words[k]['word']+"相连")
var targetBlockIdxList = this._words[k]['blockIndex']
for(var a=0;a<4;a++){
if(this._blocks[targetBlockIdxList[a]]['status'] == 0){
this.blockChangeStatus(targetBlockIdxList[a],1,"")
this._nowFocusIdx = targetBlockIdxList[a]
return
}
}
}
}
}
}
//找到所有未填满的成语
var unFullWords = []
for(var i=0;i<this._words.length;i++){
var tmp = {}
var blockIndexList = this._words[i]['blockIndex']
for(var j=0;j<4;j++){
if(this._blocks[blockIndexList[j]]['status'] == 0){
tmp['firstBlankBlockIdx'] = blockIndexList[j]
tmp['x']=this._blocks[blockIndexList[j]]['pos']['x']
tmp['y']=this._blocks[blockIndexList[j]]['pos']['y']
unFullWords.push(tmp)
break
}
}
}
console.log("当前有:"+unFullWords.length+"个成语未满")
if(unFullWords.length == 0){
return
}
var nowFocusY = this._blocks[this._nowFocusIdx]['pos']['y']
var nowFocusX = this._blocks[this._nowFocusIdx]['pos']['x']
var nextFocusIdx = unFullWords[0]['firstBlankBlockIdx']
//扫描本行
for(var i=nowFocusX+1;i<9;i++){
for(var j=0;j<unFullWords.length;j++){
if(unFullWords[j]['x'] == i && unFullWords[j]['y'] == nowFocusY){
console.log("找到同一行的")
this.blockChangeStatus(unFullWords[j]['firstBlankBlockIdx'],1,"")
this._nowFocusIdx = unFullWords[j]['firstBlankBlockIdx']
return
}
}
}
//下方
for(var j=nowFocusY+1;j<9;j++){
for(var i=0;i<9;i++){
for(var k=0;k<unFullWords.length;k++){
if(unFullWords[k]['x'] == i && unFullWords[k]['y'] == j){
console.log("找到下方的")
this.blockChangeStatus(unFullWords[k]['firstBlankBlockIdx'],1,"")
this._nowFocusIdx = unFullWords[k]['firstBlankBlockIdx']
return
}
}
}
}
//上方
for(var j=0;j<nowFocusY;j++){
for(var i=0;i<9;i++){
for(var k=0;k<unFullWords.length;k++){
if(unFullWords[k]['x'] == i && unFullWords[k]['y'] == j){
console.log("找到上方的")
this.blockChangeStatus(unFullWords[k]['firstBlankBlockIdx'],1,"")
this._nowFocusIdx = unFullWords[k]['firstBlankBlockIdx']
return
}
}
}
}
},
isEnd(){
console.log("判断是否结束")
for(var i=0;i<this._blocks.length;i++){
if(this._blocks[i]['covered'] == 1 && this._blocks[i]['status'] != 6){
console.log(this._blocks[i]['text']+" 不是6"+" "+this._blocks[i]['status'])
return false
}
}
return true
},
blockChangeStatus(blockIdx,newStatusId,newTxt){
if(newStatusId == 0){
this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_empty
}
else if(newStatusId == 1){
this._blocks[blockIdx]['obj'].getChildByName('text').getComponent(cc.Label).string = ""
this._blocks[blockIdx]['inputedTxt'] = ""
this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_focus
}else if(newStatusId == 2){
this._blocks[blockIdx]['obj'].getChildByName('text').color = cc.Color.WHITE
this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_focus
this._blocks[blockIdx]['inputedTxt'] = newTxt
this._blocks[blockIdx]['obj'].getChildByName('text').getComponent(cc.Label).string = newTxt
}else if(newStatusId == 3){
this._blocks[blockIdx]['obj'].getChildByName('text').color = new cc.Color(48,55,65,255)
this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_empty
}else if(newStatusId == 4){
this._blocks[blockIdx]['obj'].getChildByName('text').color = new cc.Color(165,42,42,255)
this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_empty
}else if(newStatusId == 5){
this._blocks[blockIdx]['obj'].getChildByName('text').color = new cc.Color(165,42,42,255)
this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_focus
}else if(newStatusId == 6){
this._blocks[blockIdx]['obj'].getChildByName('text').color = cc.Color.GREEN
this._blocks[blockIdx]['obj'].getComponent(cc.Sprite).spriteFrame = this.frame_notEmpty
}
this._blocks[blockIdx]['status'] = newStatusId
},
lefBlockChangeStatus(newStatusId){
}