123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- import CCGIF from "./lib/gif/CCGIF";
- import { GIFCache } from "./lib/gif/GIF";
- const { ccclass, property } = cc._decorator;
- @ccclass
- export default class GameManager extends cc.Component {
- public static Instance: GameManager = null;
- @property(cc.Node)
- CharaNode: cc.Node = null;
- @property(cc.Node)
- TargetCharaNode: cc.Node = null;
- @property(cc.Prefab)
- CharaPre: cc.Prefab = null;
- @property(cc.Node)
- lineNode: cc.Node = null;
- @property(cc.Label)
- scoreLabel: cc.Label = null;
- @property(cc.Node)
- GifNode: cc.Node = null;
- @property(cc.Prefab)
- CharaNumber: cc.Prefab = null;
- @property(cc.Node)
- CharaNumberList: cc.Node = null;
- TargetChara: cc.Node = null;
- @property(cc.SpriteFrame)
- AllChara: cc.SpriteFrame[] = [];
- score: number = 0;
- endOne: number = 0;//限制次数
- CharaHeigth: number = 0;//下面水果中最高的高度
- CharaSize:number = 1.5
- CharaNumberRec:number[] = [];
- // LIFE-CYCLE CALLBACKS:
- onLoad() {
- cc.view.enableAutoFullScreen(false);
- if (GameManager.Instance != null) {
- GameManager.Instance.destroy();
- }
- GameManager.Instance = this;
- cc.director.getPhysicsManager().enabled = true;//物理游戏,开启物理
- }
- start() {
- this.GifNode.getComponent(CCGIF).preload().then(()=>this.GifNode.getComponent(CCGIF).play(true));
- cc.tween(this.lineNode.children[0])
- .to(0.3, { opacity: 255 })
- .to(0.3, { opacity: 0 })
- .union()
- .repeatForever()
- .start()
- this.lineNode.children[0].active = false;
- for (const index in this.AllChara) {
- if (Object.prototype.hasOwnProperty.call(this.AllChara, index)) {
- const Chara = this.AllChara[index];
- var CharaNum = cc.instantiate(this.CharaNumber);
- CharaNum.setParent(this.CharaNumberList);
- CharaNum.children[0].getComponent(cc.Sprite).spriteFrame = Chara;
- this.CharaNumberRec[index]=0
- }
- }
- this.updateCharaNumber();
- this.createOneChara(0, cc.v2(0, 550))
- }
- update(dt) {
- GameManager.Instance.CharaHeigth = GameManager.Instance.findHighestChara();
- this.scoreLabel.string = this.score.toString();
- this.checkRedLineAlert();
- }
- /**
- * 生成一个水果
- * @param _CharaNum 水果类型 0是葡萄 以此类推
- */
- createOneChara(_CharaNum: number, _pos: cc.Vec2 ) {
- for (const index in this.TargetCharaNode.children) {
- if (Object.prototype.hasOwnProperty.call(this.TargetCharaNode.children, index)) {
- const childNode = this.TargetCharaNode.children[index];
- if(childNode.position.y>=500) childNode.destroy();
- }
- }
- let Chara = cc.instantiate(this.CharaPre);//实例化一个预制体
- Chara.setParent(this.TargetCharaNode)//更改Chara父节点
- Chara.getComponent(cc.Sprite).spriteFrame = this.AllChara[_CharaNum];//更改Chara的图片
- Chara.getComponent("CharaCollision").CharaNumber = _CharaNum;//Chara碰撞回调脚本,里面有一个当前水果类型 如果是葡萄 CharaNumber为0 用于相同合成检测
- Chara.setPosition(_pos);//设置坐标
- Chara.setScale(0)//出生时scale设置为0
- Chara.getComponent(cc.RigidBody).type = cc.RigidBodyType.Static;//刚体类型设置为Static防止下落
- Chara.getComponent(cc.PhysicsCircleCollider).radius = 0;//碰撞器半径先设置位0,下落时再改到相应水果大小
- Chara.setContentSize(this.resizeChara(Chara.getContentSize(),_CharaNum));
- Chara.getComponent(cc.PhysicsCircleCollider).apply();//保存碰撞器更改的参数
- //水果生成时执行一个缩放动作
- cc.tween(Chara)
- .to(0.5, { scale: 1 }, { easing: 'backOut' })
- .call(() => {
- this.TargetChara = Chara;//将我们控制的水果TargetChara设置为刚生成的Chara
- })
- .start()
- }
- /**
- * 生成高一级的水果
- * @param _CharaNum 水果
- */
- createLevelUpChara(_CharaNum , _pos) {
- //AudioManager.Instance.Play(6, false, 1)
- let Chara = cc.instantiate(this.CharaPre);
- Chara.parent = this.CharaNode;
- Chara.getComponent(cc.Sprite).spriteFrame = this.AllChara[_CharaNum];
- Chara.getComponent("CharaCollision").CharaNumber = _CharaNum;
- Chara.position = _pos;
- Chara.scale = 0;
- Chara.getComponent(cc.RigidBody).linearVelocity = cc.v2(0, -100);
- Chara.getComponent(cc.PhysicsCircleCollider).radius = Chara.height / 2;
- Chara.setContentSize(this.resizeChara(Chara.getContentSize(),_CharaNum));
- Chara.getComponent(cc.PhysicsCircleCollider).apply();
- cc.tween(Chara)
- .to(0.5, { scale: 1 }, { easing: 'backOut' })
- .call(() => {
- if (Chara.getComponent(cc.PhysicsCircleCollider) != null) {
- if (Chara.getComponent(cc.PhysicsCircleCollider).radius != Chara.height / 2) Chara.getComponent(cc.PhysicsCircleCollider).radius = Chara.height / 2;
- if (Chara.getComponent(cc.RigidBody).type != cc.RigidBodyType.Dynamic) Chara.getComponent(cc.RigidBody).type = cc.RigidBodyType.Dynamic;
- Chara.getComponent(cc.PhysicsCircleCollider).apply();
- }
- })
- .start()
- }
- randomOneChara(){
- let randomIndexArray:number[] = [];
- for (let index = 0; index < GameManager.Instance.AllChara.length*0.5; index++) {
- randomIndexArray.push(index);
- for (let i = 0; i < GameManager.Instance.CharaNumberRec[index]; i++) {
- randomIndexArray.push(index)
- randomIndexArray.push(index)
- }
- }
- // GameManager.Instance.createOneChara(Math.floor(Math.random() * GameManager.Instance.AllChara.length*0.5), cc.v2(0, 550));
- GameManager.Instance.createOneChara(randomIndexArray[Math.floor(Math.random() * randomIndexArray.length)], cc.v2(0, 550));
- }
- resizeChara(size: cc.Size,_CharaNum: number){
- return new cc.Size(size.width*this.CharaSize*Math.pow((_CharaNum+1)/this.AllChara.length,4/5),size.height*this.CharaSize*Math.pow((_CharaNum+1)/this.AllChara.length,4/5))
- }
- updateCharaNumber(){
- for (const index in this.CharaNumberRec) {
- if (Object.prototype.hasOwnProperty.call(this.CharaNumberRec, index)) {
- const value = this.CharaNumberRec[index];
- console.log(this.CharaNumberList.children[index].children[1].getComponent(cc.Label).string);
- this.CharaNumberList.children[index].children[1].getComponent(cc.Label).string=value.toString();
- }
- }
- }
- checkRedLineAlert(){
- // 红线是否开启预警
- if (this.lineNode.children[0].y - GameManager.Instance.CharaHeigth < 200 && this.lineNode.children[0].y - GameManager.Instance.CharaHeigth >= 0) {
- this.lineNode.children[0].active = true;
- }
- if (this.lineNode.children[0].y - GameManager.Instance.CharaHeigth > 200) {
- this.lineNode.children[0].active = false;
- }
- }
- // 结束
- end() {
- if (this.endOne == 0) {
- let i = 0;
- for (let j = this.CharaNode.children.length - 1; j >= 0; j--) {
- i++;
- setTimeout(() => {
- GameManager.Instance.score += this.CharaNode.children[j].getComponent("CharaCollision").CharaNumber + 1;
- this.CharaNode.children[j].active = false;
- }, i * 100);
- }
- this.TargetCharaNode.active = true;
- for (let i = 0; i < this.TargetCharaNode.children.length; i++) {
- this.TargetCharaNode.children[i].active = false;
- }
- this.endOne++;
- }
- }
- // 获取下落水果中位置最高的
- findHighestChara() {
- if(this.CharaNode.children.length>0){
- let highest = this.CharaNode.children[0].y;
- for (let i = 1; i < this.CharaNode.children.length; i++) {
- let high = this.CharaNode.children[i].y + this.CharaNode.children[i].width / 2;
- if (highest < high) {
- highest = high;
- }
- }
- return highest;
- }else{
- return 0;
- }
- }
- }
|