Files

78 lines
2.1 KiB
TypeScript
Raw Permalink Normal View History

1970-01-01 08:23:24 +08:00
import { _decorator, Node, Prefab, instantiate, SpriteFrame, tween, Vec3, Sprite } from "cc";
import { Fruit } from "./Fruit";
import { FruitNode } from "./FruitNode";
const { ccclass, property } = _decorator;
@ccclass("Board")
export class Board extends Node {
@property(Prefab) fruitPrefab: Prefab = null!;
@property([SpriteFrame]) fruitSprites: SpriteFrame[] = [];
board: (Fruit | null)[][] = [];
rows = 4;
cols = 4;
node: Node = null!;
onLoad() {
this.initBoard();
}
initBoard() {
this.board = [];
for (let r = 0; r < this.rows; r++) {
this.board[r] = [];
for (let c = 0; c < this.cols; c++) {
this.board[r][c] = null;
}
}
this.spawnFruit();
this.spawnFruit();
}
spawnFruit() {
let emptyCells: { r: number; c: number }[] = [];
for (let r = 0; r < this.rows; r++) {
for (let c = 0; c < this.cols; c++) {
if (!this.board[r][c]) emptyCells.push({ r, c });
}
}
if (emptyCells.length === 0) return;
let index = Math.floor(Math.random() * emptyCells.length);
let cell = emptyCells[index];
let node = instantiate(this.fruitPrefab);
node.setParent(this.node);
node.setPosition(new Vec3(cell.c * 100, cell.r * -100, 0));
let fruit = new Fruit(node, cell.r, cell.c, 1);
node.getComponent(FruitNode)!.init(fruit, this);
node.getComponent(Sprite)!.spriteFrame = this.fruitSprites[0];
this.board[cell.r][cell.c] = fruit;
}
merge(f1: Fruit, f2: Fruit) {
if (f1.level !== f2.level) return;
f1.level += 1;
if (f1.level - 1 < this.fruitSprites.length)
f1.node.getComponent(Sprite)!.spriteFrame = this.fruitSprites[f1.level - 1];
this.playMergeAnimation(f1.node, f2.node);
this.board[f2.row][f2.col] = null;
f2.node.destroy();
this.spawnFruit();
}
playMergeAnimation(n1: Node, n2: Node) {
// tween(n1)
// .to(0.2, { scale: 1.2 })
// .to(0.1, { scale: 1 })
// .start();
}
}