用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - javascript代码库

Tower

2015-10-29 作者: 云代码会员举报

[javascript]代码库

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


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...