Пример #1
0
  Model.prototype.toNextState = function(n) {
    var matchModel = require('pnd.model.match'),
        figureModel = require('pnd.model.figure'),
        self = this.toNextState.bind(this),
        n = n || 0;
    

    // 处理消除阶段
    var data = this.getSimpleData(),
        matchedData = matchModel.match(data),
        clearedOrbs = this.getFullData(matchedData);

    this.updateData({
      method: 'clear', 
      indexes: matchedData.reduce(function(previous, current) {
        return previous.concat(current);
      }, [])
    });

    // 处理掉落阶段
    var emptyArr = this.getSimpleData().reduce(function(previous, current, index){
      if (current == -1) {
        previous.push(index);
      };
      return previous;
    }, []);
    
    var fallingArr = figureModel.getFallingProgress(emptyArr);
    
    this.updateData({
      method: 'move', 
      startIndexes: fallingArr[0],
      endIndexes: fallingArr[1]
    });

    // 处理天降阶段
    var skyfallOrbs = [];
    if (this.hasSkyfall) {
      skyfallOrbs = this.getRandomOrbsByRates(emptyArr.length);
      this.updateData({
        method: 'set',
        indexes: fallingArr[3],
        data: skyfallOrbs
      });
    }

    

    // 触发事件
    var stat = {
      clearedOrbs: clearedOrbs,
      empty: emptyArr,
      startIndexes: fallingArr[0],
      endIndexes: fallingArr[1],
      skyfallStartIndexes: fallingArr[2].map(function(item) {return item - this.amount}, this),
      skyfallEndIndexes: fallingArr[3],
      skyfallOrbs: skyfallOrbs
    }

    if (emptyArr.length == 0) {
      this.observer.trigger('board.changeFinish');
    } else {
      n += 1;
      this.observer.trigger('board.statChange', stat);

      if (n < 100) {
        setTimeout(function(){self(n)}, 0);
      }
    }
  }
Пример #2
0
  Model.prototype.dropOrbs = function() {
    var figureModel = require('pnd.model.figure'),
        data = this.getSimpleData(),
        emptyArr = [],
        movedOrbs = {
          start: [],
          end: [],
          skyfall: []
        };

    // 获得版面上的空位, 若空位为0则返回
    data.forEach(function(item, index) {
      if (item == -1) emptyArr.push(index);
    });
    if (emptyArr.length === 0) {return movedOrbs;}
    // 获得空位的补集的掉落
    var originStartArr = figureModel.getComplementOf(emptyArr),
        originEndArr = figureModel.getDropOf(originStartArr),
        temp = figureModel.removeRepeated([originStartArr, originEndArr]),
        skyfallStartArr = [],
        skyfallEndArr = [],
        skyfallArr = [],
        newDataArr = this.dataArr.concat();
    // 消去重复珠后即为原来面板上需要移动的珠子始终位置
    originStartArr = temp[0];
    originEndArr = temp[1];

    // 如果有天降, 获得天降珠子的始终位置, 和天降珠子类型数据
    if (this.hasSkyfall) {
      skyfallArr = this.getRandomOrbsByRates(emptyArr.length);
      // 天降形状的始终位置其实就是空缺形状的上下掉落
      // 天降的起始位置是屏幕外, 每个减去总数目才是真实坐标
      // TODO: 30
      skyfallStartArr = figureModel.getDropOf(emptyArr).map(function(i){return i - 30});
      skyfallEndArr = figureModel.getReverseDropOf(emptyArr);
    }

    // 获得最终变动了的珠子始终位置
    movedStartArr = originStartArr.concat(skyfallStartArr);
    movedEndArr = originEndArr.concat(skyfallEndArr);
    movedOrbs = {
      start: movedStartArr,
      end: movedEndArr,
      skyfall: skyfallArr,
      skyfallStart: skyfallStartArr,
      empty: emptyArr
    };

    // 更新本地数据
    
    originEndArr.forEach(function(item, index) {
      newDataArr[item] = this.dataArr[originStartArr[index]];
    }, this)
    skyfallEndArr.forEach(function(item, index) {
      newDataArr[item] = skyfallArr[index];
    })

    this.dataArr = newDataArr.map(function(item, index){
      return [index, item[1], item[2]]
    })

    // 通知事件发生
    this.observer.trigger('orbsDrop', movedOrbs);
    return movedOrbs;
  }