var stu={
_age=20;
editor=1
}
Object.defineProperty(stu,“age”,{
get:function(){
return this._age;
},
set:function(newage){
this._age=newage;
this.editor++;
}
})
stu.age=200;
百度抄的
var stu={
_age=20;
editor=1
}
Object.defineProperty(stu,“age”,{
get:function(){
return this._age;
},
set:function(newage){
this._age=newage;
this.editor++;
}
})
stu.age=200;
百度抄的
Object.defineProperty(cc.Label,‘string’,{
get:function () {
return this.string;
},
set:function (str,param) {
let i18 = this.geti18n();
if (i18) {
i18.init(str, param ? param : null)
} else {
this.string = str;
}
}
})
这样写在 string = xxx 的时候还是不会执行到set…
我的需求跟这个差不多,有这么一句
我看了Label的源码,string的setter函数中除了赋值还有其它逻辑调用,让我难以下手,我没能找到对于一个setter进行拦截的方法。可否请官方做一下调整:
搜到了这个,我试试
那全文替换 ‘.string =’ 这个呢?
替换成你自己实现的接口
这个办法是最笨的办法,不好说有多少string = 这样的写法,就算花一天替换改了,再改出bug来就不好说了。。
因为你写的是 string = “中文” 这个"中文"要换成其他文,你必然要每个都要去改的,不是么???
如果 最初 你想去要多语言的话,可能就不会使用string = “中文” 这种直接写法了,但是现在以经是这样了,一个一个去改似乎是必须的。
嗯嗯,我错了,只能改一个实例的getset
尝试重定义getset失败
A.defineSetter(“a”,function(val){this._a = val+1})
Uncaught TypeError: Cannot redefine property: a
at Function.defineSetter ()
at :1:3
是的,确实每个地方都要改,但能直接继承set方法似乎更科学?
那你试试 继承一下lable 实现一个相关组件,实现一个通用多语言接口
另一个就是 实现一个util/tools类,里面实现一个多语言接口,这样更方便些,自己怎么处理都可以,不依赖其他的,但改起来稍微有些麻烦,但也是麻烦一次
我能想到的只有继承set方法,似乎这条路不好走,好像因为string的set引擎写了很多自己的东西,影响到渲染,改了set就会导致文本不显示
这个帖子官方的回复要自定引擎,就不给自己挖坑了,还是全换成setString吧
Object.getOwnPropertyDescriptor(cc.Label.prototype,‘string’) 这句一写编译器直接报错
Cannot redefine property: string
。。。。
不想自定引擎了,以前自定后想升级版本太痛苦,考虑到以后的升级就不折腾了,万一官方的2.4.4唰唰的快呢
这种多语言应该封装一个统一的方法,并且用译文表Id去赋值这样可以满足N种语言的一键切换,例如(label:cc.Label,id:number)=>{
if(!label) return;
根据id和当前选择的语言从译文表(json或csv)中读取到字符串
let str=getDataFromJson(id)||"";
label.string=str;
}
有的,这是其中最普通的一种情况,还有一种情况是UI的多语言,这个时候需自定组件,实现编辑器中也能实时多语言
一个个改吧,别想太多了。改个 string 还怕出幺蛾子,游戏就不要开发了。
let strG;
let buildDamgeValue = self.m_building.Damage;
let extendStarStr = ‘’;if (central.m_enCentralViewMode == central.CENTRALVIEW_MODE.CENTRALVIEW_CLANMAP) { buildDamgeValue = buildDamgeValue * cc.ll.gameData.manorDefenceTowerTimes; } if (isUpdate) { let buildNextLevelDamageValue = buildingBaseLevelDataUp.Damage; if (central.m_enCentralViewMode == central.CENTRALVIEW_MODE.CENTRALVIEW_CLANMAP) { buildNextLevelDamageValue = buildNextLevelDamageValue * cc.ll.gameData.manorDefenceTowerTimes; } let clanBuildAddPercent = 1; if (central.m_enCentralViewMode == central.CENTRALVIEW_MODE.CENTRALVIEW_CLANMAP) clanBuildAddPercent = cc.ll.gameData.manorDefenceTowerPerDamageTimes; if (gameData.DEFENSE_TYPE.DEFENSE_CANNON == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_1', ["" + buildDamgeValue + '+' + (buildNextLevelDamageValue - buildDamgeValue) + ' & ' + (clanBuildAddPercent * 0.05 * self.m_building.lv).toFixed(1) + '+' + 0.05 * clanBuildAddPercent + '']); } else if (gameData.DEFENSE_TYPE.DEFENSE_VIPCANON == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_1', ["" + buildDamgeValue + '+' + (buildNextLevelDamageValue - buildDamgeValue) + ' & ' + (clanBuildAddPercent * 0.1 * self.m_building.lv).toFixed(1) + '+' + 0.1 * clanBuildAddPercent + '']); } else if (gameData.DEFENSE_TYPE.DEFENSE_ARCHERTOWER == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_1', ["" + buildDamgeValue + '+' + (buildNextLevelDamageValue - buildDamgeValue) + ' & ' + (clanBuildAddPercent * 0.05 * self.m_building.lv).toFixed(1) + '+' + 0.05 * clanBuildAddPercent + '']); } else if (gameData.DEFENSE_TYPE.DEFENSE_VIPARCHERTOWER == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_1', ["" + buildDamgeValue + '+' + (buildNextLevelDamageValue - buildDamgeValue) + ' & ' + (clanBuildAddPercent * 0.1 * self.m_building.lv).toFixed(1) + '+' + 0.1 * clanBuildAddPercent + '']); } else if (gameData.DEFENSE_TYPE.DEFENSE_MORTAR == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_1', ["" + buildDamgeValue + '+' + (buildNextLevelDamageValue - buildDamgeValue) + ' & ' + (clanBuildAddPercent * 0.25 * self.m_building.lv).toFixed(1) + '+' + 0.25 * clanBuildAddPercent + '']); } else if (gameData.DEFENSE_TYPE.DEFENSE_VIPMORTAR == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_1', ["" + buildDamgeValue + '+' + (buildNextLevelDamageValue - buildDamgeValue) + ' & ' + (clanBuildAddPercent * 0.35 * self.m_building.lv).toFixed(1) + '+' + 0.35 * clanBuildAddPercent + '']); } else if (gameData.DEFENSE_TYPE.DEFENSE_ICE == self.m_building.m_uTypeID) { let cutValue = buildingBaseLevelData.MinAttackRange; cutValue += self.m_building.star; strG = "" + buildDamgeValue + '+' + (buildNextLevelDamageValue - buildDamgeValue); strG += ' + ' + cutValue + '%+' + (buildingBaseLevelDataUp.MinAttackRange - buildingBaseLevelData.MinAttackRange) + '' strG = cc.ll.getText('info_9_2', [strG]) } else if (gameData.DEFENSE_TYPE.DEFENSE_FU == self.m_building.m_uTypeID) { let percentValue = 0; if (self.m_building.lv == 1) percentValue = 5 else if (self.m_building.lv == 2) percentValue = 7 else if (self.m_building.lv == 3) percentValue = 7 strG = cc.ll.getText('info_9_1', ["" + percentValue + '']); } else strG = cc.ll.getText('info_9', ["" + buildDamgeValue + '+' + (buildNextLevelDamageValue - buildDamgeValue)]); } else { if (self.m_building.star > 0) extendStarStr = ' + ' + Math.round(buildDamgeValue * cc.ll.gameData.starAddPercent(self.m_building.star)); //星星 self.m_building.star * 0.1 { let clanBuildAddPercent = 1; if (central.m_enCentralViewMode == central.CENTRALVIEW_MODE.CENTRALVIEW_CLANMAP) clanBuildAddPercent = cc.ll.gameData.manorDefenceTowerPerDamageTimes; if (gameData.DEFENSE_TYPE.DEFENSE_CANNON == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_3',["" + buildDamgeValue + ' & ' + (clanBuildAddPercent * 0.05 * self.m_building.lv + 0.05 * self.m_building.star).toFixed(1) + '',extendStarStr]); } else if (gameData.DEFENSE_TYPE.DEFENSE_VIPCANON == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_3',["" + buildDamgeValue + ' & ' + (clanBuildAddPercent * 0.1 * self.m_building.lv + 0.1 * self.m_building.star).toFixed(1) + '',extendStarStr]); } else if (gameData.DEFENSE_TYPE.DEFENSE_ARCHERTOWER == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_3',["" + buildDamgeValue + ' & ' + (clanBuildAddPercent * 0.05 * self.m_building.lv + 0.05 * self.m_building.star).toFixed(1) + '',extendStarStr]); } else if (gameData.DEFENSE_TYPE.DEFENSE_VIPARCHERTOWER == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_3',["" + buildDamgeValue + ' & ' + (clanBuildAddPercent * 0.1 * self.m_building.lv + 0.1 * self.m_building.star).toFixed(1) + '',extendStarStr]); } else if (gameData.DEFENSE_TYPE.DEFENSE_MORTAR == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_3',["" + buildDamgeValue + ' & ' + (clanBuildAddPercent * 0.25 * self.m_building.lv + 0.25 * self.m_building.star).toFixed(1) + '',extendStarStr]); } else if (gameData.DEFENSE_TYPE.DEFENSE_VIPMORTAR == self.m_building.m_uTypeID) { strG = cc.ll.getText('info_9_3',["" + buildDamgeValue + ' & ' + (clanBuildAddPercent * 0.35 * self.m_building.lv + 0.35 * self.m_building.star).toFixed(1) + '',extendStarStr]); } else if (gameData.DEFENSE_TYPE.DEFENSE_ICE == self.m_building.m_uTypeID) { let cutValue = buildingBaseLevelData.MinAttackRange; cutValue += self.m_building.star; strG = "" + buildDamgeValue + extendStarStr; strG += ' + ' + cutValue + '' strG = cc.ll.getText('info_9_2', [strG]) } else if (gameData.DEFENSE_TYPE.DEFENSE_FU == self.m_building.m_uTypeID) { let percentValue = 0; if (self.m_building.lv == 1) percentValue = 3 else if (self.m_building.lv == 2) percentValue = 5 else if (self.m_building.lv == 3) percentValue = 7 strG = cc.ll.getText('info_9_1',["" + percentValue + '']) } else strG = cc.ll.getText('info_9',["" + buildDamgeValue + extendStarStr]); } } self.l_info1.string = strG;
我给你抽一个刚改完的地方,这是几千处之一,你是一直都在开发小游戏吗?而且项目不在线上,自己也不用负责测试,全篇不超过几千行代码对吗?
UI的多语言我们之前是程序用代码按译文表一个个设置,后来UI使用了FGUI,UI多语言也方便了。
你这样改,引擎里似乎加入了游戏的东西,似乎不有些不太好。。。(感觉完全不是纯引擎了。。),还是在自己的游戏里封装一个比较好。。(个人认为)