Project1

标题: 以一个程序设计的角度来看这个RPG引擎 [打印本页]

作者: 爆发的妞    时间: 2013-5-9 13:07
标题: 以一个程序设计的角度来看这个RPG引擎
本帖最后由 爆发的妞 于 2013-6-21 10:55 编辑

小弟在学习这个rpg marker 引擎, 感觉有好多值得学习的地方。
问的也都是一些基础简单的问题。
小弟有个想法, 有好多高手经验都比较丰富。 对于引擎里面的脚本
都比较熟悉。 能否写出来让更多的学习引擎设计和开发的朋友学习。
无论你是搞 ruby or lua or java or c# or object-c 各种语言的同学,
或是 xp or vx or ae ,
或是 搞 工具 or 引擎 or 策划 or美术 , 有想法都可以写出来。

我也会不定期写一些自己的理解, 望大家指正。

朋友们, 别客气, 自己的心得什么的都可以提出来。。。

讨论问题列表:
1.在事件里面添加脚本合适吗?  2# ~ 4#
2. xp 脚本引擎 整体结构类图分析,只有地图场景的分析。 战斗场景类似。 5# ~ 7#
3.在移动设备上,fps之痛?  9# ~ 16#
4.地图的tile_id数值是怎么使用的, 分自动元件? 26#
5.问一下,Input里面的代码是怎么个实现的,有没有伪代码之类的可以参考?  未解决
6.小里程碑,移动设备,完美实现,行走地图
7.主角移动, 其他角色有略微的偏移的问题。
8.解析数据库的图块数据和地图中对应的图块数据  25#
9.viewport视口,sprite等绘制问题 27# 未解决

小弟创建了一个 6R移动交流群, 旨在对移动游戏制作有兴趣的同学加入,
群号:323876830 没有验证,可直接加入
群公告: 请发6R帖子地址寻求帮助或讨论, 禁止灌水, 共同学习
所以嘛, 请爱灌水的同学绕路了。。
作者: 爆发的妞    时间: 2013-5-10 10:50
1.在事件里面添加脚本合适吗?
大家都知道在事件选项里面有可以插入脚本的选项。
觉得这个方法好神奇啊。 居然可以解释代码。
看了一下代码是 使用result = eval(script) 这个方法。
搜了一下帖子,这里提到了他 http://rpg.blue/forum.php?mod=viewthread&tid=277033
不知道ruby怎么处理的, 应该会编译一下吧。 其他语言要是处理应该会这样。
亲们 , 插入脚本的硬霸功能, 虽然功能强大, 但是感觉破坏了代码的结构和封装性,
你们觉得呢?
作者: zhangbanxian    时间: 2013-5-10 22:08
爆发的妞 发表于 2013-5-10 10:50
1.在事件里面添加脚本合适吗?
大家都知道在事件选项里面有可以插入脚本的选项。
觉得这个方法好神奇啊。  ...

- -b事实上对于动态语言eval很常见...话说事件脚本的标准用法应当是
  1. class Interpreter
  2. def xxx
  3.   xxx
  4. end
  5. end
复制代码
来着,作为事件指令的一个扩展接口...

作者: 爆发的妞    时间: 2013-5-11 09:30
zhangbanxian 发表于 2013-5-10 22:08
- -b事实上对于动态语言eval很常见...话说事件脚本的标准用法应当是来着,作为事件指令的一个扩展接口... ...

恩。谢谢你的回复。
算是见识了吧。 不过我所遇到的其他引擎, 都没有这种功能。




作者: 爆发的妞    时间: 2013-5-11 11:08
2. xp 脚本引擎 整体结构类图分析,只有地图场景的分析。 战斗场景类似。
可以给像我这样的新人, 更好的理解这个程序。
大家感觉有什么问题, 可以多多指正。

整体结构类图.png (17.43 KB, 下载次数: 15)

整体结构类图.png

