78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
|
|
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();
|
||
|
|
}
|
||
|
|
}
|