const DWTool = require('../utils/DWTool');
const { RoomState, GameNotificationKey, LevelHomeArtistItemStyle } = require("../utils/GameEnum");
const GameModule = require("../utils/GameModule");
const ThemeManager = require("../utils/ThemeManger");
const HomeApi = require("../net/HomeApi");
const CityList = require("../data/city");
// const StateMachine = require('../lib/StateMachine');
// const StateMachineHistory = require('../lib/StateMachineHistory');
cc.Class({
extends: cc.Component,
properties: {
// Public Properties
bgNode: cc.Node,
/** 当前显示的图片 */
buildSprite: cc.Sprite,
/** 柱子 */
pillarTop: cc.Sprite,
pillarBottom: cc.Sprite,
pillarRight: cc.Sprite,
pillarLeft: cc.Sprite,
bottomBg: cc.Sprite,
lockBtnFrames: [cc.SpriteFrame],
/** 升级按钮的两种状态图 */
updateBtnFrames: [cc.SpriteFrame],
/** 未解锁状态的节点 */
lockNode: cc.Node,
/** 需要花费所有金币 */
costLabel: cc.Label,
/** 未解锁的建筑名称 */
unLockBuildName: cc.RichText,
/** 未解锁需要花费多少金币 */
unlockRichText: cc.RichText,
/** 建筑昵称 */
buildNameLabel: cc.Label,
/** 这里当做升级建筑按钮 */
updateBtn: cc.Sprite,
/** 解锁按钮 */
lockBtn: cc.Sprite,
/** 将要解锁建筑的类型图 */
unlockBuildingType: cc.Sprite,
lockBottomNode: cc.Node,
/** 等级节点 */
levelProgressNode: cc.Node,
/** 等级进度条 */
levelProgressBar: cc.ProgressBar,
/** 等级 */
levelProgressLabel: cc.Label,
/** 生产金币节点 */
rateProgressNode: cc.Node,
/** 生产金币进度条 */
rateProgressBar: cc.ProgressBar,
/** 生产了多少金币 */
rateProgressLabel: cc.Label,
/** 倒计时 */
countdownLabel: cc.Label,
/** 金币满了提示 */
coinFullTip: cc.Node,
artistList: cc.Node,
artistListItem: cc.Prefab,
openDoorSkeletion: sp.Skeleton,
updateSkeletion: sp.Skeleton,
// 显示加成的节点
additionNode: cc.Node,
// 显示加成倍数
additionLabel: cc.Label,
// 加成的骨骼
additionSkeleton: sp.Skeleton,
// 满级提示
maxNode: cc.Node,
//入驻艺人提醒
residentTipNode: cc.Node,
// 加成倍数,默认倍率为x1,即无加成
addition: {
get: function () {
if (!this._addition) {
this._addition = 1;
}
return this._addition;
},
set: function (value) {
this._addition = value;
if (this._addition === 1) {
this.additionNode.active = false;
// this.additionSkeleton.setAnimation(0, 'jiasutiao_2', true);
// this.rateProgressBar.barSprite.node.active = true;
} else {
this.additionNode.active = true;
this.additionLabel.string = `X${this._addition}`;
// this.rateProgressBar.barSprite.node.active = false;
}
}
},
coinArrayMax: {
default: 3,
type: cc.Integer,
tooltip: "当前楼层最大存储金币数"
},
coinWrap: cc.Node,
propWrap: cc.Node,
coinPrefab: cc.Prefab,
propPrefab: cc.Prefab,
countDown: {
get: function () {
if (!this._countDown) {
this._countDown = 0;
}
return this._countDown;
},
set: function (value) {
this._countDown = value;
this.countdownLabel.string = DWTool.calculateTime(this._countDown);
this._preCountDown = this._countDown;
}
},
rate: {
get: function () {
if (!this._rate) {
this._rate = 0;
}
return this._rate;
},
set: function (value) {
this._rate = value * this.addition;
this.rateProgressLabel.string = DWTool.coinParse(this._rate);
}
},
notPickupCount: {
get: function () {
if (!this._notPickupCount) {
this._notPickupCount = 0;
}
return this._notPickupCount;
},
set: function (value) {
this._notPickupCount = value;
this.buildingInfo.coinCount = value;
this.isNeedToReport = true;
}
},
},
// LIFE-CYCLE CALLBACKS:
onLoad() {
this.isNeedToReport = false;
this.coinArray = [];
this._currentTime = 0;
this.isFirstLoad = true;
this.humanList = [];
this.isHasProp = false;
this.updateSkeletion.node.active = false;
this._rateProgressWidth = this.rateProgressBar.barSprite.node.width;
this.openDoorSkeletion.setCompleteListener(() => {
// 升级建筑
this.updateBuilding();
GameEvent.fire(GameNotificationKey.PlaySuccessAnimation);
});
let self = this;
this.unlockBuildingEvent = _.debounce(() => {
// 如果当前不够钱, 点击不生效
if (GameModule.userInfo.grossIncome < self.buildingInfo.unlockScore) { return; }
// 点完立刻隐藏
self.lockBtn.node.active = false;
let position = self.lockBtn.node.convertToWorldSpace(cc.v2(self.lockBtn.node.width / 2, self.lockBtn.node.height / 2));
GameEvent.fire(GameNotificationKey.PlayUpdateCoinAnimation, position);
self.openDoorSkeletion.setAnimation(1, "changjing_kaiqi2");
self.lockBottomNode.runAction(cc.fadeOut(0.7));
// this.lockBottomNode.active = false;
}, 1000, true);
// 监听自定义事件
this.setEventListener();
// 升级建筑事件
this.updateBtn.node.on(cc.Node.EventType.TOUCH_END, () => {
this.updateBuildingEvent();
GameModule.audioMng.playUpdateBuilding();
}, this);
this.schedule(() => {
if (this.isNeedToReport) {
this.isNeedToReport = false;
GameModule.userInfo.updateRecordModify(this.buildingInfo);
}
}, 2.0);
this.guideEvent = _.debounce(() => {
GameModule.homeGuide.getComponent('HomeGuide').handleGuideState17(this.artists);
}, 1000, true);
// 配置界面上的金币
this.configCoins();
// 配置界面上的道具
this.configProp();
},
onDestroy() {
GameEvent.off(GameNotificationKey.ResidentArtist, this);
GameEvent.off(GameNotificationKey.RefreshLevelHomeArtistList, this);
GameEvent.off(GameNotificationKey.LevelHomeItemBuildingAllFull, this);
GameEvent.off(GameNotificationKey.ReceiveLevelHomeItemPropUpdate, this);
},
setEventListener() {
// 这个是入驻艺人成功时调用的
GameEvent.on(GameNotificationKey.ResidentArtist, this, (uid, buildingId) => {
if (this.node.active && this.uid === uid && this.buildingInfo.buildingId === buildingId) {
HomeApi.friendGetArtistsInBuilding(this.uid, this.buildingInfo.buildingId, (data) => {
// 为了不让当前的金币出现多种不同金额的币种, 当列表刷新时, 要收取一次
if (this.state === RoomState.Update || this.state === RoomState.Full) {
// 清空当前用来存储金币节点
this.currentCoin = null;
for (let i = 0; i < this.coinArrayMax; i++) {
this.pickupCoin(this.coinArray[i], false);
}
}
}, (code, msg) => {
console.log(msg);
})
}
});
// 这个是召回驱赶艺人时调用的
GameEvent.on(GameNotificationKey.RefreshLevelHomeArtistList, this, (uid, buildingId) => {
if (this.node.active && this.uid === uid && this.buildingInfo.buildingId === buildingId) {
HomeApi.friendGetArtistsInBuilding(this.uid, this.buildingInfo.buildingId, (data) => {
this.artists = data.list || [];
this.artistListLayout();
}, (code, msg) => {
console.log(msg);
})
}
});
// 所有建筑满级之后调用
GameEvent.on(GameNotificationKey.LevelHomeItemBuildingAllFull, this, () => {
if (this.isFirstLoad) { // 代表游戏一打开, 就是满级的
this.currentCoin = null;
this.coinWrap.active = false;
this.artistList.active = false;
this.coinFullTip.active = false;
} else {
GameModule.userInfo.updateRecordModify(this.buildingInfo);
this.currentCoin = null;
for (let i = 0; i < this.coinArrayMax; i++) {
this.pickupCoin(this.coinArray[i]);
}
// 需要把艺人也都清空了
for (let child of this.humanList) { child.destroy(); }
this.coinWrap.active = false;
this.artistList.active = false;
this.coinFullTip.active = false;
}
})
// 离线收益金币动画
// 只显示最底部一层的金币收取
// 其他楼层金币直接隐藏
GameEvent.on(GameNotificationKey.HandleOfflineIncomeAnim, this, () => {
// 清空当前用来存储金币节点
this.currentCoin = null;
let showAnim = this.index == 5 ? true : false
for (let i = 0; i < this.coinArrayMax; i++) {
this.pickupCoinWithNoIncom(this.coinArray[i], showAnim);
}
})
GameEvent.on(GameNotificationKey.ReceiveLevelHomeItemPropUpdate, this, (buildingItem) => {
if (buildingItem.buildingId != this.buildingInfo.buildingId) { return; }
console.log(buildingItem);
this.showProp(buildingItem.item);
});
},
// 解锁建筑事件
unlockBuilding() {
this.unlockBuildingEvent();
},
updateBuildingEvent() {
if (this.state === RoomState.Update) {
// 清空当前用来存储金币节点
this.currentCoin = null;
for (let i = 0; i < this.coinArrayMax; i++) {
this.pickupCoin(this.coinArray[i]);
}
let position = this.updateBtn.node.convertToWorldSpace(cc.v2(this.updateBtn.node.width / 2, this.updateBtn.node.height / 2));
GameEvent.fire(GameNotificationKey.PlayUpdateCoinAnimation, position);
this.updateBuilding();
// if (!this.updateSkeletion.node.active) {
this.updateSkeletion.node.active = true;
this.updateSkeletion.setAnimation(0, "changjing_sj");
this.updateSkeletion.setCompleteListener(() => {
this.updateSkeletion.node.active = false;
});
// }
// 如果好友列表功能已经开放
if (GameModule.tab) {
this.artists = GameModule.tab.getComponent('Tab').artists;
// 尝试触发艺人入驻引导
// this.guideEvent();
}
}
},
configCoins() {
for (let i = 0; i < this.coinArrayMax; i++) {
// 初始化
let coinNode = cc.instantiate(this.coinPrefab)
this.coinWrap.addChild(coinNode);
coinNode = coinNode.getComponent("LevelHomeCoin");
coinNode.index = i;
this.coinHide(coinNode)
this.coinArray[i] = coinNode;
coinNode.node.on(cc.Node.EventType.TOUCH_END, (event) => {
this.pickupCoin(coinNode);
}, this);
}
},
configProp() {
let propNode = cc.instantiate(this.propPrefab)
this.propScript = propNode.getComponent('LevelHomePropItem')
this.propWrap.addChild(propNode);
this.hideProp();
},
hideProp() {
this.isHasProp = false;
this.propScript.node.position = cc.v2(150, -108);
this.propScript.node.active = false;
this.propScript.isPlay = false;
this.propScript.isPlaying = false;
},
showProp(propData, isPlayAnimation=true) {
if (!this.isHasProp) {
this.isHasProp = true;
this.propScript.init(this.buildingInfo.buildingId, propData, (showFrame, showText) => {
// 显示领取动画
this.parent.showActGift(showFrame, showText)
this.hideProp();
});
if (isPlayAnimation) {
this.propScript.showAnimation();
} else {
this.propScript.node.position = cc.v2(150, -28);
this.propScript.node.active = true;
}
} else {
this.propScript.updateProp(propData);
this.propScript.updateAnimation();
}
},
/**
* Public Method, 用来设置建筑背景图
* @param {number} cityId 城市id
* @param {number} index 楼层
*/
init(parent, cityId, index) {
if (arguments.length < 1) {
throw new Error("init Missing parameter...");
}
this.parent = parent;
this.cityId = cityId;
this.index = index;
this.isFirstLoad = true;
ThemeManager.setBuildItemColor(this.cityId, this.bgNode);
ThemeManager.setItemBuildSpriteFrame(this.cityId, this.buildSprite, index);
ThemeManager.setItemPillarTopSpriteFrame(this.cityId, this.pillarTop);
ThemeManager.setItemPillarBottomSpriteFrame(this.cityId, this.pillarBottom);
ThemeManager.setItemPillarRightSpriteFrame(this.cityId, this.pillarRight);
ThemeManager.setItemPillarLeftSpriteFrame(this.cityId, this.pillarLeft);
ThemeManager.setItemDownSpriteFrame(this.cityId, this.bottomBg);
let lockBottomSprite = this.lockBottomNode.getComponent(cc.Sprite);
ThemeManager.setItemLockDownSpriteFrame(this.cityId, lockBottomSprite);
},
/**
* Public Method, 配置建筑的内部样式
* @param {*} buildingInfo 建筑信息
* @param {*} uid 当前用户的uid
*/
config(buildingInfo, uid, unlockBuildingRecord, resetCallback) {
// console.log(buildingInfo.coinCount);
this.unlockBuildingRecord = unlockBuildingRecord;
if (resetCallback) {
this.resetCallback = resetCallback;
}
if (buildingInfo.buildingId == 1) {
if (buildingInfo.level == 0) {
// 监听完成引导系统state1的事件
GameModule.homeGuide.on('Fire_state1', this.unlockBuildingEvent, this)
// 触发引导系统state1状态
GameModule.homeGuide.getComponent('HomeGuide').handleState('state1')
}
}
this.buildingInfo = buildingInfo;
this.uid = uid;
this.artists = this.buildingInfo.artists;
// 这里设置一些只需要设置一次的数据
this.countDown = buildingInfo.rateUnit;
this.buildNameLabel.string = buildingInfo.name;
this._notPickupCount = buildingInfo.coinCount;
// console.log(buildingInfo.coinCount, this.coinArrayMax);
if (buildingInfo.coinCount === this.coinArrayMax * 10) {
this.rateProgressBar.progress = 1;
this.countdownLabel.string = DWTool.calculateTime(0);
}
this.levelProgressLabel.string = `LV.${buildingInfo.level}`;
if (this.isFirstLoad) {
this.isFirstLoad = false;
this.artistListLayout();
}
//城市开发完毕的时候不显示艺人入驻按钮
if (GameModule.userInfo.levelHomeItemFullCount != 5 && this.cityId === Global.devCityId) {
this.artistList.active = true;
} else {
this.artistList.active = false;
}
this.initializeCoinPosition();
this.layout(buildingInfo);
},
/** 初始化金币的位置 */
initializeCoinPosition() {
// 2018年08月18日15:25, 子奇要求我去好友家园时, 不显示未收取金币
// 城市已经开发完毕不显示金币
if (this.cityId === Global.devCityId && GameModule.userInfo.levelHomeItemFullCount != 5) {
this.coinWrap.active = true;
} else {
this.coinWrap.active = false;
return;
}
if (!this.buildingInfo.coinCount) {
for (let i = 0; i < this.coinArrayMax; i++) {
let coin = this.coinArray[i];
this.coinHide(coin);
}
return;
}
for (let i = 0; i < this.coinArrayMax; i++) {
let coin = this.coinArray[i];
while (this.buildingInfo.coinCount != 0 && coin.coinCount != 10) {
coin.coinCount += 1;
this.buildingInfo.coinCount -= 1;
}
if (coin.coinCount != 0) {
let x = -140 + (85 * i);
coin.isPlay = true;
coin.node.position = cc.v2(x, -28);
coin.node.active = true;
if (this.addition > 1) {
let rate = this.buildingInfo.rate * this.addition;
coin.totalRate = rate * coin.coinCount;
} else {
coin.totalRate = this.buildingInfo.rate * coin.coinCount;
}
coin.initStatic(i);
}
}
},
artistListLayout() {
for (let child of this.artistList.children) { child.destroy(); }
for (let child of this.humanList) { child.destroy(); }
let self = this;
let addAddItemToList = function (showTop = false, showBottom = false) {
let addArtistItem = cc.instantiate(self.artistListItem);
self.artistList.addChild(addArtistItem);
let addArtistScript = addArtistItem.getComponent('LevelHomeArtistItem');
addArtistScript.initWithBuildingInfo(self.buildingInfo, self.uid, true, showTop, showBottom);
}
let addArtistItemToList = function (artist, showTop = false, showBottom = false) {
let artistItem = cc.instantiate(self.artistListItem);
self.artistList.addChild(artistItem);
let artistScript = artistItem.getComponent('LevelHomeArtistItem');
artistScript.initWithArtistData(self.buildingInfo, self.uid, true, artist, showTop, showBottom);
}
let addHuman = function (artist, index) {
DWTool.loadResPrefab("./prefabs/artist_man")
.then((prefab) => {
let human = cc.instantiate(prefab);
human.getComponent('ArtistMan').init(artist);
human.getComponent('ArtistMan').direction = (index > 0) ? 1 : -1;
self.node.addChild(human);
self.humanList.push(human);
});
}
this.addition = 1;
// 当没有自己艺人, 也没有好友艺人入驻时, 这里还得区分主态和客态
if (this.artists.length === 0) {
// 没有艺人不显示倍数
addAddItemToList(true);
} else {
// 有艺人入驻要显示倍数
this.additionNode.active = true;
if (this.artists.length === 1) {
let artist = this.artists[0];
this.addition += artist.stationJobLevel;
// 这里要区分主态和客态, 去别人家园时, 如果有一个是客态自己的艺人, 那么另一个就是可以入驻的按钮
if (artist.role === 2) {
addArtistItemToList(artist, true);
addHuman(artist, (Math.random() - 0.5) * 2);
} else {
addAddItemToList(true, true);
addArtistItemToList(artist);
addHuman(artist, (Math.random() - 0.5) * 2);
}
} else {
for (let i = 0; i < this.artists.length; i++) {
let artist = this.artists[i];
this.addition += artist.stationJobLevel;
if (i === 0) {
addArtistItemToList(artist, true, true);
} else {
addArtistItemToList(artist);
}
addHuman(artist, i);
}
}
}
},
layout(buildingInfo) {
// 判断是否有下一级, 没有的话就是满级
if (buildingInfo.hasNext === 1 && buildingInfo.level <= Global.BuildingManager.getLevelCount(buildingInfo.buildingId)) {
// 判断是否已经解锁
if (buildingInfo.isUnlocked) {
/**
* 2018年09月26日 要求将进度条改成每25级就清空, 重新走, 原来的实现如下:
* this.levelProgressBar.progress = buildingInfo.level / Global.BuildingManager.getLevelCount(buildingInfo.buildingId);
*/
let ratio = buildingInfo.level % 25;
this.levelProgressBar.progress = ratio / 25;
this.artistList.active = true;
this.lockNode.active = false;
this.costLabel.string = DWTool.coinParse(buildingInfo.nextUpScore);
this.rate = buildingInfo.rate;
// 判断是否有足够的金额解锁
if (GameModule.userInfo.grossIncome >= buildingInfo.nextUpScore) {
if (buildingInfo.buildingId === 1 && buildingInfo.level === 1) {
// 第三个引导
GameModule.homeGuide.on('Fire_state3', this.updateBuildingEvent, this)
// 触发引导系统state3状态
GameModule.homeGuide.getComponent('HomeGuide').handleState('state3')
}
this.setState(RoomState.Update);
} else {
this.setState(RoomState.UnLock);
}
} else {
this.artistList.active = false;
this.countDown = 0;
this._currentTime = 0;
this.rateProgressBar.progress = 0;
this.totalRate = 0;
this.lockNode.active = true;
this.costLabel.string = 0;
this.hideProp();
this.unLockBuildName.string = `${buildingInfo.name}`;
this.unlockRichText.string = ` ${DWTool.coinParse(buildingInfo.unlockScore)}`;
// 判断是否有足够的金额解锁
if (GameModule.userInfo.grossIncome >= buildingInfo.unlockScore) {
if (this.unlockBuildingRecord[0] === 1 && this.buildingInfo.buildingId === 2) { // 如果第一层已经解锁, 才能执行下一个引导
setTimeout(() => {
// 监听完成引导系统state4的事件
GameModule.homeGuide.on('Fire_state4', this.unlockBuildingEvent, this)
// 触发引导系统state4状态
GameModule.homeGuide.getComponent('HomeGuide').handleState('state4')
}, 500);
} else if (this.unlockBuildingRecord[1] === 1 && this.buildingInfo.buildingId === 3) {
setTimeout(() => {
// 监听完成引导系统state5的事件
GameModule.homeGuide.on('Fire_state5', this.unlockBuildingEvent, this)
// 触发引导系统state5状态
GameModule.homeGuide.getComponent('HomeGuide').handleState('state5')
}, 500)
}
this.unlockBuildingType.node.active = true;
this.lockBtn.spriteFrame = this.lockBtnFrames[1];
this.lockBtn.node.getComponent(cc.Button).interactable = true;
} else {
this.unlockBuildingType.node.active = false;
this.lockBtn.spriteFrame = this.lockBtnFrames[0];
this.lockBtn.node.getComponent(cc.Button).interactable = false;
}
this.setState(RoomState.Lock);
}
} else {
this.rate = buildingInfo.rate;
this.levelProgressBar.progress = 1.0;
this.setState(RoomState.Full);
}
},
setState(state) {
if (this.state === state) { return; }
switch (state) {
case RoomState.Lock:
this.openDoorSkeletion.node.active = true;
this.openDoorSkeletion.clearTracks();
this.openDoorSkeletion.setToSetupPose();
this.lockBtn.node.active = true;
this.lockBottomNode.stopAllActions();
this.lockBottomNode.opacity = 255;
this.lockBottomNode.active = true;
this.lockNode.active = true;
this.updateBtn.node.active = false;
this.updateBtn.spriteFrame = this.updateBtnFrames[0];
this.updateBtn.node.getComponent(cc.Button).interactable = false;
this.maxNode.active = false;
break;
case RoomState.UnLock:
this.openDoorSkeletion.node.active = false;
this.lockBtn.node.active = false;
this.lockBottomNode.active = false;
this.updateBtn.node.active = true;
this.lockNode.active = false;
this.updateBtn.spriteFrame = this.updateBtnFrames[0];
this.updateBtn.node.getComponent(cc.Button).interactable = false;
this.maxNode.active = false;
break;
case RoomState.Update:
this.openDoorSkeletion.node.active = false;
this.lockBtn.node.active = false;
this.lockBottomNode.active = false;
this.updateBtn.node.active = true;
this.lockNode.active = false;
this.updateBtn.spriteFrame = this.updateBtnFrames[1];
this.updateBtn.node.getComponent(cc.Button).interactable = true;
this.maxNode.active = false;
break;
case RoomState.Full:
this.openDoorSkeletion.node.active = false;
this.lockBtn.node.active = false;
this.lockBottomNode.active = false;
this.lockNode.active = false;
this.maxNode.active = true;
this.updateBtn.node.active = false;
default:
break;
}
this.state = state;
},
// 升级建筑
updateBuilding() {
// 从配置文件里获取
let maxLevel = Global.BuildingManager.getLevelCount(this.buildingInfo.buildingId);
let nextLevel = this.buildingInfo.level + 1;
let level = nextLevel > maxLevel ? maxLevel : nextLevel;
let buildModel = Global.BuildingManager.getBuildingInfo(this.cityId, this.buildingInfo.buildingId, level);
this.isLevelSpeedUp(buildModel);
// 将已有入驻的艺人赋值给新的model, 保持一个引用
buildModel.artists = this.buildingInfo.artists;
if (this.buildingInfo.isUnlocked) {
// 当前楼层已解锁
GameModule.userInfo.grossIncome -= this.buildingInfo.nextUpScore;
GameModule.userInfo.updateRecordModify(buildModel);
} else {
// 当前楼层未解锁
this.unlockBuildingRecord[this.buildingInfo.buildingId - 1] = 1;
GameModule.userInfo.grossIncome -= this.buildingInfo.unlockScore;
HomeApi.buildingUnlock(this.buildingInfo.buildingId, () => {
}, (err) => {
console.log(`============> ${this.buildingInfo.buildingId}解锁失败!!!! <============`)
})
// GameModule.userInfo.recordUnlockModify.push(buildModel);
// // 成功解锁后立刻调用上报,提交ub
// GameModule.userInfo.doReport()
}
GameModule.userInfo.stars += 1;
if (this.resetCallback) {
this.resetCallback(buildModel);
}
this.config(buildModel, this.uid);
// 如果满级了, 就发通知告诉userinfo
if (buildModel.hasNext != 1 && this.cityId != CityList[CityList.length-1].id) {
GameEvent.fire(GameNotificationKey.LevelHomeItemBuildingFull);
}
if (buildModel.level === 1) {
GameEvent.fire(GameNotificationKey.LevelHomeItemUnlock);
}
},
/**
* 升级到某个特定等级,根据配置表的金币生产速度和时间,判断是否需要弹出金币x2或者时间-50%的通知。
*/
isLevelSpeedUp(buildingInfo) {
if (buildingInfo.level <= 2) {
return;
}
if (buildingInfo.rate >= this.buildingInfo.rate * 2) {
GameEvent.fire(GameNotificationKey.LevelHomeSpeedUp, buildingInfo.name, 1);
} else if (buildingInfo.rateUnit === this.buildingInfo.rateUnit / 2) {
GameEvent.fire(GameNotificationKey.LevelHomeSpeedUp, buildingInfo.name, 2);
}
},
// 收取金币
pickupCoin(coin, isShowAnimation = true) {
if (this.currentCoin === coin) {
this.currentCoin = null;
}
if (isShowAnimation) {
let pos = coin.node.convertToWorldSpace(cc.v2(coin.node.width / 2, coin.node.height / 2));
this.showCollectAnim(pos, coin.coinCount)
}
// 点击一次金币, 就将notPickupCount减去coinNode.coinCount
this.notPickupCount -= coin.coinCount;
// console.log(`收入: ${buildingInfo.rate * coin.coinCount}`);
GameModule.userInfo.grossIncome += (this.buildingInfo.rate * coin.coinCount * this._addition);
this.coinHide(coin);
},
// 收取金币,不增加收益
pickupCoinWithNoIncom(coin, isShowAnimation = true) {
if (this.currentCoin === coin) {
this.currentCoin = null;
}
if (isShowAnimation) {
let pos = coin.node.convertToWorldSpace(cc.v2(coin.node.width / 2, coin.node.height / 2));
this.showCollectAnim(pos, coin.coinCount)
}
// 点击一次金币, 就将notPickupCount减去coinNode.coinCount
this.notPickupCount -= coin.coinCount;
this.coinHide(coin);
},
showCollectAnim(pos, colNums) {
let canvasNode = cc.find("Canvas");
let grossCoin = GameModule.userInfo.grossCoin;
let grossCoinPos = grossCoin.node.convertToWorldSpace(cc.v2(grossCoin.node.width / 2, grossCoin.node.height / 2));
// let colNums = 5
let vSize = cc.view.getVisibleSize();
let target = cc.v2(grossCoinPos.x - vSize.width / 2, grossCoinPos.y - vSize.height / 2)
let i = 0;
let runSt = setInterval(() => {
if (i == colNums) {
clearInterval(runSt)
} else {
let ran = (Math.random() - 0.5) * 2 * 3;
let newCoin = cc.instantiate(this.coinPrefab);
let posX = pos.x - vSize.width / 2;
let posY = pos.y - vSize.height / 2;
canvasNode.addChild(newCoin)
newCoin.x = posX + ran * 15;
newCoin.y = posY + 30 + ran * 15;
newCoin.active = true;
newCoin = newCoin.getComponent("LevelHomeCoin")
newCoin.initAnim()
let cbNotiStart = cc.callFunc(() => {
GameEvent.fire(GameNotificationKey.UserCollectCoin, true);
})
let cbDestroy = cc.callFunc(() => {
newCoin.node.destroy();
})
let act = cc.sequence(cc.moveTo(1, target), cbDestroy, cbNotiStart)
newCoin.node.runAction(act.easing(cc.easeIn(2.1)));
i++
}
}, 100);
},
coinHide(coin) {
// 算出金币的x值, 70是金币宽度, -130是第一个金币的x值
let x = -140 + (85 * coin.index);
// 重置金币状态
coin.node.position = cc.v2(x, -108);
coin.node.active = false;
coin.isPlay = false;
coin.isPlaying = false;
coin.coinCount = 0;
coin.totalRate = 0;
},
getFreeCoin() {
for (let i = 0; i < this.coinArrayMax; i++) {
let coinNode = this.coinArray[i];
if (coinNode.coinCount != 10) {
return coinNode;
}
}
return null;
},
generateCoin() {
if (this.currentCoin && this.currentCoin.coinCount < 10) {
this.currentCoin.totalRate += this.rate;
this.currentCoin.coinCount += 1;
this.currentCoin.updateAnimation();
} else {
this.currentCoin = this.getFreeCoin();
if (this.currentCoin) {
this.currentCoin.totalRate += this.rate;
this.currentCoin.coinCount += 1;
if (this.buildingInfo.buildingId === 1 && this.buildingInfo.level === 1 && this.notPickupCount === 1) {
// 监听完成引导系统state2的事件
GameModule.homeGuide.on('Fire_state2', () => {
this.pickupCoin(this.currentCoin);
}, this);
// 触发引导系统state1状态
GameModule.homeGuide.getComponent('HomeGuide').handleState('state2');
}
if (!this.currentCoin.isPlay) {
this.currentCoin.showAnimation();
} else {
this.currentCoin.updateAnimation();
}
}
}
},
update(dt) {
if (this.buildingInfo) {
// 不断刷新界面
this.layout(this.buildingInfo);
// 只有已经解锁进度条才会走
if (this.buildingInfo.isUnlocked) {
// 进度条走完, 开始生产金币
if (Math.floor(this.rateProgressBar.progress) === 1) {
this.rateProgressBar.progress = 1;
if (GameModule.userInfo.levelHomeItemFullCount != 5 && // 是否满级
this.cityId === Global.devCityId) { // 当前访问的是不是这个city
if (this.notPickupCount >= this.coinArrayMax * 10) {
this.rateProgressLabel.node.active = false;
this.coinFullTip.active = true;
} else {
this.coinFullTip.active = false;
this.notPickupCount += 1;
this.generateCoin();
this.rateProgressBar.progress = 0;
this._currentTime = 0;
}
} else { // 满级后的状态
this.rateProgressBar.progress = 0;
this._currentTime = 0;
this.coinFullTip.active = false;
this.rateProgressLabel.node.active = true;
}
} else {
this.rateProgressLabel.node.active = true;
this.coinFullTip.active = false;
this._currentTime += dt;
this.rateProgressBar.progress = this._currentTime / this.countDown;
if (Math.floor(this.rateProgressBar.progress) === 1) {
this.rateProgressBar.progress = 1;
}
let resultCountDown = this.countDown - Math.floor(this._currentTime);
if (this._preCountDown !== resultCountDown) {
this.countdownLabel.string = DWTool.calculateTime(resultCountDown);
this._preCountDown = resultCountDown;
}
}
}
}
},
setResidentTip(show) {
this.residentTipNode.active = show;
}
});