games/FullFire/assets/scripts/Ball.ts

276 lines
9.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Define from "./common/Define";
import GameManager from "./manager/GameManager";
import Common from "./common/Common";
import LDataStone from "./datas/LDataStone";
import LDataStoneManager from "./datas/LDataStoneManager";
import LevelInfo from "./Levellnfo";
import ParticleEffectManager from "./manager/ParticleEffectManager";
import SoundManager from "./manager/SoundManager";
import UIManager from "./manager/UIManager";
import WXHelper from "./common/WXHelper";
import UserInfo from "./UserInfo";
// 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 Ball extends cc.Component {
public rigidBody:cc.RigidBody;
@property(cc.Label)
labelNumber:cc.Label = null;
@property(cc.Node)
icon:cc.Node = null;
@property(cc.Node)
effectRoot:cc.Node = null;
nTotalNumber:number = 0;
isCanDrop:boolean = false;
callBack:Function = null;
physicsCircle:cc.PhysicsCircleCollider = null;
stoneData:LDataStone = null;
spriteIcon:cc.Sprite = null;
initScore:number = null;
isCanShake:boolean = true;
private lastGravityScale:number = 0;
private lastAngularVelocity:number = 0;
private lasLlinearVelocity:cc.Vec2 = cc.Vec2.ZERO;
private _stoneId: number = -1;
public get stoneId(): number {
return this._stoneId;
}
public set stoneId(value: number) {
this._stoneId = value;
this.stoneData = LDataStoneManager.GetDataById(value);
}
onLoad()
{
this.rigidBody = this.node.getComponent<cc.RigidBody>(cc.RigidBody);
this.rigidBody.active = false;
this.rigidBody.linearVelocity = cc.Vec2.ZERO;
this.physicsCircle = this.node.getComponent<cc.PhysicsCircleCollider>(cc.PhysicsCircleCollider);
}
setNumber(total:number){
this.nTotalNumber = total;
this.initScore = this.nTotalNumber;
this.labelNumber.string = Common.getShowNumber(this.nTotalNumber);
this.icon.color = Common.getStoneColor(LevelInfo.getCurLevelMaxScore(),this.nTotalNumber)
this.handlerNumberScale();
}
getShowColor():cc.Color{
return this.node.color;
}
getNumber():number{
return this.nTotalNumber;
}
handlerNumberScale(){
let tempScale = 1;
if(this.labelNumber.string.length == 1){
tempScale = this.stoneData.scalesize01;
}else if(this.labelNumber.string.length == 2){
tempScale = this.stoneData.scalesize02;
}else if(this.labelNumber.string.length == 3){
tempScale = this.stoneData.scalesize03;
}else if(this.labelNumber.string.length == 4){
tempScale = this.stoneData.scalesize04;
}
this.labelNumber.node.setScale(tempScale)
}
Hit(hurt:number = 1):number{
this.nTotalNumber = this.nTotalNumber - hurt;
if(this.nTotalNumber <= 0){
this.nTotalNumber = 0;
GameManager.instance.ShakeBg(2 + this._stoneId);
//SoundManager.palySoundById(Define.soundStonebomb)
}
this.labelNumber.string = Common.getShowNumber(this.nTotalNumber);
this.handlerNumberScale();
if(this.nTotalNumber > 0){
this.icon.color = Common.getStoneColor(LevelInfo.getCurLevelMaxScore(),this.nTotalNumber)
if(this.isCanShake)
{
this.isCanShake = false;
let minScale = 0.9;
if(this.stoneData.stonId > 1){
minScale = 0.95;
}
this.node.runAction(cc.sequence(cc.scaleTo(0.05,minScale),cc.scaleTo(0.05,1),
cc.callFunc(function(){
this.isCanShake = true;
}.bind(this))));
}
}
return this.nTotalNumber;
}
onBeginContact(contact: cc.PhysicsContact, selfCollider: cc.PhysicsCollider, otherCollider: cc.PhysicsCollider): void{
let other = otherCollider.node.name;
if(other == "floor")
{
let tempPos = new cc.Vec2(this.node.position.x ,this.node.position.y - this.stoneData.radius) ;
ParticleEffectManager.getInstance().showParticleEffect(Define.effectParticleToground,tempPos,0.5);
this.rigidBody.linearVelocity = cc.v2(this.rigidBody.linearVelocity.x,Define.ballRestitutionMaxArr[this._stoneId]);
GameManager.instance.ShakeBg(2 + this._stoneId);
//SoundManager.palySoundById(Define.soundStonetoground)
}
else if(other.indexOf("cannon") == 0){
if(!Common.isGod){
if(UserInfo.curLevel <= 3){
UIManager.getInstance().executeEvent(Define.viewBattle,"showPrompt")
WXHelper.brateLong();
}else{
Common.actionTinkColor(this.labelNumber.node);
GameManager.instance.gameOver(this);
}
}
}
if(other == "floor" ||other == "wall"){
if(Math.abs( this.rigidBody.linearVelocity.x) > 200){
if(this.rigidBody.linearVelocity.x > 0){
this.rigidBody.linearVelocity = cc.v2(100,this.rigidBody.linearVelocity.y);
}else{
this.rigidBody.linearVelocity = cc.v2(-100,this.rigidBody.linearVelocity.y);
}
}
}
}
appear(dir:number,dir1:number = -1,pos:cc.Vec2 = cc.Vec2.ZERO,intY:number = 800){
this.rigidBody.active = false;
this.rigidBody.linearVelocity = cc.Vec2.ZERO;
if(dir == Define.right){
this.node.position = cc.v2(this.getAppearPosX(dir),intY);
this.rigidBody.angularVelocity = -30
this.node.runAction(
cc.sequence(cc.moveTo(2,cc.v2(this.getAppearTargetX(dir),intY)),
cc.callFunc(function(){
this.node.group = Define.groupBall;
this.rigidBody.linearVelocity = cc.v2(-100,-100);
this.rigidBody.active = true;
this.isCanDrop = true;
}.bind(this))
));
}else if(dir == Define.left){
this.rigidBody.angularVelocity = 30
this.node.position = cc.v2(this.getAppearPosX(dir),intY);
this.node.runAction(
cc.sequence(cc.moveTo(2,cc.v2(this.getAppearTargetX(dir),intY)),
cc.callFunc(function(){
this.node.group = Define.groupBall;
this.rigidBody.linearVelocity = cc.v2(100,-100);
this.isCanDrop = true;;
this.rigidBody.active = true;
}.bind(this))
));
}
else if(dir == Define.center){
if(dir1 == Define.left){
this.node.position = pos;
this.rigidBody.angularVelocity = -30
this.node.group = Define.groupBall;
this.rigidBody.linearVelocity = cc.v2(-200,300);
this.rigidBody.active = true;
this.isCanDrop = true;
}
else if(dir1 == Define.right){
this.node.position = pos;
this.rigidBody.angularVelocity = 30
this.node.group = Define.groupBall;
this.rigidBody.linearVelocity = cc.v2(200,300);
this.rigidBody.active = true;
this.isCanDrop = true;
}
}
}
setCallBack(callBack:Function){
this.callBack = callBack;
}
update (dt) {
if(!this.isCanDrop){
this.rigidBody.linearVelocity = cc.Vec2.ZERO;
}
}
stopDrop(){
this.rigidBody.active = false;
this.rigidBody.linearVelocity = cc.Vec2.ZERO;
}
getAppearPosX(dir:number):number{
//移动距离大的固定的距离 240
if(dir == Define.left){
return -240 + this.stoneData.radius;
}else if(dir == Define.right){
return 880 - this.stoneData.radius
}
}
getAppearTargetX(dir:number):number{
if(dir == Define.left){
return this.stoneData.radius;
}else if(dir == Define.right){
return 640 - this.stoneData.radius;
}
}
getBreakScore():number{
return Math.ceil((this.initScore/2));
/*分裂规则
石块上数字清零后分裂出的数字为石块数字除以二获得2个分数石块。
若出现无法被2出尽的情况则在原分数减1后再除以2
石块上为1时只能分裂成1*/
}
//是否暂停移动
pauseMove(isPause:boolean){
if(isPause){
this.lastGravityScale = this.rigidBody.gravityScale
this.lastAngularVelocity = this.rigidBody.angularVelocity
this.lasLlinearVelocity = this.rigidBody.linearVelocity
this.rigidBody.gravityScale = 0
this.rigidBody.angularVelocity = 0
this.rigidBody.linearVelocity = cc.Vec2.ZERO
this.node.pauseAllActions();
}else{
this.node.resumeAllActions();
this.rigidBody.gravityScale = this.lastGravityScale
this.rigidBody.angularVelocity = this.lastAngularVelocity
this.rigidBody.linearVelocity = this.lasLlinearVelocity
}
}
}