从Hint 谈游戏中扩展文本控件

题目有点大,但实际上是很简单的事情,也许一两句话就说完了。

 

组成文本控件的核心对象:

unit: 最小显示单元的抽象。

line:用于组织显示的对象,主要用于可见部分的文字和内容的构造,记录了一组unit所在的位置。

chunk:文本控件内部保存unit的容器,不记录unit的位置信息,一个文本控件里应该包含大量的chunk。

 

行为:

parse:将一段串行化的文本解析成一个chunk。

bulidLine: 将一个chunk按目标窗口的大小等参数,将对象初始化成一组组的line,这里需要考虑unit的splite功能(处理转行的问题)。

show: 计算出需要显示的line,选择正确的内容进行显示。

 

我知道上面的文字很偷懒,但是给出一个相当的实现实在是....各位YY吧。

 

做过Hint的朋友一定知道,它绝对是一个极其繁琐的东西...不在于板式多难,而是策划需要显示的项极其多...

PS:在处理hint的时候,巧妙的使用Macro,合理构造出需要手写的 {} ,能使VS对功能代码进行折叠,会对维护带来极大的好处。方便看,还能设断点。另外说一句,我们解析物品hint的功能函数有近4000行...

 

现在来谈这个题目的核心。

margin 缩进
upStride 上边距
downStride 下边距

 

我不知道各位的实现策略是什么。比如line的缩进,是可以使用空字符来代替的。但是整chunk的缩进,用空字符的策略就显得不那么正确了。我不怀疑你能用那方法做出来,但是这绝对不方便serailize/parse的交替进行。那么,问题是什么?

 

问题就是什么样的对象需要上面3个功能?

 

直接说结论吧:

unit : space

line : upStride, downStride

chunk : margin, upStride, downStride

 

现在来说理由

unit : line 内部的 unit 的上下边距是没有意义的,同时没有字缩进这个说法,我们一般都说字间距。所以在这里换个说法。虽然说普通文字的间距不是通过在这里进行处理的,大多数的方案是在Font上进行, 但是必须要考虑非文本对象,所以对于unit来说,需要实现space。

line : 对于游戏而言,极少需要每line进行缩进排版。如果真有这样的需求,也可以将需要排版的地方转换成“每chunk一个line,使用chunk的缩进”,但是上边距和下边距是需要的,如果不在line上做边距,就没有办法每chunk调整其内部的“行间距”了。

chunk : chunk的整体缩进是为排版提供更加丰富的可能性。上下边距是为了实现“段间距”功能。

 

      当然,段间距我们也可以通过“设置多个文本控件,每文本控件一个chunk”的方式进行实现,这跟行缩进的代替方案的思路一致,但是当你考虑chunk的长度不固定的情况,那你不得不为了使多个文本控件支持动态调整height而做一些非文本控件固有的功能。其实我觉得虽然各种方案最后都能实现,但是其中的取舍根据实现难度、思考理解难度、时间限制等因素,并没有优劣之分,只有合适不合适的问题。这里是我的选择方案:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值