Container_Manager.ts 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. import { _decorator, BoxCollider, Component, director, find, instantiate, Node, NodePool, Prefab, Quat, random, RigidBody, sp, tween, Vec3 } from 'cc';
  2. import ch_util from '../../ch/ch_util';
  3. import { gui } from '../../core/ui/ui';
  4. import ArrayUtil from '../../core/util/ArrayUtil';
  5. import { Layout_Main } from '../ui/UI_Main/Layout_Main';
  6. import { UI_Main } from '../ui/UI_Main/UI_Main';
  7. import { CreateIdiom } from './CreateIdiom';
  8. import { Cube_Infor, Cube_State } from './Cube_Infor';
  9. import { GameCtl } from './GameCtl';
  10. import { ch } from '../../ch/ch';
  11. import { table_idiom_order } from '../../module_extra/table_ts/table_idiom_order';
  12. import { table_idiom_unorder_1_3 } from '../../module_extra/table_ts/table_idiom_unorder_1_3';
  13. import { table_idiom_unorder_2_2 } from '../../module_extra/table_ts/table_idiom_unorder_2_2';
  14. import { table_idiom_unorder_3_1 } from '../../module_extra/table_ts/table_idiom_unorder_3_1';
  15. import { table_level } from '../../module_extra/table_ts/table_level';
  16. import { table_level_2 } from '../../module_extra/table_ts/table_level_2';
  17. import { Hall } from '../hall/Hall';
  18. import { UI_Idioms } from '../ui/UI_Idioms/UI_Idioms';
  19. const { ccclass, property } = _decorator;
  20. @ccclass('Container_Manager')
  21. export class Container_Manager extends Component {
  22. @property(Node)
  23. skeleton1: Node = null;
  24. @property(Node)
  25. skeleton2: Node = null;
  26. canTouch: boolean = false;
  27. @property([Node])
  28. Lock_node: Node[] = [];
  29. @property([Prefab])
  30. prefabs: Prefab[] = [];
  31. level_config: any = null;//关卡配置
  32. level2_config: any = null;//第二关配置
  33. config: any = null;//有规律的成语库
  34. config_1_3: any = null;//无规律1+3
  35. config_2_2: any = null;//无规律2+2
  36. config_3_1: any = null;//无规律3+1
  37. idioms: any[] = [];//生成的成语
  38. idioms_Copy: any[] = [];//生成的成语备份
  39. index: number = 0;
  40. @property(CreateIdiom)
  41. create_node: CreateIdiom = null;
  42. @property([Node])
  43. nodes: Node[] = [];//位置节点 用于成语放入
  44. node_isIdiom: boolean[] = new Array(9).fill(false);
  45. unlock_Num: number = 7;
  46. is_Show_UI_Lock = false;
  47. idiom_combine: Map<Cube_Infor, number> = new Map();
  48. Cube_Pool: NodePool = new NodePool();
  49. nodeReferences: Node[] = []; // 额外维护的节点引用数组
  50. count: number = 0;
  51. time: number = 0;
  52. private instantiateCube() {
  53. let num=60;
  54. if(this.idioms.length < 30)
  55. {
  56. num=this.idioms.length*2;
  57. }
  58. for (let i = 0; i < num; i++) {
  59. let idiomIndex = Math.floor(i / 2);
  60. let isPiece1 = i % 2 === 0;
  61. let Text_Length = isPiece1
  62. ? this.idioms[idiomIndex].piece_1_word.length
  63. : this.idioms[idiomIndex].piece_2_word.length;
  64. const newCube = instantiate(this.prefabs[Text_Length - 1]);
  65. newCube.active = true;
  66. // 按顺序为节点赋值文字内容
  67. newCube.getComponent(Cube_Infor).Text = isPiece1
  68. ? this.idioms[idiomIndex].piece_1_word
  69. : this.idioms[idiomIndex].piece_2_word;
  70. // console.log("生成第" + i + "个节点:" + newCube.getComponent(Cube_Infor).Text);
  71. this.Cube_Pool.put(newCube);
  72. }
  73. this.index = num;
  74. if(Hall.getInstance().player.get_max_floor() != 0)
  75. this.shufflePool();
  76. }
  77. public instantiateNewCube() {
  78. console.log("instantiateNewCube");
  79. if (this.index < (this.count * 2)) {
  80. console.log("idiomIndex:" + Math.floor(this.index / 2));
  81. let idiomIndex = Math.floor(this.index / 2);
  82. let isPiece1 = this.index % 2 === 0;
  83. let Text_Length = isPiece1
  84. ? this.idioms_Copy[idiomIndex].piece_1_word.length
  85. : this.idioms_Copy[idiomIndex].piece_2_word.length;
  86. const newCube = instantiate(this.prefabs[Text_Length - 1]);
  87. newCube.active = true;
  88. // 按顺序为节点赋值文字内容
  89. newCube.getComponent(Cube_Infor).Text = isPiece1
  90. ? this.idioms_Copy[idiomIndex].piece_1_word
  91. : this.idioms_Copy[idiomIndex].piece_2_word;
  92. //随机选择已在nodereference中的一个方块position
  93. newCube.parent = director.getScene();
  94. newCube.setPosition(this.nodeReferences[Math.floor(Math.random() * this.nodeReferences.length)].position.x, this.nodeReferences[Math.floor(Math.random() * this.nodeReferences.length)].position.y - 0.1, this.nodeReferences[Math.floor(Math.random() * this.nodeReferences.length)].position.z);
  95. this.nodeReferences.push(newCube);
  96. console.log("生成第" + this.index + "个节点:" + newCube.getComponent(Cube_Infor).Text);
  97. console.log("位置:" + newCube.position)
  98. this.index = this.index + 1;
  99. }
  100. }
  101. public getCube(): Node {
  102. // console.log(this.Cube_Pool.size());
  103. const cube = this.Cube_Pool.get();
  104. if (cube)
  105. cube.active = true;
  106. return cube;
  107. }
  108. // 将方块回收到对象池
  109. public recycleCube(cube: Node): void {
  110. cube.active = false; // 将方块设置为非激活状态
  111. this.Cube_Pool.put(cube);
  112. }
  113. //清空对象池
  114. public clearCubePool() {
  115. this.Cube_Pool.clear();
  116. }
  117. //合成规则导入
  118. start() {
  119. this.config = table_idiom_order.getList();
  120. this.config_1_3 = table_idiom_unorder_1_3.getList();
  121. this.config_2_2 = table_idiom_unorder_2_2.getList();
  122. this.config_3_1 = table_idiom_unorder_3_1.getList();
  123. console.log(this.config.length);
  124. console.log(this.config_1_3.length);
  125. console.log(this.config_2_2.length);
  126. console.log(this.config_3_1.length);
  127. this.level_config = table_level.getList();
  128. this.level2_config = table_level_2.getList();
  129. // if (this.level_config.length === 5) {
  130. // console.log("关卡配置导入成功");
  131. // }
  132. this.level_idioms();
  133. }
  134. update(deltaTime: number) {
  135. }
  136. checkIdiom_Combine(matchedcube2: Cube_Infor, outMatchedCubes: Cube_Infor[]): boolean {
  137. if (this.idiom_combine.size < 2) {
  138. return false; // 至少需要两个方块
  139. }
  140. for (let cube of this.idiom_combine.keys()) {
  141. // 遍历 idioms 列表,检查是否匹配成语
  142. const matchedIdiom = this.idioms.find(
  143. idiom =>
  144. idiom.piece_1_word === cube.Text && idiom.piece_2_word === matchedcube2.Text
  145. );
  146. if (matchedIdiom) {
  147. // 匹配成功
  148. outMatchedCubes.push(cube, matchedcube2);
  149. this.nodeReferences = this.nodeReferences.filter((el) => el !== matchedcube2.node && el !== cube.node);
  150. console.log("成功拼成成语: " + matchedIdiom.piece_1_word + matchedIdiom.piece_2_word);
  151. return true;
  152. }
  153. // 再检查逆序组合是否匹配
  154. const reverseMatchedIdiom = this.idioms.find(
  155. idiom =>
  156. idiom.piece_1_word === matchedcube2.Text && idiom.piece_2_word === cube.Text
  157. );
  158. if (reverseMatchedIdiom) {
  159. // 匹配成功
  160. outMatchedCubes.push(matchedcube2, cube);
  161. this.nodeReferences = this.nodeReferences.filter((el) => el !== matchedcube2.node && el !== cube.node);
  162. console.log(
  163. "成功拼成成语: " +
  164. reverseMatchedIdiom.piece_1_word +
  165. reverseMatchedIdiom.piece_2_word
  166. );
  167. return true;
  168. }
  169. }
  170. return false; // 没有匹配到成语
  171. }
  172. level_idioms() {
  173. this.Lock_node.forEach(node => {
  174. node.active = true;
  175. });
  176. this.unlock_Num = 7;
  177. this.is_Show_UI_Lock = false;
  178. this.canTouch = false;
  179. let level = Hall.getInstance().player.get_max_floor();
  180. if(level>0){
  181. Hall.getInstance().firstEnter=false;
  182. }
  183. for (let i = 0; i < this.nodeReferences.length; i++) {
  184. if (this.nodeReferences[i])
  185. this.nodeReferences[i].destroy();
  186. }
  187. this.clearCubePool();
  188. this.idioms = [];
  189. this.nodeReferences = [];
  190. this.node_isIdiom = new Array(9).fill(false);
  191. this.idiom_combine = new Map();
  192. if (level === 0) {
  193. let str2: string = this.level_config[level].idiom_type_2;
  194. let idiom_type_2 = str2.split("_");
  195. console.log("idiom_type_2:", idiom_type_2);
  196. let selectedIdioms: Record<string, any[]> = {};
  197. [...idiom_type_2].forEach(rule => {
  198. let filteredIdioms = this.config.filter(item => item.piece_2_word === rule);
  199. console.log(`筛选2 ${rule} 后的成语:`, filteredIdioms);
  200. selectedIdioms[rule] = filteredIdioms;
  201. });
  202. for (let rule in selectedIdioms) {
  203. if (selectedIdioms.hasOwnProperty(rule)) {
  204. this.idioms.push(...selectedIdioms[rule]);
  205. }
  206. }
  207. console.log("最终选中的成语:", this.idioms);
  208. } else if (level === 1) {
  209. for (let i = 0; i < 30; i++) {
  210. let filteredIdiom = this.config.filter(item => item.idiom == this.level2_config[i].idiom);
  211. this.idioms.push(...filteredIdiom);
  212. filteredIdiom=this.config_3_1.filter(item => item.idiom == this.level2_config[i].idiom);
  213. this.idioms.push(...filteredIdiom);
  214. }
  215. for (let i = 30; i < 40; i++) {
  216. let filteredIdiom = this.config_2_2.filter(item => item.idiom == this.level2_config[i].idiom);
  217. this.idioms.push(...filteredIdiom);
  218. }
  219. console.log("最终选中的成语:", this.idioms); // 打印最终的成语数组
  220. } else {
  221. if (level > 99) {
  222. level = ch_util.getRandomInt(28, 100);
  223. }
  224. let dif: string = this.level_config[level].different_grade_level;
  225. let grade = dif.split("_");
  226. let str1: string = this.level_config[level].idiom_type_1;
  227. let idiom_type_1 = str1.split("_"); // 分割成数组
  228. idiom_type_1=idiom_type_1.filter(item => item !== "");
  229. console.log("idiom_type_1:", idiom_type_1);
  230. let str2: string = this.level_config[level].idiom_type_2;
  231. let idiom_type_2 = str2.split("_"); // 分割成数组
  232. idiom_type_2=idiom_type_2.filter(item => item !== "");
  233. console.log("idiom_type_2:", idiom_type_2);
  234. let count = this.level_config[level].count / (idiom_type_1.length + idiom_type_2.length);
  235. console.log("count:", count);
  236. // 初始化保存结果的数组
  237. let selectedIdioms: Record<string, any[]> = {};
  238. // 遍历 idiom_type_1的每个规律
  239. [...idiom_type_1].forEach(rule => {
  240. // 从 config 中筛选符合当前规律的成语
  241. let filteredIdioms = this.config.filter(item => item.piece_1_word === rule && item.difficulty === grade[0]);
  242. console.log(`筛选 ${rule} 后的成语:`, filteredIdioms);
  243. if (filteredIdioms.length < count) {
  244. console.error(`规律 ${rule} 的成语数量不足,仅有 ${filteredIdioms.length} 个`);
  245. } else {
  246. console.log(`规律 ${rule} 的成语数量:${filteredIdioms.length}`);
  247. let selected = [];
  248. // 随机选择不重复的成语
  249. for (let i = 0; i < count;) {
  250. let rand = ch_util.getRandomInt(0, filteredIdioms.length - 1); // 确保 rand 在有效范围内
  251. let selectedIdiom = filteredIdioms[rand];
  252. // 从数组中移除已选成语,避免再次选择
  253. filteredIdioms.splice(rand, 1);
  254. // 添加到已选数组中
  255. selected.push(selectedIdiom);
  256. console.log(`选中的成语:${selectedIdiom.idiom}`);
  257. i++;
  258. }
  259. selectedIdioms[rule] = selected;
  260. }
  261. });
  262. // 遍历idiom_type_2 的每个规律
  263. [...idiom_type_2].forEach(rule => {
  264. // 从 config 中筛选符合当前规律的成语
  265. let filteredIdioms = this.config.filter(item => item.piece_2_word === rule && item.difficulty === grade[0]);
  266. console.log(`筛选2 ${rule} 后的成语:`, filteredIdioms);
  267. if (filteredIdioms.length < count) {
  268. console.error(`规律2 ${rule} 的成语数量不足,仅有 ${filteredIdioms.length} 个`);
  269. } else {
  270. console.log(`规律2 ${rule} 的成语数量:${filteredIdioms.length}`);
  271. let selected = [];
  272. // 随机选择不重复的成语
  273. for (let i = 0; i < count;) {
  274. let rand = ch_util.getRandomInt(0, filteredIdioms.length - 1); // 确保 rand 在有效范围内
  275. let selectedIdiom = filteredIdioms[rand];
  276. // 从数组中移除已选成语,避免再次选择
  277. filteredIdioms.splice(rand, 1);
  278. // 添加到已选数组中
  279. selected.push(selectedIdiom);
  280. console.log(`选中的成语:${selectedIdiom.idiom}`);
  281. i++;
  282. }
  283. selectedIdioms[rule] = selected;
  284. }
  285. });
  286. // 将所有选中的成语合并到 idioms 数组
  287. for (let rule in selectedIdioms) {
  288. this.idioms.push(...selectedIdioms[rule]); // 使用扩展运算符合并成语
  289. }
  290. //
  291. if (this.level_config[level].easy_1_3 > 0) {
  292. let filteredIdioms = this.config_1_3.filter(item => item.difficulty === "easy");
  293. for (let i = 0; i < this.level_config[level].easy_1_3; i++) {
  294. let rand = ch_util.getRandomInt(0, filteredIdioms.length - 1);
  295. let selectedIdiom = filteredIdioms[rand];
  296. filteredIdioms.splice(rand, 1);
  297. this.idioms.push(selectedIdiom);
  298. }
  299. }
  300. if (this.level_config[level].hard_1_3 > 0) {
  301. let filteredIdioms = this.config_1_3.filter(item => item.difficulty === "hard");
  302. for (let i = 0; i < this.level_config[level].hard_1_3; i++) {
  303. let rand = ch_util.getRandomInt(0, filteredIdioms.length - 1);
  304. let selectedIdiom = filteredIdioms[rand];
  305. filteredIdioms.splice(rand, 1);
  306. this.idioms.push(selectedIdiom);
  307. }
  308. }
  309. if (this.level_config[level].easy_2_2 > 0) {
  310. let filteredIdioms = this.config_2_2.filter(item => item.difficulty === "easy");
  311. for (let i = 0; i < this.level_config[level].easy_2_2; i++) {
  312. let rand = ch_util.getRandomInt(0, filteredIdioms.length - 1);
  313. let selectedIdiom = filteredIdioms[rand];
  314. filteredIdioms.splice(rand, 1);
  315. this.idioms.push(selectedIdiom);
  316. }
  317. }
  318. if (this.level_config[level].hard_2_2 > 0) {
  319. let filteredIdioms = this.config_2_2.filter(item => item.difficulty === "hard");
  320. for (let i = 0; i < this.level_config[level].hard_2_2; i++) {
  321. let rand = ch_util.getRandomInt(0, filteredIdioms.length - 1);
  322. let selectedIdiom = filteredIdioms[rand];
  323. filteredIdioms.splice(rand, 1);
  324. this.idioms.push(selectedIdiom);
  325. }
  326. }
  327. if (this.level_config[level].easy_3_1 > 0) {
  328. let filteredIdioms = this.config_3_1.filter(item => item.difficulty === "easy");
  329. for (let i = 0; i < this.level_config[level].easy_3_1; i++) {
  330. let rand = ch_util.getRandomInt(0, filteredIdioms.length - 1);
  331. let selectedIdiom = filteredIdioms[rand];
  332. filteredIdioms.splice(rand, 1);
  333. this.idioms.push(selectedIdiom);
  334. }
  335. }
  336. if (this.level_config[level].hard_1_3 > 0) {
  337. let filteredIdioms = this.config_1_3.filter(item => item.difficulty === "hard");
  338. for (let i = 0; i < this.level_config[level].hard_1_3; i++) {
  339. let rand = ch_util.getRandomInt(0, filteredIdioms.length - 1);
  340. let selectedIdiom = filteredIdioms[rand];
  341. filteredIdioms.splice(rand, 1);
  342. this.idioms.push(selectedIdiom);
  343. }
  344. }
  345. console.log("最终选中的成语:", this.idioms); // 打印最终的成语数组
  346. }
  347. this.idioms_Copy = [...this.idioms];
  348. this.count = this.level_config[level].total;
  349. this.time = this.level_config[level].time;
  350. this.instantiateCube();
  351. gui.show(UI_Idioms);
  352. this.create_node.nodeMoving();
  353. gui.show(UI_Main);
  354. }
  355. //消除一组
  356. eliminate() {
  357. //先判断槽内是否有方块,如果有,匹配槽内最前面一个与散落方块中的
  358. let cube;
  359. for (const [key, value] of this.idiom_combine) {
  360. if (value === 0) {
  361. cube = key;
  362. break;
  363. }
  364. }
  365. //槽中有方块
  366. if (cube) {
  367. const originalReferences = [...this.nodeReferences];
  368. for (const element of originalReferences) {
  369. if (this.idioms.find(c => c.idiom == element.getComponent(Cube_Infor).Text + cube.Text) && element.getComponent(Cube_Infor) !== cube) {
  370. console.log(element.getComponent(Cube_Infor).Text);
  371. element.getComponent(Cube_Infor).state = Cube_State.wait;
  372. element.getComponent(Cube_Infor).rigidbody.type = RigidBody.Type.STATIC;
  373. element.getComponent(BoxCollider).enabled = false;
  374. let targetRotation = new Quat();
  375. Quat.fromEuler(targetRotation, -90, 0, 0);
  376. element.rotation = targetRotation;
  377. // 使用filter过滤掉当前元素
  378. GameCtl.instance.combine_ani(element.getComponent(Cube_Infor), cube);
  379. this.nodeReferences = this.nodeReferences.filter((el) => el !== element && el !== cube.node);
  380. this.instantiateNewCube();
  381. break;
  382. }
  383. else if (this.idioms.find(c => c.idiom == cube.Text + element.getComponent(Cube_Infor).Text) && element.getComponent(Cube_Infor) !== cube) {
  384. console.log(element.getComponent(Cube_Infor).Text);
  385. element.getComponent(Cube_Infor).state = Cube_State.wait;
  386. element.getComponent(Cube_Infor).rigidbody.type = RigidBody.Type.STATIC;
  387. element.getComponent(BoxCollider).enabled = false;
  388. let targetRotation = new Quat();
  389. Quat.fromEuler(targetRotation, -90, 0, 0);
  390. element.rotation = targetRotation;
  391. GameCtl.instance.combine_ani(cube, element.getComponent(Cube_Infor));
  392. this.nodeReferences = this.nodeReferences.filter((el) => el !== element && el !== cube.node);
  393. this.instantiateNewCube();
  394. break;
  395. }
  396. }
  397. }
  398. //槽中没有方块
  399. else {
  400. let flag: boolean = false;
  401. const originalReferences1 = [...this.nodeReferences];
  402. const originalReferences2 = [...this.nodeReferences];
  403. for (const element1 of originalReferences1) {
  404. for (const element2 of originalReferences2) {
  405. if (this.idioms.find(c => c.idiom == element1.getComponent(Cube_Infor).Text + element2.getComponent(Cube_Infor).Text)) {
  406. element1.getComponent(Cube_Infor).state = Cube_State.wait;
  407. element1.getComponent(Cube_Infor).rigidbody.type = RigidBody.Type.STATIC;
  408. let targetRotation = new Quat();
  409. Quat.fromEuler(targetRotation, -90, 0, 0);
  410. element1.rotation = targetRotation;
  411. element2.getComponent(Cube_Infor).state = Cube_State.wait;
  412. element2.getComponent(Cube_Infor).rigidbody.type = RigidBody.Type.STATIC;
  413. element2.getComponent(BoxCollider).enabled = false;
  414. element2.rotation = targetRotation;
  415. // 使用filter过滤掉当前元素
  416. GameCtl.instance.combine_ani(element1.getComponent(Cube_Infor), element2.getComponent(Cube_Infor));
  417. this.nodeReferences = this.nodeReferences.filter((el) => el !== element1 && el !== element2);
  418. flag = true;
  419. break;
  420. }
  421. if (this.idioms.find(c => c.idiom == element2.getComponent(Cube_Infor).Text + element1.getComponent(Cube_Infor).Text)) {
  422. element1.getComponent(Cube_Infor).state = Cube_State.wait;
  423. element1.getComponent(Cube_Infor).rigidbody.type = RigidBody.Type.STATIC;
  424. let targetRotation = new Quat();
  425. Quat.fromEuler(targetRotation, -90, 0, 0);
  426. element1.rotation = targetRotation;
  427. element2.getComponent(Cube_Infor).state = Cube_State.wait;
  428. element2.getComponent(Cube_Infor).rigidbody.type = RigidBody.Type.STATIC;
  429. element2.getComponent(BoxCollider).enabled = false;
  430. element2.rotation = targetRotation;
  431. // 使用filter过滤掉当前元素
  432. GameCtl.instance.combine_ani(element2.getComponent(Cube_Infor), element1.getComponent(Cube_Infor));
  433. this.nodeReferences = this.nodeReferences.filter((el) => el !== element1 && el !== element2);
  434. flag = true;
  435. break;
  436. }
  437. }
  438. if (flag === true) {
  439. for (let i = 0; i < 2; i++) {
  440. this.instantiateNewCube();
  441. }
  442. break;
  443. } else {
  444. console.log("没有可消除");
  445. }
  446. }
  447. }
  448. }
  449. async shuffle() {
  450. // 回收所有非槽内的活跃节点
  451. this.nodeReferences.forEach(node => {
  452. const cubeInfo = node.getComponent(Cube_Infor);
  453. if (cubeInfo.state === Cube_State.live) {
  454. let targetRotation = new Quat();
  455. Quat.fromEuler(targetRotation, -90, 0, 0);
  456. node.rotation = targetRotation;
  457. this.recycleCube(node); // 回收到池中
  458. }
  459. });
  460. this.shufflePool();
  461. // 等待节点移动完成后执行后续逻辑
  462. this.create_node.nodeMoving();
  463. }
  464. //清空槽子
  465. Empty() {
  466. for (let idiom of this.idiom_combine.keys()) {
  467. idiom.state = Cube_State.live;
  468. let posX = ch.util.getRandom(-3, 3);
  469. let posZ = ch.util.getRandom(-3, 3);
  470. tween(idiom.node).to(0.2, { position: new Vec3(posX, this.create_node.node.position.y + 5, posZ) }).call(() => {
  471. idiom.rigidbody.type = RigidBody.Type.DYNAMIC;
  472. }).start();
  473. //idiom.node.position = ;
  474. }
  475. this.idiom_combine.clear();
  476. this.node_isIdiom.fill(false);
  477. gui.get(UI_Idioms).all_light_Hide();
  478. }
  479. AddTime() {
  480. const layout = gui.get(UI_Main).getLayout<Layout_Main>();
  481. layout.time += 120;
  482. }
  483. private shufflePool() {
  484. const poolSize = this.Cube_Pool.size();
  485. const tempArray = [];
  486. // 从池中取出所有节点到临时数组
  487. for (let i = 0; i < poolSize; i++) {
  488. tempArray.push(this.Cube_Pool.get());
  489. }
  490. // 只打乱部分节点(以 30% 为例,可调整比例)
  491. const shuffleCount = Math.ceil(poolSize * 0.3); // 只打乱前 30%
  492. for (let i = 0; i < shuffleCount; i++) {
  493. const randomIndex = Math.floor(Math.random() * poolSize);
  494. [tempArray[i], tempArray[randomIndex]] = [tempArray[randomIndex], tempArray[i]];
  495. }
  496. // 将打乱的节点放回池中
  497. tempArray.forEach(cube => this.Cube_Pool.put(cube));
  498. }
  499. }