EliminateGuideManager.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. /*
  2. * @Author: mojunshou 1637302775@qq.com
  3. * @Date: 2025-04-20 10:00:00
  4. * @LastEditors: mojunshou 1637302775@qq.com
  5. * @LastEditTime: 2025-04-20 10:00:00
  6. * @Description: 消除游戏引导管理器
  7. */
  8. import { Label, Node } from "cc";
  9. import { BrickData, CellState, GridConfigData } from "./EliminateTypes";
  10. import { EliminateGridManager } from "./EliminateGridManager";
  11. import { EliminateBrickManager } from "./EliminateBrickManager";
  12. export class EliminateGuideManager {
  13. private isGuideMode: boolean = false;
  14. private guideStep: number = 0;
  15. private guideNode: Node | null = null;
  16. private gridManager: EliminateGridManager;
  17. private brickManager: EliminateBrickManager;
  18. // 引导提示文本
  19. private guideTips: string[] = [
  20. "拖动方块,填满整行可以进行消除",
  21. "当行与列被砖块同时填满,砖块会被消除",
  22. "点击方块可以旋转90°,不限旋转次数哦",
  23. "放置&消除方块得分达成目标获得金砖"
  24. ];
  25. constructor(guideNode: Node, gridManager: EliminateGridManager, brickManager: EliminateBrickManager) {
  26. this.guideNode = guideNode;
  27. this.gridManager = gridManager;
  28. this.brickManager = brickManager;
  29. }
  30. /**
  31. * 开始引导模式
  32. */
  33. public startGuideMode(): void {
  34. this.isGuideMode = true;
  35. this.guideStep = 1;
  36. if (this.guideNode) {
  37. this.guideNode.active = true;
  38. }
  39. this.setupGuideStep(this.guideStep);
  40. }
  41. /**
  42. * 设置引导步骤
  43. */
  44. public setupGuideStep(step: number): void {
  45. this.gridManager.clearAllGuideGrids();
  46. this.guideStep = step;
  47. // 更新引导提示文本
  48. const tips_node = this.guideNode?.getChildByPath("tips/lab_tips");
  49. if (tips_node) {
  50. const tips = tips_node.getComponent(Label);
  51. if (tips) {
  52. tips.string = this.guideTips[step - 1];
  53. }
  54. }
  55. // 根据不同步骤创建不同的引导场景
  56. switch (step) {
  57. case 1:
  58. this.setupStep1();
  59. break;
  60. case 2:
  61. this.setupStep2();
  62. break;
  63. case 3:
  64. this.setupStep3();
  65. break;
  66. case 4:
  67. this.setupStep4();
  68. break;
  69. }
  70. }
  71. /**
  72. * 第1步:引导玩家消除一行
  73. */
  74. private setupStep1(): void {
  75. const cols = this.gridManager.getCols();
  76. const emptyIndex = Math.floor(cols / 2);
  77. // 创建一行只缺一个格子的状态
  78. for (let c = 0; c < cols; c++) {
  79. if (c !== emptyIndex) {
  80. const gridList = this.gridManager.getGridList();
  81. const g = gridList[0][c];
  82. g.status = CellState.FILLED;
  83. g.type = 1;
  84. this.gridManager.generateGrid(g);
  85. }
  86. }
  87. // 创建一个简单的单格子方块供玩家放置
  88. this.brickManager.createGuideBrick(
  89. [{ row: 0, column: 0 }],
  90. "Brick1",
  91. 1,
  92. 1
  93. );
  94. }
  95. /**
  96. * 第2步:引导玩家消除一列
  97. */
  98. private setupStep2(): void {
  99. const rows = this.gridManager.getRows();
  100. const emptyRow = rows - 1;
  101. // 创建一列只缺一个格子的状态
  102. for (let r = 0; r < rows; r++) {
  103. if (r !== emptyRow) {
  104. const gridList = this.gridManager.getGridList();
  105. const g = gridList[r][0];
  106. g.status = CellState.FILLED;
  107. g.type = 1;
  108. this.gridManager.generateGrid(g);
  109. }
  110. }
  111. // 创建一个简单的单格子方块供玩家放置
  112. this.brickManager.createGuideBrick(
  113. [{ row: 0, column: 0 }],
  114. "Brick1",
  115. 1,
  116. 1
  117. );
  118. }
  119. /**
  120. * 第3步:引导玩家旋转方块
  121. */
  122. private setupStep3(): void {
  123. // 填满前两列,除去特定位置,制造一个L型缺口
  124. for (let r = 0; r < this.gridManager.getRows(); r++) {
  125. for (let c = 0; c < 2; c++) {
  126. if (r === 2 && c === 0) continue; // 留一个空位用于放置旋转后的L型砖块
  127. if (r === 1 && c === 0) continue; // 留一个空位用于放置旋转后的L型砖块
  128. if (r === 3 && c === 0) continue; // 留一个空位用于放置旋转后的L型砖块
  129. if (r === 2 && c === 1) continue; // 留一个空位用于放置旋转后的L型砖块
  130. if (r === 1 && c === 1) continue; // 留一个空位用于放置旋转后的L型砖块
  131. if (r === 3 && c === 1) continue; // 留一个空位用于放置旋转后的L型砖块
  132. const gridList = this.gridManager.getGridList();
  133. const g = gridList[r][c];
  134. g.status = CellState.FILLED;
  135. g.type = 1;
  136. this.gridManager.generateGrid(g);
  137. }
  138. }
  139. // 创建一个L型方块,引导玩家旋转后放置
  140. this.brickManager.createGuideBrick(
  141. [
  142. { row: 0, column: 0 },
  143. { row: 0, column: 1 },
  144. { row: 0, column: 2 },
  145. { row: 1, column: 0 },
  146. { row: 1, column: 1 },
  147. { row: 1, column: 2 }
  148. ],
  149. "BrickII",
  150. 1,
  151. 1,
  152. true
  153. );
  154. }
  155. /**
  156. * 第4步:引导玩家同时消除行和列
  157. */
  158. private setupStep4(): void {
  159. const rows = this.gridManager.getRows();
  160. const cols = this.gridManager.getCols();
  161. const centerRow = Math.floor(rows / 2);
  162. const centerCol = Math.floor(cols / 2);
  163. // 遍历整个网格
  164. for (let r = 0; r < rows; r++) {
  165. for (let c = 0; c < cols; c++) {
  166. const inCenter =
  167. r >= centerRow && r <= centerRow + 1 &&
  168. c >= centerCol && c <= centerCol + 1;
  169. const isCross =
  170. r === centerRow || r === centerRow + 1 || // 中间两行
  171. c === centerCol || c === centerCol + 1; // 中间两列
  172. if (isCross && !inCenter) {
  173. const gridList = this.gridManager.getGridList();
  174. const g = gridList[r][c];
  175. g.status = CellState.FILLED;
  176. g.type = 1;
  177. this.gridManager.generateGrid(g);
  178. }
  179. }
  180. }
  181. // 创建一个正方形方块,引导玩家放在中间空位
  182. this.brickManager.createGuideBrick(
  183. [
  184. { row: 0, column: 0 },
  185. { row: 0, column: 1 },
  186. { row: 1, column: 0 },
  187. { row: 1, column: 1 }
  188. ],
  189. "BrickO",
  190. 1,
  191. 1
  192. );
  193. }
  194. /**
  195. * 结束引导模式
  196. */
  197. public endGuideMode(): void {
  198. this.isGuideMode = false;
  199. if (this.guideNode) {
  200. this.guideNode.active = false;
  201. }
  202. }
  203. /**
  204. * 检查是否需要进入下一步引导
  205. */
  206. public checkNextStep(): void {
  207. if (this.isGuideMode && this.guideStep < 4) {
  208. this.setupGuideStep(this.guideStep + 1);
  209. } else if (this.isGuideMode && this.guideStep >= 4) {
  210. this.endGuideMode();
  211. }
  212. }
  213. /**
  214. * 获取当前是否为引导模式
  215. */
  216. public getIsGuideMode(): boolean {
  217. return this.isGuideMode;
  218. }
  219. /**
  220. * 获取当前引导步骤
  221. */
  222. public getGuideStep(): number {
  223. return this.guideStep;
  224. }
  225. }