DropRule.ts 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. import { AccountManager } from "../Net/AccountManager";
  2. import Ball from "../Main/Ball";
  3. import { EventManager, StageMode } from "./EventManager";
  4. import { GameTools } from "./GameTools";
  5. import { GameManager } from "../Main/GameManager";
  6. import { ServerManager, BlastToMerge } from "../Net/ServerManager";
  7. import { AudioManager, MusicType } from "./AudioManager";
  8. export class DropRule{
  9. private static ins:DropRule;
  10. public progress:any;
  11. constructor(){
  12. DropRule.ins = this;
  13. this.Init();
  14. this.InitEffect();
  15. // EventManager.StageOn(StageMode.ReStart,this,this.Init);
  16. EventManager.StageOn(StageMode.Refresh,this,this.Init);
  17. }
  18. public static get Instance():DropRule{
  19. if(DropRule.ins){
  20. return DropRule.ins
  21. }
  22. else{
  23. return new DropRule();
  24. }
  25. }
  26. //特效名字数组
  27. public EffectName:string[] = new Array<string>("blue","yellow","purple","green");
  28. //特效预制体数组
  29. public EffectArray:Laya.Prefab[] = [];
  30. //球名字数组
  31. public PrefabName:string[] = new Array<string>("2","4","8","16","32","64","128","256","512","1024","2048","4096","8192","16384","32768","65536","131072","262144");
  32. //是否已经克隆完毕
  33. public Cloned:boolean = false;
  34. //本关卡数
  35. public STAGE:number;
  36. //本关卡目标分数
  37. public GoalScore:number;
  38. //本关卡能出球的区间
  39. public BallNum:string[];
  40. //本关卡能出现的最小球的数字
  41. public MinBall:number;
  42. //本关卡能出现的次小球的数字
  43. public MinNextBall:number;
  44. //本关卡掉落线
  45. public DropHeight:number;
  46. //本关卡开始的掉落球数量
  47. public StartNum:number;
  48. //本关卡一次性掉落数量区间
  49. public DropNum:string[];
  50. //本关卡球Size大小序列
  51. public SizeIndex:string[];
  52. //本关卡球乘幂序列
  53. public EdgeIndex:string[];
  54. Init(_data?){
  55. this.STAGE = Number(AccountManager.Instance.curplayerData.GainAccount("stage"));
  56. let level = AccountManager.Instance.curplayerData.GainCollocation("level");
  57. if(_data){
  58. for(var key in level){
  59. if(level[key].id == this.STAGE){
  60. let Level = level[Number(key)];
  61. this.DropHeight = Number(Level.hight);
  62. this.GoalScore = Number(Level.goal);
  63. // this.SizeIndex = Level.index.split(";");//不重新开始游戏不更新球的大小序列
  64. this.BallNum = Level.edge.split(";");
  65. this.StartNum = Number(Level.start_number);
  66. this.DropNum = Level.drop_number.split(";");
  67. // this.EdgeIndex = Level.edgeindex.split(";");
  68. let min =Number(this.BallNum[0]);
  69. let minnext = Number(this.BallNum[1]);
  70. //获取消除道具中 本局 最小球 及 次小球
  71. this.MinBall =Number(this.PrefabName[min-1]);
  72. this.MinNextBall = Number(this.PrefabName[minnext-1]);
  73. }
  74. }
  75. }
  76. else{
  77. for(var key in level){
  78. if(level[key].id == this.STAGE){
  79. let Level = level[Number(key)];
  80. this.DropHeight = Number(Level.hight);
  81. this.GoalScore = Number(Level.goal);
  82. this.SizeIndex = Level.index.split(";");
  83. console.log(this.SizeIndex);
  84. this.BallNum = Level.edge.split(";");
  85. this.StartNum = Number(Level.start_number);
  86. this.DropNum = Level.drop_number.split(";");
  87. this.EdgeIndex = Level.edgeindex.split(";");
  88. let min =Number(this.BallNum[0]);
  89. let minnext = Number(this.BallNum[this.BallNum.length-1]);
  90. //获取消除道具中 本局 最小球 及 次小球
  91. this.MinBall =Number(this.PrefabName[min-1]);
  92. this.MinNextBall = Number(this.PrefabName[minnext-1]);
  93. }
  94. }
  95. }
  96. this.Read();
  97. }
  98. //特效
  99. InitEffect(){
  100. for (let i = 0; i < this.EffectName.length; i++) {
  101. this.ReadJson(i)
  102. }
  103. }
  104. ReadJson(i:number){
  105. Laya.loader.create("Effect/"+this.EffectName[i]+".json",Laya.Handler.create(this,this.creat));
  106. }
  107. creat(Prefab:any){
  108. let obj = new Laya.Prefab();
  109. obj.json = Prefab;
  110. this.EffectArray.push(obj);
  111. }
  112. /**传入分数及位置 克隆相应销毁特效 */
  113. CreateEffect(_score:number,_pos:Laya.Vector2){
  114. let effect;
  115. let index;
  116. if(_score == 2 || _score == 16 || _score == 256 || _score == 2048 || _score == 32768 || _score == 262144){
  117. effect = this.EffectArray[3];
  118. index = 3;
  119. }
  120. else if(_score == 8 || _score == 32 || _score == 4096 || _score == 131072){
  121. effect = this.EffectArray[1];
  122. index = 1;
  123. }
  124. else if(_score == 64 || _score == 512 || _score == 16384){
  125. effect = this.EffectArray[2];
  126. index = 2;
  127. }
  128. else if(_score == 4 || _score ==128 || _score == 1024 || _score == 8192 || _score == 65536){
  129. effect = this.EffectArray[0];
  130. index = 0;
  131. }
  132. let pre = Laya.Pool.getItemByCreateFun(this.EffectName[index],effect.create,effect) as Laya.Animation;
  133. pre.pos(_pos.x,_pos.y);
  134. Laya.stage.addChild(pre);
  135. pre.on(Laya.Event.COMPLETE,this,()=>{
  136. pre.removeSelf();
  137. pre.destroy();
  138. })
  139. }
  140. /** 传入分数获取球的序号*/
  141. GetBallIndex(_score:number):number{
  142. let num;
  143. for (let i = 0; i < this.PrefabName.length; i++) {
  144. if(_score == Number(this.PrefabName[i])){
  145. num = i;
  146. }
  147. else if(_score>Number(this.PrefabName[i]) && _score<Number(this.PrefabName[i+1])){
  148. num = i;
  149. }
  150. }
  151. return num;
  152. }
  153. /**传入消掉的分数获取应加的分数*/
  154. GetScore(_score:number):number{
  155. let num;
  156. for (let i = 0; i < this.PrefabName.length; i++) {
  157. if(_score == Number(this.PrefabName[i])){
  158. num = Number(this.PrefabName[i]);
  159. }
  160. else if(_score>Number(this.PrefabName[i]) && _score<Number(this.PrefabName[i+1])){
  161. num = Number(this.PrefabName[i]);
  162. }
  163. }
  164. return num;
  165. }
  166. /**传入分数获取本关卡球的size */
  167. GetBallSize(_score:number):number{
  168. let num ;
  169. let index;
  170. let size = 0;
  171. for (let i = 0; i < this.PrefabName.length; i++) {
  172. if(_score == Number(this.PrefabName[i])){
  173. num = i;
  174. }
  175. else if(_score>Number(this.PrefabName[i]) && _score<Number(this.PrefabName[i+1])){
  176. num = i;
  177. }
  178. }
  179. for (let j = 0; j < this.EdgeIndex.length; j++) {
  180. if(num+1 == Number(this.EdgeIndex[j])){
  181. index = Number(this.SizeIndex[j]);
  182. size = this.Size(num+1,index);
  183. }
  184. }
  185. if(size == 0){
  186. let cimi = Number(this.EdgeIndex[this.EdgeIndex.length-1]);
  187. index = Number(this.SizeIndex[this.EdgeIndex.length-1]);
  188. size = this.Size(cimi,index);
  189. let n = (num+1) - cimi;
  190. size = size + (n*5);
  191. }
  192. return size
  193. }
  194. /**传入球的序号(2的次幂),等级 获取球的大小 */
  195. Size(_index:number,sizelevel:number):number{
  196. let ballsize ;
  197. let ball = AccountManager.Instance.curplayerData.GainCollocation("ball");
  198. for (var key in ball) {
  199. let item = ball[key];
  200. if(_index == item.ball && sizelevel == item.size_level){
  201. ballsize = Number(item.size)
  202. }
  203. }
  204. return ballsize
  205. }
  206. /**创建球的预制 合成克隆*/
  207. CreatBall(_index:number,size:number,pos:Laya.Vector2){
  208. let ball:Laya.Image = new Laya.Image();
  209. ball.skin = "Game/res/Ball/blast"+ _index + ".png";
  210. ball.anchorX = 0.5;
  211. ball.anchorY = 0.5;
  212. ball.height = size;
  213. ball.width = size;
  214. //刚体碰撞器
  215. let collider = ball.addComponent(Laya.CircleCollider) as Laya.CircleCollider;
  216. collider.restitution = AccountManager.Instance.curplayerData.Restitution;
  217. collider.radius = size/2 + 1.5;
  218. // console.log("_index--",_index);
  219. console.log("碰撞器半径--",collider.radius,size);
  220. let rig = ball.addComponent(Laya.RigidBody) as Laya.RigidBody;
  221. // rig.allowRotation = true;
  222. rig.gravityScale = 3;
  223. //字体
  224. let num :Laya.FontClip = new Laya.FontClip();
  225. num.name = "num";
  226. num.skin = "Game/res/Ball/44.png";
  227. num.anchorX = 0.5;
  228. num.anchorY = 0.5;
  229. num.sheet = "0123456789";
  230. let zi = this.PrefabName[_index];
  231. num.value = zi;
  232. ball.addChild(num);
  233. num.centerX = 0;
  234. num.centerY = 0;
  235. //光效
  236. let light:Laya.Image = new Laya.Image();
  237. light.skin = "Game/res/Ball/"+ zi + ".png";
  238. light.anchorX = 0.5;
  239. light.anchorY = 0.5;
  240. light.width = this.LightSize(size);
  241. light.height =this.LightSize(size);
  242. light.name = "light";
  243. ball.addChild(light);
  244. light.centerX = 0;
  245. light.centerY = 0;
  246. //脚本
  247. let script = ball.addComponent(Ball) as Ball;
  248. ball.pos(pos.x,pos.y);
  249. // this.SetPosition(ball,pos);
  250. Laya.timer.once(1,this,()=>{
  251. EventManager.StageTrigger(StageMode.Clone,[ball]);
  252. })
  253. this.Cloned = true;
  254. AudioManager.playMusic(MusicType.down);
  255. }
  256. /**创建球的预制 自动掉球*/
  257. CreatBall2(_index:number,size:number,pos:Laya.Vector2){
  258. let ball:Laya.Image = new Laya.Image();
  259. ball.skin = "Game/res/Ball/blast"+ _index + ".png";
  260. ball.anchorX = 0.5;
  261. ball.anchorY = 0.5;
  262. ball.height = size;
  263. ball.width = size;
  264. //刚体碰撞器
  265. let collider = ball.addComponent(Laya.CircleCollider) as Laya.CircleCollider;
  266. collider.restitution = AccountManager.Instance.curplayerData.Restitution;
  267. if(this.STAGE == 1 && GameManager.Instance.Wave<3){
  268. collider.restitution = 0;
  269. }
  270. collider.radius = size/2 + 1.5;
  271. let rig = ball.addComponent(Laya.RigidBody) as Laya.RigidBody;
  272. rig.allowRotation = true;
  273. rig.gravityScale = 3;
  274. //字体
  275. let num :Laya.FontClip = new Laya.FontClip();
  276. num.name = "num";
  277. num.skin = "Game/res/Ball/44.png";
  278. num.anchorX = 0.5;
  279. num.anchorY = 0.5;
  280. num.sheet = "0123456789";
  281. let zi = this.PrefabName[_index];
  282. num.value = zi;
  283. ball.addChild(num);
  284. num.centerX = 0;
  285. num.centerY = 0;
  286. //光效
  287. let light:Laya.Image = new Laya.Image();
  288. light.skin = "Game/res/Ball/"+ zi + ".png";
  289. light.anchorX = 0.5;
  290. light.anchorY = 0.5;
  291. light.width = this.LightSize(size);
  292. light.height = this.LightSize(size);
  293. light.name = "light";
  294. ball.addChild(light);
  295. light.centerX = 0;
  296. light.centerY = 0;
  297. //脚本
  298. let script = ball.addComponent(Ball) as Ball;
  299. // ball.pos(pos.x,pos.y);
  300. this.SetPosition(ball,pos);
  301. Laya.timer.once(1,this,()=>{
  302. EventManager.StageTrigger(StageMode.Clone,[ball]);
  303. })
  304. AudioManager.playMusic(MusicType.down);
  305. }
  306. //设置球的位置
  307. SetPosition(_node:Laya.Image,_pos:Laya.Vector2){
  308. _node.pos(_pos.x,_pos.y);
  309. }
  310. /**根据球的大小调节光圈大小 */
  311. LightSize(_size:number):number{
  312. let num;
  313. switch (_size) {
  314. case 65:
  315. num = 79;
  316. break;
  317. case 70:
  318. num = 87
  319. break;
  320. case 75:
  321. num = 95
  322. break;
  323. case 80:
  324. num = 100
  325. break;
  326. case 85:
  327. num = 105
  328. break;
  329. case 90:
  330. num = 110
  331. break;
  332. case 95:
  333. num = 117
  334. break;
  335. case 100:
  336. num = 124
  337. break;
  338. case 105:
  339. num = 130
  340. break;
  341. case 110:
  342. num = 136
  343. break;
  344. case 115:
  345. num = 143
  346. break;
  347. case 120:
  348. num = 150
  349. break;
  350. case 125:
  351. num = 152
  352. break;
  353. case 130:
  354. num = 160
  355. break;
  356. case 135:
  357. num = 165
  358. break;
  359. case 140:
  360. num = 174
  361. break;
  362. case 145:
  363. num = 181
  364. break;
  365. case 150:
  366. num = 186
  367. break;
  368. case 155:
  369. num = 192
  370. break;
  371. case 160:
  372. num = 199
  373. break;
  374. case 165:
  375. num = 202
  376. break;
  377. case 170:
  378. num = 210
  379. break;
  380. case 175:
  381. num = 215
  382. break;
  383. case 180:
  384. num = 223
  385. break;
  386. }
  387. return num
  388. }
  389. /**消除掉球 */
  390. FallDown(_time?:number){
  391. if(!_time){
  392. let mindrop = Number(this.DropNum[0]);
  393. let maxdrop = Number(this.DropNum[1]);
  394. _time = GameTools.RandomANumber(mindrop,maxdrop+1);
  395. }
  396. let min = Number(this.BallNum[0]);
  397. let max =Number(this.BallNum[this.BallNum.length-1]);
  398. let index;
  399. let size;
  400. for (let j = 0; j < _time; j++) {
  401. let num = GameTools.RandomANumber(min,max+1);
  402. for (let i = 0; i < this.BallNum.length; i++) {
  403. if(num == Number(this.BallNum[i])){
  404. index = Number(this.SizeIndex[i]);
  405. size = this.Size(num,index);
  406. }
  407. }
  408. let X = GameTools.RandomANumber(100,500);
  409. let pos = new Laya.Vector2(X, 30);
  410. this.CreatBall2(num-1,size,pos);
  411. }
  412. }
  413. //新手指引关掉球规律
  414. GuideFallDown(){
  415. GameManager.Instance.CheckHeight = false;
  416. let num;
  417. let shuliang;
  418. let gaoduxin;
  419. if(GameManager.Instance.Wave == 1){
  420. shuliang = 2;
  421. num = 1;
  422. }
  423. else if(GameManager.Instance.Wave == 2){
  424. shuliang = 2;
  425. num = 2;
  426. }
  427. else if(GameManager.Instance.Wave == 3){
  428. shuliang = 6;
  429. num = 1;
  430. }
  431. else if(GameManager.Instance.Wave == 4){
  432. shuliang = 12;
  433. num = 1;
  434. }
  435. else if(GameManager.Instance.Wave == 5){
  436. shuliang = 6;
  437. num = 2;
  438. }
  439. else if(GameManager.Instance.Wave == 6){
  440. shuliang = 12;
  441. num = 2
  442. }
  443. else{
  444. GameManager.Instance.CheckHeight = true;
  445. this.DropHeight = AccountManager.Instance.curplayerData.GuideHeight;
  446. let mindrop = Number(this.DropNum[0]);
  447. let maxdrop = Number(this.DropNum[1]);
  448. num = GameTools.RandomANumber(mindrop,maxdrop+1);
  449. }
  450. let score = Number(this.PrefabName[num-1]);
  451. let index = this.GetBallIndex(score);
  452. let size = this.GetBallSize(score);
  453. for (let j = 0; j < shuliang; j++) {
  454. let X = GameTools.RandomANumber(100,500);
  455. let pos = new Laya.Vector2(X, 30);
  456. this.CreatBall2(num-1,size,pos);
  457. }
  458. }
  459. /**恢复场景 */
  460. RecoverScene(){
  461. for (let i = 0; i < this.progress.length-3; i++) {
  462. let item = this.progress[i];
  463. this.CreatBall2(Number(item.index)-1,Number(item.size),new Laya.Vector2(Number(item.pos.x),Number(item.pos.y)));
  464. }
  465. }
  466. /**读取进度*/
  467. Read(){
  468. if(this.STAGE>1){
  469. var args =[{"stage":"0"}]
  470. ServerManager.Instance.SendHttp(BlastToMerge.GetProgress,args,Laya.Handler.create(this,(res)=>{
  471. let json =JSON.parse(res.user_game.detail);
  472. this.progress = json;
  473. if(this.progress.length>1){
  474. let items = this.progress[this.progress.length-2];
  475. let _score = Number(items.jindu);
  476. GameManager.Instance.ScoreProgress = _score;
  477. this.SizeIndex = this.progress[this.progress.length-1].sizeindex;
  478. this.EdgeIndex = this.progress[this.progress.length -3].edgeindex;
  479. }
  480. console.log("获取进度成功");
  481. }),Laya.Handler.create(this,()=>{
  482. console.log("获取进度失败");
  483. }))
  484. }
  485. }
  486. }