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

305 lines
7.6 KiB
TypeScript

import Player, { PlayerStatus } from "./Player";
import Knife, { KnifeType, KnifeStatus } from "./Knife";
import Random from "../util/Random";
import GameManager from "../core/GameManager";
import CommonUils from "../util/CommonUils";
import DataManager from "../core/DataManager";
// 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 KnifePool extends cc.Component {
@property(Player)
public player:Player = null;
public radius:number = 125;
public rotaSpeed = 180;
private rotaAngle:number = 0;
public knifes:Array<Knife> = [];
private limitNum:number = 25;
private baseNum:number = 100;
// LIFE-CYCLE CALLBACKS:
// onLoad () {}
start () {
this.knifes = this.getComponentsInChildren(Knife);
//this.initKnife(this.initCount);
this.changeDefenceState();
/*cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP,(event)=>{
switch(event.keyCode)
{
case cc.macro.KEY.a:
this.refresh();
break;
case cc.macro.KEY.s:
this.refresh2();
break;
case cc.macro.KEY.d:
cc.log("场景飞刀数",this.player.gameScene.knifeArr.length);
break;
}
})*/
}
update (dt)
{
this.rotaAngle -= dt * this.rotaSpeed * this.player.rotaSpeedUp;
this.rotaAngle %= 360;
this.node.angle = this.rotaAngle;
}
public initKnife(count:number)
{
var tempKnife:Array<Knife> = this.knifes.slice();
for(var i = 0 ; i < tempKnife.length ; i++)
{
this.removeKnife(tempKnife[i]);
tempKnife[i].destroySelf();
}
for(var i = 0 ; i < count ; i++)
{
var knife:Knife = GameManager.instance.getKnife(KnifeType.normal);
this.addKnife(knife);
}
}
public addKnife(knife:Knife)
{
if(this.knifes.indexOf(knife) != -1)
{
return;
}
if(knife.node.parent != null)
{
var worldPos:cc.Vec2 = knife.node.parent.convertToWorldSpaceAR(knife.node.position);
var relaPos:cc.Vec2 = this.node.convertToNodeSpaceAR(worldPos);
knife.node.position = relaPos;
}
knife.node.parent = this.node;
knife.player = this.player;
knife.status = KnifeStatus.capture;
knife.setSkin(this.player.knifeId);
this.knifes.push(knife);
if(!this.player.isAI)
{
if(this.knifes.length > DataManager.instance.getPlayerData().knives)
{
DataManager.instance.getPlayerData().knives = this.knifes.length;
DataManager.instance.saveLevelData();
}
}
if(this.player.status == PlayerStatus.defence)
{
this.changeDefenceState();
}
else if(this.player.status == PlayerStatus.attack)
{
this.changeAttackState();
}
}
public updateKnifesSkin(knifeId:number)
{
var len:number = this.knifes.length;
for(var i = 0 ; i < len ; i++)
{
this.knifes[i].setSkin(knifeId);
}
}
public removeKnife(knife:Knife)
{
var index:number = this.knifes.indexOf(knife);
if(index != -1)
{
this.knifes.splice(index,1);
if(this.player.status == PlayerStatus.defence)
{
this.changeDefenceState();
}
else if(this.player.status == PlayerStatus.attack)
{
this.changeAttackState();
}
}
}
public disposeAllKnifes()
{
var arr:Array<Knife> = this.knifes.slice();
for(var i = 0 ; i < arr.length ; i++)
{
var dir:cc.Vec2 = cc.v2(Random.Range(-1,1),Random.Range(-1,1)).normalize();
arr[i].fly(dir);
}
}
/**
* 切换防御状态
*/
public changeDefenceState()
{
var len:number = this.knifes.length;
var angle:number = 2 * Math.PI / len;
var eulerAngle = 360 / len;
//var t = 1 / len;
/*if(t > 0.1)
{
t > 0.1
}
if(t <= 0.001)
{
t = 0.001;
}
this.schedule(()=>{
var knife:Knife = this.knifes[i];
if(!knife)
return;
knife.node.stopAllActions();
var pos:cc.Vec2 = cc.v2(this.radius * Math.cos(i * angle),this.radius * Math.sin(i * angle));
knife.setPos(pos);
knife.setRota(90 - i * eulerAngle);
//knife.setScale(Random.Range(1,4));
i++;
},t,len - 1)*/
//this.radius = 160 + Math.floor(len/10) * 30;
var rd:number = len < 10 ? 10 : len;
var radiusScale = len / this.baseNum + (1 - this.limitNum /this.baseNum);
this.radius = (133.9308 * radiusScale + rd * 5.3564);
this.rotaSpeed = 144;
this.player.size = (115 + len * 1.94) / 115;
this.player.pickRadius = this.radius;
for(var i = 0 ; i < len ; i++)
{
var knife:Knife = this.knifes[i];
knife.node.stopAllActions();
if(len >= this.limitNum)
{
knife.node.scale = ((i % 5 + 1) / 5 * 0.6 + 0.75);
}else
{
//knife.node.scale = 1;
knife.node.scale = radiusScale;
}
var pos:cc.Vec2 = cc.v2(this.radius * Math.cos(i * angle),this.radius * Math.sin(i * angle));
knife.setPos(pos);
knife.setRota(90 - i * eulerAngle);
//knife.setScale(Random.Range(1,4));
}
}
/**
* 切换进攻状态
*/
public changeAttackState()
{
var len:number = this.knifes.length;
var angle:number = 2 * Math.PI / len;
var eulerAngle = 360 / len;
//this.radius = 160 + Math.floor(len/10) * 30;
var rd:number = len < 10 ? 10 : len;
var radiusScale = len / this.baseNum + (1 - this.limitNum /this.baseNum);
this.radius = 133.9308 * radiusScale + rd * 5.3564 + 90 * radiusScale;
this.rotaSpeed = 160;
this.player.size = (115 + len * 1.94) / 115;
this.player.pickRadius = this.radius;
for(var i = 0 ; i < len ; i++)
{
var knife:Knife = this.knifes[i];
knife.node.stopAllActions();
if(len >= this.limitNum)
{
knife.node.scale = ((i % 5 + 1) / 5 * 0.6 + 0.75);
}else
{
//knife.node.scale = 1;
knife.node.scale = radiusScale;
}
var pos:cc.Vec2 = cc.v2(this.radius * Math.cos(i * angle),this.radius * Math.sin(i * angle));
knife.setPos(pos);
knife.setRota(180 - i * eulerAngle);
}
}
}