H5关卡编辑:http://game.ixuexie.com/idiomEditor
H5成语游戏:http://game.ixuexie.com/idiomGame
词条基本数据:对应 IdiomData.js,描述成语词库里的一条原始数据,被成语对象引用;
成语对象:对应 Idiom.js,我们还发现,描述关卡中编辑好的每一条成语,同时会记录成语所占用的格子;
格子对象:对应 Grid.js,描述编辑区每个格子的状态与行为,如格子被使用,可从格子引用到成语对象;
关卡对象:对应 Level.js,关卡对象组织了格子和成语对象,并且负责对刷成语和换成语/删成语/去字/保存加载等。
for (let j = 0; j < idiom.grids.length; j++) {
//创建下方可选格子
if (idiom.grids[j].isSpaceGrid && this.isInBottomSelGrids(idiom.grids[j].gridId) === false) {
let selGrid = cc.instantiate(this.bottomGridPrefab);
let gridComponent = selGrid.getComponent("Grid");
//格子设置为填字模式
gridComponent.setSelectMode(true);
gridComponent.setChar(idiom.grids[j].char);
gridComponent.gridId = idiom.grids[j].gridId;
this.bottomSelGrids.push(selGrid);
}
}
//填字格子需打乱顺序再addChild
this.bottomSelGrids.sort(() => {
return Math.random() > 0.5 ? -1 : 1;
});
registTouchEvent: function() {
this.node.on(cc.Node.EventType.TOUCH_START, (event) => {
if (this.node.scale !== 1 || Grid.disappearGrid !== null)
return;
if (this.isSelectMode) {
Audio.instance.playFillChar();
Game.instance.level.fillGrid(this);
}
}
}
//填字逻辑
fillGrid: function (grid) {
//设置charLabel显示
this.charLabel.node.active = true;
this.setCharLabel(grid.char);
//设置其它显示属性...
//填字格子消失动画
grid.bottomGridDisappear();
//检查格子引用的成语
let fillError = false;
for (let i = 0; i < this.idioms.length; i++) {
if (this.idioms[i].checkIdiomFillResult()) {
//填词成功动画播放
this.idioms[i].onFillRight();
}
else {
//填词有错误
if (this.idioms[i].getFilledCharNum() === 4) {
//填错动画播放
this.idioms[i].onFillError();
fillError = true;
}
}
}
}
if (!fillError) {
//自动跳下一格
let nextGrid = this.getNextSpaceGrid();
if (nextGrid)
Game.instance.level.selectGrid(nextGrid);
else {
//当前无可选格,取消选择状态
Game.instance.level.selectGrid(null);
}
}
else {
//停在错词的格子不作处理
}
let levelPass = true;
for (let i = 0; i < Game.instance.level.idioms.length; i++) {
if (!Game.instance.level.idioms[i].filled) {
//如果还有成语未完成则break
levelPass = false;
break;
}
}
if (levelPass) {
//过关,显示结算界面...
}