求助 cc.Label prototype 应该怎么写

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多语言也方便了。

那我们的解决方式差不多

你这样改,引擎里似乎加入了游戏的东西,似乎不有些不太好。。。(感觉完全不是纯引擎了。。),还是在自己的游戏里封装一个比较好。。(个人认为)

我个人认为这个需求还不值得去自定引擎