作者: chd114    时间: 2013-5-12 14:25
ruby or lua or java or c# or object-c 我居然看成了 ruby or lu a lu rjava or c# or object-c ·······感觉RMXP很强大只是脚本复杂到新手完全只能被束缚在框架中,RMAV的话系统很多东西都有成品(比如装备提高角色生命的,RMXP就没有),但是脚本能做的东西就有点少
作者: 爆发的妞    时间: 2013-5-12 16:50
chd114 发表于 2013-5-12 14:25
ruby or lua or java or c# or object-c 我居然看成了 ruby or lu a lu rjava or c# or object-c ···· ...

哈哈。 你太敏感了。   
谢谢你的回复。
RMAV的脚本还没有看。 主要看了xp的。
xp 和 vx 的脚本架构差不多。
其实这个引擎还是蛮强大的, 支持插入脚本,
感觉哪里不合适都可以改。 就是数据库是依照RPG
设计的, 做其他类型的游戏,改脚本较多。  
还有一个该引擎是基于格子判断的系统。
碰撞检测可能没那么精确, 还有攻击动画没有
关键帧和攻击区域的概念。 改arpg比较麻烦。
作者: chd114    时间: 2013-5-12 16:59
爆发的妞 发表于 2013-5-12 16:50
哈哈。 你太敏感了。   
谢谢你的回复。
RMAV的脚本还没有看。 主要看了xp的。

我个人是希望做一种类似《上古2》的游戏啦~~~感觉RMAV和VX出来都晚一些,所以觉得XP在时间上优势极端大···
作者: 爆发的妞    时间: 2013-5-14 15:46
小弟模仿xp脚本在android平台实现了地图绘制的功能。
遇到的问题是 如果是2层地图的话,fps 只能达到20多帧,
1层的话, 40多帧。 3层的话真不敢想象。。。
本人机器配置:
型号:sumsung i9000
处理器:1G
分辨率:800*480
以我的机器为例:
每次绘制的格子数是
1层 (800/32=25)*(480/32=15) = 375
2层 375*2 = 750
也就是需要750次的循环了。 时间都耗在这里了。

帖子上我也看到了对于RMXP for android 模拟器的讨论。
http://blog.csdn.net/cxy1238/article/details/6954422
作者本人也说在他的G10也只是20左右。可见直接使用
模拟器是不太现实的。
我使用过的其他引擎,也基本上是一层的,对于移动设备来说。
2层估计扛不住了。

有谁有好的办法,或者解决方案,可以奉献出来啊, 小弟在此谢过。。

device-2013-05-14-154536.png (31.36 KB, 下载次数: 10)

device-2013-05-14-154536.png

作者: 一根大鸡巴    时间: 2013-5-14 20:17
爆发的妞 发表于 2013-5-14 15:46
小弟模仿xp脚本在android平台实现了地图绘制的功能。
遇到的问题是 如果是2层地图的话,fps 只能达到20多帧 ...

首先声明,我没有用过RPGMaker,所以对脚本不是很了解。
2D游戏开发,已经涉及了。不过最近要找工作的,因为要作品程序,只好做了简单的引擎。这两天正在考虑地图绘制问题。因此一直在66上DOWN资源,看到lz的帖子,
特来看一下。
不能提出什么建设性意见,权当笑料罢了。
以现代的cpu和gpu技术来说,如果2d绘图的掉帧,99%都是程序没有优化好,或者是设计的失误。手机也一样。如果是用android的话,估计是用opengl。这点,我大学的时候
看过一段时间opengl。现在忘记了。

首先先说下我的引擎绘制方案吧。2d游戏地图,经典的格子层,这是共识的无可多说。关键是怎么加快格子绘制进度。我设计引擎的时候,仿造<传奇>,建立三层,一层地板,
一层物品,中间根据角色位置来判断遮挡。最上一层,每单元2字节,来判断碰撞。
在地图绘制过程中,如类似传奇类的大型rpg,本身图元利用率就很低。所以,类似比奇,大多资源都是放在硬盘文件中,需要时候才能读取,但即使读取这些文件,本身也是很要花时间的。即便是 文件映射到内存。事先,我把传奇所有的图片压缩为png格式,因此不能直接写屏幕。这是我的引擎和传奇使用的D7最重要的区别。这点来,图片解压缩就需要花费时间。而且在基数长宽下会轻度失真。

