cb/assets/Script/Block.ts
2025-08-04 15:42:54 +08:00

1604 lines
64 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import CollisionDetection from "./CollisionDetection";
import { LQCollideSystem } from "./lq_collide_system/lq_collide_system";
import MapConroler from "./Map";
const { ccclass, property } = cc._decorator;
export enum BlockType {
/*普通地块 */
"普通块" = 0,
/*起点地块 */
"叠加块下" = 1,
/*湿地 */
"钥匙块" = 2,
/*山峰 */
"上锁块" = 3,
/*终点地块 */
"冻结块" = 4,
/*息壤 */
"星星块" = 5,
/*加固 */
"炸弹块" = 6,
/*加固 */
"水平块" = 7,
/*加固 */
"垂直块" = 8,
/*加固 */
"粘合块" = 9,
/*加固 */
"叠加块上" = 10,
}
export enum BlockColor {
/*起点地块 */
"紫色" = 0,
/*湿地 */
"黄色" = 1,
/*山峰 */
"绿色" = 2,
/*终点地块 */
"蓝色" = 3,
/*息壤 */
"粉色" = 4,
/*加固 */
"橘黄色" = 5,
/*加固 */
"青色" = 6,
/*加固 */
"白色" = 7,
/*加固 */
"红色" = 8,
/*加固 */
"灰色" = 9,
}
export enum PathType {
err = "err",
up = "up",
down = "down",
left = "left",
right = "right",
up_left = "up_left",
up_right = "up_right",
down_left = "down_left",
down_right = "down_right",
left_up = "left_up",
left_down = "left_down",
right_up = "right_up",
right_down = "right_down",
}
@ccclass
export default class Block extends cc.Component {
// 新增缓存变量
private moveInterval = 0; // 约 60 FPS
private lastMoveTime = 0; // 上下两个值来调节跟手,一个是时间轴,一个是距离轴
private maxSpeed = 300; // 最大移动距离
// private otherCollider: cc.Collider = null;
// @property({
// tooltip: '碰撞形状None就是无敌不参与碰撞',
// type: cc.Enum(BlockType),
// // default: BlockType.Nomal,
// displayName: '碰撞形状'
// })
@property({
tooltip: '碰撞形状None就是无敌不参与碰撞',
type: cc.Enum(BlockType),
})
type: BlockType = BlockType.;
@property({
tooltip: '碰撞形状None就是无敌不参与碰撞',
type: cc.Enum(BlockColor),
})
color: BlockColor = BlockColor.;
@property({
tooltip: '横向长度',
type: cc.Integer,
})
heng: Number = 1;
@property({
tooltip: '竖向长度',
type: cc.Integer,
})
shu: Number = 1;
@property(cc.SpriteAtlas)
ice_SpriteFrame: cc.SpriteAtlas = null;
@property(sp.SkeletonData)
magic_SkeletonData: sp.SkeletonData = null;
// LIFE-CYCLE CALLBACKS:
// @property(cc.SpriteAtlas)
// UI: cc.SpriteAtlas = null;
private initialTouchOffset: cc.Vec2 = null;
private offsetTolerance = 100; // 偏移容忍度;
allBlocks: any; //所有的方块,用于计算posX,posY消除
touchPoint: cc.Vec2 = null; //触摸点
isTouch: boolean = false; //是否触摸
posX: number = 0; //地图块的X坐标
posY: number = 0; //地图块的Y坐标
moveLeft: boolean = true; //是否可以左移;
moveRight: boolean = true; //是否可以右移;
moveUp: boolean = true; //是否可以上移;
moveDown: boolean = true; //是否可以下移;
moveCorner: number = 0; //是否碰撞角落
moveY: number = 0; //是否可以上下移动;
moveX: number = 0; //是否可以左右移动;
touchPointX: number = 0; //触摸点X坐标;
touchPointY: number = 0; //触摸点Y坐标;
blockId: number = 0; //方块ID;
stacking: cc.Vec2; //叠加方块
adhesive: cc.Vec2; //粘合方块
level: number = 0; //叠加方块层数;
pz: boolean = false;
over: boolean = false; //方块是否失效已消失
collider: any;
block_Info: any;
_touchListener: any;
relative_Position: cc.Vec2; //点击和方块相对位置
private _eventManager: any;
hit: cc.Node;
otherCollider: any;
moveStack: boolean;
touchDelta: cc.Vec2 = cc.v2(0, 0);
adhesiveNode: any;
checkCollision: boolean = false;
//计时器
private scheduleCallback: any = null;
private scheduleCallback2: any = null;
isEliminatedByHammer: boolean = false; // 标记是否被锤子消除过
onLoad() {
this.pz = false;
this.stacking = cc.v2(0, 0);
this.adhesive = cc.v2(0, 0);
this.adhesiveNode = [];
this.collider = this.node.getComponent(cc.PolygonCollider);
this.over = false;
this.checkCollision = false;
}
start() {
}
jsonDeepClone<T>(obj: T): T {
return JSON.parse(JSON.stringify(obj));
}
//createAd 为是否创建粘合快图片
init(block_Info, posX, posY, node, createAd) {
this.block_Info = this.jsonDeepClone(block_Info);
if (node) this.block_Info.node = node;
this.type = block_Info.type;
this.color = block_Info.color;
this.blockId = block_Info.id;
//console.log("方块类型",this.type,"方块颜色",this.color,"方块ID",this.blockId);
// if(posX&&posY){
// this.posX = posX;
// this.posY = posY;
// }
// console.log("方块层级",this.node.zIndex);
this.initColor();
this.initType();
this.initBlocks();
if (this.type != BlockType.) {
this.node.on(cc.Node.EventType.TOUCH_START, this.touchStart, this);
this.node.on(cc.Node.EventType.TOUCH_MOVE, this.touchMove, this);
this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.touchEnd, this);
this.node.on(cc.Node.EventType.TOUCH_END, this.touchEnd, this);
this.node['_touchListener'].setSwallowTouches(false);
setTimeout(() => {
if (this.type == BlockType.) {
// 计算位置偏移
const posOffset = cc.v2(
this.node.x - this.block_Info.node.x,
this.node.y - this.block_Info.node.y
);
if (createAd) {
if (this.node.zIndex >= this.block_Info.node.zIndex)
this.createAdhesive();
else
this.block_Info.node.getComponent("Block").createAdhesive();
}
const targetNames = ['top', 'down', 'left', 'right'];
this.block_Info.node.children.forEach(child => {
if (child instanceof cc.Node && targetNames.includes(child.name) && child.getComponent("lq_collide").data_string != "-1") {
const clonedChild = cc.instantiate(child);
clonedChild.getComponent("lq_collide").data_string = "-1";
clonedChild.parent = this.node;
// 获取子节点相对于父节点的位置
const relativePos = child.getPosition();
// 调整子节点位置以保证相对位置不变
clonedChild.setPosition(
relativePos.x - posOffset.x,
relativePos.y - posOffset.y
);
}
});
this.adhesive = posOffset;
}
}, 100);
let mapInfo = MapConroler._instance.mapInfo;
for (let i = 0; i < mapInfo.length; i++) {
let blockRect = mapInfo[i].getBoundingBox();
// 使用 cc.Intersection.pointInRect 方法判断点是否在矩形范围内
let point = cc.v2(this.node.position.x - 5, this.node.position.y + 10)
if (blockRect.contains(point)) {
this.posX = mapInfo[i].getComponent("MapBlock").posX;
this.posY = mapInfo[i].getComponent("MapBlock").posY;
this.setMapBlock();
this.level = 50 + this.posX - this.posY * 3;
this.node.zIndex = this.level;
this.node.x = mapInfo[i].x + 65;
this.node.y = mapInfo[i].y - 60;
i = 10000;
this.hit = new cc.Node();
this.hit.addComponent(cc.Sprite);
this.hit.parent = this.node;
let name = "xz_" + this.block_Info.block;
this.hit.getComponent(cc.Sprite).spriteFrame = this.ice_SpriteFrame._spriteFrames[name];
this.hit.setAnchorPoint(this.node.anchorX, this.node.anchorY);
this.setHitPosition();
// if(this.hit.anchorX == 0.5) this.hit.setPosition(0,-11);
// else if(this.hit.anchorX == 0.33) this.hit.setPosition(-13,-11);
// else if(this.hit.anchorX == 0.66) this.hit.setPosition(2,-9);
// this.hit.opacity = 0;
this.hit.active = false;
break;
}
}
}
}
//初始化方块类型
initType() {
let posConfig = cc.fx.GameConfig.PROP_INFO[this.block_Info.block];
switch (this.type) {
case BlockType.炸弹块:
let boom = cc.instantiate(MapConroler._instance.Block_Prop[this.type]);
boom.parent = this.node;
boom.setPosition(posConfig.pos1.x, posConfig.pos1.y);
if (this.block_Info?.boomTime)
boom.getComponent("Boom").init(this.block_Info.boomTime);
break;
case BlockType.星星块:
let star = cc.instantiate(MapConroler._instance.Block_Prop[this.type]);
star.anchorX = this.node.anchorX;
star.anchorY = this.node.anchorY;
star.getComponent(cc.Sprite).spriteFrame = star.getComponent("Star").star_SpriteFrame.getSpriteFrame("star_" + this.block_Info.block);
star.parent = this.node;
star.setPosition(posConfig.pos4.x - 10, posConfig.pos4.y);
case BlockType.钥匙块:
let key = cc.instantiate(MapConroler._instance.Block_Prop[this.type]);
key.parent = this.node;
key.setPosition(posConfig.pos1.x, posConfig.pos1.y);
break;
case BlockType.上锁块:
let lock = cc.instantiate(MapConroler._instance.Block_Prop[this.type]);
lock.parent = this.node;
lock.setPosition(posConfig.pos1.x, posConfig.pos1.y);
lock.getComponent("Lock").init(this.block_Info.lockTime);
break;
case BlockType.冻结块:
let freeze = cc.instantiate(MapConroler._instance.Block_Prop[this.type]);
freeze.parent = this.node;
let name = "ice_" + this.block_Info.block;
let spriteFrame = this.ice_SpriteFrame._spriteFrames[name];
freeze.getChildByName("icon").getComponent(cc.Sprite).spriteFrame = spriteFrame;
let freezeX = posConfig.pos6.x - (this.node.width * (this.node.anchorX - 0.5)); let freezeY = posConfig.pos6.y + this.node.height / 2;
if (this.block_Info.block == 2) {
freeze.setPosition(freezeX + 4, freezeY - 10);
}
else freeze.setPosition(freezeX, freezeY);
freeze.getComponent("Freeze").init(this.block_Info.freezeTime);
freeze.getChildByName("time").setPosition(posConfig.pos5.x - 10 - freezeX, posConfig.pos5.y - 2 - freezeY);
break;
case BlockType.水平块:
let horizontal = cc.instantiate(MapConroler._instance.Block_Prop[this.type]);
horizontal.parent = this.node;
let heng = "heng" + this.heng;
horizontal.getChildByName(heng).active = true;
horizontal.setPosition(posConfig.pos2.x - 3, posConfig.pos2.y);
break;
case BlockType.垂直块:
let vertical = cc.instantiate(MapConroler._instance.Block_Prop[this.type]);
vertical.parent = this.node;
let shu = "shu" + this.shu;
vertical.getChildByName(shu).active = true;
vertical.setPosition(posConfig.pos3.x, posConfig.pos3.y);
break;
case BlockType.叠加块上:
this.moveStack = false;
this.node.off(cc.Node.EventType.TOUCH_START);
this.node.off(cc.Node.EventType.TOUCH_MOVE);
this.node.off(cc.Node.EventType.TOUCH_CANCEL);
this.node.off(cc.Node.EventType.TOUCH_END);
// this.selfBoxColliders = [];
this.node.zIndex = 201;
let pos = this.getStackingPos();
this.node.setPosition(this.node.x + pos.x, this.node.y + pos.y);
this.stacking = cc.v2(this.node.x - this.block_Info.node.x, this.node.y - this.block_Info.node.y);
this.block_Info.node.getComponent("Block").block_Info.node = this.node;
this.node.scaleX *= 0.7;
this.node.scaleY *= 0.7;
for (let i = 0; i < this.node.children.length; i++) {
if (this.node.children[i].name == "left" || this.node.children[i].name == "right" || this.node.children[i].name == "top" || this.node.children[i].name == "down")
this.node.children[i].active = false;
}
break;
}
}
//初始化方块颜色
initColor() {
let name = this.color + "color" + this.block_Info.block;
let number = Math.floor((this.color - 1) / 2);
let blockSpriteFrame = MapConroler._instance.Block_Color[number]._spriteFrames;
var spriteFrame = blockSpriteFrame[name];
// if(this.type == BlockType.冻结块){
// name = "ice_"+this.block_Info.block;
// spriteFrame = this.ice_SpriteFrame._spriteFrames[name];
// }
this.node.getChildByName("icon").getComponent(cc.Sprite).spriteFrame = spriteFrame;
}
//创建粘合快连接处
createAdhesive() {
let box = [];
for (let i = 0; i < this.allBlocks.length; i++) {
box.push(cc.v2(this.allBlocks[i].x + this.posX, this.allBlocks[i].y + this.posY));
}
let otherBox = [];
for (let i = 0; i < this.block_Info.node.getComponent("Block").allBlocks.length; i++) {
otherBox.push(cc.v2(this.block_Info.node.getComponent("Block").allBlocks[i].x + this.block_Info.node.getComponent("Block").posX, this.block_Info.node.getComponent("Block").allBlocks[i].y + this.block_Info.node.getComponent("Block").posY));
}
for (let k = 0; k < box.length; k++) {
for (let j = 0; j < otherBox.length; j++) {
if ((box[k].x == otherBox[j].x + 1 || box[k].x == otherBox[j].x - 1) && (box[k].y == otherBox[j].y)) {
//在X轴 相邻
let left = box[k].x == otherBox[j].x + 1 ? "left" : "right";
this.addAdhesive(left, box[k]);
otherBox.splice(j, 1);
j--; // 调整索引
if (j < 0) break;
}
if ((box[k].y == otherBox[j].y + 1 || box[k].y == otherBox[j].y - 1) && (box[k].x == otherBox[j].x)) {
//在Y轴 相邻
let down = box[k].y == otherBox[j].y + 1 ? "down" : "up";
this.addAdhesive(down, box[k]);
otherBox.splice(j, 1);
j--; // 调整索引
if (j < 0) break;
}
}
}
// let adhesive = cc.instantiate(MapConroler._instance.Block_Prop[this.type]);
}
//具体添加粘合快锁链方法
addAdhesive(diraction, box) {
let pos = cc.v2(box.x - this.posX, box.y - this.posY);
let adhesive = cc.instantiate(MapConroler._instance.Block_Prop[10]);
adhesive.parent = this.node.parent.getChildByName("Adhesive");
// adhesive.parent = this.node.getChildByName("adhesive");
adhesive.setPosition(120 * pos.x - 65 + this.node.x, 120 * pos.y + 60 + this.node.y);
if (diraction == "left" || diraction == "right") {
adhesive.getChildByName("heng").active = true;
adhesive.getChildByName("heng").x = -60;
if (diraction == "right") adhesive.getChildByName("heng").x = 60;
adhesive.getChildByName("heng").x += 9;
adhesive.getChildByName("heng").y += 7;
}
else {
adhesive.getChildByName("shu").active = true;
adhesive.getChildByName("shu").y = -60;
if (diraction == "up") adhesive.getChildByName("shu").y = 60;
}
adhesive.getComponent("Adhesive").init(this.node);
this.adhesiveNode.push(adhesive);
}
removeAdhesive() {
if (this.adhesiveNode.length > 0) {
for (let i = 0; i < this.adhesiveNode.length; i++) {
let adhesive = this.adhesiveNode[i];
adhesive.getComponent("Adhesive").remove();
}
}
}
//方块落点
blockFall(point, type) {
if (this.over == true) return;
// // 假设 MapConroler 有网格信息,这里简单示例
const mapWidth = MapConroler._instance.mapWidth;
const mapHeight = MapConroler._instance.mapHeight;
const cellSize = 120; // 每个格子的大小,根据实际情况调整
// 计算点所在的网格坐标
const gridX = Math.floor((point.x + (mapWidth * cellSize / 2)) / cellSize);
const gridY = Math.floor((point.y + (mapHeight * cellSize / 2)) / cellSize);
// 检查网格坐标是否越界
if (gridX >= 0 && gridX < mapWidth && gridY >= 0 && gridY < mapHeight) {
const mapBlock = MapConroler._instance.mapBlocksWall[gridX][gridY];
const blockRect = mapBlock.getBoundingBox();
// 使用 cc.Intersection.pointInRect 方法判断点是否在矩形范围内
if (blockRect.contains(point)) {
//寻找落点
this.removeMapBlock();
this.posX = mapBlock.getComponent("MapBlock").posX;
this.posY = mapBlock.getComponent("MapBlock").posY;
this.setMapBlock();
this.level = 50 + this.posX - this.posY * 3;
this.node.zIndex = this.level;
//console.log("方块层级", this.node.zIndex);
this.node.x = mapBlock.x + 65;
this.node.y = mapBlock.y - 60;
if (this.type == 9) {
if (this.block_Info.node) {
this.block_Info.node.x = this.node.x - this.adhesive.x;
this.block_Info.node.y = this.node.y - this.adhesive.y;
}
}
else if (this.type == 1) {
this.block_Info.node.getComponent("Block").moveStack = false;
this.block_Info.node.x = this.node.x + this.block_Info.node.getComponent("Block").stacking.x;
this.block_Info.node.y = this.node.y + this.block_Info.node.getComponent("Block").stacking.y;
}
}
}
let jg = MapConroler._instance.checkPass(this.node, this.allBlocks);
if (jg >= 0) {
this.over = true;
// MapConroler._instance.changeState(true);
this.removeBoxCollider();
this.removeMapBlock();
this.removeAction(jg, type);
}
else {
MapConroler._instance.upDoor(this.color);
this.setVibrate("medium", 1)
//@ts-ignore
}
}
//移除方块碰撞
removeBoxCollider() {
for (let i = 0; i < this.node.children.length; i++) {
if (this.node.children[i].name == "left" || this.node.children[i].name == "right" || this.node.children[i].name == "top" || this.node.children[i].name == "down"
|| this.node.children[i].name == "tan_up_right" || this.node.children[i].name == "tan_up_left" || this.node.children[i].name == "tan_down_right" || this.node.children[i].name == "tan_down_left"
)
this.node.children[i].destroy();
}
}
//移除方块动画
removeAction(diraction, type) {
this.node.off(cc.Node.EventType.TOUCH_START);
this.node.off(cc.Node.EventType.TOUCH_MOVE);
this.node.off(cc.Node.EventType.TOUCH_CANCEL);
this.node.off(cc.Node.EventType.TOUCH_END);
if (diraction == 2 || diraction == 3) {
// 获取当前节点的宽度和高度
const currentWidth = this.node.width;
const currentHeight = this.node.height;
// 假设将高度增加 50你可以根据需求修改这个值
const newHeight = currentHeight + 50;
// 设置新的节点尺寸
this.node.setContentSize(currentWidth, newHeight);
}
else if (diraction == 0 || diraction == 1) {
// 获取当前节点的宽度和高度
const currentWidth = this.node.width;
const currentHeight = this.node.height;
// 假设将高度增加 50你可以根据需求修改这个值
const newWidth = currentWidth + 50;
// 设置新的节点尺寸
this.node.setContentSize(newWidth, currentHeight);
}
this.node.addComponent(cc.Mask);
let self = this;
let pos = this.node.getPosition();
if (this.type == BlockType.) {
let scaleX = this.node.scaleX;
let scaleY = this.node.scaleY;
this.block_Info.node.getComponent("Block").restoreNomal(this.posX, this.posY, true);
cc.tween(this.block_Info.node)
.to(0.3, { position: pos, scaleX: scaleX > 0 ? 1 : -1, scaleY: scaleY > 0 ? 1 : -1 })
.start();
}
else if (this.type == BlockType.) {
this.removeAdhesive();
this.block_Info.node.getComponent("Block").removeAdhesive();
this.block_Info.node.getComponent("Block").restoreNomal(this.block_Info.node.getComponent("Block").posX,
this.block_Info.node.getComponent("Block").posY, false);
this.block_Info.node = null;
}
else if (this.type == BlockType.) {
this.node.getChildByName("boom").getComponent("Boom").destroyBoom(false);
}
let time = 0.33;
// this.node.zIndex = 0;
let width = Math.floor(this.node.width / 120);
let height = Math.floor(this.node.height / 120);
setTimeout(() => {
cc.fx.AudioManager._instance.playEffect("xiaochu", null);
}, 300);
this.setVibrate("light", 3)
if (diraction == 0) {
time = 0.33 * height;
// time = 0.99;
for (let i = 0; i < this.node.children.length; i++) {
cc.tween(this.node.children[i])
.to(time, { y: this.node.children[i].y + this.node.children[0].height })
.start();
}
}
else if (diraction == 1) {
time = 0.33 * height;
// time = 0.99
for (let i = 0; i < this.node.children.length; i++) {
cc.tween(this.node.children[i])
.to(time, { y: this.node.children[i].y - this.node.children[0].height })
.start();
}
}
else if (diraction == 2) {
time = 0.33 * width;
// time = 0.99
for (let i = 0; i < this.node.children.length; i++) {
cc.tween(this.node.children[i])
.to(time, { x: this.node.children[i].x - this.node.children[0].width })
.start();
}
}
else if (diraction == 3) {
time = 0.33 * width
// time = 0.99
for (let i = 0; i < this.node.children.length; i++) {
cc.tween(this.node.children[i])
.to(time, { x: this.node.children[i].x + this.node.children[0].width })
.start();
}
}
MapConroler._instance.judgeWin(0);
setTimeout(() => {
let tempColor = this.color;
setTimeout(() => {
MapConroler._instance.upDoor(tempColor);
}, 250);
MapConroler._instance.nextLevel();
this.node.active = false;
this.node.removeFromParent();
setTimeout(() => {
if (MapConroler._instance.blockNum != 0 && type == true && MapConroler._instance.openWall.length > 0
&& !MapConroler._instance.gameOver && !MapConroler._instance.gameWin) {
let gameover = MapConroler._instance.predict_End();
if (gameover == false) {
MapConroler._instance.failLevel("lock");
}
}
}, 500);
// this.node.active = false;
// this.node.removeFromParent();
}, time * 1000);
}
touchStart(event) {
if (this.over || MapConroler._instance.gameOver) return;
// 返回世界坐标
let touchLoc = event.getLocation();
// https://docs.cocos.com/creator/api/zh/classes/Intersection.html 检测辅助类
// let pos = this.collider.world.points
if (!this.collider.world) {
return;
}
// 判断触摸点是否在多边形内
if (cc.Intersection.pointInPolygon(touchLoc, this.collider.world.points)) {
if (MapConroler._instance.hammer) {
this.eliminate2();
this.isTouch = false;
MapConroler._instance.hammerMask.active = false;
MapConroler._instance.node.parent.getChildByName("Bottom").getChildByName("destroyBtn").getComponent("btnControl").setTouch(true);
return false;
}
if (this.type != BlockType. && this.type != BlockType.) {
MapConroler._instance.startUpdate();
cc.fx.AudioManager._instance.playEffect("hit", null);
this.node.zIndex = 200;
if (this.type == 9) {
if (this.block_Info.node) {
this.block_Info.node.zIndex = 200;
this.block_Info.node.getComponent("Block").hit.active = true;
MapConroler._instance.downDoor(this.block_Info.node.getComponent("Block").color, this.block_Info.node.getComponent("Block").type);
}
}
else if (this.type == 1) {
this.block_Info.node.getComponent("Block").moveStack = true;
}
let touchPoint = event.getLocation();
let local = this.node.parent.convertToNodeSpaceAR(touchPoint);
this.touchPointX = local.x;
this.touchPointY = local.y;
this.moveLeft = this.moveRight = this.moveUp = this.moveDown = true;
this.isTouch = true;
this.moveCorner = 0;
this.relative_Position = cc.v2(this.node.x - local.x, this.node.y - local.y);
MapConroler._instance.changeRiseFall(this.color, true);
MapConroler._instance.downDoor(this.color, this.type);
this.setVibrate("light", 1)
if (this.hit) this.hit.active = true;
return true;
}
else {
this.isTouch = false;
return false;
}
}
else {
this.isTouch = false;
return false;
}
}
touchEnd(event) {
if (MapConroler._instance.gameOver) return;
if (this.isTouch) {
this.touchDelta = cc.v2(0, 0);
this.checkCollision = false;
MapConroler._instance.changeRiseFall(this.color, false);
cc.fx.AudioManager._instance.playEffect("down", null);
MapConroler._instance.removeOneBlock();
this.isTouch = false;
this.node.zIndex = this.level;
this.hit.active = false;
if (this.type == 9) {
if (this.block_Info.node) {
this.block_Info.node.getComponent("Block").hit.active = false;
// this.block_Info.node.getComponent("Block").isTouch = false;
}
}
this.touchPoint = event.getLocation();
let local = cc.v2(this.node.x - 50, this.node.y + 50);
if (this.type != 10) {
//@ts-ignore
this.blockFall(local, true);
if (this.type == 9) {
if (this.block_Info.node) {
let localTemp = cc.v2(this.block_Info.node.x - 50, this.block_Info.node.y + 50);
this.block_Info.node.getComponent("Block").blockFall(localTemp, false);
}
}
}
this.moveLeft = this.moveRight = this.moveUp = this.moveDown = true;
}
}
touchMove(event: cc.Event.EventTouch) {
if (MapConroler._instance.gameOver) return;
if (this.isTouch) {
const delta = event.getDelta();
const touchPoint = event.getLocation();
const local = this.node.parent.convertToNodeSpaceAR(touchPoint);
this.touchPointX = local.x;
this.touchPointY = local.y;
delta.x = this.touchPointX - this.node.x + this.relative_Position.x;
delta.y = this.touchPointY - this.node.y + this.relative_Position.y;
// 限制移动速度
this.touchPointX = local.x;
this.touchPointY = local.y;
delta.x = this.touchPointX - this.node.x + this.relative_Position.x;
delta.y = this.touchPointY - this.node.y + this.relative_Position.y;
// 限制移动速度
delta.x = Math.max(-this.maxSpeed, Math.min(this.maxSpeed, delta.x));
delta.y = Math.max(-this.maxSpeed, Math.min(this.maxSpeed, delta.y));
// 记录触摸移动的增量
this.touchDelta = delta;
}
}
//超出限制判断
exceeds(stepx, stepy) {
}
//道具魔棒消除
eliminate() {
clearTimeout(this.scheduleCallback2);
clearTimeout(this.scheduleCallback);
let self = this;
//锤子状态消失
MapConroler._instance.pause = true;
if (MapConroler._instance.ismagic) {
this.scheduleCallback = setTimeout(() => {
// 记录添加magic时的锚点
this.node.anchorX = 0.5;
this.node.anchorY = 0.5;
this.node.addChild(new cc.Node("magic"));
let effectNode = this.node.getChildByName("magic");
effectNode.setPosition(0, 0);
// 改锚点后修正magic的位置
this.node.anchorX = 1;
this.node.anchorY = 0;
// 重新设置magic的位置使其视觉上不变
let parentSize = this.node.getContentSize();
effectNode.setPosition(
effectNode.x + parentSize.width * (0.5 - 1),
effectNode.y + parentSize.height * (0.5 - 0)
);
switch (this.node.name) {
case "block14":
this.node.anchorX = 0.66;
this.node.anchorY = 0;
effectNode.setPosition(-50, 120);
break;
case "block18":
this.node.anchorX = 0.66;
this.node.anchorY = 0;
effectNode.setPosition(-50, 200);
break;
case "block10":
effectNode.setPosition(0, 200);
break;
case "block21":
effectNode.setPosition(0, 130);
break;
case "block16":
effectNode.setPosition(0, 180);
break;
default:
break;
}
effectNode.zIndex = 1000;
effectNode.addComponent(sp.Skeleton);
effectNode.getComponent(sp.Skeleton).skeletonData = this.magic_SkeletonData;
effectNode.getComponent(sp.Skeleton).setAnimation(0, "play", false);
if (this.type == BlockType.) {
this.node.getChildByName("freeze").getComponent("Freeze").reduce(2);
MapConroler._instance.ismagic = false;
return;
}
else if (this.type == BlockType.) {
MapConroler._instance.ismagic = false;
this.node.getChildByName("lock").getComponent("Lock").reduce();
return;
}
}, 800);
}
if (this.type == BlockType. && (!MapConroler._instance.ishammer && !MapConroler._instance.ismagic)) {
this.node.getChildByName("freeze").getComponent("Freeze").reduce(2);
return;
}
else if (this.type == BlockType. && (!MapConroler._instance.ishammer && !MapConroler._instance.ismagic)) {
this.node.getChildByName("lock").getComponent("Lock").reduce();
return;
}
if (self.type == BlockType.) {
self.block_Info.node.getComponent("Block").restoreNomal(self.block_Info.node.getComponent("Block").posX,
self.block_Info.node.getComponent("Block").posY, false);
}
else if (self.type == BlockType.) {
this.node.getChildByName("boom").getComponent("Boom").stopBoom();
}
this.scheduleCallback2 = setTimeout(() => {
//如果方块可以消除
MapConroler._instance.blockNum -= 1;
MapConroler._instance.special_Treatment(this.node);
var self = this;
this.removeMapBlock();
MapConroler._instance.judgeWin(1);
let pos = this.node.getPosition();
if (self.type == BlockType.) {
let scaleX = self.node.scaleX;
let scaleY = self.node.scaleY;
self.block_Info.node.getComponent("Block").restoreNomal(this.posX, this.posY, true);
cc.tween(self.block_Info.node)
.to(0.1, { position: pos, scaleX: scaleX > 0 ? 1 : -1, scaleY: scaleY > 0 ? 1 : -1 })
.start();
}
else if (self.type == BlockType.) {
this.node.getChildByName("boom").getComponent("Boom").destroyBoom(false);
}
MapConroler._instance.nextLevel();
this.node.active = false;
this.node.removeFromParent();
setTimeout(() => {
if (MapConroler._instance.blockNum != 0 && MapConroler._instance.openWall.length > 0
&& !MapConroler._instance.gameOver && !MapConroler._instance.gameWin) {
let gameover = MapConroler._instance.predict_End();
if (gameover == false) {
MapConroler._instance.failLevel("lock");
}
}
}, 500);
MapConroler._instance.ismagic = false;
}, 950);
}
//道具锤子消除
eliminate2() {
clearTimeout(this.scheduleCallback2);
let self = this;
this.isEliminatedByHammer = true;
//锤子状态消失
MapConroler._instance.pause = true;
if (MapConroler._instance.ishammer == true) {
let parentSize = this.node.getContentSize();
console.log("锤子状态消除", this.node.position);
let pos = cc.v3(0, 0, 0)
if (this.node.anchorX == 1) {
pos = cc.v3(this.node.position.x - parentSize.width / 2,
this.node.position.y + parentSize.height / 2, 0)
} else if (this.node.anchorX == 0.5) {
pos = cc.v3(this.node.position.x,
this.node.position.y + parentSize.height / 2, 0)
} else if (this.node.anchorX == 0.33) {
pos = cc.v3(this.node.position.x + parentSize.width / 4,
this.node.position.y + parentSize.height / 2, 0)
} else if (this.node.anchorX == 0.66) {
pos = cc.v3(this.node.position.x - parentSize.width / 6,
this.node.position.y + parentSize.height / 2, 0)
}
//name等于个别
switch (this.node.name) {
case "block21":
pos = cc.v3(this.node.position.x - parentSize.width / 4,
this.node.position.y + parentSize.height / 2, 0)
break;
case "block16":
pos = cc.v3(this.node.position.x - parentSize.width / 6,
this.node.position.y + parentSize.height / 2, 0)
case "block10":
pos = cc.v3(this.node.position.x - parentSize.width / 4,
this.node.position.y + parentSize.height / 2, 0)
break;
case "block8":
pos = cc.v3(this.node.position.x - parentSize.width / 6 - parentSize.width / 2,
this.node.position.y + parentSize.height / 2, 0)
break;
case "block22":
pos = cc.v3(this.node.position.x - parentSize.width / 4,
this.node.position.y + parentSize.height - parentSize.height / 4, 0)
break;
case "block20":
pos = cc.v3(this.node.position.x - parentSize.height + parentSize.height / 4,
this.node.position.y + parentSize.height / 2, 0)
break;
case "block6":
pos = cc.v3(this.node.position.x - parentSize.width / 4,
this.node.position.y + parentSize.height / 2, 0)
break;
}
MapConroler._instance.startHammer(pos);
if (this.type == BlockType.) {
MapConroler._instance.ishammer = false;
if (MapConroler._instance.hammer == true) MapConroler._instance.hammer = false;
setTimeout(() => {
this.node.getChildByName("freeze").getComponent("Freeze").reduce(2);
}, 1000);
return;
}
else if (this.type == BlockType.) {
MapConroler._instance.ishammer = false;
if (MapConroler._instance.hammer == true) MapConroler._instance.hammer = false;
setTimeout(() => {
this.node.getChildByName("lock").getComponent("Lock").reduce();
}, 1000);
return;
}
}
if (this.type == BlockType. && (!MapConroler._instance.ishammer && !MapConroler._instance.ismagic)) {
this.node.getChildByName("freeze").getComponent("Freeze").reduce(2);
return;
}
else if (this.type == BlockType. && (!MapConroler._instance.ishammer && !MapConroler._instance.ismagic)) {
this.node.getChildByName("lock").getComponent("Lock").reduce();
return;
}
if (MapConroler._instance.hammer == true) MapConroler._instance.hammer = false;
if (self.type == BlockType.) {
self.block_Info.node.getComponent("Block").restoreNomal(self.block_Info.node.getComponent("Block").posX,
self.block_Info.node.getComponent("Block").posY, false);
}
else if (self.type == BlockType.) {
this.node.getChildByName("boom").getComponent("Boom").stopBoom();
}
this.scheduleCallback2 = setTimeout(() => {
//如果方块可以消除
MapConroler._instance.blockNum -= 1;
MapConroler._instance.special_Treatment(this.node);
var self = this;
this.removeMapBlock();
MapConroler._instance.judgeWin(1);
let pos = this.node.getPosition();
if (self.type == BlockType.) {
let scaleX = self.node.scaleX;
let scaleY = self.node.scaleY;
self.block_Info.node.getComponent("Block").restoreNomal(this.posX, this.posY, true);
cc.tween(self.block_Info.node)
.to(0.1, { position: pos, scaleX: scaleX > 0 ? 1 : -1, scaleY: scaleY > 0 ? 1 : -1 })
.start();
}
else if (self.type == BlockType.) {
this.node.getChildByName("boom").getComponent("Boom").destroyBoom(false);
}
MapConroler._instance.nextLevel();
this.node.active = false;
this.node.removeFromParent();
setTimeout(() => {
if (MapConroler._instance.blockNum != 0 && MapConroler._instance.openWall.length > 0
&& !MapConroler._instance.gameOver && !MapConroler._instance.gameWin) {
let gameover = MapConroler._instance.predict_End();
if (gameover == false) {
MapConroler._instance.failLevel("lock");
}
}
}, 500);
//如果是锤子状态消除
MapConroler._instance.ishammer = false;
}, 900);
}
stopTimeCutDown() {
if (this.scheduleCallback) {
this.unschedule(this.scheduleCallback);
this.scheduleCallback = null;
}
}
//震动方法
setVibrate(type, count) {
// return;
// console.log("最新:",cc.fx.GameConfig.GM_INFO.vibrateOpen,type);
if (!cc.fx.GameConfig.GM_INFO.vibrateOpen) {
return;
}
if (count == 1) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) { // 判断是否在微信环境
//@ts-ignore
wx.vibrateShort({
type: type,
success: () => {
// console.log("震动成功1111111111")
},
fail: (err) => {
// console.log("震动失败1111111111",err);
}
});
} else {
}
return;
}
let time = 150;
for (let i = 0; i < 4; i++) {
setTimeout(() => {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) { // 判断是否在微信环境
//@ts-ignore
wx.vibrateShort({
type: type,
success: () => {
// console.log("震动成功222222222")
},
fail: (err) => {
// console.log("震动失败222222222", err);
}
});
} else {
}
}, time * i);
}
}
setMoveCorner(diraction) {
return;
}
cmupdate() {
let cm: any = cc.director.getCollisionManager();
cm.update();
}
//恢复成一般方块
restoreNomal(posX, posY, type) {
this.type = 0;
this.block_Info.node = null;
this.moveStack = false;
this.posX = posX;
this.posY = posY;
this.setMapBlock();
this.level = 50 + this.posX - this.posY * 3;
this.node.zIndex = this.level;
let j = 1000;
for (let i = 0; i < this.node.children.length; i++) {
if (this.node.children[i].name == "New Node") {
j = i;
}
if (i > j) {
this.node.children[i].active = false;
}
}
if (type) {
for (let i = 0; i < this.node.children.length; i++) {
if (this.node.children[i].name == "left" || this.node.children[i].name == "right" || this.node.children[i].name == "top" || this.node.children[i].name == "down")
this.node.children[i].active = true;
}
}
this.node.on(cc.Node.EventType.TOUCH_START, this.touchStart, this);
this.node.on(cc.Node.EventType.TOUCH_MOVE, this.touchMove, this);
this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.touchEnd, this);
this.node.on(cc.Node.EventType.TOUCH_END, this.touchEnd, this);
this.node['_touchListener'].setSwallowTouches(false);
this.hit = new cc.Node();
this.hit.addComponent(cc.Sprite);
this.hit.parent = this.node;
let name = "xz_" + this.block_Info.block;
this.hit.getComponent(cc.Sprite).spriteFrame = this.ice_SpriteFrame._spriteFrames[name];
this.hit.setAnchorPoint(this.node.anchorX, this.node.anchorY);
this.setHitPosition();
// if(this.hit.anchorX == 0.5) this.hit.setPosition(0,-11);
// else if(this.hit.anchorX == 0.33) this.hit.setPosition(-13,-11);
// else if(this.hit.anchorX == 0.66) this.hit.setPosition(2,-9);
this.hit.active = false;
}
//冻结状态恢复为常规状态
resetFreeze() {
this.type = 0;
this.block_Info.type = 0;
let name = this.color + "color" + this.block_Info.block;
let number = Math.floor((this.color - 1) / 2);
let blockSpriteFrame = MapConroler._instance.Block_Color[number]._spriteFrames;
var spriteFrame = blockSpriteFrame[name];
this.node.getChildByName("icon").getComponent(cc.Sprite).spriteFrame = spriteFrame;
}
initBlocks() {
this.allBlocks = [];
switch (this.block_Info.block) {
case 0:
let pos = cc.v2(0, 0);
this.allBlocks = [pos];
break;
case 1:
let pos1 = cc.v2(0, 0);
let pos2 = cc.v2(-1, 0);
this.allBlocks = [pos1, pos2];
break;
case 2:
let pos3 = cc.v2(0, 0);
let pos4 = cc.v2(0, 1);
this.allBlocks = [pos3, pos4];
break;
case 3:
let pos5 = cc.v2(0, 0);
let pos6 = cc.v2(-1, 0);
let pos7 = cc.v2(-2, 0);
this.allBlocks = [pos5, pos6, pos7];
break;
case 4:
let pos8 = cc.v2(0, 0);
let pos9 = cc.v2(0, 1);
let pos10 = cc.v2(0, 2);
this.allBlocks = [pos8, pos9, pos10];
break;
case 5:
let pos11 = cc.v2(0, 0);
let pos12 = cc.v2(-1, 0);
let pos13 = cc.v2(-1, 1);
let pos14 = cc.v2(0, 1);
this.allBlocks = [pos11, pos12, pos13, pos14];
break;
case 6:
let pos15 = cc.v2(0, 0);
let pos16 = cc.v2(0, 1);
let pos17 = cc.v2(0, 2);
let pos18 = cc.v2(-1, 2);
this.allBlocks = [pos15, pos16, pos17, pos18];
break;
case 7:
let pos19 = cc.v2(0, 0);
let pos20 = cc.v2(0, 1);
let pos21 = cc.v2(-1, 1);
let pos22 = cc.v2(-2, 1);
this.allBlocks = [pos19, pos20, pos21, pos22];
break;
case 8:
let pos23 = cc.v2(0, 0);
let pos24 = cc.v2(-1, 0);
let pos25 = cc.v2(-1, 1);
let pos26 = cc.v2(-1, 2);
this.allBlocks = [pos23, pos24, pos25, pos26];
break;
case 9:
let pos27 = cc.v2(0, 0);
let pos28 = cc.v2(-1, 0);
let pos29 = cc.v2(-2, 0);
let pos30 = cc.v2(0, 1);
this.allBlocks = [pos27, pos28, pos29, pos30];
break;
case 10:
let pos31 = cc.v2(0, 0);
let pos32 = cc.v2(1, 2);
let pos33 = cc.v2(0, 1);
let pos34 = cc.v2(0, 2);
this.allBlocks = [pos31, pos32, pos33, pos34];
break;
case 11:
let pos35 = cc.v2(0, 0);
let pos36 = cc.v2(2, 1);
let pos37 = cc.v2(1, 1);
let pos38 = cc.v2(0, 1);
this.allBlocks = [pos35, pos36, pos37, pos38];
break;
case 12:
let pos39 = cc.v2(0, 0);
let pos40 = cc.v2(0, 1);
let pos41 = cc.v2(0, 2);
let pos42 = cc.v2(-1, 0);
this.allBlocks = [pos39, pos40, pos41, pos42];
break;
case 13:
let pos43 = cc.v2(0, 0);
let pos44 = cc.v2(-1, 0);
let pos45 = cc.v2(-2, 0);
let pos46 = cc.v2(-2, 1);
this.allBlocks = [pos43, pos44, pos45, pos46];
break;
case 14:
let pos47 = cc.v2(0, 0);
let pos48 = cc.v2(0, 1);
let pos49 = cc.v2(-1, 1);
let pos50 = cc.v2(1, 1);
this.allBlocks = [pos47, pos48, pos49, pos50];
break;
case 15:
let pos51 = cc.v2(0, 0);
let pos52 = cc.v2(-1, 0);
let pos53 = cc.v2(-2, 0);
let pos54 = cc.v2(-1, 1);
this.allBlocks = [pos51, pos52, pos53, pos54];
break;
case 16:
let pos55 = cc.v2(0, 0);
let pos56 = cc.v2(1, 1);
let pos57 = cc.v2(0, 1);
let pos58 = cc.v2(0, 2);
this.allBlocks = [pos55, pos56, pos57, pos58];
break;
case 17:
let pos59 = cc.v2(0, 0);
let pos60 = cc.v2(0, 1);
let pos61 = cc.v2(0, 2);
let pos62 = cc.v2(-1, 1);
this.allBlocks = [pos59, pos60, pos61, pos62];
break;
case 18:
let pos63 = cc.v2(0, 0);
let pos64 = cc.v2(0, 1);
let pos65 = cc.v2(0, 2);
let pos66 = cc.v2(1, 1);
let pos67 = cc.v2(-1, 1);
this.allBlocks = [pos63, pos64, pos65, pos66, pos67];
break;
case 19:
let pos68 = cc.v2(0, 0);
let pos69 = cc.v2(0, 1);
let pos70 = cc.v2(-1, 0);
this.allBlocks = [pos68, pos69, pos70];
break;
case 20:
let pos71 = cc.v2(0, 0);
let pos72 = cc.v2(-1, 0);
let pos73 = cc.v2(-1, 1);
this.allBlocks = [pos71, pos72, pos73];
break;
case 21:
let pos74 = cc.v2(0, 0);
let pos75 = cc.v2(0, 1);
let pos76 = cc.v2(1, 1);
this.allBlocks = [pos74, pos75, pos76];
break;
case 22:
let pos77 = cc.v2(0, 0);
let pos78 = cc.v2(0, 1);
let pos79 = cc.v2(-1, 1);
this.allBlocks = [pos77, pos78, pos79];
break;
}
}
setMapBlock() {
if (this.allBlocks.length > 0) {
for (let i = 0; i < this.allBlocks.length; i++) {
let pos = this.allBlocks[i];
let x = this.posX + pos.x;
let y = this.posY + pos.y;
MapConroler._instance.mapBlocksWall[x][y].getComponent("MapBlock").block_Id = this.node.uuid;
}
}
}
removeMapBlock() {
if (this.posX == 0 && this.posY == 0) {
return;
}
if (this.allBlocks) {
if (this.allBlocks.length > 0) {
for (let i = 0; i < this.allBlocks.length; i++) {
if (this.allBlocks[i]) {
let pos = this.allBlocks[i];
let x = this.posX + pos.x;
let y = this.posY + pos.y;
if (MapConroler._instance.mapBlocksWall[x][y]) {
if (MapConroler._instance.mapBlocksWall[x][y].getComponent("MapBlock"))
MapConroler._instance.mapBlocksWall[x][y].getComponent("MapBlock").block_Id = "";
}
}
}
}
}
}
//叠加块,位置差异,校准位置
getStackingPos() {
switch (this.node.name) {
case "block0":
return cc.v2(-21, 22);
case "block1":
return cc.v2(-36, 23);
case "block2":
return cc.v2(-18, 40);
case "block3":
return cc.v2(-59, 25);
case "block4":
return cc.v2(-19, 57);
case "block5":
return cc.v2(-36, 38);
case "block6":
return cc.v2(-19, 97);
case "block7":
return cc.v2(-19, 61);
case "block8":
return cc.v2(-55, 24);
case "block9":
return cc.v2(-20, 24);
case "block10":
return cc.v2(-17, 96);
case "block11":
return cc.v2(-17, 58);
case "block12":
return cc.v2(-20, 24);
case "block13":
return cc.v2(-92, 25);
case "block14":
return cc.v2(-18, 60);
case "block15":
return cc.v2(-58, 24);
case "block16":
return cc.v2(-20, 60);
case "block17":
return cc.v2(-17, 60);
case "block18":
return cc.v2(-17, 60);
case "block19":
return cc.v2(-20, 24);
case "block20":
return cc.v2(-54, 25);
case "block21":
return cc.v2(-17, 60);
case "block22":
return cc.v2(-17, 60);
}
}
update(dt: number) {
if (this.isTouch && this.touchDelta.mag() > 0) {
//this.moveLeft = this.moveRight = this.moveUp = this.moveDown = true;
const delta = this.touchDelta;
const newX = this.node.x + delta.x;
const newY = this.node.y + delta.y;
const distance = Math.sqrt(Math.pow(newX - this.node.x, 2) + Math.pow(newY - this.node.y, 2));
let mag = Math.round(delta.mag());
// 脱离接触恢复可移动状态
if (this.moveY === 1) {
if (this.touchPointY <= this.node.y + this.node.height / 2) {
this.moveY = 0;
}
} else if (this.moveY === -1) {
if (this.touchPointY >= this.node.y + this.node.height / 2) {
this.moveY = 0;
}
}
if (this.moveX === 1) {
if (this.touchPointX <= this.node.x - this.node.width / 2) {
this.moveX = 0;
}
else {
}
} else if (this.moveX === -1) {
if (this.touchPointX >= this.node.x - this.node.width / 2) {
this.moveX = 0;
}
else {
}
}
//恢复的时候如果追的距离超过100则分段移动避免穿透
if (distance > 100) {
mag = 10;
const speedScale = 0.5;
delta.x *= speedScale;
delta.y *= speedScale;
} else {
if (mag > 5) {
mag = Math.floor(mag / 5);
}
}
// mag = 2;
const stepx = delta.x / mag;
const stepy = delta.y / mag;
for (let index = 0; index < mag; index++) {
this.moveCorner = 0;
const tempX = this.node.x + stepx;
const tempY = this.node.y + stepy;
if (!this.checkCollision) {
if (this.type !== 8 && this.type !== 10) {
this.node.x = Math.round(tempX);
}
if (this.type !== 7 && this.type !== 10) {
this.node.y = Math.round(tempY);
}
} else {
const isXMain = Math.abs(stepx) > Math.abs(stepy);
if (isXMain) {
if (this.node.x > tempX) {
if (this.moveLeft && this.moveX === 0 && this.type !== 8 && this.type !== 10) {
this.node.x = tempX;
}
if (this.moveX !== 0) {
this.moveX = 0;
}
} else if (this.node.x <= tempX) {
if (this.moveRight && this.moveX === 0 && this.type !== 8 && this.type !== 10) {
this.node.x = tempX;
}
if (this.moveX !== 0) {
this.moveX = 0;
}
}
if (this.node.y > tempY) {
if (this.moveDown && this.moveY === 0 && this.type !== 7 && this.type !== 10) {
this.node.y = tempY;
}
if (this.moveY !== 0) {
this.moveY = 0;
}
} else if (this.node.y <= tempY) {
if (this.moveUp && this.moveY === 0 && this.type !== 7 && this.type !== 10) {
this.node.y = tempY;
}
if (this.moveY !== 0) {
this.moveY = 0;
}
}
} else {
if (this.node.y > tempY) {
if (this.moveDown && this.moveY === 0 && this.type !== 7 && this.type !== 10) {
this.node.y = tempY;
}
if (this.moveY !== 0) {
this.moveY = 0;
}
} else if (this.node.y <= tempY) {
if (this.moveUp && this.moveY === 0 && this.type !== 7 && this.type !== 10) {
this.node.y = tempY;
}
if (this.moveY !== 0) {
this.moveY = 0;
}
}
if (this.node.x > tempX) {
if (this.moveLeft && this.moveX === 0 && this.type !== 8 && this.type !== 10) {
this.node.x = tempX;
}
if (this.moveX !== 0) {
this.moveX = 0;
}
} else if (this.node.x <= tempX) {
if (this.moveRight && this.moveX === 0 && this.type !== 8 && this.type !== 10) {
this.node.x = tempX;
}
if (this.moveX !== 0) {
this.moveX = 0;
}
}
}
}
LQCollideSystem.update_logic(dt);
}
// 移动完成后重置触摸增量
this.touchDelta = cc.v2(0, 0);
}
if (this.type == BlockType.) {
if (this.block_Info.node != null) {
if (this.block_Info.node.getComponent("Block").moveStack == true) {
this.block_Info.node.x = this.node.x + this.block_Info.node.getComponent("Block").stacking.x;
this.block_Info.node.y = this.node.y + this.block_Info.node.getComponent("Block").stacking.y;
}
}
}
if (this.block_Info) {
if (this.block_Info.node != null) {
if (this.type == BlockType.) {
if (this.adhesive.x != 0 && this.adhesive.y != 0 && this.block_Info.node != null) {
this.block_Info.node.x = this.node.x - this.adhesive.x;
this.block_Info.node.y = this.node.y - this.adhesive.y;
}
if (this.isTouch == true && this.block_Info.node.getComponent("Block").isTouch == false) {
LQCollideSystem.update_logic(dt);
this.block_Info.node.x = this.node.x - this.adhesive.x;
this.block_Info.node.y = this.node.y - this.adhesive.y;
}
}
}
}
}
//精细更改 点击高亮位置
setHitPosition() {
this.hit.setPosition(13, -16);
switch (this.block_Info.block) {
case 0:
this.hit.setPosition(15, -20);
break;
case 1:
this.hit.setPosition(13, -17.5);
break;
case 2:
this.hit.setPosition(15, -16);
break;
case 4:
this.hit.setPosition(12, -18);
break;
case 6:
this.hit.setPosition(15, -14);
break;
case 7:
this.hit.setPosition(17, -9);
break;
case 8:
this.hit.setPosition(15, -14);
break;
case 9:
this.hit.setPosition(13, -13);
break;
case 10:
this.hit.setPosition(-5.5, -14);
break;
case 11:
this.hit.setPosition(-6, -15);
break;
case 12:
this.hit.setPosition(15, -15);
break;
case 13:
this.hit.setPosition(15, -13);
break;
case 13:
this.hit.setPosition(15, -14);
break;
case 14:
this.hit.setPosition(2, -7);
break;
case 15:
this.hit.setPosition(15, -16);
break;
case 16:
this.hit.setPosition(1, -15.5);
break;
case 17:
this.hit.setPosition(15, -14);
break;
case 18:
this.hit.setPosition(5, -13);
break;
case 21:
this.hit.setPosition(-2, -14);
break;
case 22:
this.hit.setPosition(14, -14);
break;
}
}
// 边角弹开 避免卡死
Bounce(name) {
let distance = 1.5;
if (name == "tan_down_left") {
this.node.x = this.node.x + distance;
this.node.y = this.node.y + distance;
}
else if (name == "tan_up_right") {
this.node.x = this.node.x - distance;
this.node.y = this.node.y - distance;
}
else if (name == "tan_down_right") {
this.node.x = this.node.x - distance;
this.node.y = this.node.y + distance;
}
else if (name == "tan_up_left") {
this.node.x = this.node.x + distance;
this.node.y = this.node.y - distance;
}
}
}