games/FullFire/assets/scripts/manager/GameManager.ts

678 lines
23 KiB
TypeScript

import Ball from "../Ball";
import Define from "../common/Define";
import Shake from "../Shake";
import Common from "../common/Common";
import FrameAnimation from "../common/FrameAnimation";
import FramaAnimations from "../common/FramaAnimations";
import Bullet from "../Bullet";
import UserInfo from "../UserInfo";
import LevelInfo from "../Levellnfo";
import TimeTaskManager from "./TimeTaskManager";
import UIManager from "./UIManager";
import LDataGoldManager from "../datas/LDataGoldManager";
import LDataStoncolourManager from "../datas/LDataStoncolourManager";
import LDataStoneManager from "../datas/LDataStoneManager";
import GoldCtr from "../GoldCtr";
import ParticleEffectManager from "./ParticleEffectManager";
import ParticleEffect from "../ParticleEffect";
import WXHelper from "../common/WXHelper";
import CannonCtr from "../CannonCtr";
import CannonManager from "./CannonManager";
import LDataCannonManager from "../datas/LDataCannonManager";
import ResManager from "./ResManager";
import HttpManager from "./HttpManager";
import LDataSceneManager from "../datas/LDataSceneManager";
import SoundManager from "./SoundManager";
// Learn TypeScript:
// - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/typescript.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/life-cycle-callbacks.html
const {ccclass, property} = cc._decorator;
@ccclass
export default class GameManager extends cc.Component {
@property(cc.Node)
nodeBalls: cc.Node = null;
@property(cc.Node)
nodeGolds:cc.Node = null;
@property(cc.Node)
nodeParticleEffects:cc.Node = null;
@property(cc.Node)
nodeBg:cc.Node = null;
@property(cc.Node)
nodeGameRoot:cc.Node = null;//游戏子节点
@property(cc.Node)
nodeUiRoot:cc.Node = null;//ui 子节点
@property(cc.Node)
nodeGold:cc.Node = null;//ui金币
@property(cc.Node)
nodeBallRoot:cc.Node = null;//球体的根节点
@property(cc.Node)
nodeGoldRoot:cc.Node = null;//球体的根节点
@property(cc.Node)
nodePrompt: cc.Node = null; //提示
@property(cc.Sprite)
display: cc.Sprite = null; //微信子域
@property(cc.Node)
textAddGold: cc.Node = null; //金币增加
@property(cc.Node)
addPowerEffect:cc.Node = null;
@property(cc.Node)
sceneBgs:cc.Node = null;
@property(cc.Node)
nodeSoundRoot:cc.Node = null;
@property(cc.Node)
sceneObjs:cc.Node = null;
wxHelper:WXHelper = null;
private bgInitPos:cc.Vec2 = null;
private isCanMoveCannon:boolean = false;
private moveToPos:cc.Vec2 = null;
private totalShootTime:number = 0;
private totalShootCount:number = 0;
public static instance:GameManager = null;
private bulletArr:Bullet[] = [];
private ballArr:Ball[] = [];
private goldArr:GoldCtr[] = [];
private totalShootAnimaTime:number = 0;
//当前坦克
curCannonCtr:CannonCtr = null;
private nodeBullet:cc.Node = null;//子弹
private newMethod(): CannonCtr {
return null;
}
start () {
this.wxHelper = new WXHelper();
this.wxHelper.initWXHelper();
this.wxHelper.display = this.display;
WXHelper.initRewardedVideoAd();
//cc.game.setFrameRate(60);
//初始化数据表
LDataGoldManager.GetDataById(0);
LDataStoncolourManager.GetDataById(0);
LDataStoneManager.GetDataById(0);
LDataCannonManager.GetDataById(0);
LDataSceneManager.GetDataById(0);
//UserInfo.clearAllDatas();
//加载玩家本地数据
UserInfo.loadAllData();
//初始化数据表完成
GameManager.instance = this;
// if(cc.sys.platform === cc.sys.WECHAT_GAME){
// this.nodeBg.getParent().on(cc.Node.EventType.TOUCH_START, (e: cc.Event.EventTouch) => this.mouseDown(e))
// this.nodeBg.getParent().on(cc.Node.EventType.TOUCH_MOVE, (e: cc.Event.EventTouch) => this.mouseMove(e))
// this.nodeBg.getParent().on(cc.Node.EventType.TOUCH_END, (e: cc.Event.EventTouch) => this.mouseEnd(e))
// this.nodeBg.getParent().on(cc.Node.EventType.TOUCH_CANCEL, (e: cc.Event.EventTouch) => this.mouseEnd(e))
// }else {
// this.nodeBg.getParent().on(cc.Node.EventType.MOUSE_DOWN, (e: cc.Event.EventTouch) => this.mouseDown(e))
// this.nodeBg.getParent().on(cc.Node.EventType.MOUSE_MOVE, (e: cc.Event.EventTouch) => this.mouseMove(e))
// this.nodeBg.getParent().on(cc.Node.EventType.MOUSE_UP, (e: cc.Event.EventTouch) => this.mouseEnd(e))
// }
// 注册触摸事件
this.nodeBg.getParent().on(cc.Node.EventType.TOUCH_START, (e: cc.Event.EventTouch) => this.mouseDown(e));
this.nodeBg.getParent().on(cc.Node.EventType.TOUCH_MOVE, (e: cc.Event.EventTouch) => this.mouseMove(e));
this.nodeBg.getParent().on(cc.Node.EventType.TOUCH_END, (e: cc.Event.EventTouch) => this.mouseEnd(e));
this.nodeBg.getParent().on(cc.Node.EventType.TOUCH_CANCEL, (e: cc.Event.EventTouch) => this.mouseEnd(e));
// 注册鼠标事件
this.nodeBg.getParent().on(cc.Node.EventType.MOUSE_DOWN, (e: cc.Event.EventMouse) => this.mouseDown(e));
this.nodeBg.getParent().on(cc.Node.EventType.MOUSE_MOVE, (e: cc.Event.EventMouse) => this.mouseMove(e));
this.nodeBg.getParent().on(cc.Node.EventType.MOUSE_UP, (e: cc.Event.EventMouse) => this.mouseEnd(e));
cc.game.on(cc.game.EVENT_HIDE,this.gameEventHide)
cc.game.on(cc.game.EVENT_SHOW,this.gameEventShow)
cc.game.on(cc.game.EVENT_ENGINE_INITED,this.gameEventShow)
this.changeCannonById(UserInfo.curUseCannonId)
TimeTaskManager.addTimeTask(3.5,this.createStone.bind(this));
this.bgInitPos = this.nodeBg.position;
Common.isFirstCreatStone = true;
//保存几个根节点
Common.nodeGameRoot = this.nodeGameRoot;
Common.nodeUiRoot = this.nodeUiRoot;
Common.nodeBallRoot = this.nodeBallRoot;
Common.nodeGoldRoot = this.nodeGoldRoot;
Common.nodeParticleEffects = this.nodeParticleEffects;
Common.nodePrompt = this.nodePrompt;
Common.nodeAddGold = this.textAddGold;
Common.addPowerEffect = this.addPowerEffect;
Common.nodeSoundRoot = this.nodeSoundRoot;
Common.offLineRewardCount = LevelInfo.getOffLineRewardGoldCount();
this.changeSceneByIndex(UserInfo.getCurSceneIndex(),true)
if(Define.gameId == "002"){
HttpManager.getInstance().getGameState(function(){
this.enterGame();
}.bind(this));
}else{
this.enterGame();
}
}
enterGame(){
if(Common.offLineRewardCount > 20){
UIManager.getInstance().showView(Define.viewOffLineReward);
UIManager.getInstance().showView(Define.viewUpgrade);
}else{
UIManager.getInstance().showView(Define.viewMain);
UIManager.getInstance().showView(Define.viewUpgrade);
}
WXHelper.wxCheckLogin();
}
changeCannonById(id = 0){
let lastPos:cc.Vec2 = new cc.Vec2(320,280)
if(this.curCannonCtr != null){
lastPos = this.curCannonCtr.node.position
this.curCannonCtr.node.destroy()
}
Common.curUseCannonId = id
Common.curDataCannon = LDataCannonManager.GetDataById(Common.curUseCannonId)
CannonManager.createCannon(id,this.nodeGameRoot,function(cannonCtr:CannonCtr){
this.curCannonCtr = cannonCtr
this.curCannonCtr.node.position = lastPos
this.curCannonCtr.node.setSiblingIndex(2)
this.removeAllBullet()
ResManager.loadPrefab("prefabs/bullets/bullet"+Common.curDataCannon.bulletsId.toString(),function(bullet){
this.nodeBullet = bullet
}.bind(this))
}.bind(this));
}
changeSceneByIndex(index:number,isFirst:boolean = false){
for (let i = 0; i < this.sceneBgs.childrenCount; i++) {
this.sceneBgs.children[i].active = false
}
this.sceneBgs.children[index].active = true
if(index != 0){
this.sceneObjs.active = false
}else{
this.sceneObjs.active = true
}
if(index == 2){
console.log("播放音乐")
SoundManager.pauseBackGroundSound(false)
}else{
SoundManager.pauseBackGroundSound(true)
}
}
mouseDown (event:cc.Event.EventTouch){
this.isCanMoveCannon = true;
this.moveToPos = event.getLocation();
console.log("触摸开始,位置:", event.getLocation());
console.log("事件类型:", event.type);
}
mouseMove (event:cc.Event.EventTouch){
if(!this.isCanMoveCannon){
return;
}
this.moveToPos = event.getLocation();
console.log("触摸移动,位置:", event.getLocation());
}
mouseEnd (event:cc.Event.EventTouch){
this.isCanMoveCannon = false;
this.curCannonCtr.shootBullet(false)
console.log("触摸结束/取消,位置:", event.getLocation());
}
cannonMove(dt){
if(this.isCanMoveCannon){
this.curCannonCtr.move(dt,this.isCanMoveCannon,this.moveToPos);
this.shootBullet(dt);
this.curCannonCtr.shootBullet(true)
}
}
shootBullet(dt){
let bulletCount:number = UserInfo.bulletShootMaxCount * Common.addPower
//发射的子弹已经达到上限
if(this.getCurValidBulletCount() >= bulletCount){
return
}
this.totalShootTime = this.totalShootTime + dt
//这里处理动作 限制动作的最快速度
if(bulletCount >= 10)
{
this.totalShootAnimaTime = this.totalShootAnimaTime + dt
if(this.totalShootAnimaTime > 0.1){
this.totalShootAnimaTime = 0
this.curCannonCtr.playAttack()
}
}else
{
if(this.totalShootTime > 1/bulletCount){
this.curCannonCtr.playAttack()
}
}
let count:number = bulletCount;
if(count >= Define.bulletMacCount)
{
count = Define.bulletMacCount;
}
if(this.totalShootTime > 1/count) //20
{
this.totalShootCount++;
let row = Math.floor(bulletCount/Define.bulletMacCount)
let count = Math.floor(bulletCount%Define.bulletMacCount)
if(this.totalShootCount <= count)
{
row = row + 1
}
if(row <= 0)
{
row = 1
}
//子弹升级了火力
let power = UserInfo.addFirePower
if(this.totalShootCount < UserInfo.addFirePowerCount){
power = power + 1
}
for (let index = 0; index < row; index++) {
let offsetX = Common.getBulletOffsetX(row,index);
let bullet = this.getBullet();
let v1 = new cc.Vec2(this.curCannonCtr.node.position.x,(this.curCannonCtr.node.position.y + 50));
let v2 = new cc.Vec2(this.curCannonCtr.node.position.x + offsetX,(this.curCannonCtr.node.position.y + 1136));
bullet.setPower(power)
bullet.shoot(v1,v2);
}
this.totalShootTime = 0
}
if(this.totalShootCount > count)
{
this.totalShootCount = 0;
}
}
isCanShakeBg:boolean = true
ShakeBg(shakeLevel:number = 5){
if(this.isCanShakeBg){
this.isCanShakeBg = false
this.nodeBg.runAction(cc.sequence(Shake.create(0.2,shakeLevel,shakeLevel),
cc.callFunc(function(){
this.nodeBg.position = this.bgInitPos;
this.isCanShakeBg = true
}.bind(this))
));
}
}
getBullet():Bullet{
let bullet:Bullet = null
for (let index = 0; index < this.bulletArr.length; index++) {
if(!this.bulletArr[index].isValidBullet){ //已经无效重新利用
bullet = this.bulletArr[index];
}
}
if(bullet == null)
{
bullet = cc.instantiate(this.nodeBullet).getComponent(Bullet);
Common.nodeBallRoot.addChild(bullet.node);
this.bulletArr.push(bullet);
}
//默认子弹的威力是1
bullet.power = 1
return bullet
}
//移除所有子弹
removeAllBullet(){
for (let index = 0; index < this.bulletArr.length; index++) {
this.bulletArr[index].node.destroy();
}
this.bulletArr = []
}
getCurValidBulletCount():number{
let count = 0;
for (let index = 0; index < this.bulletArr.length; index++) {
if(this.bulletArr[index].isValidBullet){
count++;
}
}
return count;
}
update (dt) {
this.wxHelper.update(dt);
if(Common.isPause || Common.isGameOver || !Common.isPlaying){
return;
}
this.cannonMove(dt);
this.handlerBulletCollision();
TimeTaskManager.updateTime(dt);
}
handlerBulletCollision(){
for (let index = 0; index < this.bulletArr.length; index++) {
if(this.bulletArr[index].isValidBullet){
this.checkIsBulletCollision(this.bulletArr[index]);
}
}
}
//单独子弹对 球进行检测
checkIsBulletCollision(bullet:Bullet){
for (let index = 0; index < this.ballArr.length; index++) {
let ball = this.ballArr[index];
let isCollision = Common.isCollision(ball.node,bullet.node,ball.stoneData.radius);
if(isCollision){
bullet.setValid(false);
ball.Hit(bullet.power);
Common.totalShowScore = Common.totalShowScore + bullet.power;
UserInfo.totalScore = UserInfo.totalScore + bullet.power;
UIManager.getInstance().executeEvent(Define.viewBattle,"refreshScore");
if(ball.getNumber() <= 0){
if(ball.stoneData.stonId == 0){
Common.curLevelScore++;
UIManager.getInstance().executeEvent(Define.viewBattle,"refreshProgressInfo");
console.log("金币掉落................")
this.handlerGoldDrop(ball.node.position);
if(LevelInfo.isFinishLevel()){
//已经通过了关卡
console.log("已经通过了关卡。。。。。。。。。。。。。。。。。。。。")
this.handlerCollectAllGold() //收集所有金币
Common.isPlaying = false;
UIManager.getInstance().executeEvent(Define.viewBattle,"hideAddPower");
UIManager.getInstance().showView(Define.viewGameWin);
UserInfo.saveNextLevel();
}
}
//释放小球
this.ballArr.splice(index,1);
//这里创建新的小球
this.stoneBreakCallBack(ball);
ball.node.destroy();
ball = null;
break;
}
}
}
}
//检测是否存在最大的石块
checkIsExsitMaxStone():boolean{
for (let index = 0; index < this.ballArr.length; index++) {
if(this.ballArr[index].stoneId == 3){
return true;
}
}
return false;
}
createStone(onlyTag:string,dir:number = 0,stoneId:number = -1,pos:cc.Vec2 = null,score:number = 0){
if(Common.isPause || Common.isGameOver || !Common.isPlaying){
return;
}
if(!LevelInfo.isCanCreateStone() && onlyTag != "stoneBreak"){
console.log("已经创建到最大了。。。。。。。。。");
return;
}
//已经有最大的不创建
if((this.checkIsExsitMaxStone() || this.ballArr.length > Define.ballMaxCount )&& onlyTag != "stoneBreak"){
return;
}
if(onlyTag != "stoneBreak"){
stoneId = LevelInfo.getStoneId();
if(stoneId == null){
return;
}
}
let ball = cc.instantiate(this.nodeBalls.children[stoneId]).getComponent(Ball);
ball.stoneId = stoneId;
Common.nodeBallRoot.addChild(ball.node);
if(onlyTag == "stoneBreak"){
ball.appear(Define.center,dir,pos);
ball.setNumber(score);
}else{
let stoneScore = LevelInfo.getStoneScore(Common.isFirstCreatStone);
Common.isFirstCreatStone = false;
ball.setNumber(stoneScore);
ball.appear(Common.getRandom(0,2),dir,pos,LevelInfo.getStoneInitY());
}
this.ballArr.push(ball);
}
stoneBreakCallBack(ball:Ball){
WXHelper.brateShort();
let effect:ParticleEffect = ParticleEffectManager.getInstance().showParticleEffect(3,ball.node.position,0.5);
effect.node.scale = ball.stoneData.radius/40;
if(ball.stoneId > 0){
this.createStone("stoneBreak",Define.left,ball.stoneId-1,ball.node.position,ball.getBreakScore());
this.createStone("stoneBreak",Define.right,ball.stoneId-1,ball.node.position,ball.getBreakScore());
}
}
//处理金币掉落
handlerGoldDrop(pos:cc.Vec2){
let count:number = LevelInfo.getDropGoldCount();
if(count >= 0){
for (let index = 0; index < count; index++) {
let goldId = LevelInfo.getDropGoldId();
this.getGold(goldId,pos);
}
}
}
//获得一个金币
getGold(goldId:number,pos:cc.Vec2):GoldCtr{
let goldCtr:GoldCtr = null
for (let index = 0; index < this.goldArr.length; index++) {
if(this.goldArr[index].isCanUseTag){
goldCtr = this.goldArr[index];
}
}
if(goldCtr == null){
goldCtr = cc.instantiate(this.nodeGold).getComponent<GoldCtr>(GoldCtr);
Common.nodeGoldRoot.addChild(goldCtr.node);
this.goldArr.push(goldCtr);
}
goldCtr.node.position = pos;
goldCtr.setGoldId(goldId);
let frame:cc.SpriteFrame = this.nodeGolds.children[goldId].getComponent(cc.Sprite).spriteFrame;
goldCtr.setIcon(frame);
return goldCtr;
}
//收集所有金币
handlerCollectAllGold(){
for (let index = 0; index < this.goldArr.length; index++) {
this.goldArr[index].autoCollect();
}
}
//收集的金币
handlerCollectGold(goldCount:number){
UserInfo.curGold = UserInfo.curGold + goldCount;
UIManager.getInstance().executeEvent(Define.viewBattle,"refreshGold")
}
//移除所有的石头
removeAllStone(){
for (let index = 0; index < this.ballArr.length; index++) {
this.ballArr[index].node.destroy();
this.ballArr[index] = null;
}
this.ballArr = [];
}
//金币没有被释放 重复利用
clearAllGold(){
for (let index = 0; index < this.goldArr.length; index++) {
this.goldArr[index].clear();
}
}
//重新开始游戏调用
restartGame(){
//清空上一局数据
this.removeAllStone();
this.curCannonCtr.openCollision();
LevelInfo.InitLevelStoneInfo();
Common.resetDatas();
UIManager.getInstance().refreshView(Define.viewBattle);
//出现石块
Common.isGameOver = false;
Common.isPause = false;
Common.isPlaying = true;
this.createStone("");
}
//退出游戏
exitGame(){
Common.lastShowScore = 0;
this.removeAllStone(); //清理石头
this.clearAllGold(); //清理金币
}
gameOver(ball:Ball){
if(ball != null){
if(Common.isGameOver){
return
}
Common.isGameOver = true;
this.pauseStoneMove(true);
this.showGameOverEffect()
}else {
UserInfo.saveGoldData();
this.exitGame();
UIManager.getInstance().executeEvent(Define.viewBattle,"hideAddPower");
UIManager.getInstance().showView(Define.viewGameResult);
}
}
//显示结算失败效果
showGameOverEffect(){
WXHelper.brateLong();
this.curCannonCtr.die(function(){
if(Common.isCanRevive){
Common.isCanRevive = false;
UIManager.getInstance().executeEvent(Define.viewBattle,"hideAddPower");
UIManager.getInstance().showView(Define.viewRevive);
}else{
//显示结算失败
WXHelper.instance.submitScore();
UserInfo.saveGoldData();
this.exitGame();
UIManager.getInstance().executeEvent(Define.viewBattle,"hideAddPower");
UIManager.getInstance().showView(Define.viewGameResult);
}
}.bind(this))
}
//视频或者点击金币复活了
reviveGame(){
UserInfo.god(3)
this.pauseStoneMove(false)
Common.isGameOver = false;
}
pauseStoneMove(isPause:boolean){
for (let index = 0; index < this.ballArr.length; index++) {
this.ballArr[index].pauseMove(isPause);
}
}
gameEventHide(){
console.log("gameEventHide")
cc.director.pause();
UserInfo.saveLastQuitTime()
}
gameEventShow(){
console.log("gameEventShow")
if(cc.director.isPaused()){
cc.director.resume();
}
if(UIManager.getInstance().isShow(Define.viewSelectCannon)){ //这里分享获得大炮
UIManager.getInstance().executeEvent(Define.viewSelectCannon);
}else if(UIManager.getInstance().isShow(Define.viewUpgrade)){
UIManager.getInstance().executeEvent(Define.viewUpgrade,);
}else if(UIManager.getInstance().isShow(Define.viewBattle)){
UIManager.getInstance().executeEvent(Define.viewBattle,"share");
}else if(UIManager.getInstance().isShow(Define.viewSelectScene)){
UIManager.getInstance().executeEvent(Define.viewSelectScene);
}
}
}