[JavaScript] Tower →→→→→进入此内容的聊天室

来自 , 2021-03-06, 写在 JavaScript, 查看 132 次.
URL http://www.code666.cn/view/cd8d5260
  1. /**
  2.  * 炮塔的逻辑
  3.  */
  4. var Tower = qc.defineBehaviour('qc.demo.Tower', qc.Behaviour, function() {
  5.     var self = this;
  6.  
  7.     // 炮塔的等级、攻击力
  8.     self.level = 1;
  9.     self.attack = 100;
  10.  
  11.     // 炮塔的位置
  12.     self.index = 0;
  13.  
  14.     // 攻击范围标识
  15.     self.scopeFlag = null;
  16.  
  17.     // 背景和图标
  18.     self.background = null;
  19.     self.icon = null;
  20.     self.appearEffect = null;
  21.  
  22.     // 子弹预制
  23.     self.bulletPrefab = null;
  24.  
  25.     // 攻击频率
  26.     self.rate = 0.8;
  27. }, {
  28.     // 需要序列化的字段
  29.     level: qc.Serializer.NUMBER,
  30.     attack: qc.Serializer.NUMBER,
  31.     scopeFlag: qc.Serializer.NODE,
  32.     background: qc.Serializer.NODE,
  33.     icon: qc.Serializer.NODE,
  34.     appearEffect: qc.Serializer.NODE,
  35.     rate: qc.Serializer.NUMBER,
  36.     bulletPrefab: qc.Serializer.PREFAB
  37. });
  38.  
  39. Object.defineProperties(Tower.prototype, {
  40.     /**
  41.      * @property {number} scope - 攻击范围
  42.      * @readonly
  43.      */
  44.     scope: {
  45.         get: function() { return this.scopeFlag.width / 2; }
  46.     }
  47. });
  48.  
  49. // 炮塔出现了
  50. Tower.prototype.appear = function(index) {
  51.     var self = this;
  52.     this.index = index;
  53.  
  54.     // 添加到主逻辑中
  55.     window.towerUI.addTower(index, self);
  56.  
  57.     // 播放特效
  58.     self.appearEffect.visible = true;
  59.     self.appearEffect.playAnimation('monster_disappear');
  60.     self.appearEffect.onFinished.addOnce(function() {
  61.         self.appearEffect.visible = false;
  62.     });
  63.  
  64.     // 背景和图标显示出来
  65.     var c = self.background.getScript('qc.TweenScale');
  66.     c.playForward();
  67.     c = self.icon.getScript('qc.TweenScale');
  68.     c.playForward();
  69.  
  70.     // 开始进行攻击
  71.     self._timer = self.game.timer.loop(self.rate * 1000, function() {
  72.         var monsters = window.towerUI.monsters;
  73.         for (var i in monsters) {
  74.             var monster = monsters[i].getScript('qc.demo.TowerMonster');
  75.             if (monster.denyAttack) continue;
  76.             if (monster.die || !self.isInRange(monster.gameObject.x, monster.gameObject.y)) continue;
  77.  
  78.             // 进行攻击
  79.             self.startAttack(monster);
  80.             return;
  81.         }
  82.     });
  83. };
  84.  
  85. // 析构的处理
  86. Tower.prototype.onDestroy = function() {
  87.     if (this._timer) {
  88.         this.game.timer.remove(this._timer);
  89.         delete this._timer;
  90.     }
  91. };
  92.  
  93. // 炮塔被点击时显示或隐藏攻击范围
  94. Tower.prototype.onClick = function() {
  95.     var self = this,
  96.         c = self.scopeFlag.getScript('qc.TweenScale');
  97.     if (self.scopeFlag.visible) {
  98.         // 隐藏掉
  99.         c.from = new qc.Point(1, 1);
  100.         c.to = new qc.Point(0, 0);
  101.         c.stop();
  102.         c.resetToBeginning();
  103.         c.onFinished.addOnce(function() {
  104.             self.scopeFlag.visible = false;
  105.         });
  106.         c.playForward();
  107.     }
  108.     else {
  109.         // 显示出来
  110.         c.from = new qc.Point(0, 0);
  111.         c.to = new qc.Point(1, 1);
  112.         c.stop();
  113.         self.scopeFlag.visible = true;
  114.         c.resetToBeginning();
  115.         c.playForward();
  116.     }
  117. };
  118.  
  119. // 是否在炮塔攻击范围内
  120. Tower.prototype.isInRange = function(x, y) {
  121.     var distance = (new qc.Point(x, y)).distance(new qc.Point(this.gameObject.x, this.gameObject.y));
  122.     return distance <= this.scope;
  123. };
  124.  
  125. // 令炮塔面对攻击点
  126. Tower.prototype.lookat = function(x, y) {
  127.     var self = this,
  128.         r = Math.atan2(y - self.gameObject.y, x - self.gameObject.x);
  129.  
  130.     // 面向目标
  131.     self.icon.rotation = r;
  132. };
  133.  
  134. // 开始攻击目标怪物
  135. Tower.prototype.startAttack = function(monster) {
  136.     var self = this;
  137.  
  138.     // 炮塔面对目标点
  139.     self.lookat(monster.gameObject.x, monster.gameObject.y);
  140.  
  141.     // 播放攻击动画
  142.     self.icon.playAnimation('tower_attack');
  143.     self.icon.onFinished.addOnce(function() {
  144.         self.icon.playAnimation('tower_idle');
  145.  
  146.         // 生成子弹并攻击目标
  147.         var bullet = self.game.add.clone(self.bulletPrefab, self.gameObject.parent);
  148.         bullet.getScript('qc.demo.TowerBullet').fly(self, monster)
  149.     });
  150. }
  151.  

回复 "Tower"

这儿你可以回复上面这条便签

captcha