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很常见...话说事件脚本的标准用法应当是class Interpreter
def xxx
xxx
end
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)
作者: 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)
作者: 一根大鸡巴 时间: 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)
作者: 爆发的妞 时间: 2013-5-17 14:58
我看xp绘制地图的时候,用到tile_id,不知道这个数值
xp是怎么导出数据的。 并且怎么用。
for z in [ email] 0 ...@map_data.zsize [ /email]
723 . # Passes Through X Coordinates
724 . for x in x1...x2
725 . # Passes Through Y Coordinates
726 . for y in y1...y2
727 . # Collects Tile ID
728 . id = @map_data [ x, y, z]
729 . # Skip if 0 tile
730 . next if id == 0
731 . # Skip If Non-Animated Tile
732 . next unless @autotiles [ id / 48 - 1 ] .width / 96 > 1 if id < 384
733 . # Passes Through All Priorities
734 . for p in 0 ..5
735 . # Skip If Priority Doesn't Match
736 . next unless p == @priorities [ id]
737 . # Cap Priority to Layer 3
738 . p = 2 if p > 2
739 . # If Autotile
740 . if id < 384
741 . # Draw Auto-Tile
742 . draw_autotile ( x, y, p , id)
743 . # Draw Higher Tiles
744 . for l in [ email] 0 ...@map_data.zsize [ /email]
745 . id_l = @map_data [ x, y, l]
746 . draw_tile ( x, y, p , id_l)
747 . end
748 . # Save Autotile Location
749 . autotile_locations [ x, y, z] = 1
750 . # If Normal Tile
751 . else
752 . # If Autotile Drawn
753 . if autotile_locations[ x, y, z] == 1
754 . # Redraw Normal Tile
755 . draw_tile ( x, y, p , id)
756 . # Draw Higher Tiles
757 . for l in [ email] 0 ...@map_data.zsize [ /email]
758 . id_l = @map_data [ x, y, l]
759 . draw_tile ( x, y, p , id_l)
760 . end
761 . end
762 . end
763 . end
764 . end
765 . end
766 . end
767 . end
for z in [ email] 0 ...@map_data.zsize [ /email]
723 . # Passes Through X Coordinates
724 . for x in x1...x2
725 . # Passes Through Y Coordinates
726 . for y in y1...y2
727 . # Collects Tile ID
728 . id = @map_data [ x, y, z]
729 . # Skip if 0 tile
730 . next if id == 0
731 . # Skip If Non-Animated Tile
732 . next unless @autotiles [ id / 48 - 1 ] .width / 96 > 1 if id < 384
733 . # Passes Through All Priorities
734 . for p in 0 ..5
735 . # Skip If Priority Doesn't Match
736 . next unless p == @priorities [ id]
737 . # Cap Priority to Layer 3
738 . p = 2 if p > 2
739 . # If Autotile
740 . if id < 384
741 . # Draw Auto-Tile
742 . draw_autotile ( x, y, p , id)
743 . # Draw Higher Tiles
744 . for l in [ email] 0 ...@map_data.zsize [ /email]
745 . id_l = @map_data [ x, y, l]
746 . draw_tile ( x, y, p , id_l)
747 . end
748 . # Save Autotile Location
749 . autotile_locations [ x, y, z] = 1
750 . # If Normal Tile
751 . else
752 . # If Autotile Drawn
753 . if autotile_locations[ x, y, z] == 1
754 . # Redraw Normal Tile
755 . draw_tile ( x, y, p , id)
756 . # Draw Higher Tiles
757 . for l in [ email] 0 ...@map_data.zsize [ /email]
758 . id_l = @map_data [ x, y, l]
759 . draw_tile ( x, y, p , id_l)
760 . end
761 . end
762 . end
763 . end
764 . end
765 . end
766 . end
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)
作者: 爆发的妞 时间: 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)
作者: 恶魔般的天使 时间: 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 编辑
需要用到数据库中的图块的数据,直接解析生成的文件, 貌似没有那么容易,
结构不太明白,还需要深入学习。所以就简单的在工程中输出了。
需要用到的同学,可以拿去
代码如下:
#输出Tilesets
#创建一个可写文件流
fh = File .new ( sprintf ( "Data/Tilesets.rx" ) , "w" )
#输出地图数据
size = $data_tilesets .size - 1
for i in 1 ..size
tileset = $data_tilesets [ i]
tileset_name = tileset.tileset_name
autotile_names = tileset.autotile_names
panorama_name = tileset.panorama_name
panorama_hue = tileset.panorama_hue
fog_name = tileset.fog_name
fog_hue = tileset.fog_hue
fog_opacity = tileset.fog_opacity
fog_blend_type = tileset.fog_blend_type
fog_zoom = tileset.fog_zoom
fog_sx = tileset.fog_sx
fog_sy = tileset.fog_sy
battleback_name = tileset.battleback_name
passages = tileset.passages
priorities = tileset.priorities
terrain_tags = tileset.terrain_tags
fh.puts i
fh.puts 'tileset_name %s.png' % [ tileset_name]
fh.print 'autotile_names '
for i in 0 ..autotile_names .size
if autotile_names[ i] .nil ?
fh.print ','
else
fh.print '%s.png,' % [ autotile_names[ i] ]
end
end
fh.puts ''
passages_size = passages.xsize
fh.print 'passages '
for i in 0 ..passages_size
fh.print '%s,' % [ passages[ i] ]
end
fh.puts ''
priorities_size = priorities.xsize
fh.print 'priorities '
for i in 0 ..priorities_size
if i==priorities_size
fh.print '%s' % [ priorities[ i] ]
elsif i==0
fh.print '%s,' % [ 5 ]
else
fh.print '%s,' % [ priorities[ i] ]
end
end
fh.puts ''
end
fh.close #关闭文件流
#输出Tilesets
#创建一个可写文件流
fh = File .new ( sprintf ( "Data/Tilesets.rx" ) , "w" )
#输出地图数据
size = $data_tilesets .size - 1
for i in 1 ..size
tileset = $data_tilesets [ i]
tileset_name = tileset.tileset_name
autotile_names = tileset.autotile_names
panorama_name = tileset.panorama_name
panorama_hue = tileset.panorama_hue
fog_name = tileset.fog_name
fog_hue = tileset.fog_hue
fog_opacity = tileset.fog_opacity
fog_blend_type = tileset.fog_blend_type
fog_zoom = tileset.fog_zoom
fog_sx = tileset.fog_sx
fog_sy = tileset.fog_sy
battleback_name = tileset.battleback_name
passages = tileset.passages
priorities = tileset.priorities
terrain_tags = tileset.terrain_tags
fh.puts i
fh.puts 'tileset_name %s.png' % [ tileset_name]
fh.print 'autotile_names '
for i in 0 ..autotile_names .size
if autotile_names[ i] .nil ?
fh.print ','
else
fh.print '%s.png,' % [ autotile_names[ i] ]
end
end
fh.puts ''
passages_size = passages.xsize
fh.print 'passages '
for i in 0 ..passages_size
fh.print '%s,' % [ passages[ i] ]
end
fh.puts ''
priorities_size = priorities.xsize
fh.print 'priorities '
for i in 0 ..priorities_size
if i==priorities_size
fh.print '%s' % [ priorities[ i] ]
elsif i==0
fh.print '%s,' % [ 5 ]
else
fh.print '%s,' % [ priorities[ i] ]
end
end
fh.puts ''
end
fh.close #关闭文件流
下面的代码是对应地图图块的数据输出,
代码如下:
#创建一个可写文件流
fh = File .new ( sprintf ( "Data/Map%03d.rx" , @map_id ) , "w" )
#输出地图数据
for i in 0 ..2
xsize = @map .data .xsize
#print xsize
ysize = @map .data .ysize
#print ysize
fh.puts '[w = %s][h = %s]' % [ xsize,ysize]
for line in 0 ...ysize
for col in 0 ...xsize
tile_id = @map .data [ col, line, i]
if tile_id == nil
#fh.puts "[%s][%s][%s]=%s" % [col, line,i,'空'] #写入数据
#print "[%s][%s][0]=%s" % [col, line,'空']
fh.print "%s," % [ '空' ]
else
#fh.puts "[%s][%s][%s]=%s" % [col, line,i,tile_id] #写入数据
#print "[%s][%s][0]=%s" % [col, line,tile_id]
if col==xsize-1
fh.print "%s" % [ tile_id]
else
fh.print "%s," % [ tile_id]
end
end
end
fh.puts ''
end
fh.puts ''
end
fh.close #关闭文件流
#创建一个可写文件流
fh = File .new ( sprintf ( "Data/Map%03d.rx" , @map_id ) , "w" )
#输出地图数据
for i in 0 ..2
xsize = @map .data .xsize
#print xsize
ysize = @map .data .ysize
#print ysize
fh.puts '[w = %s][h = %s]' % [ xsize,ysize]
for line in 0 ...ysize
for col in 0 ...xsize
tile_id = @map .data [ col, line, i]
if tile_id == nil
#fh.puts "[%s][%s][%s]=%s" % [col, line,i,'空'] #写入数据
#print "[%s][%s][0]=%s" % [col, line,'空']
fh.print "%s," % [ '空' ]
else
#fh.puts "[%s][%s][%s]=%s" % [col, line,i,tile_id] #写入数据
#print "[%s][%s][0]=%s" % [col, line,tile_id]
if col==xsize-1
fh.print "%s" % [ tile_id]
else
fh.print "%s," % [ tile_id]
end
end
end
fh.puts ''
end
fh.puts ''
end
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-194202.png
(170.44 KB, 下载次数: 16)
作者: 爆发的妞 时间: 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