在这个图中,绘制20*20单元格。每一个格子图元都是由即时加载生成。映射两个硬盘文件一个是地图数据,一个是图片集和。
总地图资源在40X40时一帧耗费0.265f秒,在2048X2048时耗费0.886秒。Alienware表示压力很大,在另外一台旧笔记本上彻底跑不动。原因在哪里?
解决方案
其实在绘制地图时候,第一帧总是要画很长时间,但是第二帧呢,如果不移动,第一帧和第二帧绘图就是相等。就算是移动只要不是用了随机传送卷,第一帧和第二帧也不会变化太大幅度。所以要充分利用这些。而且玩家在意的是角色而不是背景。 还记得 暗黑3 里,选项设置中有前景和背景之分吗。

所以我把第一帧绘制过的图形,存放在一个池子里,然后每次加载前,要先确认池中是否有存在的元素,这些元素可以重复利用。而对于手机rpgmaker之类,本身地图单元格就有很大的重复率。而且减少读写文件的次数。这次,在新引擎下绘制28X28 3层格子耗时几乎可以忽略。实测在0.0016波动。

其实最主要的,还是本身语言的痛处。android是Java,忽略了指针,就失去了自由控制变量生命周期和内存的自由。如同当需要不停依靠一个循环数组来检测是否重复资源的时候,使用指针和一个队列,就可以解决问题。
还有就是GPU的问题。
如果是android,理论上是可以操作gpu的。opengl情况我不清楚。但和dx大抵有类似的地方。首先你加载单元格时候,禁止cpu访问,而且使用writediscard,可以略微加快速度。还有就是合理使用内存和显存,在两者之间相互替换。因为我自己搞了1年左右的d9,本来想做游戏程序的,但硬生生被老师拿去做微分了。因为d9在图片操作的时候,释放速度一直不尽人意,所以我临时决定用d10绘制,d10不支持vista以下系统。
希望对你有帮助。
作者: noachic    时间: 2013-5-15 12:48
lz你走偏了,用openGL
作者: 爆发的妞    时间: 2013-5-15 13:01
noachic 发表于 2013-5-15 12:48
lz你走偏了,用openGL

恩。 谢谢你回复。
openGL绘制的确效率高些, 不过不是所有的手机
都支持openGL的。 我是使用普通的canvas绘制的。
另外我觉得2D游戏没必要使用openGL进行绘制。
如兄言, 有没有可靠的参数来说明openGL绘制
能提高多少的性能,相对于普通的canvas绘制。  
作者: 爆发的妞    时间: 2013-5-15 13:20
一根大鸡巴 发表于 2013-5-14 20:17
首先声明,我没有用过RPGMaker,所以对脚本不是很了解。
2D游戏开发,已经涉及了。不过最近要找工作的, ...

谢谢你的回复。
有一些很不错的意见。
首先 减少绘制的次数, 我想到可以使用 双缓冲+卡马克算法解决。
还有一个是使用openGL,这个我可能只是来试验一下来做吧。 因为
简单的2D图形使用openGL效果不一定好。 况且有些手机也不一定支持。
作者: noachic    时间: 2013-5-15 13:23
我现在在用的cocos2dx引擎,openGL绘制2d的,你可以自己试下,有专门的贴片地图的。
作者: 一根大鸡巴    时间: 2013-5-15 14:51
爆发的妞 发表于 2013-5-15 13:20
谢谢你的回复。
有一些很不错的意见。
首先 减少绘制的次数, 我想到可以使用 双缓冲+卡马克算法解决。 ...

使用OPENGL,调用硬件支持是加快绘制速度的关键。单单靠cpu的解算速度可能不尽人意。而且涉及更多的颜色时候,cpu显然显得很吃力。
以google的实力,android应该支持shader。
如果可以调用shader编程,速度提升不仅仅是一两倍的事情。
我曾经写过1366X768分辨率下的模糊算法。 以最简单,将周围四个压缩为1格,进行模糊,每一帧需要计算4X1366X768。cpu相当吃力,如果用shader,
直接飘逸uv坐标,几乎不耗时间。
不是opengl绘制2d效果不好,是因为现代的显卡厂商已经无视2d绘制了。N卡的一则报告上有说,2d绘制在现在显卡上耗时为0。

