赞 | 1 |
VIP | 246 |
好人卡 | 87 |
积分 | 1 |
经验 | 34142 |
最后登录 | 2015-1-15 |
在线时间 | 323 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 55
- 在线时间
- 323 小时
- 注册时间
- 2010-8-21
- 帖子
- 666
|
本帖最后由 沙漠点灰 于 2013-4-22 23:15 编辑
lz只要技能树的话..粗略看了下截图,先从信息读取说吧
因为lz只要算法,所以从简,而且没有测试
技能等级读取
有
level_x = [xx,xx]的
就是- re = /level_(\d+) = (.+)/
- tree_level = []
- skill_obj.note.scan(re){|str|str[re]
- tree_level[$1.to_i] = Kernel.eval($2)}
复制代码 skill_obj就是技能对象,利用正则表达式进行匹配,最后存到tree_level中
照截图的所说,没有level_0,所以,tree_level[0]就为nil值,建议初始化技能节点类似,就不赘述了- skill_obj.note[/.*connections = (.+).*/]
- skill_onnections = Kernel.eval($1)
复制代码 窗口的建立不多说,那个貌似有说明窗口,也很简单。
最主要的就是各个图标的位置了,
首先为窗口定义两个实例变量@show_x,@show_y。这是为了节约内存,
但是考虑到现在内存灰常大,可以考虑把窗口显示位图初始化很大很大,具体有多大随你便,够用就行(别用硬编码)。
坐标更新时,先更新@show_x,@show_y。
然后把图标显示的坐标分别减去@show_x,@show_y。
不用的话直接修改ox,oy就行.
lz如果善于发现的话,会发现,每个技能点占得宽度为它所有次级技能宽度之和,这就会用到递归算法了。
算法如下:- def search_next(id)
- skill_onnections.each{|i|yield(i[1]) if i[0] == x}
- end
- def getWidth(id)
- _width = WIDTH_DUST
- search_next(id){|next_id|_width += getWidth(next_id)}
- _width
- end
复制代码 WIDTH_DUST就是一个的宽度,还是建议别用硬编码
当然,仅仅是宽度而已,后边的也要加前面,每级清零,并加上位置修正,这个后面说。
把技能图标放到中间就行,一个遍历应该就能解决,在这个遍历中,放完每一个检查有没有父技能,有的话,头上插根天线,用
fill_rect,每个用一个数组存储每个父技能的子技能天线位置,父技能的子技能天线顶端相互连起来.再检查有没有子技能,有的话,接根地线,
就不用记录了,因为子技能会帮你接的。
上面说到位置修正,其实就是父技能的前个技能(如果有的话)的位置。
说到这,也差不多了,但是这,貌似还是很麻烦,所以建议lz直接自己封装一个Game_Skill_Tree类
Game_Actor下加一个实例变量- @skill_tree = []
- 你的遍历处理
- skill_id = xxxxxxxx
- @skill_tree << Game_Skill_Tree.new(skill_id)
- @skill_tree[-1].father = xx
- @skill_tree[-1].father_b = xx
- @skill_tree[-1].width = getWidth
- @skill_tree[-1].x = (@skill_tree[-1].father_b ? @skill_tree[-1].father_b.x : 0) + @skill_tree[-1].width / 2
- @skill_tree[-1].y = xxxx
- ....更多处理
- 你的遍历处理结束
复制代码 加个方法get_skill_tree(skill_id)返回@skill_tree中适当的成员
Game_Skill_Tree也是自然不会给出现成代码,不过至少得提供以下接口:
father 父技能树对象
father_b 获取父技能前个树对象
x,y,width 等可读可写数据
上面的
search_next
getWidth
因为封装成类了,所以参数自然就省了
不过说回来,成类了,search_next也可以用数组代替了.
话说这不蛋疼么,既然有现成的,还要自己写?( ̄▽ ̄")
|
|