用户注册



邮箱:

密码:

用户登录


邮箱:

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

发表随想


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

TowerUI

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

[javascript]代码库

/**
 * @author weism
 * copyright 2015 Qcplay All Rights Reserved.
 */

/**
 * 塔防示例游戏,总的界面和逻辑控制
 */
var TowerUI = qc.defineBehaviour('qc.demo.TowerUI', qc.Behaviour, function() {
    var self = this;

    // 地图为7 * 12
    self.COLS = 12;
    self.ROWS = 7;

    // 格子的大小为:
    self.SIZE = 80;

    // 总共有几条命?
    self.life = 30;

    // 我有多少金钱
    self.money = 5000;

    // 当前我有多少个萝卜
    self._bonus = 0;

    // 地图数据
    self.map = null;

    // 所有的炮塔
    self.towers = {};

    // 当前第几波怪物
    self.currRound = 0;

    // 当前的怪物列表
    self.monsters = [];

    // 当前是否处于暂停状态
    self.isPause = false;

    // 开始/暂停游戏按钮
    self.startBtn = null;

    // 怪物预制
    self.monsterPrefab = null;

    // 建造的预制
    self.buildPrefab = null;

    // 提示箭头
    self.arrow = null;

    // 萝卜的数量
    self.bonusLabel = null;

    // 第几波怪物
    self.roundTen = null;
    self.roundOne = null;

    // 显示生命
    self.lifeLabel = null;

    // 重点
    self.endFlag = null;

    // 记录全局变量,方便调用
    self.game.log.trace('初始化塔防游戏。');
    window.towerUI = self;
}, {
    // 需要序列化的字段
    map: qc.Serializer.NODE,
    life: qc.Serializer.NUMBER,
    startBtn: qc.Serializer.NODE,
    monsterPrefab: qc.Serializer.PREFAB,
    arrow: qc.Serializer.NODE,
    buildPrefab: qc.Serializer.PREFAB,
    bonusLabel: qc.Serializer.NODE,
    roundTen: qc.Serializer.NODE,
    roundOne: qc.Serializer.NODE,
    lifeLabel: qc.Serializer.NODE,
    endFlag: qc.Serializer.NODE
});

Object.defineProperties(TowerUI.prototype, {
    /**
     * @property {number} fail - 被通过的怪物数量
     */
    fail: {
        get: function() { return this._fail || 0; },
        set: function(v) {
            this._fail = v;
            if (v <= 0) {
                // 游戏失败了
                this.game.log.trace('游戏失败了。');
            }
            this.redraw();
        }
    },

    /**
     * @property {number} bonus - 当前有多少个萝卜
     */
    bonus: {
        get: function() { return this._bonus || 0; },
        set: function(v) {
            this._bonus = v;
            this.redraw();
        }
    }
});

// 初始化处理
TowerUI.prototype.awake = function() {
    var self = this;

    // 开始按钮被点击的处理
    self.startBtn.onClick.add(function() {
        // 开始游戏,暂停的功能就不做演示了
        self.nextRound();
        self.startBtn.frame = '上底7.png';
    });
    self.redraw();
};

// 被点击的处理,建造炮塔
TowerUI.prototype.onClick = function(e) {
    var self = this;

    // 换算下点击在第几个格子
    var x = e.source.x,
        y = e.source.y;
    var point = self.gameObject.toLocal(new qc.Point(x, y));
    point.x += self.gameObject.width / 2;
    point.y += self.gameObject.height / 2;

    var col = self.game.math.floorTo(point.x / self.SIZE);
    var row = self.game.math.floorTo(point.y / self.SIZE);
    var index = row * self.COLS + col;
    self.game.log.trace('格子{0}被点击了', index);

    // 检查下这格子是不是有数据
    if (self.map.getScript('qc.demo.TowerMapData').data[index]) return;

    // 出现建造按钮
    if (self._buildBtn) {
        self._buildBtn.destroy();
        self._buildBtn = undefined;
    }
    self._buildBtn = self.game.add.clone(self.buildPrefab, self.gameObject);
    self._buildBtn.x = self.getPos(index).x;
    self._buildBtn.y = self.getPos(index).y;
    self._buildBtn.getScript('qc.demo.TowerBuild').appear(index);
};

// 开始一轮
TowerUI.prototype.nextRound = function() {
    var self = this;

    // 怪物的数量
    var count = (self.currRound++) * 2 + 40;
    self.game.log.trace('本轮产出{0}头怪物', count);

    // 生产怪物的逻辑
    var produce = function() {
        // 生成一头怪物
        self.redraw();
        self.game.log.trace('产出一头怪物');
        self.producing = true;
        var monster = self.game.add.clone(self.monsterPrefab, self.gameObject);
        monster.getScript('qc.demo.TowerMonster').appear(self.currRound);
        self.monsters.push(monster);

        if (--count <= 0) {
            self.producing = false;
            return;
        }
        self.game.timer.add(1000, produce);
    };

    // 提示怪物快要开始生成了
    var clue = function() {
        self.arrow.getScript('qc.demo.TowerArrow').play();

        // 3秒后开始生产怪物
        self.game.log.trace('2s后开始产出怪物。');
        self.game.timer.add(2500, produce);
    };

    // 准备生产
    self.game.log.trace('2s后提示本轮开始。');
    self.game.timer.add(1000, clue);
};

// 根据格子换算坐标
TowerUI.prototype.getPos = function(index) {
    var self = this;
    var x0 = -self.gameObject.width / 2,
        y0 = -self.gameObject.height / 2;
    var col = index % self.COLS,
        row = self.game.math.floorTo(index / self.COLS);

    return new qc.Point(x0 + col * self.SIZE + self.SIZE / 2,
        y0 + row * self.SIZE + self.SIZE / 2);
};

// 添加一个炮塔
TowerUI.prototype.addTower = function(index, tower) {
    this.towers[index] = tower;
    this.map.getScript('qc.demo.TowerMapData').data[index] = 2;
};

// 删除一个怪物
TowerUI.prototype.removeMonster = function(monster) {
    var index = this.monsters.indexOf(monster);
    if (index !== -1) this.monsters.splice(index, 1);
    this.game.log.trace('删除一头怪物,剩余:{0}', this.monsters.length);

    // 如果没有怪物了,进入下一波
    if (this.currRound < 15 && !this.producing && this.monsters.length === 0) {
        this.nextRound();
    }
};

// 重绘信息
TowerUI.prototype.redraw = function() {
    var self = this;
    self.bonusLabel.text = '' + self.bonus;
    self.roundTen.text = '' + self.game.math.floorTo(self.currRound / 10);
    self.roundOne.text = '' + (self.currRound % 10);
    self.lifeLabel.text = '' + self.life;

    if (self.life < 10) {
        // 显示萝卜缺一角的图片
        self.endFlag.frame = '吃萝卜.png';
    }
};


网友评论    (发表评论)


发表评论:

评论须知:

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


扫码下载

加载中,请稍后...

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

加载中,请稍后...