关于绘图速度的调整,计算机就是在内存和速度上来回切换的。使用双缓冲应该可以解决问题,实在不行用3倍缓也可以,现在移动设备内存是最不值钱的。我的建议是,如果你的地图背景非动态而且角色与地图交互少的情况下,
可以预先渲染一张地图,放入缓存中不需要更改,然后只绘制角色和那些会动的树木等等。

双缓冲,也取决与单帧的绘制速度,如果单帧绘制不够快,两个线程也只能在临界区互相等待。如果你又足够大的内存
可以在角色换新地图的时候,`LOADING界面后台加载足够的大地图,根据角色位置,直接 从内存中的 地图的RECT 复制到当前画面上。这样可以直接跳开循环检测方案。而且等于地图只绘制了一次。等价于你后台绘制地图,然后切换到前台的效果。不过少了线程,减少cpu消耗。
作者: 爆发的妞    时间: 2013-5-17 11:37
对于fps低下的问题, 小弟已经解决。
还要再次谢谢楼上两位的建议。
现在三层全铺满, 人为干预20毫秒的情况,
fps基本上可以达到140以上。
具体的解决方法是使用了卡马克算法, 这两天又
温习了下, 原理简单, 编写起来还是非常麻烦的。
手机还是原来的配置:
机型:i9000
分辨率:800*480
地图三层,全铺满
地图宽30格子, 高 20格子。

device-2013-05-17-112553.png (31.39 KB, 下载次数: 17)

device-2013-05-17-112553.png

作者: 爆发的妞    时间: 2013-5-17 14:58
我看xp绘制地图的时候,用到tile_id,不知道这个数值
xp是怎么导出数据的。 并且怎么用。

RUBY 代码复制
  1. for z in [email]0...@map_data.zsize[/email]
  2.  
  3. 723.          # Passes Through X Coordinates
  4.  
  5. 724.          for x in x1...x2
  6.  
  7. 725.            # Passes Through Y Coordinates
  8.  
  9. 726.            for y in y1...y2
  10.  
  11. 727.              # Collects Tile ID
  12.  
  13. 728.              id = @map_data[x, y, z]
  14.  
  15. 729.              # Skip if 0 tile
  16.  
  17. 730.              next if id == 0
  18.  
  19. 731.              # Skip If Non-Animated Tile
  20.  
  21. 732.              next unless @autotiles[id / 48 - 1].width / 96 > 1 if id < 384
  22.  
  23. 733.              # Passes Through All Priorities
  24.  
  25. 734.              for p in 0..5
  26.  
  27. 735.                # Skip If Priority Doesn't Match
  28.  
  29. 736.                next unless p == @priorities[id]
  30.  
  31. 737.                # Cap Priority to Layer 3
  32.  
  33. 738.                p = 2 if p > 2
  34.  
  35. 739.                # If Autotile
  36.  
  37. 740.                if id < 384
  38.  
  39. 741.                  # Draw Auto-Tile
  40.  
  41. 742.                  draw_autotile(x, y, p, id)
  42.  
  43. 743.                  # Draw Higher Tiles
  44.  
  45. 744.                  for l in [email]0...@map_data.zsize[/email]
  46.  
  47. 745.                    id_l = @map_data[x, y, l]
  48.  
  49. 746.                    draw_tile(x, y, p, id_l)
  50.  
  51. 747.                  end
  52.  
  53. 748.                  # Save Autotile Location
  54.  
  55. 749.                  autotile_locations[x, y, z] = 1
  56.  
  57. 750.                # If Normal Tile
  58.  
  59. 751.                else
  60.  
  61. 752.                  # If Autotile Drawn
  62.  
  63. 753.                  if autotile_locations[x, y, z] == 1
  64.  
  65. 754.                    # Redraw Normal Tile
  66.  
  67. 755.                    draw_tile(x, y, p, id)
  68.  
  69. 756.                    # Draw Higher Tiles
  70.  
  71. 757.                    for l in [email]0...@map_data.zsize[/email]
  72.  
  73. 758.                      id_l = @map_data[x, y, l]
  74.  
  75. 759.                      draw_tile(x, y, p, id_l)
  76.  
  77. 760.                    end
  78.  
  79. 761.                  end
  80.  
  81. 762.                end
  82.  
  83. 763.              end
  84.  
  85. 764.            end
  86.  
  87. 765.          end
  88.  
  89. 766.        end
  90.  
  91. 767.      end


上面有tile_id的使用, 没搞清楚跟啥有关系, 这个384,是什么概念?
望清楚的可以给小弟明示一下。 谢谢啦。
作者: Sion    时间: 2013-5-17 15:59
爆发的妞 发表于 2013-5-17 14:58
我看xp绘制地图的时候,用到tile_id,不知道这个数值
xp是怎么导出数据的。 并且怎么用。

      因为只看过ACE的脚本,所以不是很肯定。那个 tile_id 是图块的索引,就是32*32的小格子从左到右一排一排往下数。
      通过索引可以直接定位图块:tile_id % 每行图块数 得到 “列数”; tile_id / 每行图块数 得到“行数”,使用的时候通常再 * 32 可以得到图块在素材的左上角坐标
      另外还可以建立一个数组,储存关于图块的其它信息,比如用于通行判定之类的信息。通过这个tile_id也可以轻松得到相应的信息。
作者: 爆发的妞    时间: 2013-5-17 17:22
Sion 发表于 2013-5-17 15:59
因为只看过ACE的脚本,所以不是很肯定。那个 tile_id 是图块的索引,就是32*32的小格子从左到右一 ...

谢谢你的回复。
我看 tile_id不是单纯的% or / 得到对应图片的位置等等。
上段代码给我的意思是 在384之前的图块是自动元件的,
在384之后, 是正常的。 就是搞不清他的值区域的意思。
然后怎么绘制一张自动元件的图块呢?怎么得到是自动元件的
哪个图块?
作者: Sion    时间: 2013-5-17 18:06
本帖最后由 Sion 于 2013-5-17 18:27 编辑
爆发的妞 发表于 2013-5-17 17:22
谢谢你的回复。
我看 tile_id不是单纯的% or / 得到对应图片的位置等等。
上段代码给我的意思是 在384 ...


自动元件大概就是根据一个图块它周围的图块是否跟它自身一样,然后来决定图块样式。
xp这个图块好乱,看不出它是怎么计算的- -b,大概原理就是这样:http://bbs.9ria.com/thread-157487-1-1.html
实在不行自己写一个吧。


补充:
绘制完以后,tile_id 应该就是对应到每个具体的图块了,自动元件只是在绘制的时候会智能的帮你选中对应的元件(确定它的tile_id)而已。这个是在生成动态的区域比较有用,比如绘制战争迷雾。算法其实很简单,几行就搞定的,P那堆图才叫麻烦。如果你没有对应的地图编辑器,还是建议一格一格来画吧- -b
作者: 爆发的妞    时间: 2013-5-24 09:26
小里程碑,移动设备,完美实现,行走地图

device-2013-05-24-092320.png (37.7 KB, 下载次数: 19)

device-2013-05-24-092320.png

作者: 爆发的妞    时间: 2013-6-3 13:23
当添加其他角色的时候, 当主角行走的时候, 其他角色会有稍微的偏移现象,
查了好久,发现数据显示都是正常的,百思不得其解, 最后发现是Sprite_Character
里面出了问题。
他的update绘制方法:
主要逻辑是这样的,
1.首先super,调用父类的update
2.然后
    # 设置脚本的坐标
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
设置位置等。

这就产生问题了, 当逻辑执行完,要绘制的时候,
第一帧没有进行相应的变化, 而是等下一帧才变化。
有一帧的延迟。
做法是把super放到方法最后执行。
rm没有这个问题,我重写的会有这个问题。

device-2013-06-03-131436.png (46.43 KB, 下载次数: 15)

device-2013-06-03-131436.png

作者: 恶魔般的天使    时间: 2013-6-3 18:08
不懂楼主表达什么意思
作者: 爆发的妞    时间: 2013-6-4 09:06
恶魔般的天使 发表于 2013-6-3 18:08
不懂楼主表达什么意思

呵呵。等你重写一下引擎,你就明白了。
作者: 爆发的妞    时间: 2013-6-20 17:17
本帖最后由 爆发的妞 于 2013-6-21 17:41 编辑

需要用到数据库中的图块的数据,直接解析生成的文件, 貌似没有那么容易,
结构不太明白,还需要深入学习。所以就简单的在工程中输出了。
需要用到的同学,可以拿去

代码如下:
RUBY 代码复制
  1. #输出Tilesets
  2.     #创建一个可写文件流
  3.     fh = File.new(sprintf("Data/Tilesets.rx"), "w")
  4.     #输出地图数据
  5.     size = $data_tilesets.size - 1
  6.     for i in 1..size
  7.         tileset = $data_tilesets[i]
  8.         tileset_name = tileset.tileset_name
  9.         autotile_names = tileset.autotile_names
  10.         panorama_name = tileset.panorama_name
  11.         panorama_hue = tileset.panorama_hue
  12.         fog_name = tileset.fog_name
  13.         fog_hue = tileset.fog_hue
  14.         fog_opacity = tileset.fog_opacity
  15.         fog_blend_type = tileset.fog_blend_type
  16.         fog_zoom = tileset.fog_zoom
  17.         fog_sx = tileset.fog_sx
  18.         fog_sy = tileset.fog_sy
  19.         battleback_name = tileset.battleback_name
  20.         passages = tileset.passages
  21.         priorities = tileset.priorities
  22.         terrain_tags = tileset.terrain_tags
  23.         fh.puts i
  24.         fh.puts 'tileset_name  %s.png'% [tileset_name]
  25.         fh.print 'autotile_names  '
  26.         for i in 0..autotile_names.size
  27.             if autotile_names[i].nil?
  28.               fh.print ','
  29.             else
  30.               fh.print '%s.png,'% [autotile_names[i]]
  31.             end
  32.         end
  33.         fh.puts ''
  34.         passages_size = passages.xsize
  35.         fh.print 'passages  '
  36.         for i in 0..passages_size
  37.             fh.print '%s,'% [passages[i]]
  38.         end
  39.         fh.puts ''
  40.         priorities_size = priorities.xsize
  41.         fh.print 'priorities  '
  42.         for i in 0..priorities_size
  43.           if i==priorities_size
  44.             fh.print '%s'% [priorities[i]]
  45.           elsif i==0
  46.             fh.print '%s,'% [5]
  47.           else
  48.             fh.print '%s,'% [priorities[i]]
  49.           end
  50.         end
  51.        fh.puts ''
  52.     end
  53.     fh.close #关闭文件流


下面的代码是对应地图图块的数据输出,
代码如下:
RUBY 代码复制
  1. #创建一个可写文件流
  2.     fh = File.new(sprintf("Data/Map%03d.rx", @map_id), "w")
  3.     #输出地图数据
  4.     for i in 0..2
  5.       xsize = @map.data.xsize
  6.       #print xsize
  7.       ysize = @map.data.ysize
  8.       #print ysize
  9.       fh.puts '[w = %s][h = %s]'% [xsize,ysize]
  10.       for line in 0...ysize
  11.         for col in 0...xsize
  12.            tile_id = @map.data[col, line, i]
  13.            if tile_id == nil
  14.               #fh.puts "[%s][%s][%s]=%s" % [col, line,i,'空'] #写入数据
  15.               #print "[%s][%s][0]=%s" % [col, line,'空']
  16.               fh.print "%s," % ['空']
  17.             else
  18.               #fh.puts "[%s][%s][%s]=%s" % [col, line,i,tile_id] #写入数据
  19.               #print "[%s][%s][0]=%s" % [col, line,tile_id]
  20.               if col==xsize-1
  21.                  fh.print "%s" % [tile_id]
  22.               else
  23.                  fh.print "%s," % [tile_id]
  24.               end
  25.             end
  26.           end
  27.           fh.puts ''
  28.         end
  29.         fh.puts ''
  30.      end
  31.     fh.close #关闭文件流


后续还会解析其他的数据,感兴趣的可以,共同研究
作者: 爆发的妞    时间: 2013-6-20 19:23
本帖最后由 爆发的妞 于 2013-6-20 19:43 编辑

rm for android (原生开发)
地图展示,不过不包含优先级的功能绘制



调了一下fps,和有对话脚本的图

device-2013-06-20-191050.png (218.96 KB, 下载次数: 13)

device-2013-06-20-191050.png

device-2013-06-20-194202.png (170.44 KB, 下载次数: 16)

device-2013-06-20-194202.png

作者: 爆发的妞    时间: 2013-6-21 10:54
个位高人,小弟在做地图的绘制的时候遇到个问题,
我简单的描述一下吧:
看代码,可以了解到 sprite,plane和window是展示在
对应的viewport视口上面的。
但通篇都没有看到对于viewport和sprite等的绘制部分,
全是update逻辑处理。
我猜想一下他们是不是这样处理的, 每次new新建一个viewport
视口的时候,就在viewportManager(暂定视口管理器)添加一个,
然后 sprite也是如此, 有一个spriteManager来管理他们, 其他同理,
那么就是先根据viewport视口的z轴判断进行绘制, 然后再绘制viewport
视口内的 sprite等等(也是根据z轴来判断绘制), 如果rm内部这样来做的
话,逻辑倒也说的清除, 但是参考help(帮助文档),发现 sprite,plane和window
是继承object(基类的),而不是一个viewport视口能够统一处理的类,例如 baseSprite。
难道绘制的时候还判断了下实例, 这个真的不得而知, 不知道我的猜测有无道理。
如果有哪位同学知道的,可以赐教下。 谢谢啦。
作者: 灼眼的夏娜    时间: 2013-6-22 11:29
继承自Object和Viewport是否能够统一处理没有必然联系(

继承自Object,Sprite也可以再Viewport的容器里(~
作者: 爆发的妞    时间: 2013-6-22 12:04
灼眼的夏娜 发表于 2013-6-22 11:29
继承自Object和Viewport是否能够统一处理没有必然联系(

继承自Object,Sprite也可以再Viewport的容器里( ...

谢谢高人指点。 不过我还是没明白他的结构。
sprite只是引用了viewport,就是说在某一个viewport视口里面。
但是viewport并没有对他进行管理啊。 有没有伪代码, 可以
看看。 谢谢啦。
作者: 灼眼的夏娜    时间: 2013-6-22 12:42
爆发的妞 发表于 2013-6-22 12:04
谢谢高人指点。 不过我还是没明白他的结构。
sprite只是引用了viewport,就是说在某一个viewport视口里 ...

viewport没对sprite进行属性管理(但管理了 sprite的渲染(根据sprite的各种属性进行渲染
作者: 爆发的妞    时间: 2013-6-22 12:56
灼眼的夏娜 发表于 2013-6-22 12:42
viewport没对sprite进行属性管理(但管理了 sprite的渲染(根据sprite的各种属性进行渲染  ...

恩。谢谢你的回答。 我说的意思就是对sprite进行管理。
就类似于我上面说的spriteManager的概念。
有没有这方面的代码可以参考下。
因为看了tilemap的第三方实现,了解到xp的三层是个逻辑三层,
而不是地图的三层,只是对layer中的图片进行了绘制,而layer是一个
sprite,所以猜想是viewport对sprite进行了管理。 是根据z轴进行绘制的。
然后最外层, 是对viewport进行绘制的,也是根据z轴。
这方面有什么参考吗?这样我也可以少走点弯路。 谢谢啦。
作者: 灼眼的夏娜    时间: 2013-6-22 13:03
大概渲染流程

def 渲染(list)
  list.sort_by_z.each{|d| if d.is_a?(Viewport) then 渲染(d.childrens) else d.render(...)}
end





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1