/** |
* 炮塔的逻辑 |
*/ |
var Tower = qc.defineBehaviour( 'qc.demo.Tower' , qc.Behaviour, function () { |
var self = this ; |
// 炮塔的等级、攻击力 |
self.level = 1; |
self.attack = 100; |
// 炮塔的位置 |
self.index = 0; |
// 攻击范围标识 |
self.scopeFlag = null ; |
// 背景和图标 |
self.background = null ; |
self.icon = null ; |
self.appearEffect = null ; |
// 子弹预制 |
self.bulletPrefab = null ; |
// 攻击频率 |
self.rate = 0.8; |
}, { |
// 需要序列化的字段 |
level: qc.Serializer.NUMBER, |
attack: qc.Serializer.NUMBER, |
scopeFlag: qc.Serializer.NODE, |
background: qc.Serializer.NODE, |
icon: qc.Serializer.NODE, |
appearEffect: qc.Serializer.NODE, |
rate: qc.Serializer.NUMBER, |
bulletPrefab: qc.Serializer.PREFAB |
}); |
Object.defineProperties(Tower.prototype, { |
/** |
* @property {number} scope - 攻击范围 |
* @readonly |
*/ |
scope: { |
get: function () { return this .scopeFlag.width / 2; } |
} |
}); |
// 炮塔出现了 |
Tower.prototype.appear = function (index) { |
var self = this ; |
this .index = index; |
// 添加到主逻辑中 |
window.towerUI.addTower(index, self); |
// 播放特效 |
self.appearEffect.visible = true ; |
self.appearEffect.playAnimation( 'monster_disappear' ); |
self.appearEffect.onFinished.addOnce( function () { |
self.appearEffect.visible = false ; |
}); |
// 背景和图标显示出来 |
var c = self.background.getScript( 'qc.TweenScale' ); |
c.playForward(); |
c = self.icon.getScript( 'qc.TweenScale' ); |
c.playForward(); |
// 开始进行攻击 |
self._timer = self.game.timer.loop(self.rate * 1000, function () { |
var monsters = window.towerUI.monsters; |
for ( var i in monsters) { |
var monster = monsters[i].getScript( 'qc.demo.TowerMonster' ); |
if (monster.denyAttack) continue ; |
if (monster.die || !self.isInRange(monster.gameObject.x, monster.gameObject.y)) continue ; |
// 进行攻击 |
self.startAttack(monster); |
return ; |
} |
}); |
}; |
// 析构的处理 |
Tower.prototype.onDestroy = function () { |
if ( this ._timer) { |
this .game.timer.remove( this ._timer); |
delete this ._timer; |
} |
}; |
// 炮塔被点击时显示或隐藏攻击范围 |
Tower.prototype.onClick = function () { |
var self = this , |
c = self.scopeFlag.getScript( 'qc.TweenScale' ); |
if (self.scopeFlag.visible) { |
// 隐藏掉 |
c.from = new qc.Point(1, 1); |
c.to = new qc.Point(0, 0); |
c.stop(); |
c.resetToBeginning(); |
c.onFinished.addOnce( function () { |
self.scopeFlag.visible = false ; |
}); |
c.playForward(); |
} |
else { |
// 显示出来 |
c.from = new qc.Point(0, 0); |
c.to = new qc.Point(1, 1); |
c.stop(); |
self.scopeFlag.visible = true ; |
c.resetToBeginning(); |
c.playForward(); |
} |
}; |
// 是否在炮塔攻击范围内 |
Tower.prototype.isInRange = function (x, y) { |
var distance = ( new qc.Point(x, y)).distance( new qc.Point( this .gameObject.x, this .gameObject.y)); |
return distance <= this .scope; |
}; |
// 令炮塔面对攻击点 |
Tower.prototype.lookat = function (x, y) { |
var self = this , |
r = Math.atan2(y - self.gameObject.y, x - self.gameObject.x); |
// 面向目标 |
self.icon.rotation = r; |
}; |
// 开始攻击目标怪物 |
Tower.prototype.startAttack = function (monster) { |
var self = this ; |
// 炮塔面对目标点 |
self.lookat(monster.gameObject.x, monster.gameObject.y); |
// 播放攻击动画 |
self.icon.playAnimation( 'tower_attack' ); |
self.icon.onFinished.addOnce( function () { |
self.icon.playAnimation( 'tower_idle' ); |
// 生成子弹并攻击目标 |
var bullet = self.game.add.clone(self.bulletPrefab, self.gameObject.parent); |
bullet.getScript( 'qc.demo.TowerBullet' ).fly(self, monster) |
}); |
} |