609 lines
20 KiB
JavaScript
609 lines
20 KiB
JavaScript
var Utils = require("Utils")
|
|
var dtoh = 0.0174528
|
|
var boomscale = 0.3
|
|
var battlenet = require("battlenetmanage")
|
|
var temphouse = {
|
|
width: 0,
|
|
height: 0,
|
|
x: 0,
|
|
y: 0,
|
|
}
|
|
var BulletManage = function() {
|
|
this.bulletpool = [];
|
|
this.bulletarr = [];
|
|
this.bulletNode = null;
|
|
this.time = 9999
|
|
this.reset = function() {
|
|
this.bulletpool.length = 0;
|
|
this.bulletarr.length = 0;
|
|
this.bulletNode = null;
|
|
}
|
|
this.clean = function() {
|
|
for (var i = 0; i < this.bulletpool.length; i++) {
|
|
this.bulletpool[i].bullet = null
|
|
this.bulletpool[i].effect = null
|
|
|
|
}
|
|
for (var i = 0; i < this.bulletarr.length; i++) {
|
|
this.bulletarr[i].bullet = null
|
|
this.bulletarr[i].effect = null
|
|
}
|
|
this.reset()
|
|
}
|
|
this.createBullet = function(lv, gun, dir, pos, owner, distance, oid,netdata) {
|
|
|
|
var bullet
|
|
if (this.bulletpool.length > 0) {
|
|
bullet = this.bulletpool.pop();
|
|
} else {
|
|
bullet = new cc.Node();
|
|
|
|
|
|
bullet.effect = new cc.Node()
|
|
bullet.effect.anchorX = 1
|
|
bullet.effect.addComponent(cc.Sprite)
|
|
bullet.addChild(bullet.effect)
|
|
|
|
bullet.bullet = new cc.Node()
|
|
bullet.addChild(bullet.bullet)
|
|
var sp = bullet.bullet.addComponent(cc.Sprite)
|
|
sp.sizeMode = 2
|
|
sp.trim = false
|
|
this.bulletNode.addChild(bullet);
|
|
|
|
|
|
bullet.shadow = new cc.Node()
|
|
bullet.shadow.zIndex = 32767
|
|
cc.gameMgr.ndhouse.addChild(bullet.shadow)
|
|
var sp2 = bullet.shadow.addComponent(cc.Sprite)
|
|
sp2.sizeMode = 2
|
|
sp2.trim = false
|
|
bullet.shadow.scale = 0.5
|
|
bullet.shadow.color = cc.color(0, 0, 0)
|
|
|
|
|
|
|
|
bullet.prefabnode = new cc.Node()
|
|
bullet.addChild(bullet.prefabnode)
|
|
|
|
// bullet.effnode = new cc.Node()
|
|
// bullete.addChild(bullet.effnode);
|
|
}
|
|
//test
|
|
// dir = Utils.dirRotate(dir,(Utils.randintSeed(10)-5)*dtoh)
|
|
|
|
// bullet.effect.getComponent(cc.ParticleSystem).resetSystem();
|
|
|
|
var esp = bullet.effect.getComponent(cc.Sprite)
|
|
var tailres = gun.bullet_tail ? gun.bullet_tail : "tail1"
|
|
|
|
esp.spriteFrame = cc.atlMgr.bulletatlas.getSpriteFrame(tailres)
|
|
esp.trim = false
|
|
bullet.effect.width = 20
|
|
|
|
|
|
|
|
bullet.opacity = 255
|
|
bullet.shadow.opacity = 100
|
|
// this.bulletNode.addChild(bullet);
|
|
bullet.position = pos
|
|
bullet.rotation = -Math.atan2(dir.y, dir.x) * (180 / Math.PI);
|
|
bullet.bullet.x = bullet.bullet.y = 0
|
|
bullet.shadow.rotation = bullet.rotation
|
|
|
|
bullet.owner = owner;
|
|
bullet.isboom = false;
|
|
bullet.ownerid = oid
|
|
|
|
|
|
this.bulletarr.push(bullet);
|
|
this.setBulletData(lv, bullet, gun, dir, distance,netdata);
|
|
};
|
|
|
|
this.deletabullets = function(delarr){
|
|
for(var j=0;j<delarr.length;j++){
|
|
for (var i = this.bulletarr.length - 1; i >= 0; i--) {
|
|
if(this.bulletarr[i].bullet_uniid == delarr[j]){
|
|
this.bulletarr[i].opacity = 0
|
|
this.bulletpool.push(this.bulletarr[i])
|
|
this.bulletarr.splice(i, 1);
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
this.setBulletData = function(lv, bullet, gun, dir, distance,netdata) {
|
|
var bdata = gun
|
|
var plusdis = 0
|
|
|
|
|
|
if (bullet.effani) {
|
|
cc.gameMgr.effectManager.huishoulooteff(bullet.effani.prefabname, bullet.effani)
|
|
bullet.effani = null
|
|
}
|
|
bullet.prefabnode.destroyAllChildren()
|
|
bullet.bullet_uniid = netdata.bullet_uniid
|
|
bullet.gundata = gun
|
|
var sprite = bullet.bullet.getComponent(cc.Sprite);
|
|
var sp2 = bullet.shadow.getComponent(cc.Sprite);
|
|
|
|
bullet.bdistance = (bdata.range + plusdis) * (bdata.range + plusdis);
|
|
bullet.bdistanceboom = bdata.range + plusdis
|
|
bullet.needEff = null
|
|
bullet.isclose = false
|
|
bullet.lifetime2 = bdata.missiles_time / 1000
|
|
if (!bullet.lifetime2) {
|
|
bullet.lifetime2 = 0
|
|
}
|
|
bullet.rotstartv = 600
|
|
bullet.update2start = false
|
|
|
|
bullet.deadwaittime = 0
|
|
bullet.needdead = false
|
|
bullet.bullet.opacity = 255
|
|
bullet.shadow.opacity = 255
|
|
|
|
if (bdata.fixrotation) {
|
|
bullet.rotation = 0
|
|
}
|
|
if (bdata.equip_type == 3) {
|
|
bullet.isboom = true;
|
|
|
|
if (!bdata.bullet_eff) {
|
|
cc.loader.loadRes("icons/" + bdata.world_img, cc.SpriteFrame, function(err, res) {
|
|
if (!err && sprite.isValid) {
|
|
sprite.spriteFrame = res;
|
|
sprite.sizeMode = 2
|
|
sprite.trim = false
|
|
|
|
sp2.spriteFrame = res;
|
|
sp2.sizeMode = 2
|
|
sp2.trim = false
|
|
}
|
|
});
|
|
|
|
} else {
|
|
sprite.spriteFrame = null
|
|
sp2.spriteFrame = null
|
|
}
|
|
|
|
|
|
bullet.bdistance = distance * distance;
|
|
bullet.effect.opacity = 0
|
|
// bullet.owner.throw()
|
|
bullet.bullet.scale = 1
|
|
bullet.shadow.scale = 0.3
|
|
} else if (bdata.equip_subtype == 1) {
|
|
sprite.spriteFrame = null;
|
|
sp2.spriteFrame = null;
|
|
|
|
bullet.needEff = bdata.hit_fire
|
|
|
|
|
|
// bullet.needEff = "eff_fightfire"
|
|
bullet.isclose = true
|
|
bullet.effect.opacity = 0
|
|
// bullet.owner.shotSound(bullet.gundata.sound_use, bullet.position);
|
|
bullet.owner.shotAni(bullet.gundata.sound_use, bullet.position, dir, bullet.gundata.shootfire,bullet.gundata.shootfire2,bullet.rotation,bullet.gundata);
|
|
|
|
|
|
} else {
|
|
var bres = bdata.bullet_icon ? bdata.bullet_icon : "b1"
|
|
|
|
|
|
sprite.spriteFrame = cc.atlMgr.bulletatlas.getSpriteFrame(bres)
|
|
sprite.sizeMode = 2
|
|
sprite.trim = false
|
|
|
|
|
|
sp2.spriteFrame = cc.atlMgr.bulletatlas.getSpriteFrame(bres)
|
|
sp2.sizeMode = 2
|
|
sp2.trim = false
|
|
|
|
if (!bdata.isskill) {
|
|
bullet.owner.shotAni(bullet.gundata.sound_use, bullet.position, dir, bullet.gundata.shootfire,bullet.gundata.shootfire2,bullet.rotation,bullet.gundata);
|
|
}
|
|
|
|
bullet.effect.opacity = 255
|
|
|
|
bullet.bullet.scale = 0.5
|
|
bullet.shadow.scale = 0.3
|
|
// if(bdata.equip_subtype!=8){//
|
|
// if(bdata.hit_fire){
|
|
// bullet.needEff = bdata.hit_fire
|
|
// }else{
|
|
// bullet.needEff = "eff_bulletfire"
|
|
// }
|
|
|
|
// }
|
|
bullet.needEff = bdata.hit_fire
|
|
if (bdata.bullet_life) {
|
|
bullet.deadwaittime = bdata.bullet_life / 1000
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bdata.bullet_eff) {
|
|
var cb = function(res) {
|
|
if (bullet && bullet.isValid) {
|
|
bullet.effani = res
|
|
bullet.effani.prefabname = bdata.bullet_eff
|
|
bullet.prefabnode.addChild(bullet.effani);
|
|
} else {
|
|
console.log("!11111111111111")
|
|
}
|
|
}
|
|
// bullet.prefabname = bdata.bullet_eff
|
|
cc.gameMgr.effectManager.createlooteff(bdata.bullet_eff, cb)
|
|
}
|
|
|
|
|
|
bullet.bmoveDir = dir;
|
|
bullet.bspeed = bdata.bullet_speed;
|
|
bullet.width = bullet.height = bdata.bullet_rad * 2
|
|
// bullet.bullet.width = bullet.width
|
|
// bullet.bullet.height = bullet.height
|
|
bullet.effect.width = 20
|
|
bullet.startPos = bullet.position
|
|
|
|
|
|
bullet.ispenetrate = bdata.ispenetrate
|
|
|
|
|
|
if(bullet.isup){
|
|
bullet.removeFromParent(false)
|
|
this.bulletNode.addChild(bullet)
|
|
}
|
|
bullet.isup = bdata.isup
|
|
if(bullet.isup){
|
|
bullet.removeFromParent(false)
|
|
cc.gameMgr.ndtree.addChild(bullet)
|
|
}
|
|
|
|
|
|
|
|
if (this.time > 1) {
|
|
this.housearr = []
|
|
this.playerarr = []
|
|
//this.lootarr = []
|
|
|
|
for (var i = cc.gameMgr.playerarr.length - 1; i >= 0; i--) {
|
|
if (cc.gameMgr.playerarr[i].opacity == 255) {
|
|
this.playerarr.push(cc.gameMgr.playerarr[i])
|
|
}
|
|
}
|
|
// for(var i = cc.gameMgr.housearr.length-1;i>=0;i--){
|
|
// if(cc.gameMgr.housearr[i].opacity==255){
|
|
// this.housearr.push(cc.gameMgr.housearr[i])
|
|
// }
|
|
// }
|
|
// for(var i = cc.gameMgr.lootarr.length-1;i>=0;i--){
|
|
// if(cc.gameMgr.lootarr[i].opacity==255){
|
|
// this.lootarr.push(cc.gameMgr.lootarr[i])
|
|
// }
|
|
// }
|
|
this.time = 0
|
|
}
|
|
|
|
|
|
bullet.peoplesound = bdata.sound_hit
|
|
|
|
}
|
|
this.shot = function(gun, dir, pos, owner, shotTime) {
|
|
this.createBullet(gun, dir, pos, owner, shotTime);
|
|
};
|
|
this.checkHouse = function(player, house) {
|
|
var count = 0;
|
|
for (var i = house.objChildren.length - 1; i >= 0; i--) {
|
|
if (Utils.hitTestRectangle(player, house.objChildren[i])) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
|
|
// for(var i=house.doorChildren.length-1;i>=0;i--){
|
|
// if(house.doorChildren[i].active && Utils.hitTestRectangle(player, house.doorChildren[i])){
|
|
// return true
|
|
// }
|
|
// }
|
|
return false;
|
|
|
|
};
|
|
this.update = function(dt) {
|
|
this.time += dt
|
|
//var housearr = this.housearr
|
|
var playerarr = this.playerarr
|
|
// var lootarr = this.lootarr
|
|
var vw = 50
|
|
var vh = 50
|
|
var delta = 0
|
|
var dx = 0
|
|
var dy = 0
|
|
var bt = null
|
|
var tpos = null
|
|
var eff = null
|
|
var bdisb = 0
|
|
var bbili = 0
|
|
var hitf = null
|
|
var bshow = null
|
|
var upv = 10
|
|
for (var i = this.bulletarr.length - 1; i >= 0; i--) {
|
|
bt = this.bulletarr[i];
|
|
if (bt.update2start) {
|
|
bt.lifetime2 -= dt
|
|
bt.rotstartv -= dt * 600
|
|
if (bt.rotstartv > 0) {
|
|
bt.rotation += dt * bt.rotstartv
|
|
}
|
|
|
|
if (bt.lifetime2 <= 0) {
|
|
battlenet.dohit(bt.gundata, null, 4, bt.position)
|
|
bt.opacity = 0
|
|
bt.shadow.opacity = 0
|
|
this.bulletpool.push(bt)
|
|
this.bulletarr.splice(i, 1);
|
|
}
|
|
continue
|
|
}
|
|
if (bt.needdead) {
|
|
bt.deadwaittime -= dt
|
|
if (bt.deadwaittime <= 0) {
|
|
bt.opacity = 0
|
|
this.bulletpool.push(bt)
|
|
this.bulletarr.splice(i, 1);
|
|
}
|
|
continue
|
|
}
|
|
|
|
|
|
delta = dt * bt.bspeed;
|
|
dx = bt.bmoveDir.x * delta;
|
|
dy = bt.bmoveDir.y * delta;
|
|
|
|
bt.x = bt.x + dx;
|
|
bt.y = bt.y + dy;
|
|
|
|
tpos = bt.position
|
|
|
|
bshow = bt.shadow
|
|
upv = 10
|
|
if (bt.isboom) {
|
|
upv = 10
|
|
bt.rotation += dt * 600
|
|
bshow.rotation = bt.rotation
|
|
bdisb = Math.sqrt((Math.pow((bt.x - bt.startPos.x), 2) + Math.pow((bt.y - bt.startPos.y), 2)))
|
|
|
|
bbili = bdisb / bt.bdistanceboom
|
|
|
|
if (bbili < 0.5) {
|
|
bt.bullet.scale = (1 + bbili * 1.5)
|
|
} else {
|
|
bt.bullet.scale = (1 + (1 - bbili) * 1.5)
|
|
}
|
|
|
|
//bshow.scale = (2-bt.bullet.scale)*0.3
|
|
bt.bullet.scale *= boomscale
|
|
|
|
}
|
|
eff = bt.needEff
|
|
|
|
if (bt&&!bt.ispenetrate) {
|
|
for (var j = playerarr.length - 1; j >= 0; j--) {
|
|
|
|
|
|
if (playerarr[j].pctrl.kct||playerarr[j].pctrl.isdead() || playerarr[j].opacity == 0 || bt.owner.node == playerarr[j] || playerarr[j].active == false || playerarr[j].pctrl.horsemode || playerarr[j].pctrl.chuantou>0) {
|
|
continue;
|
|
}
|
|
|
|
if (Utils.hitTestCircle(bt, playerarr[j])) {
|
|
//bt.opacity = 0
|
|
// this.bulletpool.push(bt)
|
|
// this.bulletarr.splice(i, 1);
|
|
|
|
bt.bullet.opacity = 0
|
|
bt.shadow.opacity = 0
|
|
bt.needdead = true
|
|
|
|
if (bt.peoplesound) {
|
|
cc.gameMgr.playSound(bt.peoplesound, playerarr[j].position)
|
|
}
|
|
battlenet.dohit(bt.gundata, playerarr[j].objuuid, 1, bt.position, bt.ownerid)
|
|
bt = null
|
|
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bt) {
|
|
var lootarr = cc.gameMgr.getlootarr({
|
|
x: bt.x,
|
|
y: bt.y,
|
|
width: bt.width * 5,
|
|
height: bt.height * 5
|
|
})
|
|
|
|
|
|
for (var j = lootarr.length - 1; j >= 0; j--) {
|
|
|
|
if (lootarr[j].uuid) {
|
|
var oneloot = cc.gameMgr.lootmap[lootarr[j].uuid]
|
|
|
|
|
|
if (oneloot.hp <= 0 || oneloot.opacity == 0 || oneloot.istree == 2 || oneloot.istree == 3 || oneloot.event) {
|
|
continue;
|
|
}
|
|
if (oneloot.isdead || oneloot.bullet_hit == 1) {
|
|
continue;
|
|
}
|
|
|
|
|
|
hitf = oneloot.tp == 2 ? Utils.hitTestRectangle : Utils.hitTestCircle
|
|
if (hitf(bt, oneloot)) {
|
|
if (oneloot.opacity == 255) {
|
|
if (bt.isclose && oneloot.hit_sound2) {
|
|
cc.gameMgr.playSound(oneloot.hit_sound2, oneloot.position)
|
|
} else {
|
|
cc.gameMgr.playSound(oneloot.hit_sound, oneloot.position)
|
|
}
|
|
|
|
}
|
|
battlenet.dohit(bt.gundata, oneloot.objuuid, 2, bt.position, bt.ownerid)
|
|
// bt.opacity = 0
|
|
// this.bulletpool.push(bt)
|
|
// this.bulletarr.splice(i, 1);
|
|
bt.bullet.opacity = 0
|
|
bt.shadow.opacity = 0
|
|
bt.needdead = true
|
|
bt = null
|
|
break;
|
|
}
|
|
|
|
} else {
|
|
var oneloot = lootarr[j]
|
|
var wall = {
|
|
x: oneloot.xx,
|
|
y: oneloot.yy,
|
|
width: oneloot.width,
|
|
height: oneloot.height,
|
|
}
|
|
|
|
if (Utils.hitTestRectangle(bt, wall)) {
|
|
cc.gameMgr.playSound("hit_common", bt.position)
|
|
// bt.opacity = 0
|
|
// this.bulletpool.push(bt)
|
|
// this.bulletarr.splice(i, 1);
|
|
bt.bullet.opacity = 0
|
|
bt.shadow.opacity = 0
|
|
bt.needdead = true
|
|
battlenet.dohit(bt.gundata, null, 3, bt.position, bt.ownerid)
|
|
bt = null
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (bt&&!bt.ispenetrate) {
|
|
for (var j = cc.gameMgr.npcarr.length - 1; j >= 0; j--) {
|
|
let onenpc = cc.gameMgr.npcarr[j]
|
|
|
|
if (bt.owner.node == onenpc) {
|
|
continue;
|
|
}
|
|
|
|
|
|
if (Utils.hitTestCircle(bt, onenpc)) {
|
|
// bt.opacity = 0
|
|
// this.bulletpool.push(bt)
|
|
// this.bulletarr.splice(i, 1);
|
|
bt.bullet.opacity = 0
|
|
bt.shadow.opacity = 0
|
|
bt.needdead = true
|
|
cc.gameMgr.playSound("hit_common", bt.position)
|
|
bt = null
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (bt) {
|
|
for (var j = cc.gameMgr.cararr.length - 1; j >= 0; j--) {
|
|
let onenpc = cc.gameMgr.cararr[j]
|
|
|
|
if (bt.owner.node == onenpc) {
|
|
continue;
|
|
}
|
|
|
|
|
|
if (Utils.hitTestCircle(bt, onenpc)) {
|
|
// bt.opacity = 0
|
|
// this.bulletpool.push(bt)
|
|
// this.bulletarr.splice(i, 1);
|
|
bt.bullet.opacity = 0
|
|
bt.shadow.opacity = 0
|
|
bt.needdead = true
|
|
cc.gameMgr.playSound("hit_common", bt.position)
|
|
bt = null
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// if(bt){
|
|
// for(var j=housearr.length-1;j>=0;j--){
|
|
|
|
// if(Math.abs(housearr[j].x-bt.x)>vw+housearr[j].width/1||Math.abs(housearr[j].y-bt.y>vh+housearr[j].height/1)){
|
|
// continue;
|
|
// }
|
|
// temphouse.width = housearr[j].width*2
|
|
// temphouse.height = housearr[j].height*2
|
|
// temphouse.x = housearr[j].x
|
|
// temphouse.y = housearr[j].y
|
|
|
|
// if(Utils.hitTestRectangle(bt,temphouse)){
|
|
// if(this.checkHouse(bt,housearr[j])){
|
|
// cc.gameMgr.playSound("hit_common",bt.position)
|
|
// bt.opacity = 0
|
|
// this.bulletpool.push(bt)
|
|
// this.bulletarr.splice(i, 1);
|
|
// battlenet.dohit(bt.gundata,null,3,bt.position,bt.ownerid)
|
|
// bt = null
|
|
// break;
|
|
// }
|
|
|
|
// }
|
|
// }
|
|
// }
|
|
if (bt == null && eff) {
|
|
cc.gameMgr.effectManager.createBulletHit(tpos, eff)
|
|
}
|
|
if (bt) {
|
|
|
|
bshow.x = bt.x + upv
|
|
bshow.y = bt.y - upv
|
|
|
|
|
|
bdisb = (Math.pow((bt.x - bt.startPos.x), 2) + Math.pow((bt.y - bt.startPos.y), 2))
|
|
|
|
|
|
if (bdisb > bt.bdistance) {
|
|
if (bt.isboom) {
|
|
bt.update2start = true
|
|
bt.shadow.opacity = 0
|
|
continue
|
|
// battlenet.dohit(bt.gundata,null,4,bt.position)
|
|
}
|
|
// bt.opacity = 0
|
|
// bshow.opacity = 0
|
|
// this.bulletpool.push(bt)
|
|
// this.bulletarr.splice(i, 1);
|
|
|
|
|
|
bt.bullet.opacity = 0
|
|
bt.shadow.opacity = 0
|
|
bt.needdead = true
|
|
|
|
|
|
continue;
|
|
}
|
|
} else {
|
|
bshow.opacity = 0
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
module.exports = BulletManage |