
/** |
* 炮塔的逻辑 |
*/ |
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) |
}); |
} |



