[游戏架构设计]利用观察者模式和虚函数实现多语言解决方案

 - by Hector

[游戏架构设计]利用观察者模式和虚函数实现多语言解决方案

游戏实现多语言的思路很简单:

把需要翻译的内容做出一个key-value的字典,不同语言加载不同语言的字典文件,程序设计时用一个单例类管理i18n,提供全局的根据key取得翻译的方法。

可以想象,多语言的游戏(或其他app)可能存在在各个Layer,可能有字体,语言翻译,图片翻译等等,而这些界面基本要不同程序协同完成,如果不统一管理挺势必会各种杂乱,用户切换语言也很让不同界面即时更新相当麻烦。这里我解决这个问题的一种方法,希望能起到抛砖引玉的作用。

基类有设置更新的虚函数

我在所有界面类(Layer)中继承了一个基类(或者利用多重继承单独做成一个接口),父类有设置和更新多语言的虚函数(根据复杂度,可分为设置、更新两个函数,或合并为一个)。

我们在所有需要设置多语言的界面中实现这个函数,并把所有多语言的设置和更新操作放在里面。这样,在多语言界面中,会自动按照界面的继承关系,一层一层的设置或更新其当前层的多语言,而互不影响。一个界面中加载的其他界面也会运行自己的多语言函数。

观察者模式实时更新

观察者模式:我们在程序的很多地方都有观察者,当通知者发送一个通知时,会将这些通知告知这些观察者,观察者收到通知后进行后续处理。

NotificationCenter是cocos2d-x的一个通知者类,我们可以在OnEnter的时候进行观察,在OnExit时结束观察。

结合上面的虚函数,我们在什么多语言相关的父类的OnEnter和OnExit中开始观察和释放观察者,子类不需要任何处理。这样,当用户更换语言后,发送一个更新语言的通知,由于所有界面都继承自这个基类,将层层更新本界面的语言设置。

优点

多语言方案简单统一,一个通用的基类负责监听多语言更新的通知,所有子类界面的多语言只需在规定的函数中完成即可,多程序员协同作业简单高效。

— 废话很多,以上

Leave a comment