Commit dfb92bdc authored by wjf's avatar wjf

l

parent 1b766b54
......@@ -57,6 +57,8 @@ import { GameGuide } from './GameGuide';
import { AiControl } from '../something/logic/AiControl';
import { JellyDisAni } from '../something/anis/JellyDisAni';
import { EggBrokenAni } from '../something/anis/EggBrokenAni';
import { FallAniData, FallType } from '../something/interface/FallAniData';
import { EleMaskAni } from '../something/anis/EleMaskAni';
// tslint:disable: no-var-keyword
// tslint:disable: prefer-const
// tslint:disable: cyclomatic-complexity
......@@ -217,9 +219,20 @@ export default class MainScene extends Scene {
gameGuide: GameGuide;
start(data) {
super.start();
// var a={x:1}
// egret.Tween.get(a)
// .to({x:100},1000)
// .call(()=>{
// console.log(a.x)
// })
// .set({x:0})
// .call(()=>{
// console.log(a.x)
// })
//第几关
this.chapter = (data && data.chapter) ? data.chapter : 1;
// this.chapter = 81;
// this.chapter = 24;
this.chapterTxt.text = "第" + this.chapter + "关";
//关卡数据
var mapDataIndex = this.chapter;
......@@ -423,9 +436,9 @@ export default class MainScene extends Scene {
// mask.graphics.beginFill(0xffffff, 1);
// mask.graphics.drawRect(Tool.offsetX, Tool.offsetY, Tool.width * Tool.colNum, Tool.height * Tool.rowNum + 100);
// mask.graphics.endFill();
var mask = drawShape(path);
this.elementContainer.mask = mask;
this.addChild(mask)
// var mask = drawShape(path);
// this.elementContainer.mask = mask;
// this.addChild(mask)
//容器事件
this.elementContainer.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.mouseDownE, this);
this.elementContainer.addEventListener(egret.TouchEvent.TOUCH_MOVE, this.mouseMoveE, this);
......@@ -1056,12 +1069,12 @@ export default class MainScene extends Scene {
if (!anis.length) {
callback();
} else {
this.fallAni(anis, () => {
this.fallAniSuper(anis, () => {
this.fall(callback)
})
}
} else {
this.fallAni(anis, () => {
this.fallAniSuper(anis, () => {
this.fall(callback)
}, true)
}
......@@ -1069,12 +1082,12 @@ export default class MainScene extends Scene {
var anis = this.fallVertical();
anis = anis.concat(this.fallSkewEx());
if (!anis.length) {
//如果没有能掉落的就直接回调
this.fallVerMark = false;
//如果没有能掉落的就直接回调
callback();
} else {
//有就执行掉落动画
this.fallAni(anis, () => {
this.fallAniSuper(anis, () => {
this.fall(callback)
})
}
......@@ -1082,11 +1095,11 @@ export default class MainScene extends Scene {
}
/**
* 竖直掉落
* 竖直掉落,一格判断
* 逻辑要重写
*/
private fallVertical() {
var anis = []
var anis: FallAniData[] = []
//先把竖直的掉落完,掉满后
for (var m = 0; m < Tool.colNum; m++) {
//同一列
......@@ -1095,18 +1108,20 @@ export default class MainScene extends Scene {
let lat = this.lattices[index];
if (Tool.judgeFall(lat)) {
//如果能掉落,,找down,下面,左下,右下是否有空格
var latDown, indexDown;
var latDown, indexDown, connects: { index: number, type: FallType }[] = [];
if (lat.down != null) {
latDown = this.lattices[lat.down];
indexDown = lat.down;
connects.push({ index: indexDown, type: FallType.THROUGH })
} else {
latDown = this.lattices[index + Tool.colNum]
indexDown = index + Tool.colNum;
connects.push({ index: indexDown, type: FallType.STRIGHT })
}
//下方有格子,并且再this.empty中
var emptyIndex = this.emptys.indexOf(indexDown)
if (emptyIndex > -1) {
anis.push([lat.element, indexDown]);
anis.push({ ele: lat.element, indexs: connects });
//去掉一个
this.emptys.splice(emptyIndex, 1);
//加上一个
......@@ -1116,7 +1131,7 @@ export default class MainScene extends Scene {
} else {
//如果有格子。无元素,是生成口
if (lat && !lat.element && lat.isGenerate) {
anis.push([null, index]);
anis.push({ ele: null, indexs: [{ index: index, type: FallType.STRIGHT }] });
Tool.removeEle(index, this.emptys)
}
}
......@@ -1129,23 +1144,23 @@ export default class MainScene extends Scene {
* 一次性都竖直掉落
*/
fallVerticalEx() {
var anis = []
var anis: FallAniData[] = []
//先把竖直的掉落完,掉满后
var maxCount = 1;
for (var m = 0; m < Tool.colNum; m++) {
//同一列,先原有的填满,再查是否有生成口
for (var n = Tool.rowNum - 1; n >= 0; n--) {
let index = Tool.rcToIndex(n, m);
let lat = this.lattices[index];
if (Tool.judgeFall(lat)) {
var emptyIndex = Tool.findBottom(lat, this.emptys, this.lattices);
var downIndex = this.emptys[emptyIndex];
if (emptyIndex != null) {
var ccc = (downIndex - index) / Tool.colNum
maxCount = Math.max(ccc, maxCount);
anis.push([lat.element, downIndex, ccc > 1 ? ccc / 2 : ccc]);
//去掉一个
this.emptys.splice(emptyIndex, 1);
//待修改
var indexs = Tool.findBottom(lat, this.emptys, this.lattices);
if (indexs != null) {
//最后一个
var downIndex = indexs[indexs.length - 1].index;
anis.push({ ele: lat.element, indexs: indexs });
//去掉最后一个
// this.emptys.splice(emptyIndex, 1);
Tool.removeEle(downIndex, this.emptys)
//加上一个
this.emptys.push(index);
lat.element = null
......@@ -1160,49 +1175,46 @@ export default class MainScene extends Scene {
let index = this.generateIndexs[m];
//如果有格子。无元素,是生成口,要补齐下面能掉落的
if (lat && !lat.element && lat.isGenerate) {
//找出从生成口一直到能掉落的空格
var arr = [];
//找出从生成口一直到能掉落的空格,两个
var downIndex = index;
var type: FallType = FallType.STRIGHT;
let connects: { index: number, type: FallType }[] = []
let anisOther: FallAniData[] = []
while (this.emptys.indexOf(downIndex) > -1) {
arr.push(downIndex);
connects.push({
index: downIndex,
type: type,
})
anis.push({
ele: null,
indexs: connects.slice()
});
Tool.removeEle(downIndex, this.emptys)
if (this.lattices[downIndex].down != null) {
downIndex = this.lattices[downIndex].down;
type = FallType.THROUGH
} else {
downIndex += Tool.colNum;
type = FallType.STRIGHT
}
}
var p = Tool.getPositionByIndex(index);
var len = arr.length;//越前面的越上面,y越小
for (var i = 0; i < arr.length; i++) {
let tarIndex = arr[i];
var type;
if (this.lollipopMark) {
this.lollipopMark = false;
type = ElementType.LOLLIPOP;
this.lollipopCount++;
} else {
type = Tool.randomT(this.chapterData.baseElementTypes)
}
let obj = Tool.getElement(type)
obj.x = p[0];
obj.y = p[1] - Tool.height * (len - i);
this.elementContainer.addChild(obj)
anis.push([obj, tarIndex, len > 1 ? len / 2 : len]);
Tool.removeEle(tarIndex, this.emptys)
// var p = Tool.getPositionByIndex(index);
var len = anis.length;//越前面的越上面,y越小
for (var i = len - 1; i >= len - connects.length; i--) {
anis[i].wait = (len - 1 - i) * Tool.latDeltaTime * 2 / 3;
}
maxCount = Math.max(len, maxCount);
// console.log(len)
}
}
}
anis["maxCount"] = maxCount > 1 ? maxCount / 2 : maxCount;
return anis;
}
/**
* 存在斜落的
*/
private fallSkewEx() {
//记录一个对象和位置信息[obj,index]的数组,如果obj是null则生成,index位置上方
var anis = [];
var anis: FallAniData[] = [];
var emptys = this.emptys;
//排序从大到小
emptys.sort(function (a, b) { return a < b ? 1 : -1 })
......@@ -1212,7 +1224,7 @@ export default class MainScene extends Scene {
//判断是否是生成口
if (lat.isGenerate) {
//是生成口,就不用管落下乐
anis.push([null, indexMy])
anis.push({ ele: null, indexs: [{ index: indexMy, type: FallType.STRIGHT }] })
//去掉
emptys.splice(i, 1);
//优先判断生成的,不用管掉落了,跳下一个
......@@ -1221,19 +1233,24 @@ export default class MainScene extends Scene {
}
let latFall;
let indexFall;
//找正上方是否有能掉落的。
var latUp = this.lattices[indexMy - Tool.colNum];
//上方格子为null,或格子上元素为null
if (Tool.judgeFall(latUp)) {
latFall = latUp;
indexFall = indexMy - Tool.colNum;
}
let type: FallType = FallType.STRIGHT
//找联通的up,一期没有复杂的联通,所以动画不用特殊处理
else if (lat.up) {
if (lat.up) {
var latUnUp = this.lattices[lat.up];
if (Tool.judgeFall(latUnUp)) {
latFall = latUnUp;
indexFall = lat.up;
type = FallType.THROUGH
}
}
//找正上方
if (!latFall && Tool.indexToRc(indexMy)[0] != 0) {
var latUp = this.lattices[indexMy - Tool.colNum];
if (Tool.judgeFall(latUp)) {
latFall = latUp;
indexFall = indexMy - Tool.colNum;
}
}
//找左上
......@@ -1255,7 +1272,7 @@ export default class MainScene extends Scene {
//如果latFall存在
if (latFall) {
//能掉落,记录元素动画
anis.push([latFall.element, indexMy]);
anis.push({ ele: latFall.element, indexs: [{ index: indexMy, type: type }] });
//去掉
// console.log(emptys)
// console.log(indexFall)
......@@ -1295,21 +1312,7 @@ export default class MainScene extends Scene {
let rowCount = anis[i][2] || 1;
let position = Tool.getPositionByIndex(index);
if (!obj) {
//考虑如果需要生成冰淇淋掉落,到时加
var type;
if (this.lollipopMark) {
this.lollipopMark = false;
type = ElementType.LOLLIPOP;
this.lollipopCount++;
} else {
type = Tool.randomT(this.chapterData.baseElementTypes)
}
obj = Pool.takeOut(RecoverName.ELEMENT);
if (!obj) {
obj = new Element(type)
} else {
obj.reset(type)
}
obj = this.createELement()
//位置信息赋值
this.elementContainer.addChild(obj);
obj.x = position[0];
......@@ -1345,6 +1348,148 @@ export default class MainScene extends Scene {
}
fallAniSuper(anis: FallAniData[], callback: Function, isVertical: boolean = false) {
let deltaTime = Tool.latDeltaTime;
//是竖直的。播放声音
if (isVertical) {
playSound(SoundType.fall);
deltaTime = Tool.latDeltaTime * 2 / 3;
}
let count = 0;
let countAll = anis.length;
for (let i = 0; i < anis.length; i++) {
let ani: FallAniData = anis[i];
let ele: Element = ani.ele;
let wait: number = ani.wait || 0;
let indexs: { index: number, type: FallType }[] = ani.indexs;
let oriRow: number;
let oriCol;
//最后的索引
let endIndex = indexs[indexs.length - 1].index;
let tween: egret.Tween;
if (!ele) {
ele = this.createELement();
this.elementContainer.addChild(ele);
//取出第一个索引
let firstIndex = indexs.shift()
oriRow = Tool.indexToRc(firstIndex.index)[0];
let fp = Tool.getPositionByIndex(firstIndex.index);
ele.x = fp[0];
ele.y = fp[1] - Tool.height;
//加遮罩
let mask = Tool.getRectMask();
mask.x = fp[0];
mask.y = fp[1];
this.elementContainer.addChild(mask);
ele.mask = mask;
tween = egret.Tween.get(ele);
//有等待的话
if (wait) {
// console.log(wait)
tween.wait(wait);
}
tween.to({ x: fp[0], y: fp[1] }, deltaTime)
.call(() => {
//移除遮罩
ele.mask = null;
//回收
mask.recover()
})
wait += deltaTime
} else {
oriRow = ele.row;
tween = egret.Tween.get(ele);
}
let lastX: number, lastY: number;
//对所有的indexs进行遍历动画
for (var j = 0; j < indexs.length; j++) {
let index = indexs[j].index;
let type = indexs[j].type;
let p = Tool.getPositionByIndex(index);
if (type == FallType.THROUGH) {
let indexUp = this.lattices[index].up;
let downPos = Tool.getPositionByIndex(index);
let upPos = Tool.getPositionByIndex(indexUp);
//加遮罩
// let mask11 = Tool.getRectMask();
// mask11.x = indexUp[0];
// mask11.y = indexUp[1];
// ele.mask = mask11;
// this.elementContainer.addChild(mask11);
EleMaskAni(ele, upPos, wait, this.elementContainer, true);
tween.set({ alpha: 0 })
.wait(deltaTime)
.set({ alpha: 1 })
//down位置处的动画
EleMaskAni(ele, downPos, wait, this.elementContainer);
//修改oriRow
oriRow = Tool.indexToRc(index)[0];
lastX = downPos[0];
lastY = downPos[1];
} else {
//算间隔
var delta = Tool.indexToRc(index)[0] - oriRow;
if (delta > 0) {
//修改oriRow
oriRow = Tool.indexToRc(index)[0];
//动画
if (lastX != null) {
tween.set({ x: lastX, y: lastY })
}
tween.to({ x: p[0], y: p[1] }, delta * deltaTime)
//累计等待时间
wait += delta * deltaTime;
lastX = null
}
}
}
//元素赋值,考虑到底放哪好
var lat = this.lattices[endIndex];
lat.element = ele;
ele.fallAni()
//最终回调
tween.call(() => {
let endP = Tool.getPositionByIndex(endIndex);
ele.x = endP[0];
ele.y = endP[1];
if (ele.type == ElementType.LOLLIPOP && Tool.indexToRc(endIndex)[0] == this.endRowNum) {
this.recoverEle(endIndex);
this.lollipopCount--;
//通关目标还有棒棒糖,并且,图中不足,下次需要生成
if (this.passElements &&
this.passElements[ElementType.LOLLIPOP] &&
this.lollipopCount < this.passElements[ElementType.LOLLIPOP]) {
this.lollipopMark = true
}
}
count++;
if (count == countAll) {
callback()
}
})
}
}
/**
* 创建一个掉落元素,
* 逻辑包括棒棒糖逻辑
* 定制掉落元素逻辑
*/
createELement() {
var type;
if (this.lollipopMark) {
this.lollipopMark = false;
type = ElementType.LOLLIPOP;
this.lollipopCount++;
} else {
type = Tool.randomT(this.chapterData.baseElementTypes)
}
return Tool.getElement(type);
}
/**
* 只关心交换后元素的可消除
* 或者冰淇淋的掉落
......
......@@ -6,8 +6,11 @@ import { PassType } from "./enum/PassType";
import { EffectType } from "./enum/EffectType";
import { Pool } from "./Pool";
import { RecoverName } from "./enum/RecoverName";
import { RectMask } from "./class/RectMask";
import { FallType } from "./interface/FallAniData";
export class Tool {
public static latDeltaTime = 100;
public static rowNum = 9;
public static colNum = 9;
/**
......@@ -715,37 +718,58 @@ export class Tool {
return arr
}
/**
* 找一个格子,最终掉落点,
* @param lattice 能掉落的格子
* 找一个格子,最终掉落点,所有的index吧
* @param lattice 能掉落的格子,格子上肯定有元素,并且能掉落
* @param empty
* @param lattices
* @return 返回空格数组中的索引
* @return 所有中间点吧数据
*/
public static findBottom(lattice: Lattice, emptys: number[], lattices: Lattice[]): number {
let indexDown, lat;
public static findBottom(lattice: Lattice, emptys: number[], lattices: Lattice[]): { index: number, type: FallType }[] {
let indexDown: number, lat: Lattice;
let connects: { index: number, type: FallType }[] = [];
let isThrough: boolean = false;
//找下面的
if (lattice.down != null) {
indexDown = lattice.down;
isThrough = true;
} else {
indexDown = lattice.index + this.colNum;
}
let lastEmptyIndex: number;
//下方有格子,并且再this.empty中
let emptyIndex: number = emptys.indexOf(indexDown);
//只要还在里面就一直找下,直到
while (emptyIndex > -1) {
if (isThrough) connects.push({ index: indexDown, type: FallType.THROUGH });
//记录下上一个满足的
lastEmptyIndex = emptyIndex;
//下面格子变成lat
lat = lattices[indexDown];
if (lat.down != null) {
//如果上次是false的,就结束加入
if (!isThrough) connects.push({ index: indexDown, type: FallType.STRIGHT });
isThrough = true
indexDown = lat.down;
} else {
isThrough = false
indexDown = lat.index + this.colNum;
}
emptyIndex = emptys.indexOf(indexDown);
}
if (lastEmptyIndex != undefined) {
return lastEmptyIndex
//说明已经加过,然后down无空格,直线已加
if (isThrough) {
return connects
}
//直线未加
else {
connects.push({ index: emptys[lastEmptyIndex], type: FallType.STRIGHT })
return connects
}
} else {
return null
}
......@@ -758,13 +782,20 @@ export class Tool {
var index = Tool.rcToIndex(n, m);
let lat = lattices[index];
if (Tool.judgeFall(lat)) {
var emptyIndex = Tool.findBottom(lat, emptys, lattices);
var downIndex = emptys[emptyIndex];
if (emptyIndex != null) {
if ((downIndex - index) / Tool.colNum > 1) {
var indexs = Tool.findBottom(lat, emptys, lattices);
if (indexs != null) {
//超过一步,肯定true
if (indexs.length > 1) {
return true;
} else {
var downIndex: number = indexs[0].index;
var type: FallType = indexs[0].type;
//直线的
if (type == FallType.STRIGHT && (downIndex - index) / Tool.colNum > 1) {
return true;
}
}
}
} else {
//如果有格子。无元素,是生成口,要补齐下面能掉落的
if (lat && !lat.element && lat.isGenerate) {
......@@ -773,7 +804,12 @@ export class Tool {
var downIndex = index;
while (emptys.indexOf(downIndex) > -1) {
arr.push(downIndex);
downIndex += Tool.colNum;
if (lat.down != null) {
downIndex = lat.down;
} else {
downIndex = lat.index + this.colNum;
}
lat = lattices[downIndex];
}
if (arr.length > 1) return true
}
......@@ -830,6 +866,14 @@ export class Tool {
}
return obj
}
/**
* 获得矩形遮罩
*/
public static getRectMask(): RectMask {
let rect: RectMask = Pool.takeOut(RecoverName.RECT_MASK);
if (!rect) rect = new RectMask()
return rect;
}
/**
* 返回个十百等,0是个位
......
import { Tool } from "../Tool";
import { ElementType } from "../enum/ElementType";
import { EffectType } from "../enum/EffectType";
import { Element } from "../class/Element";
import { Pool } from "../Pool";
import { RecoverName } from "../enum/RecoverName";
/**
* 矩形遮罩的元素动画
* @param eleC
* @param p
* @param con
* @param callback
*/
export function EleMaskAni(
eleC: Element,
p: number[],
wait: number,
con: egret.DisplayObjectContainer,
isUp: boolean = false,
callback?: Function
) {
let ele = Tool.getElement(eleC.type);
ele.effectType = eleC.effectType;
ele.x = p[0];
ele.y = p[1] - Tool.height * (isUp ? 0 : 1);
let mask = Tool.getRectMask();
mask.x = p[0];
mask.y = p[1];
ele.mask = mask;
con.addChild(mask);
egret.Tween.get(ele)
.wait(wait)
.call(()=>{
con.addChild(ele);
})
.to({ x: p[0], y: p[1] + Tool.height * (isUp ? 1 : 0) }, Tool.latDeltaTime)
.call(() => {
//回收元素
con.removeChild(ele);
Pool.recover(RecoverName.ELEMENT, ele);
//回收遮罩
ele.mask = null;
mask.recover();
//回调
callback && callback();
})
}
\ No newline at end of file
import { Tool } from "../Tool";
import { Pool } from "../Pool";
import { RecoverName } from "../enum/RecoverName";
/**
* 元素出现及消失用到的矩形遮罩
*/
export class RectMask extends egret.Shape {
constructor() {
super();
this.graphics.beginFill(0xffffff);
this.graphics.beginFill(0xff0000, 1);
this.graphics.drawRect(-Tool.width / 2, -Tool.height / 2, Tool.width, Tool.height)
this.graphics.endFill();
}
recover() {
if (this.parent) {
this.parent.removeChild(this);
Pool.recover(RecoverName.RECT_MASK, this);
}
}
}
\ No newline at end of file
......@@ -42,4 +42,7 @@ export enum RecoverName {
STEP_ANI = "StepAni",
JELLYDIS_ANI = "JellyDisAni",
EGGBROKEN_ANI = "EggBrokenAni",
//方形遮罩
RECT_MASK = "RectMask"
}
\ No newline at end of file
import { Element } from "../class/Element";
/**
* 掉落动画数据
*/
export interface FallAniData {
/**
* 掉落元素,设为null的时候要生成,并且通过遮罩,生成动画
*/
ele: Element;
/**
* 等待时间,一般用于一个生成口有多个元素排列着的情况
* ele为null才需要wait
*/
wait?: number;
/**
* 起点、中间点及终点的索引,穿过记录下格子,不可能为空
* 索引加类型
*/
indexs: { index: number, type: FallType }[]
// indexs:number[];
}
export enum FallType {
STRIGHT = 0,
THROUGH,
}
\ No newline at end of file
/**
* 路径数据
* 路径数据,废弃不用
*/
export interface PathData {
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment