games/BladeStruggle/assets/script/tscript/gamescene/GameScene.ts

672 lines
18 KiB
TypeScript

import Player, { PlayerStatus } from "./Player";
import Vector2 from "../util/Vector2";
import UIManager, { ViewName, LayerType } from "../ui/UIManager";
import CustomEventType from "../event/CustomEventType";
import ResourcesManager from "../core/ResourcesManager";;
import GameManager, { GameStatus } from "../core/GameManager";
import Knife, { KnifeType } from "./Knife";
import Random from "../util/Random";
import Clock from "../util/Clock";
import DataManager from "../core/DataManager";
import WXSdk from "../wx/WXSdk";
import Wall from "./Wall";
import MovieClip from "../util/MovieClip";
import BlackHole from "./BlackHole";
import Item, { ItemType } from "../item/Item";
import LevelConfigData from "../configdata/LevelConfigData";
import PlayerAI, { PlayerAILevel } from "./PlayerAI";
import CameraFollow from "./CameraFollow";
import SoundManager from "../core/SoundManager";
import { SoundClipType } from "../audio/SoundClip";
import { BgSoundClipType } from "../audio/BgSoundClip";
// Learn TypeScript:
// - [Chinese] https://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] https://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] https://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 GameScene extends cc.Component {
public static levelMax:number = 1;
public static levelMin:number = 1;
@property(cc.Node)
public sceneSize: cc.Node = null;
@property(Player)
public player:Player = null;
@property(Clock)
public clock:Clock = null;
@property(cc.Label)
public cdTxt:cc.Label = null;
@property(Wall)
public wall:Wall = null;
@property(cc.Sprite)
public bg:cc.Sprite = null;
private halfSize:cc.Size = cc.Size.ZERO;
private knifeNum:number = 25;
public knifeArr:Array<Knife> = [];
public playerArr:Array<Player> = [];
private rank:number = 8;
private skinIndexArr:number[] = [];
private nameIndexArr:number[] = [];
private aiPlayerCount:number = 7;
public aiNameIndexArr:number[] = [];
private levelConfigData:LevelConfigData = null;
public blackHole:BlackHole = null;
// LIFE-CYCLE CALLBACKS:
onLoad () {
cc.director.getCollisionManager().enabled = true;
cc.director.getPhysicsManager().enabled = true;
//cc.director.getPhysicsManager().debugDrawFlags = 1;
cc.director.getPhysicsManager().gravity = cc.Vec2.ZERO;
//this.node
//this.player = this.getComponentInChildren(Player);
//this.player.gameScene = this;
this.halfSize.width = (this.sceneSize.width - cc.winSize.width) / 2 ;
this.halfSize.height = (this.sceneSize.height - cc.winSize.height) / 2 ;
this.player.initKnife(3); //初始化3把刀
this.player.showface = DataManager.instance.getPlayerData().todayUseFace;
}
start () {
SoundManager.instance.PlayBGSound(BgSoundClipType.main);
this.clock.node.active = false;
this.cdTxt.node.active = false;
this.playerArr.push(this.player);
this.player.skin = 1;
if(WXSdk.instance.isWXPlatform())
{
if(WXSdk.instance.isLogin)
{
this.onWxLogin();
}else
{
this.player.setName("");
cc.systemEvent.on("wxLogin",this.onWxLogin,this);
}
}else
{
var nn = cc.sys.localStorage.getItem("playname");
if( nn== "" || nn==null || nn== undefined )
{
nn = "小李飞刀";
cc.sys.localStorage.setItem("playname",nn);
}
this.player.setName(nn);
}
for(var i = 0; i < this.aiPlayerCount ; i++)
{
this.aiNameIndexArr.push(this.getRandomNameIndex());
}
}
private onWxLogin()
{
this.player.setName(WXSdk.instance.nickname);
}
public startGame()
{
GameManager.instance.gameStatus = GameStatus.start;
GameManager.gameTimes ++;
DataManager.instance.getPlayerData().games++;
DataManager.instance.savePlayerData();
var star:number = DataManager.instance.getPlayerData().star;
var levelId = DataManager.instance.getLevelId(star);
this.levelConfigData = DataManager.instance.levelConfigDatas[levelId - 1];
//cc.log("levelConfigData",this.levelConfigData);
var leveCnfdatas = DataManager.instance.levelConfigDatas;
if(levelId <= 5)
{
//当玩家还处于第一阶段时 显示导航
GameManager.instance.guide.node.active = true;
}else
{
GameManager.instance.guide.node.active = false;
}
this.initBarriers();
this.initAIPlayer(this.aiPlayerCount);
this.initKnifes(this.knifeNum);
this.initMark();
this.player.onGameStart();
//var cdTxt:cc.Label = this.clock.getComponent(cc.Label);
this.clock.node.active = true;
this.clock.hms = 2;
this.clock.timeLength = 2 * 60 + 31;
var timeTxt = this.clock.getComponentInChildren(cc.Label);
timeTxt.string = "" + this.clock.timeLength;
this.clock.Play((s,m,h,str,t)=>
{
if(t == 100 || t == 70 || t == 40)
{
this.wall.shrink();
}
if(this.clock.currentCount % 25 == 0)
{
var otherKfCount = 0;
if(this.blackHole)
{
otherKfCount = Math.ceil(this.blackHole.knifecount / 2);
this.blackHole.knifecount = 0;
}
this.initKnifes(5 + otherKfCount);
}
if(this.levelConfigData.hotWheels != "")
{
var arr = this.levelConfigData.hotWheels.split("-");
if(t % Number(arr[0]) == 0)
{
this.initItem(Number(arr[1]),ItemType.fhl)
}
}
if(this.levelConfigData.speedUp != "")
{
var arr = this.levelConfigData.speedUp.split("-");
if(t % Number(arr[0]) == 0)
{
this.initItem(Number(arr[1]),ItemType.rocket)
}
}
if(this.levelConfigData.magnet != "")
{
var arr = this.levelConfigData.magnet.split("-");
if(t % Number(arr[0]) == 0)
{
this.initItem(Number(arr[1]),ItemType.magnet)
}
}
if(t == 120)
{
if(this.levelConfigData.blackHole != 0)
{
var rangeWidth = this.sceneSize.width/2 - 350;
var rangeHeight = this.sceneSize.height/2 - 350;
this.blackHole = GameManager.instance.getBlackHole();
this.blackHole.node.parent = this.node;
this.blackHole.node.position = cc.v2(Random.Range(-rangeWidth,rangeWidth),Random.Range(-rangeHeight,rangeHeight));
}
}
timeTxt.string = `${t}`;
if(t <= 5)
{
this.cdTxt.node.active = true;
this.cdTxt.string = "" + t;
SoundManager.instance.playAudioClip(SoundClipType.dida);
}
if(t == 0)
{
this.cdTxt.node.active = false;
}
},
()=>{
this.clock.Stop();
var arr:Array<Player> = [];
for(var i = 0 ; i < this.playerArr.length ; i++)
{
if(this.playerArr[i].status != PlayerStatus.die && this.playerArr[i].rank == 1)
{
arr.push(this.playerArr[i]);
}
}
arr.sort((player1:Player,player2:Player):number=>
{
if(player1.killCount > player2.killCount)
{
return -1;
}else if(player1.killCount < player2.killCount)
{
return 1;
}else
{
var len1:number = player1.knifePool.knifes.length;
var len2:number = player2.knifePool.knifes.length;
if(len1 > len2)
{
return -1;
}
if(len1 < len2)
{
return 1;
}
}
return 0;
});
for(var i = 0 ; i < arr.length ; i++)
{
arr[i].rank = i + 1;
}
this.gameOver()
});
UIManager.instance.rankUI.node.active = true;
}
public gameOver()
{
GameManager.instance.gameStatus = GameStatus.over;
console.log("game over");
this.scheduleOnce(()=>{
//GameManager.instance.gameStatus = GameStatus.over;
UIManager.instance.rankUI.node.active = false;
UIManager.instance.accountUI.open();
},1.8);
}
public initBarriers()
{
var rangeWidth = this.sceneSize.width/2 - 350;
var rangeHeight = this.sceneSize.height/2 - 350;
if(this.levelConfigData.meteor != "")
{
var arr = this.levelConfigData.meteor.split("-");
var count:number = Random.RangeInteger(Number(arr[0]),Number(arr[0]));
for(var i = 0 ; i < count ; i++)
{
var barrier:cc.Node = GameManager.instance.getRandomBarrier(0);
barrier.parent = this.node;
barrier.position = cc.v2(Random.Range(-rangeWidth,rangeWidth),Random.Range(-rangeHeight,rangeHeight));
}
}
if(this.levelConfigData.movMeteor != "")
{
var arr = this.levelConfigData.movMeteor.split("-");
var count:number = Random.RangeInteger(Number(arr[0]),Number(arr[0]));
for(var i = 0 ; i < count ; i++)
{
var barrier:cc.Node = GameManager.instance.getRandomBarrier(1);
barrier.parent = this.node;
barrier.position = cc.v2(Random.Range(-rangeWidth,rangeWidth),Random.Range(-rangeHeight,rangeHeight));
}
}
}
public initItem(count:number,itemType:ItemType = ItemType.none)
{
var width:number = this.sceneSize.width / 2 - 150;
var height:number = this.sceneSize.height / 2 - 150;
for(var i = 0; i < count ; i++)
{
var item:Item = null;
if(itemType == ItemType.none)
{
item = GameManager.instance.getItemByType(Random.RangeInteger(1,4))
}else
{
item = GameManager.instance.getItemByType(itemType)
}
item.node.parent = this.node;
item.node.position = cc.v2(Random.Range(-width,width),Random.Range(-height,height));
}
}
/**
*
* @param count 初始化AI玩家
*/
public initAIPlayer(count:number)
{
var aiLvArr:PlayerAILevel[] = [];
for(var i = 1 ; i <= 4 ; i++)
{
for(var j = 0 ; j < this.levelConfigData[`ailv${i}`]; j++)
{
aiLvArr.push(i);
}
}
for(var i = 0; i < count ; i++)
{
var player = GameManager.instance.getPlayer();
player.node.parent = this.node;
player.isAI = true;
player.showface = Random.Range(0,10) < 3 ? true : false;
player.getComponent(PlayerAI).aiLevel = !aiLvArr[i] ? PlayerAILevel.level1 : aiLvArr[i];
player.onGameStart();
player.randomKnifeSkin();
player.getComponent(PlayerAI).onGameStart();
var index = Random.RangeInteger(0,this.getSkinIndexArr().length);
var skinIndex = this.getSkinIndexArr()[index];
this.getSkinIndexArr().splice(index,1);
player.skin = skinIndex;
player.setName(DataManager.instance.nameConfigDatas[this.aiNameIndexArr[i]].name);
this.playerArr.push(player);
var width:number = this.sceneSize.width / 2 - 150;
var height:number = this.sceneSize.height / 2 - 150;
player.node.position = cc.v2(Random.Range(-width,width),Random.Range(-height,height));
}
}
private getSkinIndexArr()
{
if(this.skinIndexArr.length == 0)
{
for(var i = 1 ; i <= 8; i++)
{
this.skinIndexArr.push(i)
}
var index:number = this.skinIndexArr.indexOf(this.player.skin);
if(index != -1)
{
this.skinIndexArr.splice(index,1);
}
}
return this.skinIndexArr;
}
public getRandomNameIndex():number
{
var index:number = Random.RangeInteger(0,this.getNameIndexArr().length);
var nameIndex:number = this.getNameIndexArr()[index];
this.getNameIndexArr().splice(index,1);
//return DataManager.instance.nameConfigDatas[nameIndex].name;
return nameIndex;
}
public getNameIndexArr()
{
if(this.nameIndexArr.length == 0)
{
var nameArr = DataManager.instance.nameConfigDatas;
var len:number = 50;
for(var i = 0 ; i < len; i++)
{
this.nameIndexArr.push(i)
}
}
return this.nameIndexArr;
}
/**
* 有玩家被击杀时
* @param killer 击杀人
* @param dieMan 被击杀对象
*/
public playerKilled(killer:Player,dieMan:Player)
{
//cc.log(killer.getName(),"击杀了",dieMan.getName());
killer.killCount ++;
dieMan.rank = this.rank;
this.rank--;
var killEffect:MovieClip = GameManager.instance.getKillEffect();
killEffect.node.color = dieMan.body.node.color;
killEffect.node.parent = this.node;
killEffect.node.position = dieMan.node.position;
killer.changeFace(2,1.5);
if(killer == this.player)
{
DataManager.instance.getPlayerData().kills ++;
if(this.player.killCount == 4)
{
DataManager.instance.getPlayerData().kills4 ++;
}else if(this.player.killCount == 5)
{
DataManager.instance.getPlayerData().kills5 ++;
}else if(this.player.killCount == 6)
{
DataManager.instance.getPlayerData().kills6 ++;
}
DataManager.instance.savePlayerData();
}
//if(!killer.isAI)
//{
UIManager.instance.messageUI.showMessage(killer,dieMan);
//}
if(!dieMan.isAI)
{
WXSdk.instance.vibrateLong();//玩家自己死亡,长震动
CameraFollow.instance.shake(1);
this.clock.Stop();
this.gameOver()
}else
{
if(!killer.isAI)
{
WXSdk.instance.vibrateShort();//别的玩家自己死亡
CameraFollow.instance.shake(1);
SoundManager.instance.playAudioClip(SoundClipType.killMam);
}
var playerArr:Player[] = this.getComponentsInChildren(Player);
var isEnd = true;
for(var i = 0 ; i < playerArr.length ; i++)
{
if(!playerArr[i].node.active)
{
continue;
}
if(playerArr[i].isAI && playerArr[i].status != PlayerStatus.die)
{
isEnd = false;
break;
}
}
if(isEnd)
{
this.clock.Stop();
this.gameOver()
}
}
}
public initKnifes(count:number)
{
for(var i = 0 ; i < count ; i++)
{
var knife:Knife = GameManager.instance.getKnife(KnifeType.normal);
var width:number = this.sceneSize.width / 2 - 150;
var height:number = this.sceneSize.height / 2 - 150;
knife.node.rotation = Random.Range(0,360);
knife.node.position = cc.v2(Random.Range(-width,width),Random.Range(-height,height));
this.addKnife(knife);
}
}
public initMark()
{
var playerArr:Array<Player> = this.getComponentsInChildren(Player);
for(var i = 0 ; i < playerArr.length ; i++)
{
var player:Player = playerArr[i];
if(player.isAI && player.node.active)
{
var mark = GameManager.instance.getMark();
//mark.node.parent = cc.Camera.main.node;
mark.node.parent = UIManager.instance.getLayer(LayerType.back);
mark.player = this.player;
mark.targetPlayer = player;
}
}
}
public addKnife(knife:Knife)
{
if(knife.node.parent)
{
knife.node.parent.removeChild(knife.node);
}
this.node.addChild(knife.node,0);
if(this.knifeArr.indexOf(knife) == -1)
{
this.knifeArr.push(knife);
}
this.node.emit("knifesChange",{});
}
public removeKnife(knife:Knife)
{
var index:number = this.knifeArr.indexOf(knife);
if(index != -1)
{
this.knifeArr.splice(index,1);
}
this.node.emit("knifesChange",{});
}
/*update (dt)
{
}*/
onDestroy()
{
cc.systemEvent.off("wxLogin",this.onWxLogin,this);
}
}